mirror of https://github.com/ARMmbed/mbed-os.git
				
				
				
			Update WHD to 1.30.0
							parent
							
								
									b005bf2133
								
							
						
					
					
						commit
						66cf10f030
					
				| 
						 | 
				
			
			@ -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:8c:3c:1b"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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 */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
     *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,3 +1,3 @@
 | 
			
		|||
#define WHD_VERSION "1b9fceb7"
 | 
			
		||||
#define WHD_VERSION "v1.30.0-rc1-4-g9bd856ef-dirty"
 | 
			
		||||
#define WHD_BRANCH "master"
 | 
			
		||||
#define WHD_DATE "2019-07-03 16:07:52 +0530"
 | 
			
		||||
#define WHD_DATE "2019-08-23 15:56:34 +0800"
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										
											BIN
										
									
								
								targets/TARGET_Cypress/TARGET_PSOC6/TARGET_WHD/resources/firmware/TARGET_43012/43012C0-mfgtest.bin
								
								
								
								
									
									
									Normal file → Executable file
								
							
							
						
						
									
										
											BIN
										
									
								
								targets/TARGET_Cypress/TARGET_PSOC6/TARGET_WHD/resources/firmware/TARGET_43012/43012C0-mfgtest.bin
								
								
								
								
									
									
									Normal file → Executable file
								
							
										
											Binary file not shown.
										
									
								
							
							
								
								
									
										
											BIN
										
									
								
								targets/TARGET_Cypress/TARGET_PSOC6/TARGET_WHD/resources/firmware/TARGET_43012/43012C0-mfgtest.clm_blob
								
								
								
								
									
									
									Normal file → Executable file
								
							
							
						
						
									
										
											BIN
										
									
								
								targets/TARGET_Cypress/TARGET_PSOC6/TARGET_WHD/resources/firmware/TARGET_43012/43012C0-mfgtest.clm_blob
								
								
								
								
									
									
									Normal file → Executable file
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
				
			
			@ -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 }}};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											Binary file not shown.
										
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| 
						 | 
				
			
			@ -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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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_ */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -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";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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_ */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -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";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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_ */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -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_ */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -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_
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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_ */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -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";
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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_ */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -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_ */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -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_ */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
 | 
			
		||||
/******************************************************
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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" */
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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,14 @@ 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;
 | 
			
		||||
 | 
			
		||||
    cy_rtos_deinit_semaphore(&cdc_bdc_info->ioctl_sleep);
 | 
			
		||||
    cy_rtos_deinit_semaphore(&cdc_bdc_info->ioctl_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 +178,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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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
 | 
			
		||||
    {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue