Merge pull request #11319 from kyle-cypress/pr/whd-1.30-update

Update WHD to 1.30.0
pull/11369/head
Martin Kojtal 2019-08-28 16:11:24 +02:00 committed by GitHub
commit 67d1bb180b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
55 changed files with 39746 additions and 35226 deletions

View File

@ -47,7 +47,6 @@ struct whd_scan_userdata {
static whd_scan_userdata interal_scan_data;
static whd_scan_result_t internal_scan_result;
static whd_scan_result_t *result_ptr = &internal_scan_result;
extern "C" void whd_emac_wifi_link_state_changed(bool state_up, whd_interface_t ifp);
@ -397,7 +396,7 @@ int WhdSTAInterface::scan(WiFiAccessPoint *aps, unsigned count)
whd_res = (whd_result_t)whd_wifi_scan(_whd_emac.ifp, WHD_SCAN_TYPE_ACTIVE, WHD_BSS_TYPE_ANY,
NULL, NULL, NULL, NULL, whd_scan_handler, (whd_scan_result_t **) &result_ptr, &interal_scan_data);
NULL, NULL, NULL, NULL, whd_scan_handler, &internal_scan_result, &interal_scan_data);
if (whd_res != WHD_SUCCESS) {
res = whd_toerror(whd_res);
} else {

View File

@ -6,4 +6,4 @@
* MAC address is printed during WHD power up
*/
#define NVRAM_GENERATED_MAC_ADDRESS "macaddr=00:A0:50:45:2e:c8"
#define NVRAM_GENERATED_MAC_ADDRESS "macaddr=00:A0:50:d4:32:81"

View File

@ -1,98 +0,0 @@
/*
* Copyright 2019 Cypress Semiconductor Corporation
* SPDX-License-Identifier: Apache-2.0
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/** @file whd_bus_types.h
* Defines common data types used with WHD SDIO/SPI bus
*
*/
#ifndef INCLUDED_WHD_BUS_TYPES_H
#define INCLUDED_WHD_BUS_TYPES_H
#include "whd.h"
#ifdef __cplusplus
extern "C"
{
#endif
/** @addtogroup busapi WHD Bus API
* Allows WHD to operate with specific SDIO/SPI bus
* @{
*/
/**
* WiFi device GPIO pin selections
*/
typedef enum whd_dev_gpio_sel
{
WHD_DEV_GPIO_SEL_GPIO0 = 0, /**< Select GPIO0 */
} whd_dev_gpio_sel_t;
/**
* Interrupt configuration structure
*/
typedef struct whd_intr_config
{
whd_dev_gpio_sel_t dev_gpio_sel; /**< WiFi device-side GPIO pin selection */
whd_bool_t is_falling_edge; /**< Interrupt trigger (polarity) */
} whd_intr_config_t;
/**
* Prototype for a user-defined function to enable interrupt to be signaled.
*
* This function must be provided whenever @ref WHD_BUS_SDIO_OOB_INTR is set.
*
* WHD will call this function to enable or disable an interrupt depending on the enable bool variable. When the interrupt
* is asserted, the IRQ handler must call the appropriate "asserted" function with the WHD
* context pointer associated with the IRQ.
*
* @param whd_drv Pointer to handle instance of the driver
* @param intr Opaque interrupt signal
* @param enable WHD_TRUE means to enable the interrupt, otherwise disable.
*/
typedef void (*whd_enable_intr_func_t)(whd_driver_t whd_drv, const whd_variant_t intr, whd_bool_t enable);
/**
* Prototype for a user-defined function to get interrupt configuration.
*
* WHD calls this function to get an interrupt's configuration.
*
* This function must be provided whenever @ref WHD_BUS_SDIO_OOB_INTR is set.
*
* @param whd_driver Pointer to handle instance of the driver
* @param intr Opaque interrupt signal
* @param config Pointer to the interrupt configuration
*/
typedef void (*whd_get_intr_config_func_t)(whd_driver_t whd_driver, const whd_variant_t intr,
whd_intr_config_t *config);
/**
* Structure of function pointers for bus operations.
*/
struct whd_bus_funcs
{
whd_enable_intr_func_t whd_enable_intr; /**< Enable interrupt to be signaled */
whd_get_intr_config_func_t whd_get_intr_config; /**< Get interrupt configuration */
};
/* @} */
#ifdef __cplusplus
} /*extern "C" */
#endif
#endif /* INCLUDED_WHD_BUS_TYPES_H */

View File

@ -86,14 +86,15 @@ struct whd_resource_source
*
* @param whd_drv Pointer to handle instance of the driver
* @param type Type of resource - WHD_RESOURCE_WLAN_FIRMWARE, WHD_RESOURCE_WLAN_NVRAM, WHD_RESOURCE_WLAN_CLM
* @param blockno The number of block
* @param data Pointer to a block of data
* @param size_out Size of the resource
*
* @return WHD_SUCCESS or error code
*
*/
uint32_t (*whd_get_resource_block)(whd_driver_t whd_drv, whd_resource_type_t type, const uint8_t **data,
uint32_t *size_out);
uint32_t (*whd_get_resource_block)(whd_driver_t whd_drv, whd_resource_type_t type,
uint32_t blockno, const uint8_t **data, uint32_t *size_out);
/** Gets block count for the specified resource_type
*

View File

@ -22,6 +22,7 @@
#include <stdint.h>
#include "cy_result.h"
#include "cyhal_hw_types.h"
#ifndef INCLUDED_WHD_TYPES_H_
#define INCLUDED_WHD_TYPES_H_
@ -943,30 +944,25 @@ typedef struct
} whd_wep_key_t;
/**
* Variant data type.
* Structure for Out-of-band interrupt config parameters which can be set by application during whd power up
*/
typedef union whd_variant
typedef struct whd_oob_config
{
void *pvval; /**< Void pointer */
uint32_t u32val; /**< uint32_t type variable */
} whd_variant_t;
/**
* SDIO bus will use the host-wake out-of-band (OOB) signal.
* @ref whd_get_intr_config_func_t must be specified when this flag is set.
*/
#define WHD_BUS_SDIO_OOB_INTR (1UL << 0)
cyhal_gpio_t host_oob_pin; /**< Host-side GPIO pin selection */
uint8_t dev_gpio_sel; /**< WiFi device-side GPIO pin selection (must be zero) */
whd_bool_t is_falling_edge; /**< Interrupt trigger (polarity) */
uint8_t intr_priority; /**< OOB interrupt priority */
} whd_oob_config_t;
/**
* Structure for SDIO config parameters which can be set by application during whd power up
*/
typedef struct whd_sdio_config
{
uint32_t flags; /**< Configuration flags (see WHD_BUS_SDIO_XXX constants). */
/* Bus config */
whd_bool_t sdio_1bit_mode; /**< Default is false, means SDIO operates under 4 bit mode */
whd_bool_t high_speed_sdio_clock; /**< Default is false, means SDIO operates in normal clock rate */
whd_variant_t oob_intr; /**< Caller provided opaque data (@ref WHD_BUS_SDIO_OOB_INTR) */
whd_oob_config_t oob_config; /**< Out-of-band interrupt configuration (required when bus can sleep) */
} whd_sdio_config_t;
/**
@ -976,7 +972,7 @@ typedef struct whd_spi_config
{
/* Bus config */
whd_bool_t is_spi_normal_mode; /**< Default is false */
whd_variant_t oob_intr; /**< Caller provided opaque data */
whd_oob_config_t oob_config; /**< Out-of-band interrupt configuration */
} whd_spi_config_t;
/**

View File

@ -1,3 +1,3 @@
#define WHD_VERSION "1b9fceb7"
#define WHD_BRANCH "master"
#define WHD_DATE "2019-07-03 16:07:52 +0530"
#define WHD_VERSION "v1.30.0-rc3-dirty"
#define WHD_BRANCH "v1.30.0-rc3"
#define WHD_DATE "2019-08-27 16:29:32 +0800"

View File

@ -76,43 +76,33 @@ extern uint32_t whd_init(whd_driver_t *whd_driver_ptr, whd_init_config_t *whd_in
* @param whd_driver Pointer to handle instance of the driver
* @param whd_config Configuration for SDIO bus
* @param sdio_obj The SDHC hardware interface, from the Level 3 CY HW APIs
* @param sdio_ops Pointer to a whd_sdio_funcs_t to provide SDIO services to the driver instance
*
* @return WHD_SUCCESS or Error code
*/
extern uint32_t whd_bus_sdio_attach(whd_driver_t whd_driver, whd_sdio_config_t *whd_config, void *sdio_obj,
whd_sdio_funcs_t *sdio_ops);
extern uint32_t whd_bus_sdio_attach(whd_driver_t whd_driver, whd_sdio_config_t *whd_config, cyhal_sdio_t *sdio_obj);
/** Notify the WLAN device that the SDIO host-wake signal asserted.
/** Detach the WLAN Device to a specific SDIO bus
*
* This function may be called after the WHD calls @ref whd_enable_intr_func_t with enable
* set to WHD_TRUE.
*
* @param whd_driver Pointer to handle instance of the driver
* @param whd_driver Pointer to handle instance of the driver
*/
extern void whd_bus_sdio_oob_intr_asserted(whd_driver_t whd_driver);
extern void whd_bus_sdio_detach(whd_driver_t whd_driver);
/** Attach the WLAN Device to a specific SPI bus
*
* @param whd_driver Pointer to handle instance of the driver
* @param whd_config Configuration for SPI bus
* @param spi_obj The SPI hardware interface, from the Level 3 CY HW APIs
* @param spi_ops Pointer to a whd_spi_funcs_t to provide SPI services to the driver instance
*
* @return WHD_SUCCESS or Error code
*/
extern uint32_t whd_bus_spi_attach(whd_driver_t whd_driver, whd_spi_config_t *whd_config, void *spi_obj,
whd_spi_funcs_t *spi_ops);
extern uint32_t whd_bus_spi_attach(whd_driver_t whd_driver, whd_spi_config_t *whd_config, cyhal_spi_t *spi_obj);
/**
* Notify the WLAN device that the SPI interrupt signal asserted.
/** Detach the WLAN Device to a specific SPI bus
*
* This function may be called after the WHD calls @ref whd_enable_intr_func_t with enable
* set to WHD_TRUE.
*
* @param whd_driver Pointer to the handle instance of the driver associated to the event
* @param whd_driver Pointer to handle instance of the driver
*/
extern void whd_bus_spi_oob_intr_asserted(whd_driver_t whd_driver);
extern void whd_bus_spi_detach(whd_driver_t whd_driver);
/* @} */
/** @addtogroup wifi WHD Wi-Fi API
@ -263,7 +253,7 @@ extern uint32_t whd_wifi_scan(whd_interface_t ifp,
const uint16_t *optional_channel_list,
const whd_scan_extended_params_t *optional_extended_params,
whd_scan_result_callback_t callback,
whd_scan_result_t **result_ptr,
whd_scan_result_t *result_ptr,
void *user_data);
/** Abort a previously issued scan

View File

@ -13,414 +13,417 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "wiced_resource.h"
#if defined(CY_STORAGE_WIFI_DATA)
CY_SECTION(CY_STORAGE_WIFI_DATA) __attribute__( (used) )
#endif
const unsigned char wifi_firmware_clm_blob_image_data[7697] =
{
66, 76, 79, 66, 60, 0, 0, 0, 67, 15, 222, 237, 1, 0, 0, 0, 2, 0, 0,
0, 0, 0, 0, 0, 60, 0, 0, 0, 209, 29, 0, 0, 126, 28, 4, 82, 0, 0, 0,
0, 0, 0, 0, 0, 13, 30, 0, 0, 4, 0, 0, 0, 147, 68, 77, 121, 0, 0, 0,
0, 67, 76, 77, 32, 68, 65, 84, 65, 0, 0, 18, 0, 2, 0, 57, 46, 49, 48,
46, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 46, 51, 54, 46,
49, 0, 0, 0, 0, 0, 0, 0, 0, 40, 18, 0, 0, 67, 108, 109, 73, 109, 112,
111, 114, 116, 58, 32, 49, 46, 51, 52, 46, 49, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 66, 114, 111, 97, 100, 99, 111, 109, 45, 48, 46, 48,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 132, 17, 0, 0, 16, 4, 5, 6,
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 18, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 35, 97, 0, 15, 18,
17, 19, 10, 35, 110, 0, 16, 8, 255, 255, 0, 35, 114, 0, 15, 19, 17,
20, 10, 48, 65, 0, 7, 8, 255, 255, 16, 48, 66, 0, 0, 14, 0, 17, 16,
48, 67, 0, 7, 6, 12, 5, 25, 65, 67, 0, 16, 8, 255, 255, 16, 65, 68,
0, 7, 33, 13, 39, 57, 65, 69, 0, 7, 8, 6, 7, 32, 65, 69, 1, 7, 33, 6,
43, 32, 65, 70, 0, 7, 33, 13, 39, 57, 65, 71, 0, 7, 41, 6, 47, 32, 65,
73, 0, 6, 15, 5, 18, 26, 65, 76, 0, 7, 33, 6, 43, 32, 65, 77, 0, 7,
5, 12, 3, 9, 65, 78, 0, 7, 14, 6, 17, 32, 65, 79, 0, 7, 8, 255, 255,
16, 65, 81, 0, 16, 8, 255, 255, 16, 65, 82, 0, 7, 25, 6, 25, 0, 65,
82, 1, 7, 14, 6, 17, 0, 65, 83, 0, 6, 15, 5, 18, 26, 65, 84, 0, 7, 33,
6, 43, 32, 65, 84, 1, 7, 37, 6, 36, 32, 65, 85, 0, 18, 42, 22, 46, 9,
65, 85, 2, 18, 42, 21, 45, 0, 65, 87, 0, 7, 34, 6, 31, 1, 65, 88, 0,
16, 8, 255, 255, 16, 65, 90, 0, 7, 14, 6, 17, 32, 66, 65, 0, 7, 33,
6, 43, 32, 66, 66, 0, 7, 22, 12, 23, 25, 66, 68, 0, 7, 46, 6, 58, 0,
66, 69, 0, 7, 33, 6, 43, 32, 66, 69, 1, 7, 37, 6, 36, 32, 66, 70, 0,
7, 33, 13, 39, 25, 66, 71, 0, 7, 33, 6, 43, 32, 66, 71, 1, 7, 37, 6,
36, 32, 66, 72, 0, 7, 21, 6, 22, 0, 66, 73, 0, 7, 33, 13, 39, 25, 66,
74, 0, 7, 33, 13, 39, 57, 66, 76, 0, 16, 8, 255, 255, 16, 66, 77, 0,
6, 15, 5, 18, 26, 66, 78, 0, 7, 8, 255, 255, 0, 66, 78, 1, 17, 41, 20,
47, 0, 66, 79, 0, 7, 15, 12, 18, 42, 66, 81, 0, 16, 8, 255, 255, 16,
66, 82, 0, 7, 43, 6, 52, 32, 66, 83, 0, 18, 21, 21, 22, 0, 66, 84, 0,
7, 8, 12, 7, 56, 66, 86, 0, 16, 8, 255, 255, 16, 66, 87, 0, 7, 45, 12,
51, 57, 66, 89, 0, 7, 33, 255, 255, 0, 66, 90, 0, 7, 15, 12, 18, 26,
67, 65, 0, 0, 21, 0, 22, 0, 67, 65, 2, 6, 15, 5, 18, 26, 67, 67, 0,
16, 8, 255, 255, 16, 67, 68, 0, 7, 33, 13, 39, 57, 67, 70, 0, 7, 33,
13, 39, 25, 67, 71, 0, 7, 33, 13, 39, 57, 67, 72, 0, 7, 33, 6, 43, 32,
67, 72, 1, 7, 37, 6, 36, 32, 67, 73, 0, 7, 33, 13, 39, 57, 67, 75, 0,
7, 44, 12, 50, 25, 67, 76, 0, 7, 7, 6, 6, 1, 67, 77, 0, 7, 33, 13, 39,
25, 67, 78, 0, 21, 48, 24, 53, 0, 67, 79, 0, 7, 13, 6, 11, 32, 67, 80,
0, 16, 8, 255, 255, 16, 67, 82, 0, 7, 14, 6, 15, 32, 67, 85, 0, 7, 8,
13, 255, 57, 67, 86, 0, 7, 33, 13, 39, 25, 67, 87, 0, 16, 8, 255, 255,
16, 67, 88, 0, 18, 42, 21, 46, 25, 67, 89, 0, 7, 33, 6, 43, 32, 67,
89, 1, 7, 37, 6, 36, 32, 67, 90, 0, 7, 33, 6, 43, 32, 67, 90, 1, 7,
37, 6, 36, 32, 68, 69, 0, 7, 33, 6, 43, 32, 68, 69, 3, 7, 37, 6, 36,
32, 68, 74, 0, 7, 8, 255, 255, 16, 68, 75, 0, 7, 33, 6, 43, 32, 68,
75, 1, 7, 37, 6, 36, 32, 68, 77, 0, 7, 15, 12, 18, 26, 68, 79, 0, 7,
15, 12, 18, 26, 68, 90, 0, 7, 5, 6, 4, 32, 69, 48, 0, 7, 12, 6, 13,
32, 69, 67, 0, 7, 14, 6, 17, 32, 69, 69, 0, 7, 33, 6, 43, 32, 69, 69,
1, 7, 37, 6, 36, 32, 69, 71, 0, 7, 41, 19, 48, 0, 69, 72, 0, 7, 6, 12,
5, 25, 69, 82, 0, 7, 8, 255, 255, 16, 69, 83, 0, 7, 33, 6, 43, 32, 69,
83, 1, 7, 37, 6, 36, 32, 69, 84, 0, 7, 33, 6, 43, 0, 70, 73, 0, 7, 33,
6, 43, 32, 70, 73, 1, 7, 37, 6, 36, 32, 70, 74, 0, 7, 42, 12, 46, 25,
70, 75, 0, 7, 33, 13, 39, 25, 70, 77, 0, 6, 15, 5, 18, 26, 70, 79, 0,
7, 33, 13, 39, 57, 70, 82, 0, 7, 33, 6, 43, 32, 70, 82, 1, 7, 37, 6,
36, 32, 71, 65, 0, 7, 33, 13, 39, 25, 71, 66, 0, 7, 33, 6, 43, 32, 71,
66, 1, 7, 37, 6, 36, 32, 71, 68, 0, 7, 43, 6, 52, 0, 71, 69, 0, 7, 33,
13, 39, 57, 71, 70, 0, 7, 33, 6, 43, 0, 71, 71, 0, 7, 33, 13, 39, 25,
71, 72, 0, 7, 33, 13, 39, 57, 71, 73, 0, 7, 33, 13, 39, 25, 71, 76,
0, 16, 8, 255, 255, 16, 71, 77, 0, 7, 33, 13, 39, 25, 71, 78, 0, 7,
33, 13, 39, 57, 71, 80, 0, 7, 33, 6, 43, 0, 71, 81, 0, 7, 33, 13, 39,
25, 71, 82, 0, 7, 33, 6, 43, 32, 71, 82, 1, 7, 37, 6, 36, 32, 71, 83,
0, 16, 8, 255, 255, 16, 71, 84, 0, 7, 14, 11, 17, 16, 71, 85, 0, 0,
14, 0, 17, 0, 71, 87, 0, 7, 33, 13, 39, 25, 71, 89, 0, 7, 46, 12, 54,
25, 72, 75, 0, 18, 43, 22, 52, 0, 72, 77, 0, 16, 8, 255, 255, 16, 72,
78, 0, 7, 47, 12, 60, 10, 72, 82, 0, 7, 33, 6, 43, 32, 72, 82, 1, 7,
37, 6, 36, 32, 72, 84, 0, 7, 46, 12, 54, 9, 72, 85, 0, 7, 33, 6, 43,
32, 72, 85, 1, 7, 37, 6, 36, 32, 73, 68, 0, 7, 8, 6, 7, 0, 73, 68, 5,
7, 53, 13, 64, 25, 73, 69, 0, 7, 33, 6, 43, 32, 73, 69, 1, 7, 37, 6,
36, 32, 73, 76, 0, 7, 5, 6, 4, 32, 73, 77, 0, 7, 33, 13, 39, 25, 73,
78, 0, 17, 41, 20, 47, 32, 73, 79, 0, 7, 33, 13, 39, 25, 73, 81, 0,
7, 33, 13, 39, 25, 73, 82, 0, 7, 8, 13, 255, 57, 73, 83, 0, 7, 33, 6,
43, 32, 73, 83, 1, 7, 37, 6, 36, 32, 73, 84, 0, 7, 33, 6, 43, 32, 73,
84, 1, 7, 37, 6, 36, 32, 74, 48, 0, 7, 38, 15, 42, 0, 74, 49, 0, 14,
12, 255, 255, 0, 74, 50, 0, 14, 5, 255, 255, 0, 74, 51, 0, 14, 38, 255,
255, 0, 74, 52, 0, 14, 24, 255, 255, 0, 74, 53, 0, 14, 27, 255, 255,
0, 74, 54, 0, 14, 28, 255, 255, 0, 74, 55, 0, 14, 29, 255, 255, 0, 74,
56, 0, 14, 40, 255, 255, 0, 74, 57, 0, 7, 28, 15, 27, 0, 74, 69, 0,
7, 33, 13, 39, 25, 74, 77, 0, 7, 46, 13, 59, 25, 74, 79, 0, 7, 1, 6,
0, 32, 74, 80, 0, 14, 39, 16, 40, 1, 74, 80, 1, 14, 28, 15, 27, 0, 74,
80, 3, 14, 39, 15, 41, 1, 75, 65, 0, 20, 17, 23, 16, 3, 75, 67, 0, 20,
46, 23, 54, 3, 75, 68, 0, 7, 49, 6, 56, 3, 75, 69, 0, 7, 33, 6, 38,
33, 75, 71, 0, 7, 33, 13, 39, 25, 75, 72, 0, 7, 43, 6, 52, 0, 75, 73,
0, 18, 42, 21, 46, 25, 75, 75, 0, 20, 8, 23, 7, 0, 75, 77, 0, 7, 33,
13, 39, 25, 75, 78, 0, 7, 15, 12, 18, 26, 75, 80, 0, 16, 8, 255, 255,
16, 75, 82, 0, 16, 53, 18, 44, 0, 75, 82, 4, 21, 30, 24, 28, 17, 75,
87, 0, 7, 8, 6, 7, 32, 75, 87, 1, 7, 5, 6, 4, 32, 75, 88, 0, 7, 46,
6, 54, 3, 75, 89, 0, 0, 14, 0, 17, 0, 75, 90, 0, 7, 36, 12, 34, 8, 76,
65, 0, 7, 34, 6, 31, 1, 76, 66, 0, 7, 46, 6, 58, 32, 76, 67, 0, 7, 15,
12, 18, 26, 76, 73, 0, 7, 33, 6, 43, 0, 76, 73, 1, 7, 37, 6, 36, 0,
76, 75, 0, 17, 43, 20, 52, 0, 76, 82, 0, 7, 43, 19, 50, 17, 76, 83,
0, 7, 33, 6, 43, 0, 76, 84, 0, 7, 33, 6, 43, 32, 76, 84, 1, 7, 37, 6,
36, 32, 76, 85, 0, 7, 33, 6, 43, 32, 76, 85, 1, 7, 37, 6, 36, 32, 76,
86, 0, 7, 33, 6, 43, 32, 76, 86, 1, 7, 37, 6, 36, 32, 76, 89, 0, 7,
8, 14, 255, 16, 77, 65, 0, 7, 12, 19, 12, 32, 77, 65, 1, 7, 5, 19, 4,
32, 77, 67, 0, 7, 33, 6, 43, 0, 77, 68, 0, 7, 33, 6, 43, 32, 77, 69,
0, 7, 33, 6, 43, 32, 77, 70, 0, 7, 45, 12, 51, 25, 77, 71, 0, 7, 33,
13, 39, 57, 77, 72, 0, 16, 8, 255, 255, 16, 77, 75, 0, 7, 33, 6, 43,
32, 77, 76, 0, 7, 33, 13, 39, 25, 77, 77, 0, 7, 33, 13, 39, 25, 77,
78, 0, 7, 14, 11, 17, 32, 77, 79, 0, 7, 49, 6, 58, 0, 77, 80, 0, 6,
15, 5, 18, 26, 77, 81, 0, 7, 33, 6, 43, 0, 77, 82, 0, 7, 33, 6, 43,
0, 77, 83, 0, 7, 33, 13, 39, 57, 77, 84, 0, 7, 33, 6, 43, 32, 77, 84,
1, 7, 37, 6, 36, 32, 77, 85, 0, 7, 33, 6, 43, 32, 77, 86, 0, 7, 10,
6, 10, 32, 77, 87, 0, 7, 46, 6, 58, 32, 77, 88, 0, 7, 5, 6, 4, 0, 77,
88, 1, 7, 21, 6, 22, 0, 77, 89, 0, 17, 41, 20, 47, 0, 77, 90, 0, 7,
16, 12, 14, 26, 78, 65, 0, 7, 16, 12, 14, 26, 78, 67, 0, 7, 33, 13,
39, 25, 78, 69, 0, 7, 33, 13, 39, 25, 78, 70, 0, 7, 42, 11, 45, 0, 78,
71, 0, 7, 26, 13, 26, 57, 78, 73, 0, 7, 14, 6, 17, 32, 78, 76, 0, 7,
33, 6, 43, 32, 78, 76, 1, 7, 37, 6, 36, 32, 78, 79, 0, 7, 33, 6, 43,
32, 78, 79, 1, 7, 37, 6, 36, 32, 78, 80, 0, 17, 9, 20, 8, 0, 78, 82,
0, 7, 33, 13, 39, 25, 78, 85, 0, 7, 14, 255, 255, 16, 78, 90, 0, 7,
43, 6, 52, 32, 79, 77, 0, 7, 33, 6, 43, 32, 80, 65, 0, 17, 0, 20, 24,
32, 80, 69, 0, 7, 14, 6, 17, 32, 80, 70, 0, 7, 33, 13, 39, 25, 80, 71,
0, 7, 2, 6, 0, 0, 80, 72, 0, 7, 43, 6, 52, 32, 80, 75, 0, 7, 49, 11,
55, 33, 80, 76, 0, 7, 33, 6, 43, 32, 80, 76, 1, 7, 37, 6, 36, 32, 80,
77, 0, 7, 33, 13, 39, 25, 80, 78, 0, 16, 8, 255, 255, 16, 80, 82, 0,
0, 14, 0, 17, 0, 80, 83, 0, 16, 8, 255, 255, 0, 80, 84, 0, 7, 33, 6,
43, 32, 80, 84, 1, 7, 37, 6, 36, 32, 80, 87, 0, 7, 15, 12, 18, 26, 80,
89, 0, 7, 46, 6, 58, 0, 80, 89, 1, 7, 43, 6, 52, 0, 81, 49, 0, 2, 8,
2, 7, 0, 81, 50, 0, 0, 31, 0, 29, 0, 81, 65, 0, 7, 49, 13, 57, 57, 82,
69, 0, 7, 33, 6, 43, 0, 82, 79, 0, 7, 33, 6, 43, 32, 82, 79, 1, 7, 37,
6, 36, 32, 82, 83, 0, 7, 33, 6, 43, 32, 82, 85, 0, 7, 8, 255, 255, 0,
82, 85, 5, 7, 11, 11, 9, 1, 82, 87, 0, 7, 33, 13, 39, 57, 83, 65, 0,
7, 34, 6, 32, 33, 83, 66, 0, 7, 8, 255, 255, 16, 83, 67, 0, 7, 45, 12,
51, 25, 83, 68, 0, 7, 8, 13, 255, 57, 83, 69, 0, 7, 33, 6, 43, 32, 83,
69, 1, 7, 37, 6, 36, 32, 83, 71, 0, 17, 44, 20, 50, 33, 83, 72, 0, 16,
8, 255, 255, 16, 83, 73, 0, 7, 33, 6, 43, 32, 83, 73, 1, 7, 37, 6, 36,
32, 83, 74, 0, 16, 8, 255, 255, 16, 83, 75, 0, 7, 33, 6, 43, 32, 83,
75, 1, 7, 37, 6, 36, 32, 83, 76, 0, 7, 33, 13, 39, 25, 83, 77, 0, 7,
33, 13, 39, 25, 83, 78, 0, 7, 33, 6, 43, 32, 83, 79, 0, 7, 8, 255, 255,
16, 83, 82, 0, 7, 33, 13, 39, 25, 83, 84, 0, 7, 33, 13, 39, 25, 83,
86, 0, 7, 14, 11, 17, 32, 83, 88, 0, 16, 8, 255, 255, 16, 83, 89, 0,
16, 8, 255, 255, 16, 83, 90, 0, 7, 33, 13, 39, 25, 84, 65, 0, 16, 8,
255, 255, 16, 84, 67, 0, 7, 33, 13, 39, 25, 84, 68, 0, 7, 33, 13, 39,
25, 84, 70, 0, 7, 33, 13, 39, 25, 84, 71, 0, 7, 33, 13, 39, 25, 84,
72, 0, 7, 43, 6, 52, 32, 84, 74, 0, 7, 33, 13, 39, 25, 84, 75, 0, 16,
8, 255, 255, 16, 84, 76, 0, 7, 33, 13, 39, 57, 84, 77, 0, 7, 33, 13,
39, 25, 84, 78, 0, 7, 5, 6, 4, 32, 84, 79, 0, 7, 8, 255, 255, 16, 84,
82, 0, 7, 5, 6, 4, 32, 84, 82, 7, 7, 33, 13, 39, 57, 84, 84, 0, 7, 43,
6, 52, 32, 84, 86, 0, 7, 8, 255, 255, 16, 84, 87, 0, 0, 50, 0, 63, 0,
84, 87, 2, 0, 51, 0, 61, 0, 84, 90, 0, 7, 33, 13, 39, 25, 85, 65, 0,
7, 8, 255, 255, 0, 85, 71, 0, 7, 34, 6, 31, 33, 85, 77, 0, 0, 14, 0,
17, 0, 85, 83, 0, 5, 32, 4, 30, 10, 85, 83, 25, 11, 8, 9, 7, 0, 85,
83, 26, 4, 8, 1, 7, 0, 85, 89, 0, 18, 43, 21, 52, 0, 85, 90, 0, 7, 33,
13, 39, 25, 86, 65, 0, 7, 33, 6, 43, 0, 86, 67, 0, 7, 15, 12, 18, 26,
86, 69, 0, 7, 41, 6, 47, 0, 86, 71, 0, 7, 33, 6, 43, 0, 86, 73, 0, 0,
14, 0, 17, 0, 86, 78, 0, 7, 5, 6, 4, 0, 86, 85, 0, 7, 43, 12, 49, 25,
87, 70, 0, 7, 33, 12, 43, 25, 87, 83, 0, 7, 43, 11, 49, 17, 88, 48,
0, 3, 20, 0, 21, 0, 88, 49, 0, 7, 41, 6, 47, 0, 88, 50, 0, 19, 3, 6,
2, 0, 88, 51, 0, 7, 33, 6, 35, 32, 88, 65, 0, 7, 3, 255, 255, 0, 88,
66, 0, 0, 23, 255, 255, 0, 88, 82, 0, 1, 52, 3, 62, 0, 88, 83, 0, 12,
4, 10, 1, 33, 88, 84, 0, 11, 8, 9, 7, 32, 88, 85, 0, 8, 37, 7, 37, 32,
88, 86, 0, 10, 8, 8, 7, 32, 88, 87, 0, 20, 35, 23, 33, 34, 88, 88, 0,
9, 33, 255, 255, 32, 88, 89, 0, 7, 33, 6, 43, 32, 88, 90, 0, 13, 8,
255, 255, 32, 89, 49, 0, 0, 14, 255, 255, 16, 89, 50, 0, 0, 14, 255,
255, 16, 89, 51, 0, 0, 14, 255, 255, 16, 89, 52, 0, 0, 14, 255, 255,
16, 89, 53, 0, 0, 14, 255, 255, 16, 89, 54, 0, 0, 14, 255, 255, 16,
89, 55, 0, 0, 14, 255, 255, 16, 89, 69, 0, 7, 45, 12, 51, 25, 89, 84,
0, 7, 33, 6, 43, 0, 89, 89, 0, 16, 8, 255, 255, 0, 90, 49, 0, 16, 8,
255, 255, 16, 90, 50, 0, 16, 8, 255, 255, 16, 90, 51, 0, 16, 8, 255,
255, 16, 90, 52, 0, 16, 8, 255, 255, 16, 90, 53, 0, 16, 8, 255, 255,
16, 90, 54, 0, 16, 8, 255, 255, 16, 90, 55, 0, 16, 8, 255, 255, 16,
90, 56, 0, 16, 8, 255, 255, 16, 90, 57, 0, 16, 8, 255, 255, 16, 90,
65, 0, 7, 33, 6, 43, 32, 90, 77, 0, 17, 41, 20, 47, 0, 90, 87, 0, 7,
33, 13, 39, 57, 38, 62, 8, 102, 142, 8, 151, 175, 8, 16, 4, 5, 6, 7,
8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 18, 4, 5, 6, 7, 8, 9,
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 4, 5, 76, 0, 3, 76,
6, 3, 76, 10, 3, 76, 11, 3, 66, 12, 3, 1, 4, 62, 0, 0, 66, 4, 0, 62,
9, 0, 58, 10, 0, 4, 3, 58, 0, 3, 66, 7, 3, 58, 12, 3, 1, 5, 42, 0, 0,
50, 3, 0, 60, 8, 0, 54, 9, 0, 46, 10, 0, 4, 1, 56, 2, 3, 1, 1, 32, 1,
0, 4, 5, 58, 0, 3, 68, 6, 3, 74, 10, 3, 68, 11, 3, 66, 12, 3, 1, 5,
48, 0, 0, 58, 3, 0, 66, 8, 0, 58, 9, 0, 54, 10, 0, 4, 3, 86, 0, 0, 126,
7, 0, 86, 12, 0, 1, 3, 78, 0, 1, 126, 5, 1, 78, 10, 1, 4, 5, 70, 0,
0, 80, 6, 0, 80, 10, 0, 80, 11, 0, 72, 12, 0, 1, 5, 58, 0, 1, 68, 3,
1, 80, 8, 1, 68, 9, 1, 60, 10, 1, 4, 1, 64, 4, 0, 1, 1, 64, 2, 1, 4,
1, 76, 4, 3, 1, 1, 72, 2, 0, 4, 4, 60, 0, 3, 64, 8, 3, 44, 13, 3, 44,
16, 3, 1, 3, 40, 0, 0, 52, 5, 0, 46, 11, 0, 0, 2, 64, 3, 3, 46, 16,
3, 4, 2, 64, 2, 0, 44, 14, 0, 1, 3, 54, 0, 1, 64, 6, 1, 52, 12, 1, 6,
66, 76, 79, 66, 60, 0, 0, 0, 192, 67, 184, 158, 1, 0, 0, 0, 2, 0, 0,
0, 0, 0, 0, 0, 60, 0, 0, 0, 209, 29, 0, 0, 191, 213, 43, 137, 0, 0,
0, 0, 0, 0, 0, 0, 13, 30, 0, 0, 4, 0, 0, 0, 147, 68, 77, 121, 0, 0,
0, 0, 67, 76, 77, 32, 68, 65, 84, 65, 0, 0, 18, 0, 2, 0, 57, 46, 49,
48, 46, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 46, 51, 54,
46, 49, 0, 0, 0, 0, 0, 0, 0, 0, 40, 18, 0, 0, 67, 108, 109, 73, 109,
112, 111, 114, 116, 58, 32, 49, 46, 51, 52, 46, 49, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 66, 114, 111, 97, 100, 99, 111, 109, 45, 48, 46,
48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 132, 17, 0, 0, 16, 4,
5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 18, 4, 5, 6,
7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 35, 97, 0,
15, 18, 17, 19, 10, 35, 110, 0, 16, 8, 255, 255, 0, 35, 114, 0, 15,
19, 17, 20, 10, 48, 65, 0, 7, 8, 255, 255, 16, 48, 66, 0, 0, 14, 0,
17, 16, 48, 67, 0, 7, 6, 12, 5, 25, 65, 67, 0, 16, 8, 255, 255, 16,
65, 68, 0, 7, 33, 13, 39, 57, 65, 69, 0, 7, 8, 6, 7, 32, 65, 69, 1,
7, 33, 6, 43, 32, 65, 70, 0, 7, 33, 13, 39, 57, 65, 71, 0, 7, 41, 6,
47, 32, 65, 73, 0, 6, 15, 5, 18, 26, 65, 76, 0, 7, 33, 6, 43, 32, 65,
77, 0, 7, 5, 12, 3, 9, 65, 78, 0, 7, 14, 6, 17, 32, 65, 79, 0, 7, 8,
255, 255, 16, 65, 81, 0, 16, 8, 255, 255, 16, 65, 82, 0, 7, 25, 6, 25,
0, 65, 82, 1, 7, 14, 6, 17, 0, 65, 83, 0, 6, 15, 5, 18, 26, 65, 84,
0, 7, 33, 6, 43, 32, 65, 84, 1, 7, 37, 6, 36, 32, 65, 85, 0, 18, 42,
22, 46, 9, 65, 85, 2, 18, 42, 21, 45, 0, 65, 87, 0, 7, 34, 6, 31, 1,
65, 88, 0, 16, 8, 255, 255, 16, 65, 90, 0, 7, 14, 6, 17, 32, 66, 65,
0, 7, 33, 6, 43, 32, 66, 66, 0, 7, 22, 12, 23, 25, 66, 68, 0, 7, 46,
6, 58, 0, 66, 69, 0, 7, 33, 6, 43, 32, 66, 69, 1, 7, 37, 6, 36, 32,
66, 70, 0, 7, 33, 13, 39, 25, 66, 71, 0, 7, 33, 6, 43, 32, 66, 71, 1,
7, 37, 6, 36, 32, 66, 72, 0, 7, 21, 6, 22, 0, 66, 73, 0, 7, 33, 13,
39, 25, 66, 74, 0, 7, 33, 13, 39, 57, 66, 76, 0, 16, 8, 255, 255, 16,
66, 77, 0, 6, 15, 5, 18, 26, 66, 78, 0, 7, 8, 255, 255, 0, 66, 78, 1,
17, 41, 20, 47, 0, 66, 79, 0, 7, 15, 12, 18, 42, 66, 81, 0, 16, 8, 255,
255, 16, 66, 82, 0, 7, 43, 6, 52, 32, 66, 83, 0, 18, 21, 21, 22, 0,
66, 84, 0, 7, 8, 12, 7, 56, 66, 86, 0, 16, 8, 255, 255, 16, 66, 87,
0, 7, 45, 12, 51, 57, 66, 89, 0, 7, 33, 255, 255, 0, 66, 90, 0, 7, 15,
12, 18, 26, 67, 65, 0, 0, 21, 0, 22, 0, 67, 65, 2, 6, 15, 5, 18, 26,
67, 67, 0, 16, 8, 255, 255, 16, 67, 68, 0, 7, 33, 13, 39, 57, 67, 70,
0, 7, 33, 13, 39, 25, 67, 71, 0, 7, 33, 13, 39, 57, 67, 72, 0, 7, 33,
6, 43, 32, 67, 72, 1, 7, 37, 6, 36, 32, 67, 73, 0, 7, 33, 13, 39, 57,
67, 75, 0, 7, 44, 12, 50, 25, 67, 76, 0, 7, 7, 6, 6, 1, 67, 77, 0, 7,
33, 13, 39, 25, 67, 78, 0, 21, 48, 24, 53, 0, 67, 79, 0, 7, 13, 6, 11,
32, 67, 80, 0, 16, 8, 255, 255, 16, 67, 82, 0, 7, 14, 6, 15, 32, 67,
85, 0, 7, 8, 13, 255, 57, 67, 86, 0, 7, 33, 13, 39, 25, 67, 87, 0, 16,
8, 255, 255, 16, 67, 88, 0, 18, 42, 21, 46, 25, 67, 89, 0, 7, 33, 6,
43, 32, 67, 89, 1, 7, 37, 6, 36, 32, 67, 90, 0, 7, 33, 6, 43, 32, 67,
90, 1, 7, 37, 6, 36, 32, 68, 69, 0, 7, 33, 6, 43, 32, 68, 69, 3, 7,
37, 6, 36, 32, 68, 74, 0, 7, 8, 255, 255, 16, 68, 75, 0, 7, 33, 6, 43,
32, 68, 75, 1, 7, 37, 6, 36, 32, 68, 77, 0, 7, 15, 12, 18, 26, 68, 79,
0, 7, 15, 12, 18, 26, 68, 90, 0, 7, 5, 6, 4, 32, 69, 48, 0, 7, 12, 6,
13, 32, 69, 67, 0, 7, 14, 6, 17, 32, 69, 69, 0, 7, 33, 6, 43, 32, 69,
69, 1, 7, 37, 6, 36, 32, 69, 71, 0, 7, 41, 19, 48, 0, 69, 72, 0, 7,
6, 12, 5, 25, 69, 82, 0, 7, 8, 255, 255, 16, 69, 83, 0, 7, 33, 6, 43,
32, 69, 83, 1, 7, 37, 6, 36, 32, 69, 84, 0, 7, 33, 6, 43, 0, 70, 73,
0, 7, 33, 6, 43, 32, 70, 73, 1, 7, 37, 6, 36, 32, 70, 74, 0, 7, 42,
12, 46, 25, 70, 75, 0, 7, 33, 13, 39, 25, 70, 77, 0, 6, 15, 5, 18, 26,
70, 79, 0, 7, 33, 13, 39, 57, 70, 82, 0, 7, 33, 6, 43, 32, 70, 82, 1,
7, 37, 6, 36, 32, 71, 65, 0, 7, 33, 13, 39, 25, 71, 66, 0, 7, 33, 6,
43, 32, 71, 66, 1, 7, 37, 6, 36, 32, 71, 68, 0, 7, 43, 6, 52, 0, 71,
69, 0, 7, 33, 13, 39, 57, 71, 70, 0, 7, 33, 6, 43, 0, 71, 71, 0, 7,
33, 13, 39, 25, 71, 72, 0, 7, 33, 13, 39, 57, 71, 73, 0, 7, 33, 13,
39, 25, 71, 76, 0, 16, 8, 255, 255, 16, 71, 77, 0, 7, 33, 13, 39, 25,
71, 78, 0, 7, 33, 13, 39, 57, 71, 80, 0, 7, 33, 6, 43, 0, 71, 81, 0,
7, 33, 13, 39, 25, 71, 82, 0, 7, 33, 6, 43, 32, 71, 82, 1, 7, 37, 6,
36, 32, 71, 83, 0, 16, 8, 255, 255, 16, 71, 84, 0, 7, 14, 11, 17, 16,
71, 85, 0, 0, 14, 0, 17, 0, 71, 87, 0, 7, 33, 13, 39, 25, 71, 89, 0,
7, 46, 12, 54, 25, 72, 75, 0, 18, 43, 22, 52, 0, 72, 77, 0, 16, 8, 255,
255, 16, 72, 78, 0, 7, 47, 12, 60, 10, 72, 82, 0, 7, 33, 6, 43, 32,
72, 82, 1, 7, 37, 6, 36, 32, 72, 84, 0, 7, 46, 12, 54, 9, 72, 85, 0,
7, 33, 6, 43, 32, 72, 85, 1, 7, 37, 6, 36, 32, 73, 68, 0, 7, 8, 6, 7,
0, 73, 68, 5, 7, 53, 13, 64, 25, 73, 69, 0, 7, 33, 6, 43, 32, 73, 69,
1, 7, 37, 6, 36, 32, 73, 76, 0, 7, 5, 6, 4, 32, 73, 77, 0, 7, 33, 13,
39, 25, 73, 78, 0, 17, 41, 20, 47, 32, 73, 79, 0, 7, 33, 13, 39, 25,
73, 81, 0, 7, 33, 13, 39, 25, 73, 82, 0, 7, 8, 13, 255, 57, 73, 83,
0, 7, 33, 6, 43, 32, 73, 83, 1, 7, 37, 6, 36, 32, 73, 84, 0, 7, 33,
6, 43, 32, 73, 84, 1, 7, 37, 6, 36, 32, 74, 48, 0, 7, 38, 15, 42, 0,
74, 49, 0, 14, 12, 255, 255, 0, 74, 50, 0, 14, 5, 255, 255, 0, 74, 51,
0, 14, 38, 255, 255, 0, 74, 52, 0, 14, 24, 255, 255, 0, 74, 53, 0, 14,
27, 255, 255, 0, 74, 54, 0, 14, 28, 255, 255, 0, 74, 55, 0, 14, 29,
255, 255, 0, 74, 56, 0, 14, 40, 255, 255, 0, 74, 57, 0, 7, 28, 15, 27,
0, 74, 69, 0, 7, 33, 13, 39, 25, 74, 77, 0, 7, 46, 13, 59, 25, 74, 79,
0, 7, 1, 6, 0, 32, 74, 80, 0, 14, 39, 16, 40, 1, 74, 80, 1, 14, 28,
15, 27, 0, 74, 80, 3, 14, 39, 15, 41, 1, 75, 65, 0, 20, 17, 23, 16,
3, 75, 67, 0, 20, 46, 23, 54, 3, 75, 68, 0, 7, 49, 6, 56, 3, 75, 69,
0, 7, 33, 6, 38, 33, 75, 71, 0, 7, 33, 13, 39, 25, 75, 72, 0, 7, 43,
6, 52, 0, 75, 73, 0, 18, 42, 21, 46, 25, 75, 75, 0, 20, 8, 23, 7, 0,
75, 77, 0, 7, 33, 13, 39, 25, 75, 78, 0, 7, 15, 12, 18, 26, 75, 80,
0, 16, 8, 255, 255, 16, 75, 82, 0, 16, 53, 18, 44, 0, 75, 82, 4, 21,
30, 24, 28, 17, 75, 87, 0, 7, 8, 6, 7, 32, 75, 87, 1, 7, 5, 6, 4, 32,
75, 88, 0, 7, 46, 6, 54, 3, 75, 89, 0, 0, 14, 0, 17, 0, 75, 90, 0, 7,
36, 12, 34, 8, 76, 65, 0, 7, 34, 6, 31, 1, 76, 66, 0, 7, 46, 6, 58,
32, 76, 67, 0, 7, 15, 12, 18, 26, 76, 73, 0, 7, 33, 6, 43, 0, 76, 73,
1, 7, 37, 6, 36, 0, 76, 75, 0, 17, 43, 20, 52, 0, 76, 82, 0, 7, 43,
19, 50, 17, 76, 83, 0, 7, 33, 6, 43, 0, 76, 84, 0, 7, 33, 6, 43, 32,
76, 84, 1, 7, 37, 6, 36, 32, 76, 85, 0, 7, 33, 6, 43, 32, 76, 85, 1,
7, 37, 6, 36, 32, 76, 86, 0, 7, 33, 6, 43, 32, 76, 86, 1, 7, 37, 6,
36, 32, 76, 89, 0, 7, 8, 14, 255, 16, 77, 65, 0, 7, 12, 19, 12, 32,
77, 65, 1, 7, 5, 19, 4, 32, 77, 67, 0, 7, 33, 6, 43, 0, 77, 68, 0, 7,
33, 6, 43, 32, 77, 69, 0, 7, 33, 6, 43, 32, 77, 70, 0, 7, 45, 12, 51,
25, 77, 71, 0, 7, 33, 13, 39, 57, 77, 72, 0, 16, 8, 255, 255, 16, 77,
75, 0, 7, 33, 6, 43, 32, 77, 76, 0, 7, 33, 13, 39, 25, 77, 77, 0, 7,
33, 13, 39, 25, 77, 78, 0, 7, 14, 11, 17, 32, 77, 79, 0, 7, 49, 6, 58,
0, 77, 80, 0, 6, 15, 5, 18, 26, 77, 81, 0, 7, 33, 6, 43, 0, 77, 82,
0, 7, 33, 6, 43, 0, 77, 83, 0, 7, 33, 13, 39, 57, 77, 84, 0, 7, 33,
6, 43, 32, 77, 84, 1, 7, 37, 6, 36, 32, 77, 85, 0, 7, 33, 6, 43, 32,
77, 86, 0, 7, 10, 6, 10, 32, 77, 87, 0, 7, 46, 6, 58, 32, 77, 88, 0,
7, 5, 6, 4, 0, 77, 88, 1, 7, 21, 6, 22, 0, 77, 89, 0, 17, 41, 20, 47,
0, 77, 90, 0, 7, 16, 12, 14, 26, 78, 65, 0, 7, 16, 12, 14, 26, 78, 67,
0, 7, 33, 13, 39, 25, 78, 69, 0, 7, 33, 13, 39, 25, 78, 70, 0, 7, 42,
11, 45, 0, 78, 71, 0, 7, 26, 13, 26, 57, 78, 73, 0, 7, 14, 6, 17, 32,
78, 76, 0, 7, 33, 6, 43, 32, 78, 76, 1, 7, 37, 6, 36, 32, 78, 79, 0,
7, 33, 6, 43, 32, 78, 79, 1, 7, 37, 6, 36, 32, 78, 80, 0, 17, 9, 20,
8, 0, 78, 82, 0, 7, 33, 13, 39, 25, 78, 85, 0, 7, 14, 255, 255, 16,
78, 90, 0, 7, 43, 6, 52, 32, 79, 77, 0, 7, 33, 6, 43, 32, 80, 65, 0,
17, 0, 20, 24, 32, 80, 69, 0, 7, 14, 6, 17, 32, 80, 70, 0, 7, 33, 13,
39, 25, 80, 71, 0, 7, 2, 6, 0, 0, 80, 72, 0, 7, 43, 6, 52, 32, 80, 75,
0, 7, 49, 11, 55, 33, 80, 76, 0, 7, 33, 6, 43, 32, 80, 76, 1, 7, 37,
6, 36, 32, 80, 77, 0, 7, 33, 13, 39, 25, 80, 78, 0, 16, 8, 255, 255,
16, 80, 82, 0, 0, 14, 0, 17, 0, 80, 83, 0, 16, 8, 255, 255, 0, 80, 84,
0, 7, 33, 6, 43, 32, 80, 84, 1, 7, 37, 6, 36, 32, 80, 87, 0, 7, 15,
12, 18, 26, 80, 89, 0, 7, 46, 6, 58, 0, 80, 89, 1, 7, 43, 6, 52, 0,
81, 49, 0, 2, 8, 2, 7, 0, 81, 50, 0, 0, 31, 0, 29, 0, 81, 65, 0, 7,
49, 13, 57, 57, 82, 69, 0, 7, 33, 6, 43, 0, 82, 79, 0, 7, 33, 6, 43,
32, 82, 79, 1, 7, 37, 6, 36, 32, 82, 83, 0, 7, 33, 6, 43, 32, 82, 85,
0, 7, 8, 255, 255, 0, 82, 85, 5, 7, 11, 11, 9, 1, 82, 87, 0, 7, 33,
13, 39, 57, 83, 65, 0, 7, 34, 6, 32, 33, 83, 66, 0, 7, 8, 255, 255,
16, 83, 67, 0, 7, 45, 12, 51, 25, 83, 68, 0, 7, 8, 13, 255, 57, 83,
69, 0, 7, 33, 6, 43, 32, 83, 69, 1, 7, 37, 6, 36, 32, 83, 71, 0, 17,
44, 20, 50, 33, 83, 72, 0, 16, 8, 255, 255, 16, 83, 73, 0, 7, 33, 6,
43, 32, 83, 73, 1, 7, 37, 6, 36, 32, 83, 74, 0, 16, 8, 255, 255, 16,
83, 75, 0, 7, 33, 6, 43, 32, 83, 75, 1, 7, 37, 6, 36, 32, 83, 76, 0,
7, 33, 13, 39, 25, 83, 77, 0, 7, 33, 13, 39, 25, 83, 78, 0, 7, 33, 6,
43, 32, 83, 79, 0, 7, 8, 255, 255, 16, 83, 82, 0, 7, 33, 13, 39, 25,
83, 84, 0, 7, 33, 13, 39, 25, 83, 86, 0, 7, 14, 11, 17, 32, 83, 88,
0, 16, 8, 255, 255, 16, 83, 89, 0, 16, 8, 255, 255, 16, 83, 90, 0, 7,
33, 13, 39, 25, 84, 65, 0, 16, 8, 255, 255, 16, 84, 67, 0, 7, 33, 13,
39, 25, 84, 68, 0, 7, 33, 13, 39, 25, 84, 70, 0, 7, 33, 13, 39, 25,
84, 71, 0, 7, 33, 13, 39, 25, 84, 72, 0, 7, 43, 6, 52, 32, 84, 74, 0,
7, 33, 13, 39, 25, 84, 75, 0, 16, 8, 255, 255, 16, 84, 76, 0, 7, 33,
13, 39, 57, 84, 77, 0, 7, 33, 13, 39, 25, 84, 78, 0, 7, 5, 6, 4, 32,
84, 79, 0, 7, 8, 255, 255, 16, 84, 82, 0, 7, 5, 6, 4, 32, 84, 82, 7,
7, 33, 13, 39, 57, 84, 84, 0, 7, 43, 6, 52, 32, 84, 86, 0, 7, 8, 255,
255, 16, 84, 87, 0, 0, 50, 0, 63, 0, 84, 87, 2, 0, 51, 0, 61, 0, 84,
90, 0, 7, 33, 13, 39, 25, 85, 65, 0, 7, 8, 255, 255, 0, 85, 71, 0, 7,
34, 6, 31, 33, 85, 77, 0, 0, 14, 0, 17, 0, 85, 83, 0, 5, 32, 4, 30,
10, 85, 83, 25, 11, 8, 9, 7, 0, 85, 83, 26, 4, 8, 1, 7, 0, 85, 89, 0,
18, 43, 21, 52, 0, 85, 90, 0, 7, 33, 13, 39, 25, 86, 65, 0, 7, 33, 6,
43, 0, 86, 67, 0, 7, 15, 12, 18, 26, 86, 69, 0, 7, 41, 6, 47, 0, 86,
71, 0, 7, 33, 6, 43, 0, 86, 73, 0, 0, 14, 0, 17, 0, 86, 78, 0, 7, 5,
6, 4, 0, 86, 85, 0, 7, 43, 12, 49, 25, 87, 70, 0, 7, 33, 12, 43, 25,
87, 83, 0, 7, 43, 11, 49, 17, 88, 48, 0, 3, 20, 0, 21, 0, 88, 49, 0,
7, 41, 6, 47, 0, 88, 50, 0, 19, 3, 6, 2, 0, 88, 51, 0, 7, 33, 6, 35,
32, 88, 65, 0, 7, 3, 255, 255, 0, 88, 66, 0, 0, 23, 255, 255, 0, 88,
82, 0, 1, 52, 3, 62, 0, 88, 83, 0, 12, 4, 10, 1, 33, 88, 84, 0, 11,
8, 9, 7, 32, 88, 85, 0, 8, 37, 7, 37, 32, 88, 86, 0, 10, 8, 8, 7, 32,
88, 87, 0, 20, 35, 23, 33, 34, 88, 88, 0, 9, 33, 255, 255, 32, 88, 89,
0, 7, 33, 6, 43, 32, 88, 90, 0, 13, 8, 255, 255, 32, 89, 49, 0, 0, 14,
255, 255, 16, 89, 50, 0, 0, 14, 255, 255, 16, 89, 51, 0, 0, 14, 255,
255, 16, 89, 52, 0, 0, 14, 255, 255, 16, 89, 53, 0, 0, 14, 255, 255,
16, 89, 54, 0, 0, 14, 255, 255, 16, 89, 55, 0, 0, 14, 255, 255, 16,
89, 69, 0, 7, 45, 12, 51, 25, 89, 84, 0, 7, 33, 6, 43, 0, 89, 89, 0,
16, 8, 255, 255, 0, 90, 49, 0, 16, 8, 255, 255, 16, 90, 50, 0, 16, 8,
255, 255, 16, 90, 51, 0, 16, 8, 255, 255, 16, 90, 52, 0, 16, 8, 255,
255, 16, 90, 53, 0, 16, 8, 255, 255, 16, 90, 54, 0, 16, 8, 255, 255,
16, 90, 55, 0, 16, 8, 255, 255, 16, 90, 56, 0, 16, 8, 255, 255, 16,
90, 57, 0, 16, 8, 255, 255, 16, 90, 65, 0, 7, 33, 6, 43, 32, 90, 77,
0, 17, 41, 20, 47, 0, 90, 87, 0, 7, 33, 13, 39, 57, 38, 62, 8, 102,
142, 8, 151, 175, 8, 16, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16,
17, 18, 19, 18, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
19, 20, 21, 4, 5, 76, 0, 3, 76, 6, 3, 76, 10, 3, 76, 11, 3, 66, 12,
3, 1, 4, 62, 0, 0, 66, 4, 0, 62, 9, 0, 58, 10, 0, 4, 3, 58, 0, 3, 66,
7, 3, 58, 12, 3, 1, 5, 42, 0, 0, 50, 3, 0, 60, 8, 0, 54, 9, 0, 46, 10,
0, 4, 1, 56, 2, 3, 1, 1, 32, 1, 0, 4, 5, 58, 0, 3, 68, 6, 3, 74, 10,
3, 68, 11, 3, 66, 12, 3, 1, 5, 48, 0, 0, 58, 3, 0, 66, 8, 0, 58, 9,
0, 54, 10, 0, 4, 3, 86, 0, 0, 126, 7, 0, 86, 12, 0, 1, 3, 78, 0, 1,
126, 5, 1, 78, 10, 1, 4, 5, 70, 0, 0, 80, 6, 0, 80, 10, 0, 80, 11, 0,
72, 12, 0, 1, 5, 58, 0, 1, 68, 3, 1, 80, 8, 1, 68, 9, 1, 60, 10, 1,
4, 1, 64, 4, 0, 1, 1, 64, 2, 1, 4, 1, 76, 4, 3, 1, 1, 72, 2, 0, 4, 4,
60, 0, 3, 64, 8, 3, 44, 13, 3, 44, 16, 3, 1, 3, 40, 0, 0, 52, 5, 0,
46, 11, 0, 0, 2, 64, 3, 3, 46, 16, 3, 4, 2, 64, 2, 0, 44, 14, 0, 1,
3, 54, 0, 1, 64, 6, 1, 52, 12, 1, 6, 1, 76, 4, 0, 3, 1, 76, 2, 1, 6,
1, 76, 4, 0, 3, 1, 76, 2, 1, 6, 1, 76, 4, 0, 3, 1, 76, 2, 1, 6, 1, 76,
4, 0, 3, 1, 76, 2, 1, 6, 1, 76, 4, 0, 3, 1, 128, 2, 1, 4, 1, 64, 4,
0, 1, 1, 64, 2, 1, 6, 1, 84, 4, 3, 3, 1, 72, 2, 0, 4, 2, 120, 4, 0,
120, 17, 3, 1, 1, 120, 2, 1, 0, 0, 0, 1, 64, 4, 3, 4, 1, 80, 4, 0, 1,
1, 64, 2, 1, 4, 1, 88, 4, 0, 1, 1, 60, 2, 1, 6, 1, 100, 4, 0, 3, 1,
88, 2, 1, 4, 1, 64, 2, 3, 1, 1, 52, 1, 0, 4, 3, 56, 0, 3, 64, 9, 3,
56, 16, 3, 1, 2, 46, 0, 0, 52, 7, 0, 1, 18, 1, 255, 1, 58, 1, 14, 1,
15, 3, 29, 41, 55, 2, 19, 55, 3, 11, 1, 1, 1, 1, 10, 1, 11, 1, 12, 1,
13, 1, 14, 2, 2, 2, 10, 2, 11, 2, 12, 3, 9, 10, 10, 11, 11, 12, 12,
12, 13, 12, 14, 13, 13, 14, 14, 34, 46, 36, 48, 36, 64, 36, 116, 36,
140, 36, 144, 36, 161, 36, 165, 36, 177, 52, 52, 52, 60, 52, 64, 52,
124, 52, 140, 52, 144, 52, 165, 56, 60, 56, 64, 64, 64, 64, 100, 100,
100, 100, 116, 100, 140, 100, 144, 100, 165, 104, 128, 104, 136, 104,
140, 104, 165, 132, 140, 132, 144, 132, 165, 140, 140, 144, 144, 144,
165, 149, 149, 149, 161, 149, 165, 149, 177, 153, 161, 165, 165, 0,
145, 0, 146, 0, 147, 0, 148, 0, 149, 0, 150, 0, 151, 0, 152, 0, 153,
0, 154, 0, 0, 0, 4, 0, 0, 0, 28, 18, 0, 0, 42, 42, 42, 58, 42, 106,
42, 122, 42, 138, 42, 155, 42, 171, 58, 58, 106, 106, 106, 122, 106,
138, 106, 155, 122, 122, 122, 138, 122, 171, 138, 138, 138, 155, 155,
155, 155, 171, 42, 106, 106, 42, 58, 106, 106, 58, 42, 122, 122, 42,
58, 122, 122, 58, 42, 138, 138, 42, 58, 138, 138, 58, 106, 138, 138,
106, 42, 155, 155, 42, 58, 155, 155, 58, 106, 155, 155, 106, 122, 155,
155, 122, 138, 155, 155, 138, 42, 171, 171, 42, 58, 171, 171, 58, 106,
171, 171, 106, 122, 171, 171, 122, 138, 171, 171, 138, 0, 0, 1, 0, 0,
0, 164, 17, 0, 0, 1, 0, 0, 0, 81, 17, 0, 0, 1, 0, 0, 0, 6, 18, 0, 0,
24, 0, 159, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 93, 16, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 1, 0, 255, 1, 30, 2, 0, 3, 76, 1, 4, 76, 2, 2,
66, 12, 4, 1, 0, 255, 1, 30, 2, 0, 7, 72, 0, 2, 58, 0, 4, 68, 6, 4,
74, 8, 2, 74, 10, 4, 68, 11, 4, 66, 12, 4, 1, 0, 255, 1, 30, 2, 0, 2,
64, 2, 2, 56, 2, 4, 1, 0, 255, 1, 30, 2, 0, 5, 72, 0, 2, 76, 1, 4, 76,
7, 2, 72, 12, 2, 66, 12, 4, 1, 0, 255, 1, 30, 2, 0, 4, 58, 0, 4, 68,
2, 2, 66, 7, 4, 58, 12, 4, 1, 0, 255, 1, 30, 2, 0, 5, 92, 0, 2, 86,
0, 4, 126, 7, 1, 92, 12, 2, 86, 12, 4, 1, 0, 255, 1, 30, 2, 0, 5, 70,
0, 4, 80, 1, 2, 80, 7, 4, 76, 12, 2, 72, 12, 4, 2, 4, 255, 1, 20, 4,
2, 1, 76, 4, 1, 2, 0, 255, 1, 20, 4, 0, 1, 76, 4, 1, 3, 0, 4, 1, 20,
5, 2, 5, 76, 1, 4, 76, 4, 2, 70, 12, 4, 76, 14, 4, 54, 17, 2, 3, 0,
4, 1, 20, 5, 0, 6, 60, 0, 4, 68, 2, 2, 64, 8, 4, 48, 14, 2, 44, 14,
4, 64, 17, 2, 3, 0, 4, 1, 20, 5, 0, 3, 64, 3, 4, 64, 5, 2, 46, 16, 4,
2, 0, 3, 1, 20, 4, 0, 3, 64, 2, 1, 48, 14, 2, 44, 14, 4, 3, 0, 4, 1,
20, 5, 0, 6, 62, 0, 4, 66, 4, 2, 66, 7, 4, 62, 12, 4, 66, 14, 4, 42,
17, 2, 3, 0, 255, 1, 20, 5, 2, 2, 84, 4, 4, 78, 5, 2, 3, 0, 255, 1,
30, 5, 0, 1, 120, 5, 1, 0, 0, 255, 0, 0, 0, 2, 0, 255, 1, 23, 4, 2,
1, 92, 4, 1, 2, 0, 255, 1, 36, 4, 2, 1, 100, 4, 1, 2, 4, 3, 1, 20, 4,
2, 1, 76, 4, 1, 1, 0, 255, 1, 20, 2, 2, 1, 76, 2, 1, 2, 0, 255, 1, 20,
4, 4, 3, 56, 0, 4, 64, 9, 4, 56, 16, 4, 2, 1, 76, 4, 2, 0, 0, 0, 1,
0, 0, 0, 192, 29, 0, 0, 1, 0, 0, 0, 195, 29, 0, 0, 1, 0, 0, 0, 198,
29, 0, 0, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 8, 12, 13, 14,
15, 16, 17, 18, 19, 8, 4, 5, 6, 7, 8, 9, 10, 11, 0, 12, 4, 10, 2, 2,
2, 9, 1, 1, 1, 1, 1, 1, 3, 3, 4, 4, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1, 1,
1, 0, 9, 0, 19, 0, 22, 0, 24, 0, 32, 0, 35, 0, 42, 0, 53, 0, 59, 0,
73, 0, 75, 0, 77, 0, 80, 0, 87, 0, 92, 0, 95, 0, 101, 0, 104, 0, 117,
0, 127, 0, 130, 0, 132, 0, 134, 0, 142, 0, 144, 0, 160, 0, 173, 0, 175,
0, 183, 0, 188, 0, 190, 0, 192, 0, 195, 0, 212, 0, 217, 0, 227, 0, 229,
0, 242, 0, 248, 0, 251, 0, 1, 1, 4, 1, 11, 1, 15, 1, 18, 1, 42, 1, 46,
1, 53, 1, 6, 2, 2, 1, 1, 1, 1, 0, 6, 2, 5, 1, 1, 1, 7, 2, 4, 1, 1, 1,
2, 8, 4, 2, 2, 1, 1, 1, 14, 2, 2, 1, 1, 1, 1, 0, 6, 2, 5, 5, 1, 1, 7,
2, 4, 1, 1, 1, 2, 8, 4, 2, 2, 1, 1, 1, 13, 2, 2, 1, 1, 1, 1, 18, 4,
2, 2, 5, 1, 1, 10, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 12, 0, 1,
2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 4, 0, 1, 2, 3, 8, 12, 13, 14, 15, 16,
17, 18, 19, 8, 4, 5, 6, 7, 8, 9, 10, 11, 21, 2, 2, 18, 4, 5, 6, 7, 8,
9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 50, 48, 49, 57, 45,
48, 54, 45, 49, 49, 32, 48, 48, 58, 48, 56, 58, 53, 49, 0, 0, 3, 0,
0, 0, 196, 11, 0, 0, 1, 14, 1, 0, 3, 0, 0, 0, 120, 14, 0, 0, 42, 58,
16, 106, 138, 16, 155, 171, 16, 0, 0, 0, 3, 0, 0, 0, 28, 23, 0, 0, 21,
2, 2, 0, 9, 0, 19, 0, 22, 0, 24, 0, 32, 0, 35, 0, 42, 0, 53, 0, 59,
0, 73, 0, 75, 0, 77, 0, 80, 0, 87, 0, 92, 0, 95, 0, 101, 0, 104, 0,
117, 0, 127, 0, 130, 0, 132, 0, 134, 0, 142, 0, 144, 0, 160, 0, 173,
0, 175, 0, 183, 0, 188, 0, 190, 0, 192, 0, 195, 0, 212, 0, 217, 0, 227,
0, 229, 0, 242, 0, 248, 0, 251, 0, 1, 1, 4, 1, 11, 1, 15, 1, 18, 1,
46, 1, 52, 1, 21, 2, 2, 0, 0, 0, 3, 0, 0, 0, 40, 16, 0, 0, 102, 1, 0,
0, 148, 0, 0, 0, 34, 46, 4, 36, 64, 4, 100, 144, 4, 149, 177, 4, 104,
0, 0, 0, 4, 14, 0, 0, 119, 13, 0, 0, 99, 13, 0, 0, 112, 22, 0, 0, 64,
16, 0, 0, 172, 14, 0, 0, 232, 18, 0, 0, 241, 11, 0, 0, 76, 23, 0, 0,
20, 18, 0, 0, 156, 17, 0, 0, 84, 29, 0, 0, 255, 80, 161, 4, 76, 29,
0, 0, 184, 29, 0, 0, 92, 29, 0, 0, 12, 14, 0, 0, 201, 29, 0, 0, 112,
0, 0, 0, 84, 17, 0, 0, 6, 23, 0, 0, 34, 17, 0, 0, 205, 11, 0, 0, 103,
17, 0, 0, 176, 29, 0, 0, 124, 17, 0, 0, 64, 23, 0, 0, 248, 22, 0, 0,
104, 22, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
4, 0, 3, 1, 128, 2, 1, 4, 1, 64, 4, 0, 1, 1, 64, 2, 1, 6, 1, 84, 4,
3, 3, 1, 72, 2, 0, 4, 2, 120, 4, 0, 120, 17, 3, 1, 1, 120, 2, 1, 0,
0, 0, 1, 64, 4, 3, 4, 1, 80, 4, 0, 1, 1, 64, 2, 1, 4, 1, 88, 4, 0, 1,
1, 60, 2, 1, 6, 1, 100, 4, 0, 3, 1, 88, 2, 1, 4, 1, 64, 2, 3, 1, 1,
52, 1, 0, 4, 3, 56, 0, 3, 64, 9, 3, 56, 16, 3, 1, 2, 46, 0, 0, 52, 7,
0, 1, 18, 1, 255, 1, 58, 1, 14, 1, 15, 3, 29, 41, 55, 2, 19, 55, 3,
11, 1, 1, 1, 1, 10, 1, 11, 1, 12, 1, 13, 1, 14, 2, 2, 2, 10, 2, 11,
2, 12, 3, 9, 10, 10, 11, 11, 12, 12, 12, 13, 12, 14, 13, 13, 14, 14,
34, 46, 36, 48, 36, 64, 36, 116, 36, 140, 36, 144, 36, 161, 36, 165,
36, 177, 52, 52, 52, 60, 52, 64, 52, 124, 52, 140, 52, 144, 52, 165,
56, 60, 56, 64, 64, 64, 64, 100, 100, 100, 100, 116, 100, 140, 100,
144, 100, 165, 104, 128, 104, 136, 104, 140, 104, 165, 132, 140, 132,
144, 132, 165, 140, 140, 144, 144, 144, 165, 149, 149, 149, 161, 149,
165, 149, 177, 153, 161, 165, 165, 0, 145, 0, 146, 0, 147, 0, 148, 0,
149, 0, 150, 0, 151, 0, 152, 0, 153, 0, 154, 0, 0, 0, 4, 0, 0, 0, 28,
18, 0, 0, 42, 42, 42, 58, 42, 106, 42, 122, 42, 138, 42, 155, 42, 171,
58, 58, 106, 106, 106, 122, 106, 138, 106, 155, 122, 122, 122, 138,
122, 171, 138, 138, 138, 155, 155, 155, 155, 171, 42, 106, 106, 42,
58, 106, 106, 58, 42, 122, 122, 42, 58, 122, 122, 58, 42, 138, 138,
42, 58, 138, 138, 58, 106, 138, 138, 106, 42, 155, 155, 42, 58, 155,
155, 58, 106, 155, 155, 106, 122, 155, 155, 122, 138, 155, 155, 138,
42, 171, 171, 42, 58, 171, 171, 58, 106, 171, 171, 106, 122, 171, 171,
122, 138, 171, 171, 138, 0, 0, 1, 0, 0, 0, 164, 17, 0, 0, 1, 0, 0, 0,
81, 17, 0, 0, 1, 0, 0, 0, 6, 18, 0, 0, 24, 0, 159, 0, 0, 0, 0, 0, 0,
0, 0, 0, 2, 0, 0, 0, 93, 16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 255,
1, 30, 2, 0, 3, 76, 1, 4, 76, 2, 2, 66, 12, 4, 1, 0, 255, 1, 30, 2,
0, 7, 72, 0, 2, 58, 0, 4, 68, 6, 4, 74, 8, 2, 74, 10, 4, 68, 11, 4,
66, 12, 4, 1, 0, 255, 1, 30, 2, 0, 2, 64, 2, 2, 56, 2, 4, 1, 0, 255,
1, 30, 2, 0, 5, 72, 0, 2, 76, 1, 4, 76, 7, 2, 72, 12, 2, 66, 12, 4,
1, 0, 255, 1, 30, 2, 0, 4, 58, 0, 4, 68, 2, 2, 66, 7, 4, 58, 12, 4,
1, 0, 255, 1, 30, 2, 0, 5, 92, 0, 2, 86, 0, 4, 126, 7, 1, 92, 12, 2,
86, 12, 4, 1, 0, 255, 1, 30, 2, 0, 5, 70, 0, 4, 80, 1, 2, 80, 7, 4,
76, 12, 2, 72, 12, 4, 2, 4, 255, 1, 20, 4, 2, 1, 76, 4, 1, 2, 0, 255,
1, 20, 4, 0, 1, 76, 4, 1, 3, 0, 4, 1, 20, 5, 2, 5, 76, 1, 4, 76, 4,
2, 70, 12, 4, 76, 14, 4, 54, 17, 2, 3, 0, 4, 1, 20, 5, 0, 6, 60, 0,
4, 68, 2, 2, 64, 8, 4, 48, 14, 2, 44, 14, 4, 64, 17, 2, 3, 0, 4, 1,
20, 5, 0, 3, 64, 3, 4, 64, 5, 2, 46, 16, 4, 2, 0, 3, 1, 20, 4, 0, 3,
64, 2, 1, 48, 14, 2, 44, 14, 4, 3, 0, 4, 1, 20, 5, 0, 6, 62, 0, 4, 66,
4, 2, 66, 7, 4, 62, 12, 4, 66, 14, 4, 42, 17, 2, 3, 0, 255, 1, 20, 5,
2, 2, 84, 4, 4, 78, 5, 2, 3, 0, 255, 1, 30, 5, 0, 1, 120, 5, 1, 0, 0,
255, 0, 0, 0, 2, 0, 255, 1, 23, 4, 2, 1, 92, 4, 1, 2, 0, 255, 1, 36,
4, 2, 1, 100, 4, 1, 2, 4, 3, 1, 20, 4, 2, 1, 76, 4, 1, 1, 0, 255, 1,
20, 2, 2, 1, 76, 2, 1, 2, 0, 255, 1, 20, 4, 4, 3, 56, 0, 4, 64, 9, 4,
56, 16, 4, 2, 1, 76, 4, 2, 0, 0, 0, 1, 0, 0, 0, 192, 29, 0, 0, 1, 0,
0, 0, 195, 29, 0, 0, 1, 0, 0, 0, 198, 29, 0, 0, 10, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 8, 12, 13, 14, 15, 16, 17, 18, 19, 8, 4, 5,
6, 7, 8, 9, 10, 11, 0, 12, 4, 10, 2, 2, 2, 9, 1, 1, 1, 1, 1, 1, 3, 3,
4, 4, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1, 1, 1, 0, 9, 0, 19, 0, 22, 0, 24,
0, 32, 0, 35, 0, 42, 0, 53, 0, 59, 0, 73, 0, 75, 0, 77, 0, 80, 0, 87,
0, 92, 0, 95, 0, 101, 0, 104, 0, 117, 0, 127, 0, 130, 0, 132, 0, 134,
0, 142, 0, 144, 0, 160, 0, 173, 0, 175, 0, 183, 0, 188, 0, 190, 0, 192,
0, 195, 0, 212, 0, 217, 0, 227, 0, 229, 0, 242, 0, 248, 0, 251, 0, 1,
1, 4, 1, 11, 1, 15, 1, 18, 1, 42, 1, 46, 1, 53, 1, 6, 2, 2, 1, 1, 1,
1, 0, 6, 2, 5, 1, 1, 1, 7, 2, 4, 1, 1, 1, 2, 8, 4, 2, 2, 1, 1, 1, 14,
2, 2, 1, 1, 1, 1, 0, 6, 2, 5, 5, 1, 1, 7, 2, 4, 1, 1, 1, 2, 8, 4, 2,
2, 1, 1, 1, 13, 2, 2, 1, 1, 1, 1, 18, 4, 2, 2, 5, 1, 1, 10, 12, 13,
14, 15, 16, 17, 18, 19, 20, 21, 12, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10,
11, 4, 0, 1, 2, 3, 8, 12, 13, 14, 15, 16, 17, 18, 19, 8, 4, 5, 6, 7,
8, 9, 10, 11, 21, 2, 2, 18, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19, 20, 21, 50, 48, 49, 57, 45, 48, 56, 45, 48, 49, 32,
49, 50, 58, 51, 53, 58, 48, 50, 0, 0, 3, 0, 0, 0, 196, 11, 0, 0, 1,
14, 1, 0, 3, 0, 0, 0, 120, 14, 0, 0, 42, 58, 16, 106, 138, 16, 155,
171, 16, 0, 0, 0, 3, 0, 0, 0, 28, 23, 0, 0, 21, 2, 2, 0, 9, 0, 19, 0,
22, 0, 24, 0, 32, 0, 35, 0, 42, 0, 53, 0, 59, 0, 73, 0, 75, 0, 77, 0,
80, 0, 87, 0, 92, 0, 95, 0, 101, 0, 104, 0, 117, 0, 127, 0, 130, 0,
132, 0, 134, 0, 142, 0, 144, 0, 160, 0, 173, 0, 175, 0, 183, 0, 188,
0, 190, 0, 192, 0, 195, 0, 212, 0, 217, 0, 227, 0, 229, 0, 242, 0, 248,
0, 251, 0, 1, 1, 4, 1, 11, 1, 15, 1, 18, 1, 46, 1, 52, 1, 21, 2, 2,
0, 0, 0, 3, 0, 0, 0, 40, 16, 0, 0, 102, 1, 0, 0, 148, 0, 0, 0, 34, 46,
4, 36, 64, 4, 100, 144, 4, 149, 177, 4, 104, 0, 0, 0, 4, 14, 0, 0, 119,
13, 0, 0, 99, 13, 0, 0, 112, 22, 0, 0, 64, 16, 0, 0, 172, 14, 0, 0,
232, 18, 0, 0, 241, 11, 0, 0, 76, 23, 0, 0, 20, 18, 0, 0, 156, 17, 0,
0, 84, 29, 0, 0, 255, 80, 161, 4, 76, 29, 0, 0, 184, 29, 0, 0, 92, 29,
0, 0, 12, 14, 0, 0, 201, 29, 0, 0, 112, 0, 0, 0, 84, 17, 0, 0, 6, 23,
0, 0, 34, 17, 0, 0, 205, 11, 0, 0, 103, 17, 0, 0, 176, 29, 0, 0, 124,
17, 0, 0, 64, 23, 0, 0, 248, 22, 0, 0, 104, 22, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
12, 18, 0, 0, 136, 17, 0, 0, 10, 2, 255, 3, 17, 19, 24, 29, 30, 55,
0, 4, 56, 19, 2, 70, 28, 2, 58, 36, 2, 70, 55, 2, 14, 0, 255, 2, 23,
19, 23, 55, 2, 2, 84, 19, 2, 84, 55, 2, 14, 0, 255, 2, 23, 19, 23, 55,
0, 2, 66, 19, 2, 66, 55, 2, 23, 1, 1, 4, 23, 19, 17, 29, 23, 40, 30,
55, 2, 2, 84, 22, 2, 84, 55, 2, 24, 1, 5, 2, 23, 23, 30, 55, 0, 4, 56,
19, 2, 58, 29, 2, 60, 41, 2, 70, 55, 2, 15, 1, 255, 1, 23, 20, 2, 1,
84, 20, 2, 15, 1, 255, 1, 23, 20, 2, 1, 84, 20, 2, 20, 1, 255, 2, 21,
20, 21, 55, 2, 2, 84, 20, 2, 84, 55, 2, 0, 0, 255, 0, 0, 0, 19, 1, 255,
2, 23, 20, 23, 54, 0, 2, 66, 20, 2, 66, 54, 2, 20, 1, 255, 2, 23, 20,
20, 55, 0, 2, 66, 20, 2, 64, 55, 2, 20, 1, 255, 2, 23, 20, 20, 55, 2,
2, 92, 20, 2, 80, 55, 2, 9, 0, 255, 1, 23, 19, 2, 1, 84, 19, 2, 9, 0,
255, 1, 20, 19, 0, 1, 56, 19, 2, 11, 2, 255, 3, 17, 19, 24, 31, 30,
55, 0, 5, 56, 19, 2, 70, 28, 2, 58, 36, 2, 68, 40, 2, 70, 55, 2, 13,
2, 255, 3, 17, 19, 24, 32, 30, 55, 0, 5, 56, 19, 2, 78, 28, 2, 64, 36,
2, 68, 38, 2, 78, 46, 2, 26, 1, 255, 2, 23, 20, 30, 42, 2, 2, 84, 23,
2, 112, 55, 2, 13, 2, 255, 3, 17, 19, 24, 32, 30, 55, 0, 7, 58, 19,
2, 84, 27, 2, 76, 35, 2, 72, 38, 2, 80, 44, 2, 68, 50, 2, 80, 52, 2,
27, 0, 255, 1, 30, 26, 0, 1, 120, 26, 2, 26, 2, 255, 1, 30, 25, 0, 1,
120, 25, 2, 10, 2, 2, 3, 17, 19, 24, 29, 30, 55, 0, 4, 56, 19, 2, 70,
28, 2, 58, 36, 2, 70, 55, 2, 10, 2, 255, 3, 17, 19, 24, 29, 30, 55,
0, 4, 56, 19, 2, 66, 28, 2, 60, 36, 2, 66, 55, 2, 20, 2, 255, 2, 23,
20, 33, 55, 2, 2, 84, 20, 2, 84, 55, 2, 10, 2, 1, 3, 17, 19, 24, 29,
30, 55, 0, 4, 56, 19, 2, 70, 28, 2, 58, 36, 2, 70, 55, 2, 32, 2, 255,
1, 30, 40, 2, 1, 84, 40, 2, 29, 2, 255, 2, 21, 29, 30, 55, 0, 2, 60,
29, 2, 68, 55, 2, 29, 1, 255, 2, 30, 29, 30, 55, 2, 2, 112, 29, 2, 112,
55, 2, 5, 2, 0, 2, 23, 18, 23, 19, 2, 2, 84, 18, 2, 84, 19, 2, 7, 2,
0, 2, 23, 18, 23, 20, 2, 2, 84, 18, 2, 84, 20, 2, 8, 2, 0, 3, 23, 18,
23, 20, 30, 40, 2, 2, 84, 18, 2, 84, 22, 2, 6, 1, 255, 4, 14, 18, 14,
19, 20, 30, 20, 54, 0, 4, 48, 18, 2, 48, 19, 2, 60, 30, 2, 60, 54, 2,
14, 0, 255, 2, 17, 19, 30, 55, 0, 2, 56, 19, 2, 68, 55, 2, 12, 2, 255,
3, 17, 19, 24, 32, 30, 56, 0, 6, 62, 19, 2, 90, 28, 2, 80, 37, 2, 90,
43, 2, 86, 48, 2, 118, 56, 2, 22, 1, 255, 2, 23, 20, 30, 40, 2, 1, 84,
22, 2, 25, 1, 255, 1, 23, 24, 2, 1, 84, 24, 2, 14, 0, 6, 2, 17, 19,
20, 55, 0, 2, 56, 19, 2, 60, 55, 2, 18, 1, 255, 2, 20, 20, 20, 47, 2,
2, 72, 20, 2, 72, 47, 2, 22, 1, 255, 2, 23, 20, 30, 40, 2, 1, 84, 22,
2, 22, 2, 255, 1, 20, 22, 0, 2, 62, 20, 2, 66, 40, 2, 16, 2, 255, 2,
20, 20, 28, 40, 2, 2, 84, 20, 2, 112, 40, 2, 4, 0, 255, 1, 23, 18, 2,
1, 84, 18, 2, 20, 1, 255, 2, 23, 20, 30, 55, 2, 2, 84, 20, 2, 84, 55,
2, 21, 1, 255, 3, 23, 20, 30, 39, 30, 49, 2, 2, 84, 21, 2, 84, 49, 2,
26, 1, 255, 3, 23, 20, 24, 41, 30, 55, 2, 1, 84, 25, 2, 26, 1, 255,
3, 23, 20, 24, 41, 30, 55, 2, 1, 84, 25, 2, 17, 1, 255, 2, 23, 20, 30,
42, 2, 2, 84, 20, 2, 112, 42, 2, 34, 0, 255, 1, 27, 55, 2, 1, 84, 55,
2, 34, 0, 255, 1, 30, 55, 0, 1, 78, 55, 2, 34, 0, 255, 1, 27, 55, 2,
1, 84, 55, 2, 34, 0, 255, 1, 20, 55, 2, 1, 76, 55, 2, 31, 2, 255, 2,
17, 35, 30, 55, 0, 2, 68, 35, 2, 68, 55, 2, 30, 2, 255, 3, 17, 35, 24,
40, 30, 55, 0, 3, 56, 35, 2, 68, 40, 2, 68, 55, 2, 28, 2, 255, 3, 17,
29, 24, 40, 30, 55, 0, 3, 56, 29, 2, 58, 40, 2, 62, 55, 2, 33, 0, 255,
1, 27, 54, 2, 1, 84, 54, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2,
1, 4, 1, 5, 1, 18, 2, 18, 19, 4, 18, 19, 30, 54, 2, 18, 20, 2, 18, 22,
1, 19, 3, 19, 29, 55, 3, 19, 31, 55, 3, 19, 32, 56, 2, 19, 33, 2, 19,
55, 1, 20, 2, 20, 40, 2, 20, 42, 2, 20, 47, 2, 20, 54, 2, 20, 55, 2,
21, 49, 1, 22, 2, 22, 55, 2, 23, 55, 1, 24, 1, 25, 1, 26, 3, 29, 40,
55, 2, 29, 55, 3, 35, 40, 55, 2, 35, 55, 1, 40, 1, 54, 1, 55, 0, 0,
0, 1, 0, 0, 0, 220, 16, 0, 0, 4, 0, 0, 0, 227, 16, 0, 0, 5, 0, 0, 0,
255, 16, 0, 0, 50, 50, 32, 114, 114, 32, 163, 163, 32, 0, 0, 0, 3, 0,
0, 0, 236, 22, 0, 0, 84, 0, 69, 1, 74, 1, 18, 4, 5, 6, 7, 8, 9, 10,
11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 0, 0, 0, 68, 69, 0, 0, 3,
0, 0, 0, 0, 23, 0, 0, 74, 80, 0, 0, 10, 0, 0, 0, 238, 13, 0, 0, 85,
83, 0, 0, 2, 0, 0, 0, 72, 23, 0, 0, 3, 0, 0, 0, 144, 17, 0, 0, 252,
0, 253, 0, 4, 2, 64, 19, 1, 64, 55, 1, 1, 2, 40, 14, 0, 40, 39, 0, 4,
4, 56, 19, 0, 58, 29, 0, 60, 41, 0, 70, 55, 0, 5, 3, 52, 15, 1, 64,
30, 1, 72, 39, 1, 8, 3, 52, 1, 0, 64, 10, 0, 72, 17, 0, 4, 3, 60, 20,
1, 60, 40, 1, 60, 55, 1, 1, 3, 56, 14, 0, 60, 25, 0, 60, 39, 0, 6, 1,
84, 20, 0, 7, 1, 84, 15, 1, 10, 1, 84, 1, 0, 4, 1, 60, 20, 1, 1, 1,
56, 15, 0, 6, 1, 84, 20, 0, 7, 1, 88, 15, 1, 10, 1, 88, 1, 0, 6, 2,
84, 20, 0, 84, 55, 0, 7, 2, 84, 15, 1, 84, 39, 1, 10, 2, 84, 1, 0, 84,
17, 0, 0, 0, 4, 2, 66, 20, 1, 66, 54, 1, 1, 2, 54, 15, 0, 54, 39, 0,
6, 2, 92, 20, 0, 80, 55, 0, 7, 2, 88, 15, 1, 76, 39, 1, 10, 2, 88, 1,
0, 76, 17, 0, 4, 2, 66, 20, 1, 64, 55, 1, 1, 2, 56, 15, 0, 56, 39, 0,
4, 1, 56, 19, 1, 1, 1, 48, 14, 0, 4, 1, 60, 19, 1, 1, 1, 56, 14, 0,
4, 1, 60, 19, 1, 1, 1, 56, 14, 0, 6, 2, 84, 23, 0, 112, 55, 0, 7, 2,
88, 19, 1, 116, 39, 1, 10, 2, 88, 4, 0, 116, 17, 0, 4, 5, 56, 19, 1,
70, 28, 1, 58, 36, 1, 68, 40, 1, 70, 55, 1, 1, 7, 52, 13, 0, 66, 22,
0, 68, 23, 0, 52, 26, 0, 62, 27, 0, 72, 33, 0, 74, 39, 0, 4, 11, 58,
19, 0, 84, 27, 0, 76, 34, 0, 76, 36, 0, 72, 38, 0, 80, 44, 0, 68, 50,
0, 80, 51, 0, 80, 53, 0, 80, 57, 0, 80, 58, 0, 5, 10, 58, 13, 1, 66,
22, 1, 80, 23, 1, 62, 26, 1, 66, 27, 1, 82, 32, 1, 74, 35, 1, 76, 37,
1, 72, 38, 1, 80, 41, 1, 8, 5, 52, 0, 0, 58, 7, 0, 50, 8, 0, 82, 13,
0, 72, 17, 0, 4, 6, 56, 19, 1, 68, 28, 1, 56, 36, 1, 68, 38, 1, 68,
45, 1, 68, 55, 1, 1, 6, 48, 14, 0, 68, 23, 0, 48, 26, 0, 62, 27, 0,
74, 33, 0, 72, 39, 0, 4, 5, 56, 19, 0, 78, 28, 0, 64, 36, 0, 68, 38,
0, 78, 46, 0, 5, 10, 62, 13, 1, 62, 22, 1, 78, 23, 1, 50, 26, 1, 56,
27, 1, 78, 32, 1, 78, 35, 1, 78, 37, 1, 60, 38, 1, 78, 41, 1, 8, 6,
58, 0, 0, 64, 7, 0, 76, 8, 0, 76, 12, 0, 78, 15, 0, 72, 17, 0, 4, 1,
120, 26, 0, 5, 1, 120, 21, 1, 12, 1, 120, 6, 0, 76, 34, 120, 19, 0,
120, 20, 0, 120, 21, 0, 120, 22, 0, 120, 23, 0, 120, 24, 0, 120, 25,
0, 120, 26, 0, 120, 27, 0, 120, 28, 0, 120, 29, 0, 120, 30, 0, 120,
31, 0, 120, 32, 0, 120, 33, 0, 120, 34, 0, 120, 35, 0, 120, 36, 0, 120,
37, 0, 120, 38, 0, 120, 39, 0, 120, 40, 0, 120, 41, 0, 120, 42, 0, 120,
43, 0, 120, 44, 0, 120, 45, 0, 120, 46, 0, 120, 47, 0, 120, 48, 0, 120,
49, 0, 120, 50, 0, 120, 51, 0, 120, 52, 0, 9, 1, 120, 2, 0, 4, 1, 120,
25, 0, 5, 1, 120, 20, 1, 12, 1, 120, 5, 0, 76, 24, 120, 19, 0, 120,
20, 0, 120, 21, 0, 120, 22, 0, 120, 23, 0, 120, 24, 0, 120, 25, 0, 120,
26, 0, 120, 27, 0, 120, 28, 0, 120, 29, 0, 120, 30, 0, 120, 31, 0, 120,
32, 0, 120, 33, 0, 120, 34, 0, 120, 35, 0, 120, 36, 0, 120, 37, 0, 120,
38, 0, 120, 39, 0, 120, 40, 0, 120, 41, 0, 120, 42, 0, 9, 1, 120, 1,
0, 4, 4, 56, 19, 1, 70, 28, 1, 58, 36, 1, 70, 55, 1, 1, 4, 48, 14, 0,
62, 23, 0, 48, 26, 0, 60, 39, 0, 4, 4, 56, 19, 1, 66, 28, 1, 60, 36,
1, 66, 55, 1, 1, 3, 56, 14, 0, 60, 24, 0, 60, 39, 0, 6, 2, 84, 20, 0,
84, 55, 0, 7, 2, 88, 15, 1, 88, 39, 1, 10, 2, 88, 1, 0, 88, 17, 0, 4,
4, 56, 19, 1, 70, 28, 1, 58, 36, 1, 70, 55, 1, 1, 4, 48, 14, 0, 62,
23, 0, 48, 26, 0, 60, 39, 0, 4, 2, 60, 29, 1, 68, 55, 1, 1, 2, 56, 24,
0, 56, 39, 0, 6, 2, 112, 29, 0, 112, 55, 0, 7, 2, 112, 24, 1, 112, 39,
1, 10, 2, 112, 7, 0, 112, 17, 0, 0, 2, 64, 18, 1, 64, 20, 1, 4, 4, 48,
18, 0, 48, 19, 0, 60, 30, 0, 60, 54, 0, 5, 2, 48, 17, 1, 48, 39, 1,
8, 2, 48, 2, 0, 48, 17, 0, 4, 2, 56, 19, 1, 68, 55, 1, 1, 2, 48, 14,
0, 60, 39, 0, 4, 6, 62, 19, 0, 90, 28, 0, 80, 37, 0, 90, 43, 0, 86,
48, 0, 118, 56, 0, 5, 6, 74, 14, 1, 98, 23, 1, 66, 26, 1, 74, 27, 1,
98, 34, 1, 118, 40, 1, 8, 5, 74, 0, 0, 78, 7, 0, 82, 9, 0, 98, 15, 0,
118, 18, 0, 6, 1, 84, 24, 0, 7, 1, 88, 20, 1, 10, 1, 88, 5, 0, 6, 1,
84, 24, 0, 7, 1, 88, 20, 1, 10, 1, 88, 5, 0, 4, 2, 56, 19, 0, 60, 55,
0, 5, 2, 48, 14, 1, 60, 39, 1, 8, 2, 64, 0, 0, 70, 17, 0, 6, 2, 72,
20, 0, 72, 47, 0, 3, 2, 76, 15, 1, 76, 35, 1, 4, 2, 60, 20, 1, 60, 40,
1, 1, 2, 56, 15, 0, 64, 29, 0, 4, 2, 60, 20, 1, 60, 40, 1, 1, 1, 56,
18, 0, 4, 2, 84, 20, 1, 84, 40, 1, 1, 1, 56, 18, 0, 6, 1, 84, 22, 0,
7, 1, 88, 18, 1, 10, 1, 88, 3, 0, 6, 1, 84, 22, 0, 7, 1, 88, 18, 1,
10, 1, 88, 3, 0, 6, 2, 84, 20, 0, 112, 40, 0, 3, 2, 68, 15, 1, 96, 29,
1, 4, 2, 66, 20, 0, 66, 40, 0, 1, 2, 42, 15, 1, 64, 29, 1, 4, 2, 62,
20, 1, 66, 40, 1, 1, 2, 42, 15, 0, 64, 29, 0, 4, 2, 60, 20, 0, 60, 40,
0, 1, 2, 56, 15, 1, 64, 29, 1, 0, 0, 4, 4, 60, 20, 1, 60, 39, 1, 60,
47, 1, 60, 55, 1, 1, 4, 56, 15, 0, 60, 28, 0, 60, 35, 0, 60, 39, 0,
6, 2, 84, 21, 0, 84, 49, 0, 7, 2, 88, 16, 1, 88, 36, 1, 10, 2, 88, 2,
0, 88, 16, 0, 4, 2, 60, 20, 1, 60, 55, 1, 1, 2, 56, 15, 0, 60, 39, 0,
0, 2, 60, 20, 1, 60, 55, 1, 6, 1, 84, 25, 0, 7, 1, 84, 20, 1, 10, 1,
84, 5, 0, 6, 1, 84, 25, 0, 7, 1, 88, 20, 1, 10, 1, 88, 5, 0, 6, 2, 84,
20, 0, 112, 42, 0, 7, 2, 88, 15, 1, 116, 31, 1, 10, 2, 88, 1, 0, 116,
11, 0, 4, 3, 60, 20, 1, 60, 40, 1, 60, 55, 1, 1, 3, 56, 15, 0, 64, 29,
0, 60, 39, 0, 4, 1, 60, 55, 1, 1, 1, 52, 39, 0, 6, 1, 80, 55, 0, 7,
1, 80, 39, 1, 10, 1, 80, 17, 0, 6, 1, 80, 55, 0, 7, 1, 80, 39, 1, 10,
1, 80, 17, 0, 6, 1, 76, 55, 0, 7, 1, 68, 39, 1, 10, 1, 68, 17, 0, 6,
1, 76, 55, 0, 7, 1, 76, 39, 1, 10, 1, 76, 17, 0, 4, 1, 60, 55, 1, 1,
1, 60, 39, 0, 6, 1, 84, 55, 0, 7, 1, 88, 39, 1, 10, 1, 88, 17, 0, 4,
1, 78, 55, 0, 5, 1, 78, 39, 1, 8, 1, 78, 17, 0, 4, 3, 56, 35, 1, 68,
40, 1, 68, 55, 1, 1, 4, 48, 26, 0, 62, 27, 0, 74, 33, 0, 72, 39, 0,
4, 3, 56, 29, 1, 58, 40, 1, 62, 55, 1, 1, 4, 46, 23, 0, 48, 26, 0, 56,
29, 0, 56, 39, 0, 4, 2, 68, 35, 1, 68, 55, 1, 1, 2, 66, 26, 0, 60, 39,
0, 2, 1, 84, 54, 0, 0, 0, 88, 65, 0, 0, 2, 0, 0, 0, 144, 14, 0, 0, 88,
84, 0, 0, 47, 0, 0, 0, 168, 17, 0, 0, 88, 86, 0, 0, 48, 0, 0, 0, 124,
16, 0, 0, 3, 0, 0, 0, 212, 22, 0, 0, 3, 0, 0, 0, 40, 29, 0, 0, 3, 3,
3, 9, 3, 11, 4, 4, 4, 7, 4, 8, 4, 10, 4, 11, 5, 7, 8, 8, 9, 9, 9, 11,
11, 11, 38, 38, 38, 46, 38, 62, 38, 110, 38, 118, 38, 134, 38, 142,
38, 159, 38, 175, 46, 46, 54, 54, 54, 62, 54, 134, 62, 62, 102, 102,
102, 110, 102, 134, 102, 142, 102, 159, 110, 126, 110, 134, 110, 142,
134, 134, 134, 159, 142, 142, 151, 151, 151, 159, 151, 175, 159, 159,
1, 0, 0, 0, 116, 13, 0, 0, 3, 0, 0, 0, 148, 14, 0, 0, 2, 2, 2, 2, 2,
2, 2, 2, 2, 50, 50, 50, 114, 50, 163, 114, 163, 4, 168, 0, 0
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 18, 0, 0, 136, 17, 0, 0,
10, 2, 255, 3, 17, 19, 24, 29, 30, 55, 0, 4, 56, 19, 2, 70, 28, 2, 58,
36, 2, 70, 55, 2, 14, 0, 255, 2, 23, 19, 23, 55, 2, 2, 84, 19, 2, 84,
55, 2, 14, 0, 255, 2, 23, 19, 23, 55, 0, 2, 66, 19, 2, 66, 55, 2, 23,
1, 1, 4, 23, 19, 17, 29, 23, 40, 30, 55, 2, 2, 84, 22, 2, 84, 55, 2,
24, 1, 5, 2, 23, 23, 30, 55, 0, 4, 56, 19, 2, 58, 29, 2, 60, 41, 2,
70, 55, 2, 15, 1, 255, 1, 23, 20, 2, 1, 84, 20, 2, 15, 1, 255, 1, 23,
20, 2, 1, 84, 20, 2, 20, 1, 255, 2, 21, 20, 21, 55, 2, 2, 84, 20, 2,
84, 55, 2, 0, 0, 255, 0, 0, 0, 19, 1, 255, 2, 23, 20, 23, 54, 0, 2,
66, 20, 2, 66, 54, 2, 20, 1, 255, 2, 23, 20, 20, 55, 0, 2, 66, 20, 2,
64, 55, 2, 20, 1, 255, 2, 23, 20, 20, 55, 2, 2, 92, 20, 2, 80, 55, 2,
9, 0, 255, 1, 23, 19, 2, 1, 84, 19, 2, 9, 0, 255, 1, 20, 19, 0, 1, 56,
19, 2, 11, 2, 255, 3, 17, 19, 24, 31, 30, 55, 0, 5, 56, 19, 2, 70, 28,
2, 58, 36, 2, 68, 40, 2, 70, 55, 2, 13, 2, 255, 3, 17, 19, 24, 32, 30,
55, 0, 5, 56, 19, 2, 78, 28, 2, 64, 36, 2, 68, 38, 2, 78, 46, 2, 26,
1, 255, 2, 23, 20, 30, 42, 2, 2, 84, 23, 2, 112, 55, 2, 13, 2, 255,
3, 17, 19, 24, 32, 30, 55, 0, 7, 58, 19, 2, 84, 27, 2, 76, 35, 2, 72,
38, 2, 80, 44, 2, 68, 50, 2, 80, 52, 2, 27, 0, 255, 1, 30, 26, 0, 1,
120, 26, 2, 26, 2, 255, 1, 30, 25, 0, 1, 120, 25, 2, 10, 2, 2, 3, 17,
19, 24, 29, 30, 55, 0, 4, 56, 19, 2, 70, 28, 2, 58, 36, 2, 70, 55, 2,
10, 2, 255, 3, 17, 19, 24, 29, 30, 55, 0, 4, 56, 19, 2, 66, 28, 2, 60,
36, 2, 66, 55, 2, 20, 2, 255, 2, 23, 20, 33, 55, 2, 2, 84, 20, 2, 84,
55, 2, 10, 2, 1, 3, 17, 19, 24, 29, 30, 55, 0, 4, 56, 19, 2, 70, 28,
2, 58, 36, 2, 70, 55, 2, 32, 2, 255, 1, 30, 40, 2, 1, 84, 40, 2, 29,
2, 255, 2, 21, 29, 30, 55, 0, 2, 60, 29, 2, 68, 55, 2, 29, 1, 255, 2,
30, 29, 30, 55, 2, 2, 112, 29, 2, 112, 55, 2, 5, 2, 0, 2, 23, 18, 23,
19, 2, 2, 84, 18, 2, 84, 19, 2, 7, 2, 0, 2, 23, 18, 23, 20, 2, 2, 84,
18, 2, 84, 20, 2, 8, 2, 0, 3, 23, 18, 23, 20, 30, 40, 2, 2, 84, 18,
2, 84, 22, 2, 6, 1, 255, 4, 14, 18, 14, 19, 20, 30, 20, 54, 0, 4, 48,
18, 2, 48, 19, 2, 60, 30, 2, 60, 54, 2, 14, 0, 255, 2, 17, 19, 30, 55,
0, 2, 56, 19, 2, 68, 55, 2, 12, 2, 255, 3, 17, 19, 24, 32, 30, 56, 0,
6, 62, 19, 2, 90, 28, 2, 80, 37, 2, 90, 43, 2, 86, 48, 2, 118, 56, 2,
22, 1, 255, 2, 23, 20, 30, 40, 2, 1, 84, 22, 2, 25, 1, 255, 1, 23, 24,
2, 1, 84, 24, 2, 14, 0, 6, 2, 17, 19, 20, 55, 0, 2, 56, 19, 2, 60, 55,
2, 18, 1, 255, 2, 20, 20, 20, 47, 2, 2, 72, 20, 2, 72, 47, 2, 22, 1,
255, 2, 23, 20, 30, 40, 2, 1, 84, 22, 2, 22, 2, 255, 1, 20, 22, 0, 2,
62, 20, 2, 66, 40, 2, 16, 2, 255, 2, 20, 20, 28, 40, 2, 2, 84, 20, 2,
112, 40, 2, 4, 0, 255, 1, 23, 18, 2, 1, 84, 18, 2, 20, 1, 255, 2, 23,
20, 30, 55, 2, 2, 84, 20, 2, 84, 55, 2, 21, 1, 255, 3, 23, 20, 30, 39,
30, 49, 2, 2, 84, 21, 2, 84, 49, 2, 26, 1, 255, 3, 23, 20, 24, 41, 30,
55, 2, 1, 84, 25, 2, 26, 1, 255, 3, 23, 20, 24, 41, 30, 55, 2, 1, 84,
25, 2, 17, 1, 255, 2, 23, 20, 30, 42, 2, 2, 84, 20, 2, 112, 42, 2, 34,
0, 255, 1, 27, 55, 2, 1, 84, 55, 2, 34, 0, 255, 1, 30, 55, 0, 1, 78,
55, 2, 34, 0, 255, 1, 27, 55, 2, 1, 84, 55, 2, 34, 0, 255, 1, 20, 55,
2, 1, 76, 55, 2, 31, 2, 255, 2, 17, 35, 30, 55, 0, 2, 68, 35, 2, 68,
55, 2, 30, 2, 255, 3, 17, 35, 24, 40, 30, 55, 0, 3, 56, 35, 2, 68, 40,
2, 68, 55, 2, 28, 2, 255, 3, 17, 29, 24, 40, 30, 55, 0, 3, 56, 29, 2,
58, 40, 2, 62, 55, 2, 33, 0, 255, 1, 27, 54, 2, 1, 84, 54, 2, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 4, 1, 5, 1, 18, 2, 18, 19, 4,
18, 19, 30, 54, 2, 18, 20, 2, 18, 22, 1, 19, 3, 19, 29, 55, 3, 19, 31,
55, 3, 19, 32, 56, 2, 19, 33, 2, 19, 55, 1, 20, 2, 20, 40, 2, 20, 42,
2, 20, 47, 2, 20, 54, 2, 20, 55, 2, 21, 49, 1, 22, 2, 22, 55, 2, 23,
55, 1, 24, 1, 25, 1, 26, 3, 29, 40, 55, 2, 29, 55, 3, 35, 40, 55, 2,
35, 55, 1, 40, 1, 54, 1, 55, 0, 0, 0, 1, 0, 0, 0, 220, 16, 0, 0, 4,
0, 0, 0, 227, 16, 0, 0, 5, 0, 0, 0, 255, 16, 0, 0, 50, 50, 32, 114,
114, 32, 163, 163, 32, 0, 0, 0, 3, 0, 0, 0, 236, 22, 0, 0, 84, 0, 69,
1, 74, 1, 18, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18,
19, 20, 21, 0, 0, 0, 68, 69, 0, 0, 3, 0, 0, 0, 0, 23, 0, 0, 74, 80,
0, 0, 10, 0, 0, 0, 238, 13, 0, 0, 85, 83, 0, 0, 2, 0, 0, 0, 72, 23,
0, 0, 3, 0, 0, 0, 144, 17, 0, 0, 252, 0, 253, 0, 4, 2, 64, 19, 1, 64,
55, 1, 1, 2, 40, 14, 0, 40, 39, 0, 4, 4, 56, 19, 0, 58, 29, 0, 60, 41,
0, 70, 55, 0, 5, 3, 52, 15, 1, 64, 30, 1, 72, 39, 1, 8, 3, 52, 1, 0,
64, 10, 0, 72, 17, 0, 4, 3, 60, 20, 1, 60, 40, 1, 60, 55, 1, 1, 3, 56,
14, 0, 60, 25, 0, 60, 39, 0, 6, 1, 84, 20, 0, 7, 1, 84, 15, 1, 10, 1,
84, 1, 0, 4, 1, 60, 20, 1, 1, 1, 56, 15, 0, 6, 1, 84, 20, 0, 7, 1, 88,
15, 1, 10, 1, 88, 1, 0, 6, 2, 84, 20, 0, 84, 55, 0, 7, 2, 84, 15, 1,
84, 39, 1, 10, 2, 84, 1, 0, 84, 17, 0, 0, 0, 4, 2, 66, 20, 1, 66, 54,
1, 1, 2, 54, 15, 0, 54, 39, 0, 6, 2, 92, 20, 0, 80, 55, 0, 7, 2, 88,
15, 1, 76, 39, 1, 10, 2, 88, 1, 0, 76, 17, 0, 4, 2, 66, 20, 1, 64, 55,
1, 1, 2, 56, 15, 0, 56, 39, 0, 4, 1, 56, 19, 1, 1, 1, 48, 14, 0, 4,
1, 60, 19, 1, 1, 1, 56, 14, 0, 4, 1, 60, 19, 1, 1, 1, 56, 14, 0, 6,
2, 84, 23, 0, 112, 55, 0, 7, 2, 88, 19, 1, 116, 39, 1, 10, 2, 88, 4,
0, 116, 17, 0, 4, 5, 56, 19, 1, 70, 28, 1, 58, 36, 1, 68, 40, 1, 70,
55, 1, 1, 7, 52, 13, 0, 66, 22, 0, 68, 23, 0, 52, 26, 0, 62, 27, 0,
72, 33, 0, 74, 39, 0, 4, 11, 58, 19, 0, 84, 27, 0, 76, 34, 0, 76, 36,
0, 72, 38, 0, 80, 44, 0, 68, 50, 0, 80, 51, 0, 80, 53, 0, 80, 57, 0,
80, 58, 0, 5, 10, 58, 13, 1, 66, 22, 1, 80, 23, 1, 62, 26, 1, 66, 27,
1, 82, 32, 1, 74, 35, 1, 76, 37, 1, 72, 38, 1, 80, 41, 1, 8, 5, 52,
0, 0, 58, 7, 0, 50, 8, 0, 82, 13, 0, 72, 17, 0, 4, 6, 56, 19, 1, 68,
28, 1, 56, 36, 1, 68, 38, 1, 68, 45, 1, 68, 55, 1, 1, 6, 48, 14, 0,
68, 23, 0, 48, 26, 0, 62, 27, 0, 74, 33, 0, 72, 39, 0, 4, 5, 56, 19,
0, 78, 28, 0, 64, 36, 0, 68, 38, 0, 78, 46, 0, 5, 10, 62, 13, 1, 62,
22, 1, 78, 23, 1, 50, 26, 1, 56, 27, 1, 78, 32, 1, 78, 35, 1, 78, 37,
1, 60, 38, 1, 78, 41, 1, 8, 6, 58, 0, 0, 64, 7, 0, 76, 8, 0, 76, 12,
0, 78, 15, 0, 72, 17, 0, 4, 1, 120, 26, 0, 5, 1, 120, 21, 1, 12, 1,
120, 6, 0, 76, 34, 120, 19, 0, 120, 20, 0, 120, 21, 0, 120, 22, 0, 120,
23, 0, 120, 24, 0, 120, 25, 0, 120, 26, 0, 120, 27, 0, 120, 28, 0, 120,
29, 0, 120, 30, 0, 120, 31, 0, 120, 32, 0, 120, 33, 0, 120, 34, 0, 120,
35, 0, 120, 36, 0, 120, 37, 0, 120, 38, 0, 120, 39, 0, 120, 40, 0, 120,
41, 0, 120, 42, 0, 120, 43, 0, 120, 44, 0, 120, 45, 0, 120, 46, 0, 120,
47, 0, 120, 48, 0, 120, 49, 0, 120, 50, 0, 120, 51, 0, 120, 52, 0, 9,
1, 120, 2, 0, 4, 1, 120, 25, 0, 5, 1, 120, 20, 1, 12, 1, 120, 5, 0,
76, 24, 120, 19, 0, 120, 20, 0, 120, 21, 0, 120, 22, 0, 120, 23, 0,
120, 24, 0, 120, 25, 0, 120, 26, 0, 120, 27, 0, 120, 28, 0, 120, 29,
0, 120, 30, 0, 120, 31, 0, 120, 32, 0, 120, 33, 0, 120, 34, 0, 120,
35, 0, 120, 36, 0, 120, 37, 0, 120, 38, 0, 120, 39, 0, 120, 40, 0, 120,
41, 0, 120, 42, 0, 9, 1, 120, 1, 0, 4, 4, 56, 19, 1, 70, 28, 1, 58,
36, 1, 70, 55, 1, 1, 4, 48, 14, 0, 62, 23, 0, 48, 26, 0, 60, 39, 0,
4, 4, 56, 19, 1, 66, 28, 1, 60, 36, 1, 66, 55, 1, 1, 3, 56, 14, 0, 60,
24, 0, 60, 39, 0, 6, 2, 84, 20, 0, 84, 55, 0, 7, 2, 88, 15, 1, 88, 39,
1, 10, 2, 88, 1, 0, 88, 17, 0, 4, 4, 56, 19, 1, 70, 28, 1, 58, 36, 1,
70, 55, 1, 1, 4, 48, 14, 0, 62, 23, 0, 48, 26, 0, 60, 39, 0, 4, 2, 60,
29, 1, 68, 55, 1, 1, 2, 56, 24, 0, 56, 39, 0, 6, 2, 112, 29, 0, 112,
55, 0, 7, 2, 112, 24, 1, 112, 39, 1, 10, 2, 112, 7, 0, 112, 17, 0, 0,
2, 64, 18, 1, 64, 20, 1, 4, 4, 48, 18, 0, 48, 19, 0, 60, 30, 0, 60,
54, 0, 5, 2, 48, 17, 1, 48, 39, 1, 8, 2, 48, 2, 0, 48, 17, 0, 4, 2,
56, 19, 1, 68, 55, 1, 1, 2, 48, 14, 0, 60, 39, 0, 4, 6, 62, 19, 0, 90,
28, 0, 80, 37, 0, 90, 43, 0, 86, 48, 0, 118, 56, 0, 5, 6, 74, 14, 1,
98, 23, 1, 66, 26, 1, 74, 27, 1, 98, 34, 1, 118, 40, 1, 8, 5, 74, 0,
0, 78, 7, 0, 82, 9, 0, 98, 15, 0, 118, 18, 0, 6, 1, 84, 24, 0, 7, 1,
88, 20, 1, 10, 1, 88, 5, 0, 6, 1, 84, 24, 0, 7, 1, 88, 20, 1, 10, 1,
88, 5, 0, 4, 2, 56, 19, 0, 60, 55, 0, 5, 2, 48, 14, 1, 60, 39, 1, 8,
2, 64, 0, 0, 70, 17, 0, 6, 2, 72, 20, 0, 72, 47, 0, 3, 2, 76, 15, 1,
76, 35, 1, 4, 2, 60, 20, 1, 60, 40, 1, 1, 2, 56, 15, 0, 64, 29, 0, 4,
2, 60, 20, 1, 60, 40, 1, 1, 1, 56, 18, 0, 4, 2, 84, 20, 1, 84, 40, 1,
1, 1, 56, 18, 0, 6, 1, 84, 22, 0, 7, 1, 88, 18, 1, 10, 1, 88, 3, 0,
6, 1, 84, 22, 0, 7, 1, 88, 18, 1, 10, 1, 88, 3, 0, 6, 2, 84, 20, 0,
112, 40, 0, 3, 2, 68, 15, 1, 96, 29, 1, 4, 2, 66, 20, 0, 66, 40, 0,
1, 2, 42, 15, 1, 64, 29, 1, 4, 2, 62, 20, 1, 66, 40, 1, 1, 2, 42, 15,
0, 64, 29, 0, 4, 2, 60, 20, 0, 60, 40, 0, 1, 2, 56, 15, 1, 64, 29, 1,
0, 0, 4, 4, 60, 20, 1, 60, 39, 1, 60, 47, 1, 60, 55, 1, 1, 4, 56, 15,
0, 60, 28, 0, 60, 35, 0, 60, 39, 0, 6, 2, 84, 21, 0, 84, 49, 0, 7, 2,
88, 16, 1, 88, 36, 1, 10, 2, 88, 2, 0, 88, 16, 0, 4, 2, 60, 20, 1, 60,
55, 1, 1, 2, 56, 15, 0, 60, 39, 0, 0, 2, 60, 20, 1, 60, 55, 1, 6, 1,
84, 25, 0, 7, 1, 84, 20, 1, 10, 1, 84, 5, 0, 6, 1, 84, 25, 0, 7, 1,
88, 20, 1, 10, 1, 88, 5, 0, 6, 2, 84, 20, 0, 112, 42, 0, 7, 2, 88, 15,
1, 116, 31, 1, 10, 2, 88, 1, 0, 116, 11, 0, 4, 3, 60, 20, 1, 60, 40,
1, 60, 55, 1, 1, 3, 56, 15, 0, 64, 29, 0, 60, 39, 0, 4, 1, 60, 55, 1,
1, 1, 52, 39, 0, 6, 1, 80, 55, 0, 7, 1, 80, 39, 1, 10, 1, 80, 17, 0,
6, 1, 80, 55, 0, 7, 1, 80, 39, 1, 10, 1, 80, 17, 0, 6, 1, 76, 55, 0,
7, 1, 68, 39, 1, 10, 1, 68, 17, 0, 6, 1, 76, 55, 0, 7, 1, 76, 39, 1,
10, 1, 76, 17, 0, 4, 1, 60, 55, 1, 1, 1, 60, 39, 0, 6, 1, 84, 55, 0,
7, 1, 88, 39, 1, 10, 1, 88, 17, 0, 4, 1, 78, 55, 0, 5, 1, 78, 39, 1,
8, 1, 78, 17, 0, 4, 3, 56, 35, 1, 68, 40, 1, 68, 55, 1, 1, 4, 48, 26,
0, 62, 27, 0, 74, 33, 0, 72, 39, 0, 4, 3, 56, 29, 1, 58, 40, 1, 62,
55, 1, 1, 4, 46, 23, 0, 48, 26, 0, 56, 29, 0, 56, 39, 0, 4, 2, 68, 35,
1, 68, 55, 1, 1, 2, 66, 26, 0, 60, 39, 0, 2, 1, 84, 54, 0, 0, 0, 88,
65, 0, 0, 2, 0, 0, 0, 144, 14, 0, 0, 88, 84, 0, 0, 47, 0, 0, 0, 168,
17, 0, 0, 88, 86, 0, 0, 48, 0, 0, 0, 124, 16, 0, 0, 3, 0, 0, 0, 212,
22, 0, 0, 3, 0, 0, 0, 40, 29, 0, 0, 3, 3, 3, 9, 3, 11, 4, 4, 4, 7, 4,
8, 4, 10, 4, 11, 5, 7, 8, 8, 9, 9, 9, 11, 11, 11, 38, 38, 38, 46, 38,
62, 38, 110, 38, 118, 38, 134, 38, 142, 38, 159, 38, 175, 46, 46, 54,
54, 54, 62, 54, 134, 62, 62, 102, 102, 102, 110, 102, 134, 102, 142,
102, 159, 110, 126, 110, 134, 110, 142, 134, 134, 134, 159, 142, 142,
151, 151, 151, 159, 151, 175, 159, 159, 1, 0, 0, 0, 116, 13, 0, 0, 3,
0, 0, 0, 148, 14, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 50, 50, 50, 114,
50, 163, 114, 163, 4, 168, 0, 0
};
const resource_hnd_t wifi_firmware_clm_blob =
{ RESOURCE_IN_MEMORY, 7697, {.mem = { (const char *)wifi_firmware_clm_blob_image_data }}};

View File

@ -13,13 +13,15 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "wiced_resource.h"
#if defined(CY_STORAGE_WIFI_DATA)
CY_SECTION(CY_STORAGE_WIFI_DATA) __attribute__( (used) )
#endif
const unsigned char wifi_firmware_clm_blob_image_data[7222] =
{
66, 76, 79, 66, 60, 0, 0, 0, 190, 201, 240, 7, 1, 0, 0, 0, 2, 0, 0,
0, 0, 0, 0, 0, 60, 0, 0, 0, 246, 27, 0, 0, 227, 111, 211, 135, 0, 0,
66, 76, 79, 66, 60, 0, 0, 0, 195, 163, 213, 190, 1, 0, 0, 0, 2, 0, 0,
0, 0, 0, 0, 0, 60, 0, 0, 0, 246, 27, 0, 0, 143, 137, 42, 106, 0, 0,
0, 0, 0, 0, 0, 0, 50, 28, 0, 0, 4, 0, 0, 0, 42, 255, 237, 159, 0, 0,
0, 0, 67, 76, 77, 32, 68, 65, 84, 65, 0, 0, 12, 0, 2, 0, 57, 46, 49,
48, 46, 51, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 49, 46, 50, 57,
@ -77,8 +79,8 @@ const unsigned char wifi_firmware_clm_blob_image_data[7222] =
33, 38, 49, 2, 33, 49, 1, 38, 1, 48, 1, 49, 69, 48, 0, 88, 65, 0, 88,
85, 0, 65, 85, 2, 74, 80, 1, 0, 0, 3, 0, 0, 0, 124, 10, 0, 0, 16, 4,
5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 34, 46, 4, 36,
64, 4, 100, 144, 4, 149, 177, 4, 50, 48, 49, 57, 45, 48, 54, 45, 48,
55, 32, 48, 54, 58, 53, 57, 58, 53, 50, 0, 4, 2, 64, 19, 0, 64, 49,
64, 4, 100, 144, 4, 149, 177, 4, 50, 48, 49, 57, 45, 48, 55, 45, 51,
48, 32, 48, 49, 58, 52, 51, 58, 48, 50, 0, 4, 2, 64, 19, 0, 64, 49,
0, 1, 2, 40, 14, 0, 40, 39, 0, 4, 4, 56, 19, 0, 58, 28, 0, 60, 39, 0,
70, 49, 0, 1, 3, 52, 15, 0, 64, 30, 0, 72, 39, 0, 4, 3, 60, 20, 0, 60,
38, 0, 60, 49, 0, 1, 3, 56, 14, 0, 60, 25, 0, 60, 39, 0, 6, 1, 84, 20,

View File

@ -0,0 +1,118 @@
/*
* Copyright (c) 2019, Cypress Semiconductor Corporation, All Rights Reserved
* SPDX-License-Identifier: LicenseRef-PBL
*
* This file and the related binary are licensed under the
* Permissive Binary License, Version 1.0 (the "License");
* you may not use these files except in compliance with the License.
*
* You may obtain a copy of the License here:
* LICENSE-permissive-binary-license-1.0.txt and at
* https://www.mbed.com/licenses/PBL-1.0
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/** @file
* NVRAM file for CY8CKIT-062-WiFi-BT (PSoC6 WiFi-BT Pioneer Kit) using
* Murata's Type 1DX module - Copied from bcm94343wwcd1.txt on 08/04/2019
* # 2.4 GHz, 20 MHz BW mode; No Antenna Diversity
*/
#ifndef INCLUDED_NVRAM_IMAGE_H_
#define INCLUDED_NVRAM_IMAGE_H_
#include <string.h>
#include <stdint.h>
#include "generated_mac_address.txt"
#ifdef __cplusplus
extern "C" {
#endif
/**
* Character array of NVRAM image
*/
static const char wifi_nvram_image[] =
// # The following parameter values are just placeholders, need to be updated.
"manfid=0x2d0" "\x00"
"prodid=0x086c" "\x00"
"vendid=0x14e4" "\x00"
"devid=0x43e2" "\x00"
"boardtype=0x086c" "\x00"
"boardrev=0x1110" "\x00"
"boardnum=22" "\x00"
"xtalfreq=37400" "\x00"
NVRAM_GENERATED_MAC_ADDRESS "\x00"
"sromrev=11" "\x00"
"boardflags=0x00404201" "\x00"
"boardflags3=0x08000000" "\x00"
"nocrc=1" "\x00"
"ag0=255" "\x00"
"aa2g=1" "\x00"
"ccode=ALL" "\x00"
//#Antenna diversity
//#"swdiv_en=1" "\x00"
//#"swdiv_gpio=2" "\x00"
"pa0itssit=0x20" "\x00"
"extpagain2g=0" "\x00"
//#PA parameters for 2.4GHz, measured at CHIP OUTPUT
"pa2ga0=-168,6905,-799" "\x00"
"AvVmid_c0=0x0,0xc8" "\x00"
"cckpwroffset0=5" "\x00"
//# PPR params
"maxp2ga0=84" "\x00"
"txpwrbckof=6" "\x00"
"cckbw202gpo=0" "\x00"
"legofdmbw202gpo=0x66111111" "\x00"
"mcsbw202gpo=0x77711111" "\x00"
"propbw202gpo=0xdd" "\x00"
//# OFDM IIR :
"ofdmdigfilttype=18" "\x00"
"ofdmdigfilttypebe=18" "\x00"
//# PAPD mode:
"papdmode=1" "\x00"
"papdvalidtest=1" "\x00"
"pacalidx2g=32" "\x00"
"papdepsoffset=-36" "\x00"
"papdendidx=61" "\x00"
//# LTECX flags
//#"ltecxmux=1" "\x00"
//#"ltecxpadnum=0x02030401" "\x00"
//#"ltecxfnsel=0x3003" "\x00"
//#"ltecxgcigpio=0x3012" "\x00"
//#il0macaddr=00:90:4c:c5:12:38
"wl0id=0x431b" "\x00"
"deadman_to=0xffffffff" "\x00"
//# muxenab: 0x1 for UART enable, 0x2 for GPIOs, 0x8 for JTAG, 0x10 for HW OOB
"muxenab=0x11" "\x00"
//# CLDO PWM voltage settings - 0x4 - 1.1 volt
//#cldo_pwm=0x4 "\x00"
//#VCO freq 326.4MHz
"spurconfig=0x3" "\x00"
"\x00\x00";
#ifdef __cplusplus
} /* extern "C" */
#endif
#else /* ifndef INCLUDED_NVRAM_IMAGE_H_ */
#error Wi-Fi NVRAM image included twice
#endif /* ifndef INCLUDED_NVRAM_IMAGE_H_ */

View File

@ -15,7 +15,9 @@
*/
/** @file
* NVRAM variables taken from BCM943438WLPTH nvram file (2.4 GHz, 20 MHz BW mode)
* NVRAM file for CY8CKIT-062-WiFi-BT (PSoC6 WiFi-BT Pioneer Kit) using
* Murata's Type 1DX module - Copied from bcm94343wwcd1.txt on 08/04/2019
* # 2.4 GHz, 20 MHz BW mode; No Antenna Diversity
*/
#ifndef INCLUDED_NVRAM_IMAGE_H_
@ -37,33 +39,34 @@ extern "C" {
static const char wifi_nvram_image[] =
// # The following parameter values are just placeholders, need to be updated.
"manfid=0x2d0" "\x00"
"prodid=0x0726" "\x00"
"prodid=0x086c" "\x00"
"vendid=0x14e4" "\x00"
"devid=0x43e2" "\x00"
"boardtype=0x0726" "\x00"
"boardrev=0x1101" "\x00"
"boardtype=0x086c" "\x00"
"boardrev=0x1110" "\x00"
"boardnum=22" "\x00"
"xtalfreq=37400" "\x00"
NVRAM_GENERATED_MAC_ADDRESS "\x00"
"sromrev=11" "\x00"
"boardflags=0x00404201" "\x00"
"boardflags3=0x08000000" "\x00"
NVRAM_GENERATED_MAC_ADDRESS "\x00"
"nocrc=1" "\x00"
"ag0=255" "\x00"
"aa2g=1" "\x00"
"ccode=ALL"
"\x00"
//#Antenna diversity
"swdiv_en=1" "\x00"
"swdiv_gpio=1" "\x00"
"swdiv_gpio_1=2" "\x00"
"ccode=ALL" "\x00"
//#Antenna diversity
//#"swdiv_en=1" "\x00"
//#"swdiv_gpio=2" "\x00"
"pa0itssit=0x20" "\x00"
"extpagain2g=0" "\x00"
//#PA parameters for 2.4GHz, measured at CHIP OUTPUT
"pa2ga0=-168,6905,-799" "\x00"
"AvVmid_c0=0x0,0xc8" "\x00"
"cckpwroffset0=5" "\x00"
//# PPR params
"maxp2ga0=84" "\x00"
"txpwrbckof=6" "\x00"
@ -71,27 +74,33 @@ static const char wifi_nvram_image[] =
"legofdmbw202gpo=0x66111111" "\x00"
"mcsbw202gpo=0x77711111" "\x00"
"propbw202gpo=0xdd" "\x00"
//# OFDM IIR :
"ofdmdigfilttype=18" "\x00"
"ofdmdigfilttypebe=18" "\x00"
//# PAPD mode:
"papdmode=1" "\x00"
"papdvalidtest=1" "\x00"
"pacalidx2g=32" "\x00"
"papdepsoffset=-36" "\x00"
"papdendidx=61" "\x00"
//# LTECX flags
// "ltecxmux=1" "\x00"
//"ltecxpadnum=0x02030401" "\x00"
// "ltecxfnsel=0x3003" "\x00"
// "ltecxgcigpio=0x3012" "\x00"
//#"ltecxmux=1" "\x00"
//#"ltecxpadnum=0x02030401" "\x00"
//#"ltecxfnsel=0x3003" "\x00"
//#"ltecxgcigpio=0x3012" "\x00"
//#il0macaddr=00:90:4c:c5:12:38
"wl0id=0x431b" "\x00"
"deadman_to=0xffffffff" "\x00"
//# muxenab: 0x1 for UART enable, 0x2 for GPIOs, 0x8 for JTAG, 0x10 for HW OOB
"muxenab=0x11" "\x00"
//# CLDO PWM voltage settings - 0x4 - 1.1 volt
//#cldo_pwm=0x4 "\x00"
//#VCO freq 326.4MHz
"spurconfig=0x3" "\x00"
"\x00\x00";

View File

@ -0,0 +1,118 @@
/*
* Copyright (c) 2019, Cypress Semiconductor Corporation, All Rights Reserved
* SPDX-License-Identifier: LicenseRef-PBL
*
* This file and the related binary are licensed under the
* Permissive Binary License, Version 1.0 (the "License");
* you may not use these files except in compliance with the License.
*
* You may obtain a copy of the License here:
* LICENSE-permissive-binary-license-1.0.txt and at
* https://www.mbed.com/licenses/PBL-1.0
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/** @file
* NVRAM file for CY8CKIT-062-WiFi-BT (PSoC6 WiFi-BT Pioneer Kit) using
* Murata's Type 1DX module - Copied from bcm94343wwcd1.txt on 08/04/2019
* # 2.4 GHz, 20 MHz BW mode; No Antenna Diversity
*/
#ifndef INCLUDED_NVRAM_IMAGE_H_
#define INCLUDED_NVRAM_IMAGE_H_
#include <string.h>
#include <stdint.h>
#include "generated_mac_address.txt"
#ifdef __cplusplus
extern "C" {
#endif
/**
* Character array of NVRAM image
*/
static const char wifi_nvram_image[] =
// # The following parameter values are just placeholders, need to be updated.
"manfid=0x2d0" "\x00"
"prodid=0x086c" "\x00"
"vendid=0x14e4" "\x00"
"devid=0x43e2" "\x00"
"boardtype=0x086c" "\x00"
"boardrev=0x1110" "\x00"
"boardnum=22" "\x00"
"xtalfreq=37400" "\x00"
NVRAM_GENERATED_MAC_ADDRESS "\x00"
"sromrev=11" "\x00"
"boardflags=0x00404201" "\x00"
"boardflags3=0x08000000" "\x00"
"nocrc=1" "\x00"
"ag0=255" "\x00"
"aa2g=1" "\x00"
"ccode=ALL" "\x00"
//#Antenna diversity
//#"swdiv_en=1" "\x00"
//#"swdiv_gpio=2" "\x00"
"pa0itssit=0x20" "\x00"
"extpagain2g=0" "\x00"
//#PA parameters for 2.4GHz, measured at CHIP OUTPUT
"pa2ga0=-168,6905,-799" "\x00"
"AvVmid_c0=0x0,0xc8" "\x00"
"cckpwroffset0=5" "\x00"
//# PPR params
"maxp2ga0=84" "\x00"
"txpwrbckof=6" "\x00"
"cckbw202gpo=0" "\x00"
"legofdmbw202gpo=0x66111111" "\x00"
"mcsbw202gpo=0x77711111" "\x00"
"propbw202gpo=0xdd" "\x00"
//# OFDM IIR :
"ofdmdigfilttype=18" "\x00"
"ofdmdigfilttypebe=18" "\x00"
//# PAPD mode:
"papdmode=1" "\x00"
"papdvalidtest=1" "\x00"
"pacalidx2g=32" "\x00"
"papdepsoffset=-36" "\x00"
"papdendidx=61" "\x00"
//# LTECX flags
//#"ltecxmux=1" "\x00"
//#"ltecxpadnum=0x02030401" "\x00"
//#"ltecxfnsel=0x3003" "\x00"
//#"ltecxgcigpio=0x3012" "\x00"
//#il0macaddr=00:90:4c:c5:12:38
"wl0id=0x431b" "\x00"
"deadman_to=0xffffffff" "\x00"
//# muxenab: 0x1 for UART enable, 0x2 for GPIOs, 0x8 for JTAG, 0x10 for HW OOB
"muxenab=0x11" "\x00"
//# CLDO PWM voltage settings - 0x4 - 1.1 volt
//#cldo_pwm=0x4 "\x00"
//#VCO freq 326.4MHz
"spurconfig=0x3" "\x00"
"\x00\x00";
#ifdef __cplusplus
} /* extern "C" */
#endif
#else /* ifndef INCLUDED_NVRAM_IMAGE_H_ */
#error Wi-Fi NVRAM image included twice
#endif /* ifndef INCLUDED_NVRAM_IMAGE_H_ */

View File

@ -15,7 +15,9 @@
*/
/** @file
* NVRAM variables taken from BCM943438WLPTH nvram file (2.4 GHz, 20 MHz BW mode)
* NVRAM file for CY8CKIT-062-WiFi-BT (PSoC6 WiFi-BT Pioneer Kit) using
* Murata's Type 1DX module - Copied from bcm94343wwcd1.txt on 08/04/2019
* # 2.4 GHz, 20 MHz BW mode; No Antenna Diversity
*/
#ifndef INCLUDED_NVRAM_IMAGE_H_
@ -37,33 +39,34 @@ extern "C" {
static const char wifi_nvram_image[] =
// # The following parameter values are just placeholders, need to be updated.
"manfid=0x2d0" "\x00"
"prodid=0x0726" "\x00"
"prodid=0x086c" "\x00"
"vendid=0x14e4" "\x00"
"devid=0x43e2" "\x00"
"boardtype=0x0726" "\x00"
"boardrev=0x1101" "\x00"
"boardtype=0x086c" "\x00"
"boardrev=0x1110" "\x00"
"boardnum=22" "\x00"
"xtalfreq=37400" "\x00"
NVRAM_GENERATED_MAC_ADDRESS "\x00"
"sromrev=11" "\x00"
"boardflags=0x00404201" "\x00"
"boardflags3=0x08000000" "\x00"
NVRAM_GENERATED_MAC_ADDRESS "\x00"
"nocrc=1" "\x00"
"ag0=255" "\x00"
"aa2g=1" "\x00"
"ccode=ALL"
"\x00"
//#Antenna diversity
"swdiv_en=1" "\x00"
"swdiv_gpio=1" "\x00"
"swdiv_gpio_1=2" "\x00"
"ccode=ALL" "\x00"
//#Antenna diversity
//#"swdiv_en=1" "\x00"
//#"swdiv_gpio=2" "\x00"
"pa0itssit=0x20" "\x00"
"extpagain2g=0" "\x00"
//#PA parameters for 2.4GHz, measured at CHIP OUTPUT
"pa2ga0=-168,6905,-799" "\x00"
"AvVmid_c0=0x0,0xc8" "\x00"
"cckpwroffset0=5" "\x00"
//# PPR params
"maxp2ga0=84" "\x00"
"txpwrbckof=6" "\x00"
@ -71,27 +74,33 @@ static const char wifi_nvram_image[] =
"legofdmbw202gpo=0x66111111" "\x00"
"mcsbw202gpo=0x77711111" "\x00"
"propbw202gpo=0xdd" "\x00"
//# OFDM IIR :
"ofdmdigfilttype=18" "\x00"
"ofdmdigfilttypebe=18" "\x00"
//# PAPD mode:
"papdmode=1" "\x00"
"papdvalidtest=1" "\x00"
"pacalidx2g=32" "\x00"
"papdepsoffset=-36" "\x00"
"papdendidx=61" "\x00"
//# LTECX flags
// "ltecxmux=1" "\x00"
//"ltecxpadnum=0x02030401" "\x00"
// "ltecxfnsel=0x3003" "\x00"
// "ltecxgcigpio=0x3012" "\x00"
//#"ltecxmux=1" "\x00"
//#"ltecxpadnum=0x02030401" "\x00"
//#"ltecxfnsel=0x3003" "\x00"
//#"ltecxgcigpio=0x3012" "\x00"
//#il0macaddr=00:90:4c:c5:12:38
"wl0id=0x431b" "\x00"
"deadman_to=0xffffffff" "\x00"
//# muxenab: 0x1 for UART enable, 0x2 for GPIOs, 0x8 for JTAG, 0x10 for HW OOB
"muxenab=0x11" "\x00"
//# CLDO PWM voltage settings - 0x4 - 1.1 volt
//#cldo_pwm=0x4 "\x00"
//#VCO freq 326.4MHz
"spurconfig=0x3" "\x00"
"\x00\x00";

View File

@ -0,0 +1,118 @@
/*
* Copyright (c) 2019, Cypress Semiconductor Corporation, All Rights Reserved
* SPDX-License-Identifier: LicenseRef-PBL
*
* This file and the related binary are licensed under the
* Permissive Binary License, Version 1.0 (the "License");
* you may not use these files except in compliance with the License.
*
* You may obtain a copy of the License here:
* LICENSE-permissive-binary-license-1.0.txt and at
* https://www.mbed.com/licenses/PBL-1.0
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/** @file
* NVRAM file for CY8CKIT-062-WiFi-BT (PSoC6 WiFi-BT Pioneer Kit) using
* Murata's Type 1DX module - Copied from bcm94343wwcd1.txt on 08/04/2019
* # 2.4 GHz, 20 MHz BW mode; No Antenna Diversity
*/
#ifndef INCLUDED_NVRAM_IMAGE_H_
#define INCLUDED_NVRAM_IMAGE_H_
#include <string.h>
#include <stdint.h>
#include "generated_mac_address.txt"
#ifdef __cplusplus
extern "C" {
#endif
/**
* Character array of NVRAM image
*/
static const char wifi_nvram_image[] =
// # The following parameter values are just placeholders, need to be updated.
"manfid=0x2d0" "\x00"
"prodid=0x086c" "\x00"
"vendid=0x14e4" "\x00"
"devid=0x43e2" "\x00"
"boardtype=0x086c" "\x00"
"boardrev=0x1110" "\x00"
"boardnum=22" "\x00"
"xtalfreq=37400" "\x00"
NVRAM_GENERATED_MAC_ADDRESS "\x00"
"sromrev=11" "\x00"
"boardflags=0x00404201" "\x00"
"boardflags3=0x08000000" "\x00"
"nocrc=1" "\x00"
"ag0=255" "\x00"
"aa2g=1" "\x00"
"ccode=ALL" "\x00"
//#Antenna diversity
//#"swdiv_en=1" "\x00"
//#"swdiv_gpio=2" "\x00"
"pa0itssit=0x20" "\x00"
"extpagain2g=0" "\x00"
//#PA parameters for 2.4GHz, measured at CHIP OUTPUT
"pa2ga0=-168,6905,-799" "\x00"
"AvVmid_c0=0x0,0xc8" "\x00"
"cckpwroffset0=5" "\x00"
//# PPR params
"maxp2ga0=84" "\x00"
"txpwrbckof=6" "\x00"
"cckbw202gpo=0" "\x00"
"legofdmbw202gpo=0x66111111" "\x00"
"mcsbw202gpo=0x77711111" "\x00"
"propbw202gpo=0xdd" "\x00"
//# OFDM IIR :
"ofdmdigfilttype=18" "\x00"
"ofdmdigfilttypebe=18" "\x00"
//# PAPD mode:
"papdmode=1" "\x00"
"papdvalidtest=1" "\x00"
"pacalidx2g=32" "\x00"
"papdepsoffset=-36" "\x00"
"papdendidx=61" "\x00"
//# LTECX flags
//#"ltecxmux=1" "\x00"
//#"ltecxpadnum=0x02030401" "\x00"
//#"ltecxfnsel=0x3003" "\x00"
//#"ltecxgcigpio=0x3012" "\x00"
//#il0macaddr=00:90:4c:c5:12:38
"wl0id=0x431b" "\x00"
"deadman_to=0xffffffff" "\x00"
//# muxenab: 0x1 for UART enable, 0x2 for GPIOs, 0x8 for JTAG, 0x10 for HW OOB
"muxenab=0x11" "\x00"
//# CLDO PWM voltage settings - 0x4 - 1.1 volt
//#cldo_pwm=0x4 "\x00"
//#VCO freq 326.4MHz
"spurconfig=0x3" "\x00"
"\x00\x00";
#ifdef __cplusplus
} /* extern "C" */
#endif
#else /* ifndef INCLUDED_NVRAM_IMAGE_H_ */
#error Wi-Fi NVRAM image included twice
#endif /* ifndef INCLUDED_NVRAM_IMAGE_H_ */

View File

@ -0,0 +1,118 @@
/*
* Copyright (c) 2019, Cypress Semiconductor Corporation, All Rights Reserved
* SPDX-License-Identifier: LicenseRef-PBL
*
* This file and the related binary are licensed under the
* Permissive Binary License, Version 1.0 (the "License");
* you may not use these files except in compliance with the License.
*
* You may obtain a copy of the License here:
* LICENSE-permissive-binary-license-1.0.txt and at
* https://www.mbed.com/licenses/PBL-1.0
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/** @file
* NVRAM file for CY8CKIT-062-WiFi-BT (PSoC6 WiFi-BT Pioneer Kit) using
* Murata's Type 1DX module - Copied from bcm94343wwcd1.txt on 08/04/2019
* # 2.4 GHz, 20 MHz BW mode; No Antenna Diversity
*/
#ifndef INCLUDED_NVRAM_IMAGE_H_
#define INCLUDED_NVRAM_IMAGE_H_
#include <string.h>
#include <stdint.h>
#include "generated_mac_address.txt"
#ifdef __cplusplus
extern "C" {
#endif
/**
* Character array of NVRAM image
*/
static const char wifi_nvram_image[] =
// # The following parameter values are just placeholders, need to be updated.
"manfid=0x2d0" "\x00"
"prodid=0x086c" "\x00"
"vendid=0x14e4" "\x00"
"devid=0x43e2" "\x00"
"boardtype=0x086c" "\x00"
"boardrev=0x1110" "\x00"
"boardnum=22" "\x00"
"xtalfreq=37400" "\x00"
NVRAM_GENERATED_MAC_ADDRESS "\x00"
"sromrev=11" "\x00"
"boardflags=0x00404201" "\x00"
"boardflags3=0x08000000" "\x00"
"nocrc=1" "\x00"
"ag0=255" "\x00"
"aa2g=1" "\x00"
"ccode=ALL" "\x00"
//#Antenna diversity
//#"swdiv_en=1" "\x00"
//#"swdiv_gpio=2" "\x00"
"pa0itssit=0x20" "\x00"
"extpagain2g=0" "\x00"
//#PA parameters for 2.4GHz, measured at CHIP OUTPUT
"pa2ga0=-168,6905,-799" "\x00"
"AvVmid_c0=0x0,0xc8" "\x00"
"cckpwroffset0=5" "\x00"
//# PPR params
"maxp2ga0=84" "\x00"
"txpwrbckof=6" "\x00"
"cckbw202gpo=0" "\x00"
"legofdmbw202gpo=0x66111111" "\x00"
"mcsbw202gpo=0x77711111" "\x00"
"propbw202gpo=0xdd" "\x00"
//# OFDM IIR :
"ofdmdigfilttype=18" "\x00"
"ofdmdigfilttypebe=18" "\x00"
//# PAPD mode:
"papdmode=1" "\x00"
"papdvalidtest=1" "\x00"
"pacalidx2g=32" "\x00"
"papdepsoffset=-36" "\x00"
"papdendidx=61" "\x00"
//# LTECX flags
//#"ltecxmux=1" "\x00"
//#"ltecxpadnum=0x02030401" "\x00"
//#"ltecxfnsel=0x3003" "\x00"
//#"ltecxgcigpio=0x3012" "\x00"
//#il0macaddr=00:90:4c:c5:12:38
"wl0id=0x431b" "\x00"
"deadman_to=0xffffffff" "\x00"
//# muxenab: 0x1 for UART enable, 0x2 for GPIOs, 0x8 for JTAG, 0x10 for HW OOB
"muxenab=0x11" "\x00"
//# CLDO PWM voltage settings - 0x4 - 1.1 volt
//#cldo_pwm=0x4 "\x00"
//#VCO freq 326.4MHz
"spurconfig=0x3" "\x00"
"\x00\x00";
#ifdef __cplusplus
} /* extern "C" */
#endif
#else /* ifndef INCLUDED_NVRAM_IMAGE_H_ */
#error Wi-Fi NVRAM image included twice
#endif /* ifndef INCLUDED_NVRAM_IMAGE_H_ */

View File

@ -1,5 +1,21 @@
/*
* $ Copyright Cypress Semiconductor $
* Copyright (c) 2019, Cypress Semiconductor Corporation, All Rights Reserved
* SPDX-License-Identifier: LicenseRef-PBL
*
* This file and the related binary are licensed under the
* Permissive Binary License, Version 1.0 (the "License");
* you may not use these files except in compliance with the License.
*
* You may obtain a copy of the License here:
* LICENSE-permissive-binary-license-1.0.txt and at
* https://www.mbed.com/licenses/PBL-1.0
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/** @file
* NVRAM file for CY8CMOD-062S2-43012
*/
#ifndef INCLUDED_NVRAM_IMAGE_H_
@ -19,7 +35,7 @@ extern "C" {
* cyw943012csp_ty1LV.TXT
*/
static const char wifi_nvram_image[] =
"NVRAMRev=$Rev: 721914 $" "\x00"
"NVRAMRev=$Rev:722123$" "\x00"
"sromrev=11" "\x00"
"cckdigfilttype=4" "\x00"
"cckpwroffset0=2" "\x00"
@ -42,7 +58,7 @@ static const char wifi_nvram_image[] =
"extpagain5g=2" "\x00"
"ccode=0" "\x00"
"regrev=0" "\x00"
"antswitch = 0" "\x00"
"antswitch=0" "\x00"
"rxgains2gelnagaina0=0" "\x00"
"rxgains2gtrisoa0=15" "\x00"
"rxgains2gtrelnabypa0=0" "\x00"
@ -72,7 +88,7 @@ static const char wifi_nvram_image[] =
"swctrlmap_2g=0x10101010,0x20202020,0x10101010,0x442020,0x3ff" "\x00"
"swctrlmapext_2g=0x01000100,0x01000100,0x01000100,0x000000,0x301" "\x00"
"swctrlmap_5g=0x80808080,0x00000000,0x80808080,0x442020,0x381" "\x00"
"swctrlmapext_5g=0x01000100,0x01000100,0x00000000,0x000100,0x303" "\x00"
"swctrlmapext_5g=0x01000100,0x01000100,0x00000000,0x000000,0x303" "\x00"
"ulpnap=0" "\x00"
"ulpadc=1" "\x00"
"ssagc_en=0" "\x00"
@ -90,11 +106,12 @@ static const char wifi_nvram_image[] =
"mcsbw202gpo=0xCC864420" "\x00"
"maxp5ga0=70,70,70,70" "\x00"
"mcsbw205glpo=0xCC864220" "\x00"
"mmcsbw205gmpo=0xCC864220" "\x00"
"mcsbw205gmpo=0xCC864220" "\x00"
"mcsbw205ghpo=0xCC864220" "\x00"
"femctrlwar=0" "\x00"
"use5gpllfor2g=1" "\x00"
"pt5db_gaintbl=0" "\x00"
"muxenab=0x01" "\x00"
"txwbpapden=1" "\x00"
"wb_rxattn=0x0303" "\x00"
"wb_txattn=0x0203" "\x00"
@ -121,17 +138,18 @@ static const char wifi_nvram_image[] =
"lpo_select=4" "\x00"
"paprrmcsgamma2g=450,500,550,600,675,950,950,950,950,950,950,950" "\x00"
"paprrmcsgamma5g20=450,500,550,600,800,950,1100,1100,1100,1100,1100,1100" "\x00"
"swdiv_en=0" "\x00"
"swdiv_gpio=0" "\x00"
"swdiv_swctrl_en=2" "\x00"
"swdiv_swctrl_ant0=0" "\x00"
"swdiv_swctrl_ant1=1" "\x00"
"swdiv_antmap2g_main=1" "\x00"
"swdiv_antmap5g_main=1" "\x00"
"swdiv_snrlim=10000" "\x00"
"swdiv_thresh=3000" "\x00"
"swdiv_snrthresh=24" "\x00"
"swdiv_en=0" "\x00"
"swdiv_gpio=0" "\x00"
"swdiv_swctrl_en=2" "\x00"
"swdiv_swctrl_ant0=0" "\x00"
"swdiv_swctrl_ant1=1" "\x00"
"swdiv_antmap2g_main=1" "\x00"
"swdiv_antmap5g_main=1" "\x00"
"swdiv_snrlim=10000" "\x00"
"swdiv_thresh=3000" "\x00"
"swdiv_snrthresh=24" "\x00"
"\x00\x00";
#ifdef __cplusplus
} /*extern "C" */
#endif

View File

@ -0,0 +1,118 @@
/*
* Copyright (c) 2019, Cypress Semiconductor Corporation, All Rights Reserved
* SPDX-License-Identifier: LicenseRef-PBL
*
* This file and the related binary are licensed under the
* Permissive Binary License, Version 1.0 (the "License");
* you may not use these files except in compliance with the License.
*
* You may obtain a copy of the License here:
* LICENSE-permissive-binary-license-1.0.txt and at
* https://www.mbed.com/licenses/PBL-1.0
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/** @file
* # NVRAM file for CY8CMOD-062S3-4343W (PSoC6 (512K) with CYW4343W WiFi-BT - Murata's
* Type 1DX Module) - Copied from bcm94343wwcd1.txt on 08/04/2019
* # 2.4 GHz, 20 MHz BW mode; With Antenna Diversity
*/
#ifndef INCLUDED_NVRAM_IMAGE_H_
#define INCLUDED_NVRAM_IMAGE_H_
#include <string.h>
#include <stdint.h>
#include "generated_mac_address.txt"
#ifdef __cplusplus
extern "C" {
#endif
/**
* Character array of NVRAM image
*/
static const char wifi_nvram_image[] =
// # The following parameter values are just placeholders, need to be updated.
"manfid=0x2d0" "\x00"
"prodid=0x086c" "\x00"
"vendid=0x14e4" "\x00"
"devid=0x43e2" "\x00"
"boardtype=0x086c" "\x00"
"boardrev=0x1101" "\x00"
"boardnum=22" "\x00"
NVRAM_GENERATED_MAC_ADDRESS "\x00"
"sromrev=11" "\x00"
"boardflags=0x00404201" "\x00"
"boardflags3=0x08000000" "\x00"
"xtalfreq=37400" "\x00"
"nocrc=1" "\x00"
"ag0=255" "\x00"
"aa2g=1" "\x00"
"ccode=ALL" "\x00"
//#Antenna diversity
//#"swdiv_en=1" "\x00"
//#"swdiv_gpio=2" "\x00"
"pa0itssit=0x20" "\x00"
"extpagain2g=0" "\x00"
//#PA parameters for 2.4GHz, measured at CHIP OUTPUT
"pa2ga0=-168,6905,-799" "\x00"
"AvVmid_c0=0x0,0xc8" "\x00"
"cckpwroffset0=5" "\x00"
//# PPR params
"maxp2ga0=84" "\x00"
"txpwrbckof=6" "\x00"
"cckbw202gpo=0" "\x00"
"legofdmbw202gpo=0x66111111" "\x00"
"mcsbw202gpo=0x77711111" "\x00"
"propbw202gpo=0xdd" "\x00"
//# OFDM IIR :
"ofdmdigfilttype=18" "\x00"
"ofdmdigfilttypebe=18" "\x00"
//# PAPD mode:
"papdmode=1" "\x00"
"papdvalidtest=1" "\x00"
"pacalidx2g=32" "\x00"
"papdepsoffset=-36" "\x00"
"papdendidx=61" "\x00"
//# LTECX flags
//#"ltecxmux=1" "\x00"
//#"ltecxpadnum=0x02030401" "\x00"
//#"ltecxfnsel=0x3003" "\x00"
//#"ltecxgcigpio=0x3012" "\x00"
//#il0macaddr=00:90:4c:c5:12:38
"wl0id=0x431b" "\x00"
"deadman_to=0xffffffff" "\x00"
//# muxenab: 0x1 for UART enable, 0x2 for GPIOs, 0x8 for JTAG, 0x10 for HW OOB
"muxenab=0x11" "\x00"
//# CLDO PWM voltage settings - 0x4 - 1.1 volt
//#cldo_pwm=0x4 "\x00"
//#VCO freq 326.4MHz
"spurconfig=0x3" "\x00"
"\x00\x00";
#ifdef __cplusplus
} /* extern "C" */
#endif
#else /* ifndef INCLUDED_NVRAM_IMAGE_H_ */
#error Wi-Fi NVRAM image included twice
#endif /* ifndef INCLUDED_NVRAM_IMAGE_H_ */

View File

@ -15,7 +15,9 @@
*/
/** @file
* NVRAM variables taken from BCM943438WLPTH nvram file (2.4 GHz, 20 MHz BW mode)
* NVRAM file for CY8CKIT-062-WiFi-BT (PSoC6 WiFi-BT Pioneer Kit) using
* Murata's Type 1DX module - Copied from bcm94343wwcd1.txt on 08/04/2019
* # 2.4 GHz, 20 MHz BW mode; No Antenna Diversity
*/
#ifndef INCLUDED_NVRAM_IMAGE_H_
@ -37,33 +39,34 @@ extern "C" {
static const char wifi_nvram_image[] =
// # The following parameter values are just placeholders, need to be updated.
"manfid=0x2d0" "\x00"
"prodid=0x0726" "\x00"
"prodid=0x086c" "\x00"
"vendid=0x14e4" "\x00"
"devid=0x43e2" "\x00"
"boardtype=0x0726" "\x00"
"boardrev=0x1101" "\x00"
"boardtype=0x086c" "\x00"
"boardrev=0x1110" "\x00"
"boardnum=22" "\x00"
"xtalfreq=37400" "\x00"
NVRAM_GENERATED_MAC_ADDRESS "\x00"
"sromrev=11" "\x00"
"boardflags=0x00404201" "\x00"
"boardflags3=0x08000000" "\x00"
NVRAM_GENERATED_MAC_ADDRESS "\x00"
"nocrc=1" "\x00"
"ag0=255" "\x00"
"aa2g=1" "\x00"
"ccode=ALL"
"\x00"
//#Antenna diversity
"swdiv_en=1" "\x00"
"swdiv_gpio=1" "\x00"
"swdiv_gpio_1=2" "\x00"
"ccode=ALL" "\x00"
//#Antenna diversity
//#"swdiv_en=1" "\x00"
//#"swdiv_gpio=2" "\x00"
"pa0itssit=0x20" "\x00"
"extpagain2g=0" "\x00"
//#PA parameters for 2.4GHz, measured at CHIP OUTPUT
"pa2ga0=-168,6905,-799" "\x00"
"AvVmid_c0=0x0,0xc8" "\x00"
"cckpwroffset0=5" "\x00"
//# PPR params
"maxp2ga0=84" "\x00"
"txpwrbckof=6" "\x00"
@ -71,27 +74,33 @@ static const char wifi_nvram_image[] =
"legofdmbw202gpo=0x66111111" "\x00"
"mcsbw202gpo=0x77711111" "\x00"
"propbw202gpo=0xdd" "\x00"
//# OFDM IIR :
"ofdmdigfilttype=18" "\x00"
"ofdmdigfilttypebe=18" "\x00"
//# PAPD mode:
"papdmode=1" "\x00"
"papdvalidtest=1" "\x00"
"pacalidx2g=32" "\x00"
"papdepsoffset=-36" "\x00"
"papdendidx=61" "\x00"
//# LTECX flags
// "ltecxmux=1" "\x00"
//"ltecxpadnum=0x02030401" "\x00"
// "ltecxfnsel=0x3003" "\x00"
// "ltecxgcigpio=0x3012" "\x00"
//#"ltecxmux=1" "\x00"
//#"ltecxpadnum=0x02030401" "\x00"
//#"ltecxfnsel=0x3003" "\x00"
//#"ltecxgcigpio=0x3012" "\x00"
//#il0macaddr=00:90:4c:c5:12:38
"wl0id=0x431b" "\x00"
"deadman_to=0xffffffff" "\x00"
//# muxenab: 0x1 for UART enable, 0x2 for GPIOs, 0x8 for JTAG, 0x10 for HW OOB
"muxenab=0x11" "\x00"
//# CLDO PWM voltage settings - 0x4 - 1.1 volt
//#cldo_pwm=0x4 "\x00"
//#VCO freq 326.4MHz
"spurconfig=0x3" "\x00"
"\x00\x00";

View File

@ -0,0 +1,118 @@
/*
* Copyright (c) 2019, Cypress Semiconductor Corporation, All Rights Reserved
* SPDX-License-Identifier: LicenseRef-PBL
*
* This file and the related binary are licensed under the
* Permissive Binary License, Version 1.0 (the "License");
* you may not use these files except in compliance with the License.
*
* You may obtain a copy of the License here:
* LICENSE-permissive-binary-license-1.0.txt and at
* https://www.mbed.com/licenses/PBL-1.0
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/** @file
* # NVRAM file for CY8CMOD-062-4343W (PSoC6 with CYW4343W WiFi-BT - Murata's
* Type 1DX Module) - Copied from bcm94343wwcd1.txt on 08/04/2019
* # 2.4 GHz, 20 MHz BW mode; No Antenna Diversity
*/
#ifndef INCLUDED_NVRAM_IMAGE_H_
#define INCLUDED_NVRAM_IMAGE_H_
#include <string.h>
#include <stdint.h>
#include "generated_mac_address.txt"
#ifdef __cplusplus
extern "C" {
#endif
/**
* Character array of NVRAM image
*/
static const char wifi_nvram_image[] =
// # The following parameter values are just placeholders, need to be updated.
"manfid=0x2d0" "\x00"
"prodid=0x086c" "\x00"
"vendid=0x14e4" "\x00"
"devid=0x43e2" "\x00"
"boardtype=0x086c" "\x00"
"boardrev=0x1101" "\x00"
"boardnum=22" "\x00"
NVRAM_GENERATED_MAC_ADDRESS "\x00"
"sromrev=11" "\x00"
"boardflags=0x00404201" "\x00"
"boardflags3=0x08000000" "\x00"
"xtalfreq=37400" "\x00"
"nocrc=1" "\x00"
"ag0=255" "\x00"
"aa2g=1" "\x00"
"ccode=ALL" "\x00"
//#Antenna diversity
//#"swdiv_en=1" "\x00"
//#"swdiv_gpio=2" "\x00"
"pa0itssit=0x20" "\x00"
"extpagain2g=0" "\x00"
//#PA parameters for 2.4GHz, measured at CHIP OUTPUT
"pa2ga0=-168,6905,-799" "\x00"
"AvVmid_c0=0x0,0xc8" "\x00"
"cckpwroffset0=5" "\x00"
//# PPR params
"maxp2ga0=84" "\x00"
"txpwrbckof=6" "\x00"
"cckbw202gpo=0" "\x00"
"legofdmbw202gpo=0x66111111" "\x00"
"mcsbw202gpo=0x77711111" "\x00"
"propbw202gpo=0xdd" "\x00"
//# OFDM IIR :
"ofdmdigfilttype=18" "\x00"
"ofdmdigfilttypebe=18" "\x00"
//# PAPD mode:
"papdmode=1" "\x00"
"papdvalidtest=1" "\x00"
"pacalidx2g=32" "\x00"
"papdepsoffset=-36" "\x00"
"papdendidx=61" "\x00"
//# LTECX flags
//#"ltecxmux=1" "\x00"
//#"ltecxpadnum=0x02030401" "\x00"
//#"ltecxfnsel=0x3003" "\x00"
//#"ltecxgcigpio=0x3012" "\x00"
//#il0macaddr=00:90:4c:c5:12:38
"wl0id=0x431b" "\x00"
"deadman_to=0xffffffff" "\x00"
//# muxenab: 0x1 for UART enable, 0x2 for GPIOs, 0x8 for JTAG, 0x10 for HW OOB
"muxenab=0x11" "\x00"
//# CLDO PWM voltage settings - 0x4 - 1.1 volt
//#cldo_pwm=0x4 "\x00"
//#VCO freq 326.4MHz
"spurconfig=0x3" "\x00"
"\x00\x00";
#ifdef __cplusplus
} /* extern "C" */
#endif
#else /* ifndef INCLUDED_NVRAM_IMAGE_H_ */
#error Wi-Fi NVRAM image included twice
#endif /* ifndef INCLUDED_NVRAM_IMAGE_H_ */

View File

@ -38,32 +38,30 @@ extern "C" {
* cyw943012csp_ty1LV.TXT
*/
static const char wifi_nvram_image[] =
"NVRAMRev=$Rev: 351687 $" "\x00"
"NVRAMRev=$Rev:722124$" "\x00"
"sromrev=11" "\x00"
"cckdigfilttype=4" "\x00"
"cckpwroffset0=3" "\x00"
"cckpwroffset0=2" "\x00"
"bphyscale=0x20" "\x00"
"boardflags3=0x40000100" "\x00"
"vendid=0x14e4" "\x00"
"devid=0xA804" "\x00"
"manfid=0x2d0" "\x00"
"prodid=0x052e" "\x00"
"#macaddr=00:90:4c:2a:80:00" "\x00"
"macaddr=00:90:4c:2a:9${maclo12}" "\x00"
"#macaddr=00:90:4c:2a:80:80" "\x00"
NVRAM_GENERATED_MAC_ADDRESS "\x00"
"mac_clkgating=1" "\x00"
"nocrc=1" "\x00"
"boardtype=0x0842" "\x00"
"boardrev=0x1100" "\x00"
"boardtype=0x0871" "\x00"
"boardrev=0x1202" "\x00"
"xtalfreq=37400" "\x00"
"boardflags2=0xc0000000" "\x00"
"boardflags=0x00000000" "\x00"
"boardflags=0x00000001" "\x00"
"etmode=0x11" "\x00"
"extpagain2g=2" "\x00"
"extpagain5g=2" "\x00"
"ccode=0" "\x00"
"regrev=0" "\x00"
"antswitch = 0" "\x00"
"antswitch=0" "\x00"
"rxgains2gelnagaina0=0" "\x00"
"rxgains2gtrisoa0=15" "\x00"
"rxgains2gtrelnabypa0=0" "\x00"
@ -82,19 +80,18 @@ static const char wifi_nvram_image[] =
"tssipos2g=0" "\x00"
"femctrl=17" "\x00"
"subband5gver=4" "\x00"
"pa2ga0=-108,5627,-638" "\x00"
"# pa5ga0=-23,5933,-815,-29,5959,-814,-60,6093,-813,-50,6414,-836" "\x00"
"pa5ga0=-41,6533,-726,-29,6654,-746,9,6914,-772,12,7008,-806" "\x00"
"pa2ga0=-108,6062,-661" "\x00"
"pa5ga0=-82,6252,-698,-14,6722,-697,-92,6084,-710,-88,6465,-755" "\x00"
"pdoffset40ma0=0" "\x00"
"pdoffset80ma0=0" "\x00"
"lowpowerrange2g=0" "\x00"
"lowpowerrange5g=0" "\x00"
"ed_thresh2g=-63" "\x00"
"ed_thresh5g=-63" "\x00"
"swctrlmap_2g=0x10101010,0x20202020,0x10101010,0x414040,0x3ff" "\x00"
"swctrlmapext_2g=0x00000100,0x01000100,0x01000100,0x010000,0x301" "\x00"
"swctrlmap_5g=0x80808080,0x00000000,0x80808080,0x404040,0x3ff" "\x00"
"swctrlmapext_5g=0x01000100,0x01000100,0x00000000,0x000100,0x303" "\x00"
"swctrlmap_2g=0x10101010,0x20202020,0x10101010,0x442020,0x3ff" "\x00"
"swctrlmapext_2g=0x01000100,0x01000100,0x01000100,0x000000,0x301" "\x00"
"swctrlmap_5g=0x80808080,0x00000000,0x80808080,0x442020,0x381" "\x00"
"swctrlmapext_5g=0x01000100,0x01000100,0x00000000,0x000000,0x303" "\x00"
"ulpnap=0" "\x00"
"ulpadc=1" "\x00"
"ssagc_en=0" "\x00"
@ -106,19 +103,17 @@ static const char wifi_nvram_image[] =
"epacal5g=0" "\x00"
"papdcck=0" "\x00"
"epacal2g_mask=0x3fff" "\x00"
"maxp2ga0=82" "\x00"
"ofdmlrbw202gpo=0x0077" "\x00"
"dot11agofdmhrbw202gpo=0x8888" "\x00"
"mcsbw202gpo=0x99999999" "\x00"
"#mcsbw402gpo=0x99555533" "\x00"
"maxp5ga0=82,82,82,82" "\x00"
"mcsbw205glpo=0x99999999" "\x00"
"mcsbw205gmpo=0x99999999" "\x00"
"mcsbw205ghpo=0x99999999" "\x00"
"maxp2ga0=74" "\x00"
"ofdmlrbw202gpo=0x0020" "\x00"
"dot11agofdmhrbw202gpo=0x6442" "\x00"
"mcsbw202gpo=0xCC864420" "\x00"
"maxp5ga0=70,70,70,70" "\x00"
"mcsbw205glpo=0xCC864220" "\x00"
"mcsbw205gmpo=0xCC864220" "\x00"
"mcsbw205ghpo=0xCC864220" "\x00"
"femctrlwar=0" "\x00"
"use5gpllfor2g=1" "\x00"
"pt5db_gaintbl=0" "\x00"
"txwbpapden=1" "\x00"
"wb_rxattn=0x0303" "\x00"
"wb_txattn=0x0203" "\x00"
@ -141,19 +136,15 @@ static const char wifi_nvram_image[] =
"nb_eps_offset=0x01d701d7" "\x00"
"nb_bbmult=0x5A5A" "\x00"
"nb_tia_gain_mode=0x0000" "\x00"
"# AvVmid_c0=6,100,3,141,3,141,3,141,3,141" "\x00"
"AvVmid_c0=6,100,7,70,7,70,7,70,7,70" "\x00"
"tssisleep_en=0x5" "\x00"
"lpflags=0x28" "\x00"
"lpo_select=4" "\x00"
"muxenab=0x01" "\x00"
"paprrmcsgamma2g=450,500,550,600,675,950,950,950,950,950,950,950" "\x00"
"paprrmcsgamma5g20=450,500,550,600,800,950,1100,1100,1100,1100,1100,1100" "\x00"
"#paprdis=1" "\x00"
"#SW-Diversity Related parameters" "\x00"
"swdiv_en=1 #To enable SW-DIV feature" "\x00"
"paprrmcsgamma5g20=450,500,550,600,800,950,1100,1100,1100,1100,1100,1100" "\x00"
"swdiv_en=0 #To enable SW-DIV feature" "\x00"
"swdiv_gpio=0" "\x00"
"swdiv_swctrl_en=2" "\x00"
"swdiv_swctrl_ant0=0" "\x00"

View File

@ -0,0 +1,298 @@
/*
* Copyright (c) 2019, Cypress Semiconductor Corporation, All Rights Reserved
* SPDX-License-Identifier: LicenseRef-PBL
*
* This file and the related binary are licensed under the
* Permissive Binary License, Version 1.0 (the "License");
* you may not use these files except in compliance with the License.
*
* You may obtain a copy of the License here:
* LICENSE-permissive-binary-license-1.0.txt and at
* https://www.mbed.com/licenses/PBL-1.0
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/** @file
* NVRAM file for CYW9P62S1-43012EVB-01
*/
#ifndef INCLUDED_NVRAM_IMAGE_H_
#define INCLUDED_NVRAM_IMAGE_H_
#include <string.h>
#include <stdint.h>
#include "../generated_mac_address.txt"
#ifdef __cplusplus
extern "C" {
#endif
/**
* Character array of NVRAM image
* Generated from cyw9p62_43012car_01_P101_722082.txt
*/
static const char wifi_nvram_image[] =
"" "\x00"
"NVRAMRev=$Rev: 722082 $" "\x00"
"sromrev=11" "\x00"
"etmode=0x11" "\x00"
"cckdigfilttype=4" "\x00"
"bphyscale=0x20" "\x00"
"boardflags3=0x40000101" "\x00"
"vendid=0x14e4" "\x00"
"devid=0xA804" "\x00"
"manfid=0x2d0" "\x00"
"prodid=0x052e" "\x00"
NVRAM_GENERATED_MAC_ADDRESS "\x00"
"nocrc=1" "\x00"
"boardtype=0x0866" "\x00"
"boardrev=0x1101" "\x00"
"lpflags=0x00000420" "\x00"
"xtalfreq=37400" "\x00"
"boardflags2=0xc0800000" "\x00"
"boardflags=0x00400001" "\x00"
"extpagain2g=2" "\x00"
"extpagain5g=2" "\x00"
"ccode=0" "\x00"
"regrev=0" "\x00"
"antswitch=0" "\x00"
"rxgains2gelnagaina0=0" "\x00"
"rxgains2gtrisoa0=15" "\x00"
"rxgains2gtrelnabypa0=0" "\x00"
"rxgains5gelnagaina0=0" "\x00"
"rxgains5gtrisoa0=9" "\x00"
"rxgains5gtrelnabypa0=0" "\x00"
"pdgain5g=0" "\x00"
"pdgain2g=0" "\x00"
"tworangetssi2g=0" "\x00"
"tworangetssi5g=0" "\x00"
"rxchain=1" "\x00"
"txchain=1" "\x00"
"aa2g=1" "\x00"
"aa5g=1" "\x00"
"tssipos5g=0" "\x00"
"tssipos2g=0" "\x00"
"tssisleep_en=0x5" "\x00"
"femctrl=17" "\x00"
"subband5gver=4" "\x00"
"pa2ga0=-100,5849,-671" "\x00"
"pa5ga0=8,6421,-630,-31,6325,-670,-24,6386,-649,-70,6028,-658" "\x00"
"cckpwroffset0=2" "\x00"
"pdoffset40ma0=0" "\x00"
"pdoffset80ma0=0" "\x00"
"lowpowerrange2g=0" "\x00"
"lowpowerrange5g=0" "\x00"
"rssicorrnorm_c0=-10,0" "\x00"
"rssicorrnorm5g_c0=-10,0,0,-15,0,0,-15,0,0,-15,0,0" "\x00"
"ed_thresh2g=-63" "\x00"
"ed_thresh5g=-63" "\x00"
"swctrlmap_2g=0x10001000,0x50405040, 0x50405040,0x004040,0x3e7" "\x00"
"swctrlmapext_2g=0x02020202,0x02020202, 0x02020202,0x000000,0x003" "\x00"
"swctrlmap_5g=0x10001000,0x10001000,0x10001000,0x004040,0x3bf" "\x00"
"swctrlmapext_5g=0x00000000,0x03030303, 0x03030303,0x000000,0x001" "\x00"
"ulpnap=0" "\x00"
"ulpadc=1" "\x00"
"ssagc_en=0" "\x00"
"ds1_nap=0" "\x00"
"epacal2g=0" "\x00"
"epacal5g=0" "\x00"
"epacal2g_mask=0x3fff" "\x00"
"maxp2ga0=82" "\x00"
"ofdmlrbw202gpo=0x0077" "\x00"
"dot11agofdmhrbw202gpo=0x8888" "\x00"
"mcsbw202gpo=0x99999999" "\x00"
"mac_clkgating=1" "\x00"
"maxp5ga0=82,82,82,82" "\x00"
"mcsbw205glpo=0xffc97777" "\x00"
"mcsbw205gmpo=0xffc97777" "\x00"
"mcsbw205ghpo=0xffc97777" "\x00"
"" "\x00"
"txwbpapden=1" "\x00"
"femctrlwar=0" "\x00"
"use5gpllfor2g=1" "\x00"
"wb_rxattn=0x0303" "\x00"
"wb_txattn=0x0202" "\x00"
"wb_papdcalidx=0x1015" "\x00"
"wb_papdcalidx_5g=0x00101010" "\x00"
"wb_eps_offset=0x01bf01af" "\x00"
"wb_eps_offset_5g=0x01bf01bf" "\x00"
"wb_bbmult=0x67" "\x00"
"wb_bbmult_5g=0x004f5052" "\x00"
"wb_calref_db=0x1926" "\x00"
"wb_tia_gain_mode=0x0606" "\x00"
"wb_txbuf_offset=0x1e1e" "\x00"
"wb_frac_del=0x78ae" "\x00"
"wb_g_frac_bits=0xaa" "\x00"
"" "\x00"
"" "\x00"
"nb_rxattn=0x0403" "\x00"
"nb_txattn=0x0402" "\x00"
"nb_papdcalidx=0x1405" "\x00"
"nb_eps_offset=0x01d701ca" "\x00"
"nb_bbmult=0x5A50" "\x00"
"nb_tia_gain_mode=0x0006" "\x00"
"AvVmid_c0=6,104,7,80,7,80,7,80,7,80" "\x00"
"" "\x00"
"" "\x00"
"lpo_select=4" "\x00"
"" "\x00"
"csml=0x10" "\x00"
"pt5db_gaintbl=0" "\x00"
"" "\x00"
"papdcck=0" "\x00"
"phycal_tempdelta=15" "\x00"
"paprrmcsgamma2g=450,500,550,600,675,950,950,950,950,950,950,950" "\x00"
"paprrmcsgamma5g20=550,550,550,600,800,950,1100,1100,1100,1100,1100,1100" "\x00"
"\x00\x00";
#ifdef __cplusplus
} /*extern "C" */
#endif
#else /* ifndef INCLUDED_NVRAM_IMAGE_H_ */
#error Wi-Fi NVRAM image included twice
#endif /* ifndef INCLUDED_NVRAM_IMAGE_H_ */

View File

@ -0,0 +1,100 @@
/*
* Copyright (c) 2019, Cypress Semiconductor Corporation, All Rights Reserved
* SPDX-License-Identifier: LicenseRef-PBL
*
* This file and the related binary are licensed under the
* Permissive Binary License, Version 1.0 (the "License");
* you may not use these files except in compliance with the License.
*
* You may obtain a copy of the License here:
* LICENSE-permissive-binary-license-1.0.txt and at
* https://www.mbed.com/licenses/PBL-1.0
*
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/** @file
* NVRAM file for CYW9P62S1-43438EVB-01
*/
#ifndef INCLUDED_NVRAM_IMAGE_H_
#define INCLUDED_NVRAM_IMAGE_H_
#include <string.h>
#include <stdint.h>
#include "generated_mac_address.txt"
#ifdef __cplusplus
extern "C" {
#endif
/**
* Character array of NVRAM image
* Generated from cyw943438_26MHz_aw-cu427.txt
*/
static const char wifi_nvram_image[] =
"" "\x00"
"NVRAMRev=$Rev$" "\x00"
"manfid=0x2d0" "\x00"
"prodid=0x0727" "\x00"
"vendid=0x14e4" "\x00"
"devid=0x43e2" "\x00"
"boardtype=0x0865" "\x00"
"boardrev=0x1100" "\x00"
"boardnum=22" "\x00"
NVRAM_GENERATED_MAC_ADDRESS "\x00"
"sromrev=11" "\x00"
"boardflags=0x00404201" "\x00"
"boardflags3=0x08000000" "\x00"
"xtalfreq=26000" "\x00"
"nocrc=1" "\x00"
"ag0=255" "\x00"
"aa2g=1" "\x00"
"ccode=ALL" "\x00"
"" "\x00"
"swdiv_en=1" "\x00"
"swdiv_gpio=1" "\x00"
"swdiv_gpio_1=2" "\x00"
"" "\x00"
"pa0itssit=0x20" "\x00"
"extpagain2g=0" "\x00"
"" "\x00"
"pa2ga0=-148,6421,-710" "\x00"
"AvVmid_c0=0x0,0xc8" "\x00"
"cckpwroffset0=5" "\x00"
"" "\x00"
"maxp2ga0=84" "\x00"
"txpwrbckof=6" "\x00"
"cckbw202gpo=0" "\x00"
"legofdmbw202gpo=0x66111111" "\x00"
"mcsbw202gpo=0x77711111" "\x00"
"propbw202gpo=0xdd" "\x00"
"" "\x00"
"ofdmdigfilttype=18" "\x00"
"ofdmdigfilttypebe=18" "\x00"
"papdmode=1" "\x00"
"papdvalidtest=1" "\x00"
"pacalidx2g=32" "\x00"
"papdepsoffset=-36" "\x00"
"papdendidx=61" "\x00"
"" "\x00"
"wl0id=0x431b" "\x00"
"" "\x00"
"deadman_to=0xffffffff" "\x00"
"muxenab=0x11" "\x00"
"" "\x00"
"spurconfig=0x3" "\x00"
"" "\x00"
"rssicorrnorm=3" "\x00"
"\x00\x00";
#ifdef __cplusplus
} /*extern "C" */
#endif
#else /* ifndef INCLUDED_NVRAM_IMAGE_H_ */
#error Wi-Fi NVRAM image included twice
#endif /* ifndef INCLUDED_NVRAM_IMAGE_H_ */

View File

@ -18,11 +18,11 @@
/** @file
* Defines WHD resource functions for BCM943340WCD1 platform
*/
#include "resources.h"
#include "wifi_nvram_image.h"
#include "whd_resource_api.h"
#include "whd_debug.h"
#include "whd.h"
#include "resources.h"
/******************************************************
* Macros
@ -57,8 +57,8 @@
* Static Function Declarations
******************************************************/
uint32_t host_platform_resource_size(whd_driver_t whd_drv, whd_resource_type_t resource, uint32_t *size_out);
uint32_t host_get_resource_block(whd_driver_t whd_drv, whd_resource_type_t type, const uint8_t **data,
uint32_t *size_out);
uint32_t host_get_resource_block(whd_driver_t whd_drv, whd_resource_type_t type,
uint32_t blockno, const uint8_t **data, uint32_t *size_out);
uint32_t host_get_resource_no_of_blocks(whd_driver_t whd_drv, whd_resource_type_t type, uint32_t *block_count);
uint32_t host_get_resource_block_size(whd_driver_t whd_drv, whd_resource_type_t type, uint32_t *size_out);
resource_result_t resource_read(const resource_hnd_t *resource, uint32_t offset, uint32_t maxsize, uint32_t *size,
@ -189,35 +189,29 @@ uint32_t host_platform_resource_size(whd_driver_t whd_drv, whd_resource_type_t r
return WHD_SUCCESS;
}
uint32_t host_get_resource_block(whd_driver_t whd_drv, whd_resource_type_t type, const uint8_t **data,
uint32_t *size_out)
uint32_t host_get_resource_block(whd_driver_t whd_drv, whd_resource_type_t type,
uint32_t blockno, const uint8_t **data, uint32_t *size_out)
{
uint32_t resource_size;
uint32_t block_size;
uint32_t block_count;
static uint32_t transfer_progress;
static uint32_t i;
uint32_t read_pos;
uint32_t result;
host_platform_resource_size(whd_drv, type, &resource_size);
host_get_resource_block_size(whd_drv, type, &block_size);
host_get_resource_no_of_blocks(whd_drv, type, &block_count);
memset(r_buffer, 0, block_size);
if (i < block_count)
read_pos = blockno * block_size;
if (blockno >= block_count)
{
transfer_progress = i * block_size;
i++;
}
else
{
i = 0;
transfer_progress = i * block_size;
i++;
return WHD_BADARG;
}
if (type == WHD_RESOURCE_WLAN_FIRMWARE)
{
result = resource_read( (const resource_hnd_t *)&wifi_firmware_image, transfer_progress, block_size, size_out,
result = resource_read( (const resource_hnd_t *)&wifi_firmware_image, read_pos, block_size, size_out,
r_buffer );
if (result != WHD_SUCCESS)
{
@ -236,13 +230,19 @@ uint32_t host_get_resource_block(whd_driver_t whd_drv, whd_resource_type_t type,
}
else if (type == WHD_RESOURCE_WLAN_NVRAM)
{
*size_out = NVRAM_SIZE;
*data = (uint8_t *)NVRAM_IMAGE_VARIABLE;
i = 0;
if (NVRAM_SIZE - read_pos > block_size)
{
*size_out = block_size;
}
else
{
*size_out = NVRAM_SIZE - read_pos;
}
*data = ( (uint8_t *)NVRAM_IMAGE_VARIABLE ) + read_pos;
}
else
{
result = resource_read( (const resource_hnd_t *)&wifi_firmware_clm_blob, transfer_progress, block_size,
result = resource_read( (const resource_hnd_t *)&wifi_firmware_clm_blob, read_pos, block_size,
size_out,
r_buffer );
if (result != WHD_SUCCESS)
@ -261,7 +261,6 @@ uint32_t host_get_resource_block(whd_driver_t whd_drv, whd_resource_type_t type,
*/
}
transfer_progress = 0;
return WHD_SUCCESS;
}
@ -274,19 +273,15 @@ uint32_t host_get_resource_block_size(whd_driver_t whd_drv, whd_resource_type_t
uint32_t host_get_resource_no_of_blocks(whd_driver_t whd_drv, whd_resource_type_t type, uint32_t *block_count)
{
if (type == WHD_RESOURCE_WLAN_NVRAM)
*block_count = 1;
else
{
uint32_t resource_size;
uint32_t block_size;
uint32_t resource_size;
uint32_t block_size;
host_platform_resource_size(whd_drv, type, &resource_size);
host_get_resource_block_size(whd_drv, type, &block_size);
*block_count = resource_size / block_size;
if (resource_size % block_size)
*block_count += 1;
host_platform_resource_size(whd_drv, type, &resource_size);
host_get_resource_block_size(whd_drv, type, &block_size);
*block_count = resource_size / block_size;
if (resource_size % block_size)
*block_count += 1;
}
return WHD_SUCCESS;
}

View File

@ -56,6 +56,21 @@ extern "C" {
#define RESULT_ENUM(prefix, name, value) prefix ## name = (value)
#endif /* ifndef RESULT_ENUM */
#if !defined(CY_SECTION)
#if defined(__ARMCC_VERSION)
#define CY_SECTION(name) __attribute__ ( (section(name) ) )
#elif defined (__GNUC__)
#if defined (__clang__)
#define CY_SECTION(name) __attribute__ ( (section("__DATA, "name) ) )
#else
#define CY_SECTION(name) __attribute__ ( (section(name) ) )
#endif
#elif defined (__ICCARM__)
#define CY_SECTION(name) CY_PRAGMA(location = name)
#else
#error "An unsupported toolchain"
#endif /* (__ARMCC_VERSION) */
#endif /* !defined(CY_SECTION) */
/* These Enum result values are for Resource errors
* Values: 4000 - 4999

View File

@ -114,17 +114,11 @@ whd_bool_t whd_bus_is_flow_controlled(whd_driver_t whd_driver)
static whd_result_t whd_bus_common_download_resource(whd_driver_t whd_driver, whd_resource_type_t resource,
whd_bool_t direct_resource, uint32_t address)
{
uint32_t transfer_progress;
whd_buffer_t buffer;
uint32_t block_size;
whd_result_t result = WHD_SUCCESS;
uint8_t *image;
uint32_t image_size;
uint8_t *packet;
uint16_t transfer_size = 0;
uint32_t segment_size;
uint32_t blocks_count = 0;
uint32_t i, j, num_buff;
uint32_t i;
uint32_t size_out;
uint32_t reset_instr = 0;
@ -145,15 +139,6 @@ static whd_result_t whd_bus_common_download_resource(whd_driver_t whd_driver, wh
goto exit;
}
/* Transfer firmware image into the RAM */
result = whd_get_resource_block_size(whd_driver, resource, &block_size);
if (result != WHD_SUCCESS)
{
WPRINT_WHD_ERROR( ("Fatal error: download_resource block size not know, %s failed at line %d \n", __func__,
__LINE__) );
goto exit;
}
result = whd_get_resource_no_of_blocks(whd_driver, resource, &blocks_count);
if (result != WHD_SUCCESS)
{
@ -162,82 +147,23 @@ static whd_result_t whd_bus_common_download_resource(whd_driver_t whd_driver, wh
goto exit;
}
result = whd_host_buffer_get(whd_driver, &buffer, WHD_NETWORK_TX,
(uint16_t)(BLOCK_SIZE + sizeof(whd_buffer_header_t) ), WHD_FALSE);
if (result != WHD_SUCCESS)
{
WPRINT_WHD_ERROR( ("%s:%d whd_host_buffer_get() failed\n", __func__, __LINE__) );
goto exit;
}
transfer_progress = 0;
for (i = 0; i < blocks_count; i++)
{
/*
* In case of direct read the no of blocks is one and we would be getting a pointer pointing to entire resource
* In case of indirect read the no of blocks is the size of the resource/ size of blocks,
* get resource block would return pointer to the block
*/
CHECK_RETURN(whd_get_resource_block(whd_driver, resource, (const uint8_t **)&image, &size_out) );
/* Need to find the min size last block will be less that block_size */
transfer_size = MIN_OF(BLOCK_SIZE, size_out);
num_buff = (size_out + transfer_size - 1) / transfer_size;
if (blocks_count != 1)
transfer_progress = 0;
for (j = 0; j < num_buff; j++)
CHECK_RETURN(whd_get_resource_block(whd_driver, resource, i, (const uint8_t **)&image, &size_out) );
if ( (resource == WHD_RESOURCE_WLAN_FIRMWARE) && (reset_instr == 0) )
{
transfer_size = (uint16_t)MIN_OF(BLOCK_SIZE, image_size - transfer_progress);
packet = (uint8_t *)whd_buffer_get_current_piece_data_pointer(whd_driver, buffer);
memcpy(packet + sizeof(whd_buffer_header_t), &image[transfer_progress], transfer_size);
/* Round up the size of the chunk */
transfer_size = (uint16_t)ROUND_UP(transfer_size, WHD_BUS_ROUND_UP_ALIGNMENT);
segment_size = transfer_size;
transfer_size = (uint16_t)MIN_OF(whd_bus_get_max_transfer_size(whd_driver), transfer_size);
if (address != 0)
{
if ( (resource == WHD_RESOURCE_WLAN_FIRMWARE) && (reset_instr == 0) )
{
/* Copy the starting address of the firmware into a global variable */
reset_instr = *( (uint32_t *)(packet + sizeof(whd_buffer_header_t) ) );
}
}
for (; segment_size != 0;
segment_size -= transfer_size, packet += transfer_size)
{
if (whd_driver->bus_common_info->resource_download_abort == WHD_TRUE)
{
WPRINT_WHD_ERROR( ("Download_resource is aborted; terminating after %" PRIu32 " iterations\n",
transfer_progress) );
CHECK_RETURN(whd_buffer_release(whd_driver, buffer, WHD_NETWORK_TX) );
result = WHD_UNFINISHED;
goto exit;
}
result = whd_bus_set_backplane_window(whd_driver, address);
if (result != WHD_SUCCESS)
{
CHECK_RETURN(whd_buffer_release(whd_driver, buffer, WHD_NETWORK_TX) );
goto exit;
}
result = whd_bus_transfer_bytes(whd_driver, BUS_WRITE, BACKPLANE_FUNCTION,
(address & BACKPLANE_ADDRESS_MASK), transfer_size,
(whd_transfer_bytes_packet_t *)(packet +
sizeof(whd_buffer_queue_ptr_t) ) );
if (result != WHD_SUCCESS)
{
CHECK_RETURN(whd_buffer_release(whd_driver, buffer, WHD_NETWORK_TX) );
goto exit;
}
address += transfer_size;
transfer_progress = transfer_progress + transfer_size;
}
/* Copy the starting address of the firmware into a global variable */
reset_instr = *( (uint32_t *)(&image[0]) );
}
result = whd_bus_transfer_backplane_bytes(whd_driver, BUS_WRITE, address, size_out, &image[0]);
if (result != WHD_SUCCESS)
{
WPRINT_WHD_ERROR( ("%s: Failed to write firmware image\n", __FUNCTION__) );
goto exit;
}
address += size_out;
}
CHECK_RETURN(whd_buffer_release(whd_driver, buffer, WHD_NETWORK_TX) );
/* Below part of the code is applicable to arm_CR4 type chips only
* The CR4 chips by default firmware is not loaded at 0. So we need
* load the first 32 bytes with the offset of the firmware load address
@ -291,6 +217,15 @@ void whd_bus_common_info_init(whd_driver_t whd_driver)
}
}
void whd_bus_common_info_deinit(whd_driver_t whd_driver)
{
if (whd_driver->bus_common_info != NULL)
{
free(whd_driver->bus_common_info);
whd_driver->bus_common_info = NULL;
}
}
void whd_delayed_bus_release_schedule_update(whd_driver_t whd_driver, whd_bool_t is_scheduled)
{
whd_driver->bus_common_info->delayed_bus_release_scheduled = is_scheduled;
@ -518,12 +453,6 @@ whd_result_t whd_bus_transfer_backplane_bytes(whd_driver_t whd_driver, whd_bus_t
}
packet = (uint8_t *)whd_buffer_get_current_piece_data_pointer(whd_driver, pkt_buffer);
result = whd_ensure_wlan_bus_is_up(whd_driver);
if (result != WHD_SUCCESS)
{
goto done;
}
for (remaining_buf_size = size; remaining_buf_size != 0;
remaining_buf_size -= transfer_size, address += transfer_size)
{

View File

@ -27,6 +27,7 @@ extern "C" {
struct whd_bus_common_info;
void whd_bus_common_info_init(whd_driver_t whd_driver);
void whd_bus_common_info_deinit(whd_driver_t whd_driver);
/* Configure delayed sleep of bus.
* A high number will mean a longer delay before sleep after the last operation (higher performance)

View File

@ -26,6 +26,7 @@
#include <stdlib.h>
#include "cyabs_rtos.h"
#include "cyhal_sdio.h"
#include "cyhal_gpio.h"
#include "whd_bus_sdio_protocol.h"
#include "whd_bus.h"
@ -40,7 +41,7 @@
#include "whd_buffer_api.h"
#include "whd_resource_if.h"
#include "whd_types_int.h"
#include "whd_bus_types.h"
#include "whd_types.h"
/******************************************************
@ -77,8 +78,7 @@ struct whd_bus_priv
{
whd_sdio_config_t sdio_config;
whd_bus_stats_t whd_bus_stats;
void *sdio_obj;
whd_sdio_funcs_t *sdio_ops;
cyhal_sdio_t *sdio_obj;
};
@ -107,79 +107,24 @@ static whd_result_t whd_bus_sdio_download_firmware(whd_driver_t whd_driver);
static whd_result_t whd_bus_sdio_set_oob_interrupt(whd_driver_t whd_driver, uint8_t gpio_pin_number);
static void whd_bus_sdio_irq_handler(void *handler_arg, cyhal_sdio_irq_event_t event);
static void whd_bus_sdio_oob_irq_handler(void *arg, cyhal_gpio_irq_event_t event);
static whd_result_t whd_bus_sdio_irq_register(whd_driver_t whd_driver);
static whd_result_t whd_bus_sdio_irq_enable(whd_driver_t whd_driver, whd_bool_t enable);
static whd_result_t whd_bus_sdio_init_oob_intr(whd_driver_t whd_driver);
/******************************************************
* SDIO Logging
* Enable this section for logging of SDIO transfers
* by changing "if 0" to "if 1"
******************************************************/
#if 0
#define SDIO_LOG_SIZE (110)
#define SDIO_LOG_HEADER_SIZE (0) /*(0x30) */
typedef struct sdio_log_entry_struct
{
whd_bus_transfer_direction_t direction;
whd_bus_function_t function;
uint32_t address;
unsigned long time;
unsigned long length;
#if (SDIO_LOG_HEADER_SIZE != 0)
unsigned char header[SDIO_LOG_HEADER_SIZE];
#endif /* if ( SDIO_LOG_HEADER_SIZE != 0 ) */
} sdio_log_entry_t;
static int next_sdio_log_pos = 0;
static sdio_log_entry_t sdio_log_data[SDIO_LOG_SIZE];
static void add_log_entry(whd_bus_transfer_direction_t dir, whd_bus_function_t function, uint32_t address,
unsigned long length, uint8_t *data)
{
sdio_log_data[next_sdio_log_pos].direction = dir;
sdio_log_data[next_sdio_log_pos].function = function;
sdio_log_data[next_sdio_log_pos].address = address;
cy_rtos_get_time(&sdio_log_data[next_sdio_log_pos].time);
sdio_log_data[next_sdio_log_pos].length = length;
#if (SDIO_LOG_HEADER_SIZE != 0)
memcpy(sdio_log_data[next_sdio_log_pos].header, data,
(length >= SDIO_LOG_HEADER_SIZE) ? SDIO_LOG_HEADER_SIZE : length);
#else
UNUSED_PARAMETER(data);
#endif /* if ( SDIO_LOG_HEADER_SIZE != 0 ) */
next_sdio_log_pos++;
if (next_sdio_log_pos >= SDIO_LOG_SIZE)
{
next_sdio_log_pos = 0;
}
}
#else /* #if 0 */
#define add_log_entry(dir, function, address, length, data)
#endif /* #if 0 */
static whd_result_t whd_bus_sdio_deinit_oob_intr(whd_driver_t whd_driver);
static whd_result_t whd_bus_sdio_register_oob_intr(whd_driver_t whd_driver);
static whd_result_t whd_bus_sdio_unregister_oob_intr(whd_driver_t whd_driver);
static whd_result_t whd_bus_sdio_enable_oob_intr(whd_driver_t whd_driver, whd_bool_t enable);
/******************************************************
* Global Function definitions
******************************************************/
uint32_t whd_bus_sdio_attach(whd_driver_t whd_driver, whd_sdio_config_t *whd_sdio_config, void *sdio_obj,
whd_sdio_funcs_t *sdio_ops)
uint32_t whd_bus_sdio_attach(whd_driver_t whd_driver, whd_sdio_config_t *whd_sdio_config, cyhal_sdio_t *sdio_obj)
{
struct whd_bus_info *whd_bus_info;
if (whd_sdio_config->flags & WHD_BUS_SDIO_OOB_INTR)
{
if ( (sdio_ops == NULL) || (sdio_ops->whd_enable_intr == NULL) ||
(sdio_ops->whd_get_intr_config == NULL) )
{
WPRINT_WHD_ERROR( ("host-wake configuration invalid in %s\n", __FUNCTION__) );
return WHD_BADARG;
}
}
whd_bus_info = (whd_bus_info_t *)malloc(sizeof(whd_bus_info_t) );
if (whd_bus_info == NULL)
@ -202,7 +147,6 @@ uint32_t whd_bus_sdio_attach(whd_driver_t whd_driver, whd_sdio_config_t *whd_sdi
whd_driver->bus_priv->sdio_obj = sdio_obj;
whd_driver->bus_priv->sdio_config = *whd_sdio_config;
whd_driver->bus_priv->sdio_ops = sdio_ops;
whd_bus_info->whd_bus_init_fptr = whd_bus_sdio_init;
whd_bus_info->whd_bus_deinit_fptr = whd_bus_sdio_deinit;
@ -241,6 +185,20 @@ uint32_t whd_bus_sdio_attach(whd_driver_t whd_driver, whd_sdio_config_t *whd_sdi
return WHD_SUCCESS;
}
void whd_bus_sdio_detach(whd_driver_t whd_driver)
{
if (whd_driver->bus_if != NULL)
{
free(whd_driver->bus_if);
whd_driver->bus_if = NULL;
}
if (whd_driver->bus_priv != NULL)
{
free(whd_driver->bus_priv);
whd_driver->bus_priv = NULL;
}
}
whd_result_t whd_bus_sdio_ack_interrupt(whd_driver_t whd_driver, uint32_t intstatus)
{
return whd_bus_write_backplane_value(whd_driver, (uint32_t)SDIO_INT_STATUS, (uint8_t)4, intstatus);
@ -462,12 +420,8 @@ whd_result_t whd_bus_sdio_init(whd_driver_t whd_driver)
CHECK_RETURN(whd_bus_write_register_value(whd_driver, BUS_FUNCTION, SDIOD_CCCR_IOEN, (uint8_t)1,
SDIO_FUNC_ENABLE_1 | SDIO_FUNC_ENABLE_2) );
/* Check for host-wake configuration */
if (whd_driver->bus_priv->sdio_config.flags & WHD_BUS_SDIO_OOB_INTR)
{
/* Setup host-wake signals */
CHECK_RETURN(whd_bus_sdio_init_oob_intr(whd_driver) );
}
/* Setup host-wake signals */
CHECK_RETURN(whd_bus_sdio_init_oob_intr(whd_driver) );
/* Enable F2 interrupt only */
CHECK_RETURN(whd_bus_write_register_value(whd_driver, BUS_FUNCTION, SDIOD_CCCR_INTEN, (uint8_t)1,
@ -525,11 +479,7 @@ whd_result_t whd_bus_sdio_init(whd_driver_t whd_driver)
whd_result_t whd_bus_sdio_deinit(whd_driver_t whd_driver)
{
if (whd_driver->bus_priv->sdio_config.flags & WHD_BUS_SDIO_OOB_INTR)
{
const whd_variant_t oob_intr = whd_driver->bus_priv->sdio_config.oob_intr;
(*whd_driver->bus_priv->sdio_ops->whd_enable_intr)(whd_driver, oob_intr, WHD_FALSE);
}
CHECK_RETURN(whd_bus_sdio_deinit_oob_intr(whd_driver) );
cyhal_sdio_irq_enable(whd_driver->bus_priv->sdio_obj, CYHAL_SDIO_CARD_INTERRUPT, WHD_FALSE);
@ -792,16 +742,47 @@ static whd_result_t whd_bus_sdio_transfer(whd_driver_t whd_driver, whd_bus_trans
* Failing fast helps problems on the bus get brought to light more quickly
* and preserves the original behavior.
*/
if (data_size == (uint16_t)1)
whd_result_t result = WHD_SUCCESS;
uint16_t data_byte_size;
uint16_t data_blk_size;
if (data_size == 0)
{
return WHD_BADARG;
}
else if (data_size == (uint16_t)1)
{
return whd_bus_sdio_cmd52(whd_driver, direction, function, address, *data, response_expected, data);
}
else
else if (whd_driver->internal_info.whd_wlan_status.state == WLAN_UP)
{
return whd_bus_sdio_cmd53(whd_driver, direction, function,
(data_size >= (uint16_t)64) ? SDIO_BLOCK_MODE : SDIO_BYTE_MODE, address, data_size,
data, response_expected, NULL);
}
else
{
/* We need to handle remaining size for source image download */
data_byte_size = data_size % SDIO_64B_BLOCK;
data_blk_size = data_size - data_byte_size;
if (data_blk_size != 0)
{
result = whd_bus_sdio_cmd53(whd_driver, direction, function, SDIO_BLOCK_MODE, address,
data_blk_size, data, response_expected, NULL);
if (result != WHD_SUCCESS)
{
return result;
}
data += data_blk_size;
address += data_blk_size;
}
if (data_byte_size)
{
result = whd_bus_sdio_cmd53(whd_driver, direction, function, SDIO_BYTE_MODE, address,
data_byte_size, data, response_expected, NULL);
}
return result;
}
}
static whd_result_t whd_bus_sdio_cmd52(whd_driver_t whd_driver, whd_bus_transfer_direction_t direction,
@ -846,7 +827,6 @@ static whd_result_t whd_bus_sdio_cmd53(whd_driver_t whd_driver, whd_bus_transfer
if (direction == BUS_WRITE)
{
WHD_BUS_STATS_INCREMENT_VARIABLE(whd_driver->bus_priv, cmd53_write);
add_log_entry(direction, function, address, data_size, data);
}
arg.value = 0;
@ -893,7 +873,6 @@ static whd_result_t whd_bus_sdio_cmd53(whd_driver_t whd_driver, whd_bus_transfer
if (direction == BUS_READ)
{
WHD_BUS_STATS_INCREMENT_VARIABLE(whd_driver->bus_priv, cmd53_read);
add_log_entry(direction, function, address, data_size, data);
}
done:
@ -1276,12 +1255,8 @@ whd_result_t whd_bus_sdio_reinit_stats(whd_driver_t whd_driver, whd_bool_t wake_
CHECK_RETURN(whd_bus_write_register_value(whd_driver, BUS_FUNCTION, SDIOD_CCCR_IOEN, (uint8_t)1,
SDIO_FUNC_ENABLE_1 | SDIO_FUNC_ENABLE_2) );
/* Check for host-wake configuration */
if (whd_driver->bus_priv->sdio_config.flags & WHD_BUS_SDIO_OOB_INTR)
{
/* Setup host-wake signals */
CHECK_RETURN(whd_bus_sdio_init_oob_intr(whd_driver) );
}
/* Setup host-wake signals */
CHECK_RETURN(whd_bus_sdio_init_oob_intr(whd_driver) );
/* Enable F2 interrupt only */
CHECK_RETURN(whd_bus_write_register_value(whd_driver, BUS_FUNCTION, SDIOD_CCCR_INTEN, (uint8_t)1,
@ -1356,7 +1331,7 @@ uint32_t whd_bus_sdio_get_max_transfer_size(whd_driver_t whd_driver)
return WHD_BUS_SDIO_MAX_BACKPLANE_TRANSFER_SIZE;
}
void whd_bus_sdio_irq_handler(void *handler_arg, cyhal_sdio_irq_event_t event)
static void whd_bus_sdio_irq_handler(void *handler_arg, cyhal_sdio_irq_event_t event)
{
whd_driver_t whd_driver = (whd_driver_t)handler_arg;
@ -1364,10 +1339,12 @@ void whd_bus_sdio_irq_handler(void *handler_arg, cyhal_sdio_irq_event_t event)
if (event != CYHAL_SDIO_CARD_INTERRUPT)
{
WPRINT_WHD_ERROR( ("Unexpected interrupt event %d\n", event) );
WHD_BUS_STATS_INCREMENT_VARIABLE(whd_driver->bus_priv, error_intrs);
return;
}
WHD_BUS_STATS_INCREMENT_VARIABLE(whd_driver->bus_priv, sdio_intrs);
/* call thread notify to wake up WHD thread */
whd_thread_notify_irq(whd_driver);
}
@ -1384,25 +1361,68 @@ whd_result_t whd_bus_sdio_irq_enable(whd_driver_t whd_driver, whd_bool_t enable)
return WHD_SUCCESS;
}
void whd_bus_sdio_oob_intr_asserted(whd_driver_t whd_driver)
static void whd_bus_sdio_oob_irq_handler(void *arg, cyhal_gpio_irq_event_t event)
{
whd_driver_t whd_driver = (whd_driver_t)arg;
const whd_oob_config_t *config = &whd_driver->bus_priv->sdio_config.oob_config;
const cyhal_gpio_irq_event_t expected_event = (config->is_falling_edge == WHD_TRUE)
? CYHAL_GPIO_IRQ_FALL : CYHAL_GPIO_IRQ_RISE;
if (event != expected_event)
{
WPRINT_WHD_ERROR( ("Unexpected interrupt event %d\n", event) );
WHD_BUS_STATS_INCREMENT_VARIABLE(whd_driver->bus_priv, error_intrs);
return;
}
WHD_BUS_STATS_INCREMENT_VARIABLE(whd_driver->bus_priv, oob_intrs);
/* Call thread notify to wake up WHD thread */
whd_thread_notify_irq(whd_driver);
}
static whd_result_t whd_bus_sdio_register_oob_intr(whd_driver_t whd_driver)
{
const whd_oob_config_t *config = &whd_driver->bus_priv->sdio_config.oob_config;
cyhal_gpio_init(config->host_oob_pin, CYHAL_GPIO_DIR_INPUT, CYHAL_GPIO_DRIVE_NONE, 0);
cyhal_gpio_register_irq(config->host_oob_pin, config->intr_priority, whd_bus_sdio_oob_irq_handler,
whd_driver);
return WHD_SUCCESS;
}
static whd_result_t whd_bus_sdio_unregister_oob_intr(whd_driver_t whd_driver)
{
const whd_oob_config_t *config = &whd_driver->bus_priv->sdio_config.oob_config;
cyhal_gpio_register_irq(config->host_oob_pin, config->intr_priority, NULL, NULL);
return WHD_SUCCESS;
}
static whd_result_t whd_bus_sdio_enable_oob_intr(whd_driver_t whd_driver, whd_bool_t enable)
{
const whd_oob_config_t *config = &whd_driver->bus_priv->sdio_config.oob_config;
const cyhal_gpio_irq_event_t event =
(config->is_falling_edge == WHD_TRUE) ? CYHAL_GPIO_IRQ_FALL : CYHAL_GPIO_IRQ_RISE;
cyhal_gpio_irq_enable(config->host_oob_pin, event, (enable == WHD_TRUE) ? true : false);
return WHD_SUCCESS;
}
static whd_result_t whd_bus_sdio_init_oob_intr(whd_driver_t whd_driver)
{
const whd_variant_t oob_intr = whd_driver->bus_priv->sdio_config.oob_intr;
whd_intr_config_t config;
const whd_oob_config_t *config = &whd_driver->bus_priv->sdio_config.oob_config;
uint8_t sepintpol;
/* Get the host-wake configuration */
(*whd_driver->bus_priv->sdio_ops->whd_get_intr_config)(whd_driver, oob_intr, &config);
/* OOB isn't configured so bail */
if (config->host_oob_pin == CYHAL_NC_PIN_VALUE)
return WHD_SUCCESS;
/* Choose out-of-band interrupt polarity */
if (config.is_falling_edge == WHD_FALSE)
if (config->is_falling_edge == WHD_FALSE)
{
sepintpol = SEP_INTR_CTL_POL;
}
@ -1411,16 +1431,31 @@ static whd_result_t whd_bus_sdio_init_oob_intr(whd_driver_t whd_driver)
sepintpol = 0;
}
/* Enable out-of-band interrupt */
/* Set OOB interrupt to the correct WLAN GPIO pin (default to GPIO0) */
if (config->dev_gpio_sel)
CHECK_RETURN(whd_bus_sdio_set_oob_interrupt(whd_driver, config->dev_gpio_sel) );
/* Enable out-of-band interrupt on the device */
CHECK_RETURN(whd_bus_write_register_value(whd_driver, BUS_FUNCTION, SDIOD_SEP_INT_CTL, (uint8_t)1,
SEP_INTR_CTL_MASK | SEP_INTR_CTL_EN | sepintpol) );
/* Register and enable OOB */
/* XXX Remove this when BSP377 is implemented */
(*whd_driver->bus_priv->sdio_ops->whd_enable_intr)(whd_driver, oob_intr, WHD_TRUE);
/* Set OOB interrupt to the correct WLAN GPIO pin (default to GPIO0) */
if (config.dev_gpio_sel)
CHECK_RETURN(whd_bus_sdio_set_oob_interrupt(whd_driver, config.dev_gpio_sel) );
CHECK_RETURN(whd_bus_sdio_register_oob_intr(whd_driver) );
CHECK_RETURN(whd_bus_sdio_enable_oob_intr(whd_driver, WHD_TRUE) );
return WHD_SUCCESS;
}
static whd_result_t whd_bus_sdio_deinit_oob_intr(whd_driver_t whd_driver)
{
const whd_oob_config_t *config = &whd_driver->bus_priv->sdio_config.oob_config;
if (config->host_oob_pin != CYHAL_NC_PIN_VALUE)
{
CHECK_RETURN(whd_bus_sdio_enable_oob_intr(whd_driver, WHD_FALSE) );
CHECK_RETURN(whd_bus_sdio_unregister_oob_intr(whd_driver) );
}
return WHD_SUCCESS;
}

View File

@ -32,7 +32,7 @@ extern "C" {
#define WHD_BUS_HEADER_SIZE (0)
#define WHD_BUS_SDIO_MAX_BACKPLANE_TRANSFER_SIZE (WHD_PAYLOAD_MTU)
#define WHD_BUS_SDIO_MAX_BACKPLANE_TRANSFER_SIZE (1536)
#define WHD_BUS_SDIO_BACKPLANE_READ_PADD_SIZE (0)
/******************************************************

View File

@ -28,6 +28,7 @@
#include "cy_result.h"
#include "cyabs_rtos.h"
#include "cyhal_gpio.h"
#include "whd_thread.h"
#include "whd_chip.h"
@ -44,7 +45,6 @@
#include "whd_buffer_api.h"
#include "whd_debug.h"
#include "whd_types_int.h"
#include "whd_bus_types.h"
@ -124,8 +124,7 @@ static const uint8_t whd_bus_gspi_command_mapping[] = { 0, 1 };
struct whd_bus_priv
{
whd_spi_config_t spi_config;
void *spi_obj;
whd_spi_funcs_t *spi_ops;
cyhal_spi_t *spi_obj;
};
@ -141,74 +140,17 @@ static whd_result_t whd_spi_download_firmware(whd_driver_t whd_driver);
static whd_result_t whd_bus_spi_transfer_buffer(whd_driver_t whd_driver, whd_bus_transfer_direction_t direction,
whd_bus_function_t function, uint32_t address, whd_buffer_t buffer);
/******************************************************
* SPI Logging
* Enable this section for logging of SPI transfers
* by changing "if 0" to "if 1"
******************************************************/
#if 0
#define GSPI_LOG_SIZE (110)
#define SDIO_LOG_HEADER_SIZE (0) /*(0x30) */
typedef enum
{
UNUSED,
LOG_TX,
LOG_RX
}gspi_log_direction_t;
typedef struct gSPI_log_entry_struct
{
gspi_log_direction_t direction;
whd_bus_function_t function;
uint32_t address;
unsigned long time;
unsigned long length;
#if (SDIO_LOG_HEADER_SIZE != 0)
unsigned char header[GSPI_LOG_HEADER_SIZE];
#endif /* if ( SDIO_LOG_HEADER_SIZE != 0 ) */
}gspi_log_entry_t;
static int next_gspi_log_pos = 0;
static gspi_log_entry_t gspi_log_data[GSPI_LOG_SIZE];
static void add_log_entry(gspi_log_direction_t dir, whd_bus_function_t function, uint32_t address, unsigned long length,
char *gspi_data)
{
UNUSED_PARAMETER(gspi_data);
gspi_log_data[next_gspi_log_pos].direction = dir;
gspi_log_data[next_gspi_log_pos].function = function;
gspi_log_data[next_gspi_log_pos].address = address;
cy_rtos_get_time(&gspi_log_data[next_gspi_log_pos].time);
gspi_log_data[next_gspi_log_pos].length = length;
#if (SDIO_LOG_HEADER_SIZE != 0)
memcpy(gspi_log_data[next_gspi_log_pos].header, gspi_data,
(length >= GSPI_LOG_HEADER_SIZE) ? GSPI_LOG_HEADER_SIZE : length);
#endif /* if ( SDIO_LOG_HEADER_SIZE != 0 ) */
next_gspi_log_pos++;
if (next_gspi_log_pos >= GSPI_LOG_SIZE)
{
next_gspi_log_pos = 0;
}
}
#else
#define add_log_entry(dir, function, address, length, gspi_data)
#endif
/******************************************************
* Global Function definitions
******************************************************/
uint32_t whd_bus_spi_attach(whd_driver_t whd_driver, whd_spi_config_t *whd_spi_config, void *spi_obj,
whd_spi_funcs_t *spi_ops)
uint32_t whd_bus_spi_attach(whd_driver_t whd_driver, whd_spi_config_t *whd_spi_config, cyhal_spi_t *spi_obj)
{
struct whd_bus_info *whd_bus_info;
if ( (spi_ops == NULL) || (spi_ops->whd_enable_intr == NULL) || (spi_ops->whd_get_intr_config == NULL) )
if (whd_driver->bus_priv->spi_config.oob_config.host_oob_pin == CYHAL_NC_PIN_VALUE)
{
WPRINT_WHD_ERROR( ("oob interrupt configuration is invalid in %s\n", __FUNCTION__) );
WPRINT_WHD_ERROR( ("OOB interrupt pin argument must be provided in %s\n", __FUNCTION__) );
return WHD_BADARG;
}
@ -235,7 +177,6 @@ uint32_t whd_bus_spi_attach(whd_driver_t whd_driver, whd_spi_config_t *whd_spi_c
/* Pass the SPI object to bus private spi_obj pointer */
whd_driver->bus_priv->spi_obj = spi_obj;
whd_driver->bus_priv->spi_config = *whd_spi_config;
whd_driver->bus_priv->spi_ops = spi_ops;
whd_bus_info->whd_bus_init_fptr = whd_bus_spi_init;
whd_bus_info->whd_bus_deinit_fptr = whd_bus_spi_deinit;
@ -274,6 +215,20 @@ uint32_t whd_bus_spi_attach(whd_driver_t whd_driver, whd_spi_config_t *whd_spi_c
return WHD_SUCCESS;
}
void whd_bus_spi_detach(whd_driver_t whd_driver)
{
if (whd_driver->bus_if != NULL)
{
free(whd_driver->bus_if);
whd_driver->bus_if = NULL;
}
if (whd_driver->bus_priv != NULL)
{
free(whd_driver->bus_priv);
whd_driver->bus_priv = NULL;
}
}
whd_result_t whd_bus_spi_send_buffer(whd_driver_t whd_driver, whd_buffer_t buffer)
{
whd_result_t result = whd_bus_spi_transfer_buffer(whd_driver, BUS_WRITE, WLAN_FUNCTION, 0, buffer);
@ -350,7 +305,6 @@ static whd_result_t whd_bus_spi_transfer_buffer(whd_driver_t whd_driver, whd_bus
}
}
add_log_entry(LOG_TX, function, address, size, (char *)&gspi_header->data);
}
transfer_size = (size_t)(newsize + sizeof(whd_bus_gspi_header_t) );
@ -367,11 +321,6 @@ static whd_result_t whd_bus_spi_transfer_buffer(whd_driver_t whd_driver, whd_bus
0, 0);
}
if (direction == BUS_READ)
{
add_log_entry(LOG_RX, function, address, size, (char *)&gspi_header->data);
}
return result;
}
@ -511,15 +460,11 @@ whd_result_t whd_bus_spi_init(whd_driver_t whd_driver)
uint32_t interrupt_polarity = 0;
uint16_t chip_id;
size_t transfer_size = 12;
whd_intr_config_t config;
whd_oob_config_t *config = &whd_driver->bus_priv->spi_config.oob_config;
whd_driver->bus_gspi_32bit = WHD_FALSE;
(*whd_driver->bus_priv->spi_ops->whd_get_intr_config)(whd_driver,
whd_driver->bus_priv->spi_config.oob_intr,
&config);
if (config.is_falling_edge == WHD_FALSE)
if (config->is_falling_edge == WHD_FALSE)
interrupt_polarity = INTERRUPT_POLARITY_HIGH;
whd_bus_init_backplane_window(whd_driver);
@ -918,7 +863,6 @@ whd_result_t whd_bus_spi_transfer_bytes(whd_driver_t whd_driver, whd_bus_transfe
return WHD_TIMEOUT;
}
add_log_entry(LOG_TX, function, address, (unsigned long)size, (char *)&packet->data);
}
transfer_size = (size_t)(newsize + sizeof(whd_bus_gspi_header_t) );
@ -935,12 +879,6 @@ whd_result_t whd_bus_spi_transfer_bytes(whd_driver_t whd_driver, whd_bus_transfe
0, 0);
}
if (direction == BUS_READ)
{
add_log_entry(LOG_RX, function, address, (unsigned long)( (function == BACKPLANE_FUNCTION) ? size - 4 : size ),
(function == BACKPLANE_FUNCTION) ? ( (char *)&packet->data ) + 4 : (char *)&packet->data);
}
CHECK_RETURN(result);
return WHD_SUCCESS;
}
@ -1056,22 +994,45 @@ uint32_t whd_bus_spi_get_max_transfer_size(whd_driver_t whd_driver)
return WHD_BUS_SPI_MAX_BACKPLANE_TRANSFER_SIZE;
}
void whd_bus_spi_oob_intr_asserted(whd_driver_t whd_driver)
static void whd_bus_spi_oob_irq_handler(void *arg, cyhal_gpio_irq_event_t event)
{
whd_driver_t whd_driver = (whd_driver_t)arg;
const whd_oob_config_t *config = &whd_driver->bus_priv->spi_config.oob_config;
const cyhal_gpio_irq_event_t expected_event = (config->is_falling_edge == WHD_TRUE)
? CYHAL_GPIO_IRQ_FALL : CYHAL_GPIO_IRQ_RISE;
if (event != expected_event)
{
WPRINT_WHD_ERROR( ("Unexpected interrupt event %d\n", event) );
return;
}
/* call thread notify to wake up WHD thread */
whd_thread_notify_irq(whd_driver);
}
/* XXX FIXME */
#define WLAN_INTR_PRIORITY 1
whd_result_t whd_bus_spi_irq_register(whd_driver_t whd_driver)
{
UNUSED_PARAMETER(whd_driver);
const whd_oob_config_t *config = &whd_driver->bus_priv->spi_config.oob_config;
cyhal_gpio_init(config->host_oob_pin, CYHAL_GPIO_DIR_INPUT, CYHAL_GPIO_DRIVE_ANALOG, 0);
cyhal_gpio_register_irq(config->host_oob_pin, WLAN_INTR_PRIORITY, whd_bus_spi_oob_irq_handler,
whd_driver);
return WHD_TRUE;
}
whd_result_t whd_bus_spi_irq_enable(whd_driver_t whd_driver, whd_bool_t enable)
{
const whd_variant_t oob_intr = whd_driver->bus_priv->spi_config.oob_intr;
(*whd_driver->bus_priv->spi_ops->whd_enable_intr)(whd_driver, oob_intr, enable);
const whd_oob_config_t *config = &whd_driver->bus_priv->spi_config.oob_config;
const cyhal_gpio_irq_event_t event =
(config->is_falling_edge == WHD_TRUE) ? CYHAL_GPIO_IRQ_FALL : CYHAL_GPIO_IRQ_RISE;
cyhal_gpio_irq_enable(config->host_oob_pin, event, (enable == WHD_TRUE) ? true : false);
return WHD_TRUE;
}

View File

@ -66,6 +66,7 @@ extern "C" {
typedef struct whd_ap_int_info
{
whd_bool_t ap_is_up;
whd_bool_t is_waiting_event;
cy_semaphore_t whd_wifi_sleep_flag;
} whd_ap_int_info_t;

View File

@ -124,6 +124,7 @@ typedef struct whd_cdc_info
******************************************************/
whd_result_t whd_cdc_bdc_info_init(whd_driver_t whd_driver);
void whd_cdc_bdc_info_deinit(whd_driver_t whd_driver);
whd_result_t whd_cdc_send_iovar(whd_interface_t ifp, cdc_command_type_t type,
whd_buffer_t send_buffer_hnd,

View File

@ -328,7 +328,7 @@ typedef struct whd_internal_info
wlan_shared_t sh;
uint32_t console_addr;
whd_scan_result_callback_t scan_result_callback;
whd_scan_result_t **whd_scan_result_ptr;
whd_scan_result_t *whd_scan_result_ptr;
/* The semaphore used to wait for completion of a join;
* whd_wifi_join_halt uses this to release waiting threads (if any) */
cy_semaphore_t *active_join_semaphore;

View File

@ -66,6 +66,7 @@ struct whd_interface
whd_interface_role_t role;
whd_mac_t mac_addr;
uint8_t event_reg_list[WHD_EVENT_ENTRY_MAX];
void (*whd_link_update_callback)(whd_interface_t ifp, whd_bool_t state_up);
whd_bool_t state;
};

View File

@ -44,8 +44,8 @@ extern "C"
uint32_t whd_resource_size(whd_driver_t whd_driver, whd_resource_type_t resource, uint32_t *size_out);
uint32_t whd_get_resource_block_size(whd_driver_t whd_drv, whd_resource_type_t type, uint32_t *size_out);
uint32_t whd_get_resource_no_of_blocks(whd_driver_t whd_drv, whd_resource_type_t type, uint32_t *block_count);
uint32_t whd_get_resource_block(whd_driver_t whd_driver, whd_resource_type_t type, const uint8_t **data,
uint32_t *size_out);
uint32_t whd_get_resource_block(whd_driver_t whd_driver, whd_resource_type_t type,
uint32_t blockno, const uint8_t **data, uint32_t *size_out);
#ifdef __cplusplus
} /*extern "C" */

View File

@ -80,6 +80,7 @@ static const whd_event_num_t apsta_events[] = { WLC_E_IF, WLC_E_LINK, WLC_E_NONE
void whd_ap_info_init(whd_driver_t whd_driver)
{
whd_driver->ap_info.ap_is_up = WHD_FALSE;
whd_driver->ap_info.is_waiting_event = WHD_FALSE;
}
void whd_wifi_set_ap_is_up(whd_driver_t whd_driver, whd_bool_t new_state)
@ -164,20 +165,24 @@ static void *whd_handle_apsta_event(whd_interface_t ifp, const whd_event_header_
const uint8_t *event_data, void *handler_user_data)
{
whd_driver_t whd_driver = ifp->whd_driver;
whd_ap_int_info_t *ap;
UNUSED_PARAMETER(event_header);
UNUSED_PARAMETER(event_data);
UNUSED_PARAMETER(handler_user_data);
WHD_IOCTL_LOG_ADD_EVENT(whd_driver, event_header->event_type, event_header->flags, event_header->reason);
ap = &whd_driver->ap_info;
if ( (event_header->event_type == (whd_event_num_t)WLC_E_LINK) ||
(event_header->event_type == WLC_E_IF) )
if (ap->is_waiting_event == WHD_TRUE)
{
whd_result_t result;
result = cy_rtos_set_semaphore(&whd_driver->ap_info.whd_wifi_sleep_flag, WHD_FALSE);
whd_assert("failed to post AP link semaphore", result == WHD_SUCCESS);
REFERENCE_DEBUG_ONLY_VARIABLE(result);
if ( (event_header->event_type == (whd_event_num_t)WLC_E_LINK) ||
(event_header->event_type == WLC_E_IF) )
{
whd_result_t result;
result = cy_rtos_set_semaphore(&ap->whd_wifi_sleep_flag, WHD_FALSE);
whd_assert("failed to post AP link semaphore", result == WHD_SUCCESS);
REFERENCE_DEBUG_ONLY_VARIABLE(result);
}
}
return handler_user_data;
}
@ -276,7 +281,6 @@ uint32_t whd_wifi_init_ap(whd_interface_t ifp, whd_ssid_t *ssid, whd_security_t
*data = htod32( (uint32_t)bss_index );
}
if ( (wlan_chip_id == 43340) || (wlan_chip_id == 43342) )
{
if (whd_cdc_send_iovar(ifp, CDC_GET, buffer, &response) != WHD_SUCCESS)
@ -293,6 +297,7 @@ uint32_t whd_wifi_init_ap(whd_interface_t ifp, whd_ssid_t *ssid, whd_security_t
{
CHECK_RETURN(whd_buffer_release(whd_driver, response, WHD_NETWORK_RX) );
whd_wifi_set_ap_is_up(whd_driver, WHD_TRUE);
ap->is_waiting_event = WHD_FALSE;
return WHD_SUCCESS;
}
else
@ -316,6 +321,7 @@ uint32_t whd_wifi_init_ap(whd_interface_t ifp, whd_ssid_t *ssid, whd_security_t
{
CHECK_RETURN(whd_buffer_release(whd_driver, response, WHD_NETWORK_RX) );
whd_wifi_set_ap_is_up(whd_driver, WHD_TRUE);
ap->is_waiting_event = WHD_FALSE;
return WHD_SUCCESS;
}
else
@ -326,16 +332,25 @@ uint32_t whd_wifi_init_ap(whd_interface_t ifp, whd_ssid_t *ssid, whd_security_t
CHECK_RETURN(cy_rtos_init_semaphore(&ap->whd_wifi_sleep_flag, 1, 0) );
ap->is_waiting_event = WHD_TRUE;
/* Register for interested events */
CHECK_RETURN_WITH_SEMAPHORE(whd_management_set_event_handler(ifp, apsta_events, whd_handle_apsta_event,
NULL, &event_entry), &ap->whd_wifi_sleep_flag);
if (event_entry >= WHD_EVENT_HANDLER_LIST_SIZE)
{
WPRINT_WHD_DEBUG( ("Event handler registration failed for AP events in function %s and line %d\n", __func__,
__LINE__) );
WPRINT_WHD_DEBUG( ("Event handler registration failed for AP events in function %s and line %d\n",
__func__, __LINE__) );
return WHD_UNFINISHED;
}
ifp->event_reg_list[WHD_AP_EVENT_ENTRY] = event_entry;
if (wait_for_interface == WHD_TRUE)
{
CHECK_RETURN_WITH_SEMAPHORE(cy_rtos_get_semaphore(&ap->whd_wifi_sleep_flag, (uint32_t)10000,
WHD_FALSE), &ap->whd_wifi_sleep_flag);
}
ap->is_waiting_event = WHD_FALSE;
if (prim_ifp == ifp)
{
/* Set AP mode */
@ -394,15 +409,6 @@ uint32_t whd_wifi_init_ap(whd_interface_t ifp, whd_ssid_t *ssid, whd_security_t
CHECK_RETURN_WITH_SEMAPHORE(whd_cdc_send_iovar(prim_ifp, CDC_SET, buffer, 0), &ap->whd_wifi_sleep_flag);
}
if ( (wlan_chip_id == 4334) || (wlan_chip_id == 43340) || (wlan_chip_id == 43342) )
{
/* Check if we need to wait for interface to be created */
if (wait_for_interface == WHD_TRUE)
{
CHECK_RETURN_WITH_SEMAPHORE(cy_rtos_get_semaphore(&ap->whd_wifi_sleep_flag, (uint32_t)10000,
WHD_FALSE), &ap->whd_wifi_sleep_flag);
}
}
/* Set the channel */
data = (uint32_t *)whd_cdc_get_ioctl_buffer(whd_driver, &buffer, (uint16_t)4);
CHECK_IOCTL_BUFFER_WITH_SEMAPHORE(data, &ap->whd_wifi_sleep_flag);
@ -599,6 +605,7 @@ uint32_t whd_wifi_start_ap(whd_interface_t ifp)
/* Get the Chip Number */
wlan_chip_id = whd_chip_get_chip_id(whd_driver);
ap->is_waiting_event = WHD_TRUE;
data = (uint32_t *)whd_cdc_get_iovar_buffer(whd_driver, &buffer, (uint16_t)8, IOVAR_STR_BSS);
CHECK_IOCTL_BUFFER_WITH_SEMAPHORE(data, &ap->whd_wifi_sleep_flag);
@ -617,6 +624,7 @@ uint32_t whd_wifi_start_ap(whd_interface_t ifp)
/* Wait until AP is brought up */
CHECK_RETURN_WITH_SEMAPHORE(cy_rtos_get_semaphore(&ap->whd_wifi_sleep_flag, (uint32_t)10000,
WHD_FALSE), &ap->whd_wifi_sleep_flag);
ap->is_waiting_event = WHD_FALSE;
whd_wifi_set_ap_is_up(whd_driver, WHD_TRUE);
return WHD_SUCCESS;
@ -631,6 +639,7 @@ uint32_t whd_wifi_stop_ap(whd_interface_t ifp)
whd_result_t result2;
whd_interface_t prim_ifp;
whd_driver_t whd_driver;
whd_ap_int_info_t *ap;
CHECK_IFP_NULL(ifp);
@ -638,6 +647,8 @@ uint32_t whd_wifi_stop_ap(whd_interface_t ifp)
CHECK_DRIVER_NULL(whd_driver);
ap = &whd_driver->ap_info;
prim_ifp = whd_get_primary_interface(whd_driver);
if (prim_ifp == NULL)
@ -682,6 +693,7 @@ uint32_t whd_wifi_stop_ap(whd_interface_t ifp)
CHECK_RETURN(whd_buffer_release(whd_driver, response, WHD_NETWORK_RX) );
ap->is_waiting_event = WHD_TRUE;
/* set BSS down */
if ( (wlan_chip_id == 43012) || (wlan_chip_id == 43362) || (wlan_chip_id == 43455) || (wlan_chip_id == 43430) )
{
@ -701,8 +713,9 @@ uint32_t whd_wifi_stop_ap(whd_interface_t ifp)
}
/* Wait until AP is brought down */
result = cy_rtos_get_semaphore(&whd_driver->ap_info.whd_wifi_sleep_flag, (uint32_t)10000, WHD_FALSE);
result2 = cy_rtos_deinit_semaphore(&whd_driver->ap_info.whd_wifi_sleep_flag);
result = cy_rtos_get_semaphore(&ap->whd_wifi_sleep_flag, (uint32_t)10000, WHD_FALSE);
ap->is_waiting_event = WHD_FALSE;
result2 = cy_rtos_deinit_semaphore(&ap->whd_wifi_sleep_flag);
if (result != WHD_SUCCESS)
{
WPRINT_WHD_ERROR( ("Error getting a semaphore, %s failed at %d \n", __func__, __LINE__) );
@ -716,10 +729,10 @@ uint32_t whd_wifi_stop_ap(whd_interface_t ifp)
/* Disable AP mode */
data = (uint32_t *)whd_cdc_get_ioctl_buffer(whd_driver, &buffer, (uint16_t)4);
CHECK_IOCTL_BUFFER_WITH_SEMAPHORE(data, &whd_driver->ap_info.whd_wifi_sleep_flag);
CHECK_IOCTL_BUFFER_WITH_SEMAPHORE(data, &ap->whd_wifi_sleep_flag);
*data = 0; /* Turn off AP */
CHECK_RETURN_WITH_SEMAPHORE(whd_cdc_send_ioctl(ifp, CDC_SET, WLC_SET_AP, buffer, 0),
&whd_driver->ap_info.whd_wifi_sleep_flag);
&ap->whd_wifi_sleep_flag);
CHECK_RETURN(whd_wifi_deregister_event_handler(ifp, ifp->event_reg_list[WHD_AP_EVENT_ENTRY]) );
ifp->event_reg_list[WHD_AP_EVENT_ENTRY] = WHD_EVENT_NOT_REGISTERED;

View File

@ -15,6 +15,7 @@
* limitations under the License.
*/
#include <limits.h>
#include "whd_int.h"
#include "whd_cdc_bdc.h"
#include "whd_events_int.h"
@ -93,6 +94,20 @@ static uint8_t whd_map_dscp_to_priority(whd_driver_t whd_driver, uint8_t val)
return dscp_to_wmm_qos[dscp_val];
}
void whd_cdc_bdc_info_deinit(whd_driver_t whd_driver)
{
whd_cdc_bdc_info_t *cdc_bdc_info = &whd_driver->cdc_bdc_info;
/* Delete the sleep mutex */
(void)cy_rtos_deinit_semaphore(&cdc_bdc_info->ioctl_sleep);
/* Delete the queue mutex. */
(void)cy_rtos_deinit_semaphore(&cdc_bdc_info->ioctl_mutex);
/* Delete the event list management mutex */
(void)cy_rtos_deinit_semaphore(&cdc_bdc_info->event_list_mutex);
}
whd_result_t whd_cdc_bdc_info_init(whd_driver_t whd_driver)
{
whd_cdc_bdc_info_t *cdc_bdc_info = &whd_driver->cdc_bdc_info;
@ -169,6 +184,13 @@ whd_result_t whd_cdc_send_ioctl(whd_interface_t ifp, cdc_command_type_t type, ui
whd_driver_t whd_driver = ifp->whd_driver;
whd_cdc_bdc_info_t *cdc_bdc_info = &whd_driver->cdc_bdc_info;
/* Validate the command value */
if (command > INT_MAX)
{
WPRINT_WHD_ERROR( ("The ioctl command value is invalid\n") );
return WHD_BADARG;
}
/* Acquire mutex which prevents multiple simultaneous IOCTLs */
retval = cy_rtos_get_semaphore(&cdc_bdc_info->ioctl_mutex, CY_RTOS_NEVER_TIMEOUT, WHD_FALSE);
if (retval != WHD_SUCCESS)

View File

@ -39,7 +39,7 @@ uint16_t whd_chip_get_chip_id(whd_driver_t whd_driver)
uint32_t get_whd_var(whd_driver_t whd_driver, chip_var_t var)
{
uint32_t val;
uint32_t val = 0;
uint16_t wlan_chip_id = whd_chip_get_chip_id(whd_driver);
switch (var)

View File

@ -105,19 +105,18 @@ whd_result_t whd_process_clm_data(whd_interface_t ifp)
transfer_progress = 0;
for (i = 0; i < blocks_count; i++)
{
whd_get_resource_block(whd_driver, WHD_RESOURCE_WLAN_CLM, (const uint8_t **)&image, &size_read);
whd_get_resource_block(whd_driver, WHD_RESOURCE_WLAN_CLM, i, (const uint8_t **)&image, &size_read);
num_buff = (size_read + BLOCK_SIZE - 1) / BLOCK_SIZE;
if (blocks_count != 1)
transfer_progress = 0;
if (size_read >= BLOCK_SIZE)
chunk_len = BLOCK_SIZE;
else
chunk_len = (int)size_read;
for (j = 0; j < num_buff; j++)
{
if (size_read >= BLOCK_SIZE)
chunk_len = BLOCK_SIZE;
else
chunk_len = (int)size_read;
memcpy(chunk_buf + data_offset, &image[transfer_progress], chunk_len);
if (datalen + chunk_len == clm_blob_size)

View File

@ -81,19 +81,18 @@ static uint8_t whd_find_number_of_events(const whd_event_num_t *event_nums)
* This function registers a callback handler to be notified when
* a particular event is received.
*
* Alternately the function clears callbacks for given event type.
* @note : Currently there is a limit to the number of simultaneously
* registered events
*
* @note : Currently each event may only be registered to one handler
* and there is a limit to the number of simultaneously registered
* events
*
* @param event_nums An array of event types that is to trigger the handler. The array must be terminated with a WLC_E_NONE event
* See @ref whd_event_num_t for available events
* @param handler_func A function pointer to the new handler callback,
* or NULL if callbacks are to be disabled for the given event type
* @param handler_user_data A pointer value which will be passed to the event handler function
* @param ifp Pointer to handle instance of whd interface
* @param event_nums An array of event types that is to trigger the handler.
* The array must be terminated with a WLC_E_NONE event
* See @ref whd_event_num_t for available events
* @param handler_func A function pointer to the new handler callback,
* or NULL if callbacks are to be disabled for the given event type
* @param handler_user_data A pointer value which will be passed to the event handler function
* at the time an event is triggered (NULL is allowed)
* @param interface The interface to set the handler for.
* @param[out] *event_index entry where the event handler is registered in the list
*
* @return WHD result code
*/
@ -246,20 +245,18 @@ static uint8_t *whd_management_alloc_event_msgs_buffer(whd_interface_t ifp, whd_
* This function registers a callback handler to be notified when
* a particular event is received.
*
* Alternately the function clears callbacks for given event type.
* @note : Currently there is a limit to the number of simultaneously
* registered events
*
* @note : Currently each event may only be registered to one handler
* and there is a limit to the number of simultaneously registered
* events
*
* @param event_nums An array of event types that is to trigger the handler.
* The array must be terminated with a WLC_E_NONE event
* See @ref whd_event_num_t for available events
* @param handler_func A function pointer to the new handler callback,
* or NULL if callbacks are to be disabled for the given event type
* @param handler_user_data A pointer value which will be passed to the event handler function
* @param ifp Pointer to handle instance of whd interface
* @param event_nums An array of event types that is to trigger the handler.
* The array must be terminated with a WLC_E_NONE event
* See @ref whd_event_num_t for available events
* @param handler_func A function pointer to the new handler callback,
* or NULL if callbacks are to be disabled for the given event type
* @param handler_user_data A pointer value which will be passed to the event handler function
* at the time an event is triggered (NULL is allowed)
* @param interface The interface to set the handler for.
* @param[out] *event_index entry where the event handler is registered in the list
*
* @return WHD result code
*/

View File

@ -168,26 +168,28 @@ uint32_t whd_deinit(whd_interface_t ifp)
uint8_t i;
whd_driver_t whd_driver = ifp->whd_driver;
if (whd_driver->internal_info.whd_wlan_status.state != WLAN_UP)
if (whd_driver->internal_info.whd_wlan_status.state == WLAN_UP)
{
WPRINT_WHD_INFO( ("wlan_status: already down.\n") );
return WHD_INTERFACE_NOT_UP;
CHECK_RETURN(whd_wifi_set_ioctl_buffer(ifp, WLC_DOWN, NULL, 0) );
whd_driver->internal_info.whd_wlan_status.state = WLAN_DOWN;
}
/* Send DOWN command */
CHECK_RETURN(whd_wifi_set_ioctl_buffer(ifp, WLC_DOWN, NULL, 0) );
/* Update wlan status */
whd_driver->internal_info.whd_wlan_status.state = WLAN_DOWN;
for (i = 0; i < WHD_INTERFACE_MAX; i++)
{
if (whd_driver->iflist[i] != NULL)
{
free(whd_driver->iflist[i]);
whd_driver->iflist[i] = NULL;
}
}
whd_cdc_bdc_info_deinit(whd_driver);
whd_bus_common_info_deinit(whd_driver);
#ifdef WLAN_BUS_TYPE_SDIO
whd_bus_sdio_detach(whd_driver);
#endif
#ifdef WLAN_BUS_TYPE_SPI
whd_bus_spi_detach(whd_driver);
#endif
free(whd_driver);
return WHD_SUCCESS;

View File

@ -85,13 +85,13 @@ uint32_t whd_get_resource_no_of_blocks(whd_driver_t whd_driver, whd_resource_typ
return WHD_WLAN_NOFUNCTION;
}
uint32_t whd_get_resource_block(whd_driver_t whd_driver, whd_resource_type_t type, const uint8_t **data,
uint32_t *size_out)
uint32_t whd_get_resource_block(whd_driver_t whd_driver, whd_resource_type_t type,
uint32_t blockno, const uint8_t **data, uint32_t *size_out)
{
if (whd_driver->resource_if->whd_get_resource_block)
{
return whd_driver->resource_if->whd_get_resource_block(whd_driver, type, data, size_out);
return whd_driver->resource_if->whd_get_resource_block(whd_driver, type, blockno, data, size_out);
}
else
{

View File

@ -260,21 +260,11 @@ void whd_sdpcm_bus_vars_init(whd_driver_t whd_driver)
void whd_sdpcm_quit(whd_driver_t whd_driver)
{
whd_sdpcm_info_t *sdpcm_info = &whd_driver->sdpcm_info;
whd_cdc_bdc_info_t *cdc_bdc_info = &whd_driver->cdc_bdc_info;
whd_result_t result;
/* Delete the sleep mutex */
(void)cy_rtos_deinit_semaphore(&cdc_bdc_info->ioctl_sleep); /* Ignore return - not much can be done about failure */
/* Delete the queue mutex. */
(void)cy_rtos_deinit_semaphore(&cdc_bdc_info->ioctl_mutex); /* Ignore return - not much can be done about failure */
/* Delete the SDPCM queue mutex */
(void)cy_rtos_deinit_semaphore(&sdpcm_info->send_queue_mutex); /* Ignore return - not much can be done about failure */
/* Delete the event list management mutex */
(void)cy_rtos_deinit_semaphore(&cdc_bdc_info->event_list_mutex); /* Ignore return - not much can be done about failure */
/* Free any left over packets in the queue */
while (sdpcm_info->send_queue_head != NULL)
{

View File

@ -212,23 +212,25 @@ int8_t whd_thread_poll_all(whd_driver_t whd_driver)
*/
void whd_thread_quit(whd_driver_t whd_driver)
{
whd_thread_info_t *thread_info = &whd_driver->thread_info;
whd_result_t result;
/* signal main thread and wake it */
whd_driver->thread_info.thread_quit_flag = WHD_TRUE;
result = cy_rtos_set_semaphore(&whd_driver->thread_info.transceive_semaphore, WHD_FALSE);
thread_info->thread_quit_flag = WHD_TRUE;
result = cy_rtos_set_semaphore(&thread_info->transceive_semaphore, WHD_FALSE);
if (result == WHD_SUCCESS)
{
/* Wait for the WHD thread to end */
cy_rtos_join_thread(&whd_driver->thread_info.whd_thread);
/* Ignore return - not much can be done about failure */
(void)cy_rtos_terminate_thread(&whd_driver->thread_info.whd_thread);
cy_rtos_join_thread(&thread_info->whd_thread);
}
else
{
WPRINT_WHD_ERROR( ("Error setting semaphore in %s at %d \n", __func__, __LINE__) );
}
/* Delete the semaphore */
/* Ignore return - not much can be done about failure */
(void)cy_rtos_deinit_semaphore(&thread_info->transceive_semaphore);
}
/**
@ -334,22 +336,11 @@ static void whd_thread_func(whd_thread_arg_t thread_input)
/* Reset the quit flag */
thread_info->thread_quit_flag = WHD_FALSE;
/* Delete the semaphore */
/* Ignore return - not much can be done about failure */
(void)cy_rtos_deinit_semaphore(&thread_info->transceive_semaphore);
whd_sdpcm_quit(whd_driver);
WPRINT_WHD_DATA_LOG( ("Stopped whd Thread\n") );
if (WHD_SUCCESS != cy_rtos_join_thread(&thread_info->whd_thread) )
{
WPRINT_WHD_ERROR( ("Could not join WHD thread\n") );
}
if (WHD_SUCCESS != cy_rtos_terminate_thread(&thread_info->whd_thread) )
{
WPRINT_WHD_ERROR( ("Could not close WHD thread\n") );
}
/* Ignore return - not much can be done about failure */
(void)cy_rtos_exit_thread();
}

View File

@ -749,6 +749,8 @@ static void *whd_wifi_join_events_handler(whd_interface_t ifp, const whd_event_h
case WLC_E_DISASSOC_IND:
whd_driver->internal_info.whd_join_status[event_header->bsscfgidx] &=
~(JOIN_AUTHENTICATED | JOIN_LINK_READY);
if (ifp->whd_link_update_callback != NULL)
ifp->whd_link_update_callback(ifp, WHD_FALSE);
break;
case WLC_E_AUTH:
@ -922,6 +924,8 @@ static void *whd_wifi_join_events_handler(whd_interface_t ifp, const whd_event_h
if (whd_wifi_is_ready_to_transceive(ifp) == WHD_SUCCESS)
{
join_attempt_complete = WHD_TRUE;
if (ifp->whd_link_update_callback != NULL)
ifp->whd_link_update_callback(ifp, WHD_TRUE);
}
if (join_attempt_complete == WHD_TRUE)
@ -1419,6 +1423,12 @@ uint32_t whd_wifi_join_specific(whd_interface_t ifp, const whd_scan_result_t *ap
return WHD_BADARG;
}
if ( (ap->SSID.length == 0) || (ap->SSID.length > (size_t)SSID_NAME_SIZE) )
{
WPRINT_WHD_ERROR( ("%s: failure: SSID length error\n", __func__) );
return WHD_WLAN_BADSSIDLEN;
}
CHECK_RETURN(cy_rtos_init_semaphore(&join_semaphore, 1, 0) );
result = whd_wifi_active_join_init(ifp, security, security_key, key_length, &join_semaphore);
@ -1548,11 +1558,18 @@ uint32_t whd_wifi_join(whd_interface_t ifp, const whd_ssid_t *ssid, whd_security
CHECK_DRIVER_NULL(whd_driver);
if (ssid->length > (size_t)SSID_NAME_SIZE)
if (ssid == NULL)
{
WPRINT_WHD_ERROR( ("%s: failure: SSID too long\n", __func__) );
WPRINT_WHD_ERROR( ("%s: failure: ssid is null\n", __func__) );
return WHD_BADARG;
}
if ( (ssid->length == 0) || (ssid->length > (size_t)SSID_NAME_SIZE) )
{
WPRINT_WHD_ERROR( ("%s: failure: SSID length error\n", __func__) );
return WHD_WLAN_BADSSIDLEN;
}
/* Keep WLAN awake while joining */
WHD_WLAN_KEEP_AWAKE(whd_driver);
ifp->role = WHD_STA_ROLE;
@ -1611,6 +1628,8 @@ uint32_t whd_wifi_leave(whd_interface_t ifp)
}
whd_driver->internal_info.whd_join_status[ifp->bsscfgidx] = 0;
if (ifp->whd_link_update_callback != NULL)
ifp->whd_link_update_callback(ifp, WHD_FALSE);
ifp->role = WHD_INVALID_ROLE;
return WHD_SUCCESS;
}
@ -1685,13 +1704,6 @@ static void *whd_wifi_scan_events_handler(whd_interface_t ifp, const whd_event_h
version = dtoh32(WHD_READ_32(&bss_info->version) );
whd_minor_assert("wl_bss_info_t has wrong version", version == WL_BSS_INFO_VERSION);
if (whd_driver->internal_info.whd_scan_result_ptr == NULL)
{
whd_driver->internal_info.scan_result_callback( (whd_scan_result_t **)event_data, handler_user_data,
WHD_SCAN_INCOMPLETE );
return handler_user_data;
}
/* PNO bss info doesn't contain the correct bss info version */
if (version != WL_BSS_INFO_VERSION)
{
@ -1721,7 +1733,7 @@ static void *whd_wifi_scan_events_handler(whd_interface_t ifp, const whd_event_h
}
/* Safe to access *whd_scan_result_ptr, as whd_scan_result_ptr == NULL case is handled above */
record = (whd_scan_result_t *)(*whd_driver->internal_info.whd_scan_result_ptr);
record = (whd_scan_result_t *)(whd_driver->internal_info.whd_scan_result_ptr);
/*
* Totally ignore off channel results. This can only happen with DSSS (1 and 2 Mb). It is better to
@ -1995,13 +2007,16 @@ static void *whd_wifi_scan_events_handler(whd_interface_t ifp, const whd_event_h
CHANSPEC_BAND_MASK) ) ==
GET_C_VAR(whd_driver, CHANSPEC_BAND_2G) ? WHD_802_11_BAND_2_4GHZ : WHD_802_11_BAND_5GHZ );
whd_driver->internal_info.scan_result_callback(whd_driver->internal_info.whd_scan_result_ptr, handler_user_data,
whd_driver->internal_info.scan_result_callback(&whd_driver->internal_info.whd_scan_result_ptr, handler_user_data,
WHD_SCAN_INCOMPLETE);
if (*whd_driver->internal_info.whd_scan_result_ptr == NULL)
/* whd_driver->internal_info.scan_result_callback() can make whd_scan_result_ptr to NULL */
if (whd_driver->internal_info.whd_scan_result_ptr == NULL)
{
#if 0
whd_management_set_event_handler(scan_events, NULL, NULL);
#endif /* if 0 */
whd_driver->internal_info.scan_result_callback(NULL, handler_user_data, WHD_SCAN_ABORTED);
whd_driver->internal_info.scan_result_callback = NULL;
whd_wifi_deregister_event_handler(ifp, ifp->event_reg_list[WHD_SCAN_EVENT_ENTRY]);
ifp->event_reg_list[WHD_SCAN_EVENT_ENTRY] = WHD_EVENT_NOT_REGISTERED;
}
return handler_user_data;
@ -2106,7 +2121,7 @@ uint32_t whd_wifi_scan_synch(whd_interface_t ifp,
memset(scan_result_ptr, 0, sizeof(whd_scan_result_t) );
if (whd_wifi_scan(ifp, WHD_SCAN_TYPE_ACTIVE, WHD_BSS_TYPE_ANY, NULL, NULL, NULL, NULL,
handler, (whd_scan_result_t **)&scan_result_ptr, &scan_userdata) != WHD_SUCCESS)
handler, (whd_scan_result_t *)scan_result_ptr, &scan_userdata) != WHD_SUCCESS)
{
WPRINT_WHD_INFO( ("Failed scan \n") );
goto error;
@ -2153,7 +2168,7 @@ uint32_t whd_wifi_scan(whd_interface_t ifp,
const uint16_t *optional_channel_list,
const whd_scan_extended_params_t *optional_extended_params,
whd_scan_result_callback_t callback,
whd_scan_result_t **result_ptr,
whd_scan_result_t *result_ptr,
void *user_data
)
{
@ -2166,6 +2181,11 @@ uint32_t whd_wifi_scan(whd_interface_t ifp,
whd_assert("Bad args", callback != NULL);
if ( (result_ptr == NULL) || (callback == NULL) )
{
return WHD_BADARG;
}
if (!( (scan_type == WHD_SCAN_TYPE_ACTIVE) || (scan_type == WHD_SCAN_TYPE_PASSIVE) ||
(scan_type == WHD_SCAN_TYPE_PROHIBITED_CHANNELS) || (scan_type == WHD_SCAN_TYPE_NO_BSSID_FILTER) ) )
return WHD_BADARG;

View File

@ -26,7 +26,7 @@
#include "cybsp_api_wifi.h"
#include "cy_network_buffer.h"
#include "cmsis_os2.h"
#include "whd_bus_types.h"
#include "whd_types.h"
#include "cyhal.h"
#include "cyhal_implementation.h"
@ -45,6 +45,10 @@ extern "C" {
#define SDIO_RETRY_DELAY_MS 1
#define SDIO_BUS_LEVEL_MAX_RETRIES 5
#if !defined(CY_WIFI_OOB_INTR_PRIORITY)
#define CY_WIFI_OOB_INTR_PRIORITY 2
#endif/* !defined(CY_WIFI_OOB_INTR_PRIORITY) */
/* Determine whether to use the SDIO oob interrupt.
* When CY_SDIO_BUS_NEEDS_OOB_INTR is defined,
* use its value to determine enable status; otherwise,
@ -103,9 +107,6 @@ whd_driver_t whd_drv;
bool sdio_initialized = false;
cyhal_sdio_t sdio_obj;
static void cy_enable_oob_intr(whd_driver_t whd_driver, const whd_variant_t intr, whd_bool_t whd_enable);
static void cy_get_intr_config(whd_driver_t whd_driver, const whd_variant_t intr, whd_intr_config_t *config);
static whd_buffer_funcs_t buffer_ops =
{
.whd_host_buffer_get = cy_host_buffer_get,
@ -121,21 +122,9 @@ static whd_netif_funcs_t netif_ops =
.whd_network_process_ethernet_data = cy_network_process_ethernet_data,
};
static whd_sdio_funcs_t sdio_ops =
{
.whd_enable_intr = cy_enable_oob_intr,
.whd_get_intr_config = cy_get_intr_config,
};
//TODO: Need to use resource implemenatation from abstraction layer.
extern whd_resource_source_t resource_ops;
static void whd_wake_host_irq_handler(void *arg, cyhal_gpio_irq_event_t event)
{
//TODO: Swtich out from deep sleep or LP mode.
whd_bus_sdio_oob_intr_asserted(arg);
}
static cy_rslt_t sdio_try_send_cmd(const cyhal_sdio_t *sdio_object, cyhal_transfer_t direction, \
cyhal_sdio_command_t command, uint32_t argument, uint32_t* response)
{
@ -223,22 +212,24 @@ static void deinit_sdio_whd(void)
static cy_rslt_t init_sdio_bus(void)
{
whd_sdio_config_t whd_sdio_config;
cyhal_sdio_cfg_t config;
cy_rslt_t result = cybsp_sdio_enumerate(&sdio_obj);
if(result == CY_RSLT_SUCCESS)
{
whd_sdio_config.flags = 0;
whd_sdio_config_t whd_sdio_config;
whd_oob_config_t oob_config;
cyhal_sdio_cfg_t config;
oob_config.host_oob_pin = CY_WIFI_HOST_WAKE_GPIO;
oob_config.dev_gpio_sel = DEFAULT_OOB_PIN;
oob_config.is_falling_edge = (CY_WIFI_HOST_WAKE_IRQ_EVENT == CYHAL_GPIO_IRQ_FALL)
? WHD_TRUE
: WHD_FALSE;
oob_config.intr_priority = CY_WIFI_OOB_INTR_PRIORITY;
whd_sdio_config.sdio_1bit_mode = WHD_FALSE;
whd_sdio_config.high_speed_sdio_clock = WHD_FALSE;
if(CY_SDIO_BUS_USE_OOB_INTR != 0)
{
whd_sdio_config.flags |= WHD_BUS_SDIO_OOB_INTR;
whd_sdio_config.oob_intr.u32val = 0; /* reserved for multi whd instances */
}
whd_bus_sdio_attach(whd_drv, &whd_sdio_config, &sdio_obj, &sdio_ops);
whd_sdio_config.oob_config = oob_config;
whd_bus_sdio_attach(whd_drv, &whd_sdio_config, &sdio_obj);
/* Increase frequency to 25 MHz for better performance */
config.frequencyhal_hz = 25000000;
@ -248,40 +239,6 @@ static cy_rslt_t init_sdio_bus(void)
return result;
}
static cy_rslt_t init_wlan_wakeup(void)
{
/* assert(CY_SDIO_BUS_USE_OOB_INTR != 0) */
cy_rslt_t result = cyhal_gpio_init(CY_WIFI_HOST_WAKE_GPIO, CYHAL_GPIO_DIR_INPUT, CY_WIFI_HOST_WAKE_GPIO_DM, 0);
if(result == CY_RSLT_SUCCESS)
{
cyhal_gpio_register_irq(CY_WIFI_HOST_WAKE_GPIO, WLAN_INTR_PRIORITY, whd_wake_host_irq_handler, whd_drv);
}
return result;
}
static void cy_enable_oob_intr(whd_driver_t whd_driver, const whd_variant_t intr, whd_bool_t whd_enable)
{
/* assert(CY_SDIO_BUS_USE_OOB_INTR != 0) */
(void)whd_driver;
(void)intr;
//TODO: This needs to be enabled in the WHD after the rtos is initialized. The current location where this is called
//causes a crash in the interrupt handler since it tries to set data on the thread before it is initialized.
//Need to review where this should be called in the WHD.
// cyhal_gpio_irq_enable(CY_WIFI_HOST_WAKE_GPIO, CY_WIFI_HOST_WAKE_IRQ_EVENT,
// (whd_enable == WHD_TRUE) ? true : false);
}
static void cy_get_intr_config(whd_driver_t whd_driver, const whd_variant_t intr, whd_intr_config_t *config)
{
/* assert(CY_SDIO_BUS_USE_OOB_INTR != 0) */
(void)whd_driver;
(void)intr;
config->dev_gpio_sel = DEFAULT_OOB_PIN;
config->is_falling_edge = (CY_WIFI_HOST_WAKE_IRQ_EVENT == CYHAL_GPIO_IRQ_FALL)
? WHD_TRUE
: WHD_FALSE;
}
cy_rslt_t cybsp_sdio_init(void)
{
cy_rslt_t result = cyhal_sdio_init(&sdio_obj, CYBSP_WIFI_SDIO_CMD, CYBSP_WIFI_SDIO_CLK, CYBSP_WIFI_SDIO_D0, CYBSP_WIFI_SDIO_D1, CYBSP_WIFI_SDIO_D2, CYBSP_WIFI_SDIO_D3);
@ -307,10 +264,6 @@ cy_rslt_t cybsp_wifi_init(void)
if(ret == WHD_SUCCESS)
{
result = init_sdio_bus();
if (result == CY_RSLT_SUCCESS && CY_SDIO_BUS_USE_OOB_INTR != 0)
{
result = init_wlan_wakeup();
}
}
else
{