summaryrefslogtreecommitdiff
path: root/ini.h
diff options
context:
space:
mode:
Diffstat (limited to 'ini.h')
-rw-r--r--ini.h359
1 files changed, 359 insertions, 0 deletions
diff --git a/ini.h b/ini.h
new file mode 100644
index 0000000..27f95a1
--- /dev/null
+++ b/ini.h
@@ -0,0 +1,359 @@
+/*
+ * This file is part of wl1271
+ *
+ * Copyright (C) 2010 Nokia Corporation
+ *
+ * Contact: Luciano Coelho <luciano.coelho@nokia.com>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License
+ * version 2 as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA
+ *
+ */
+
+#ifndef __INI_H__
+#define __INI_H__
+
+#include <linux/limits.h>
+
+#define WL1271_INI_MAX_SMART_REFLEX_PARAM 16
+
+struct wl1271_ini_general_params {
+ unsigned char ref_clock;
+ unsigned char settling_time;
+ unsigned char clk_valid_on_wakeup;
+ unsigned char dc2dc_mode;
+ unsigned char dual_mode_select;
+ unsigned char tx_bip_fem_auto_detect;
+ unsigned char tx_bip_fem_manufacturer;
+ unsigned char general_settings;
+ unsigned char sr_state;
+ unsigned char srf1[WL1271_INI_MAX_SMART_REFLEX_PARAM];
+ unsigned char srf2[WL1271_INI_MAX_SMART_REFLEX_PARAM];
+ unsigned char srf3[WL1271_INI_MAX_SMART_REFLEX_PARAM];
+} __attribute__((packed));
+
+#define WL128X_INI_MAX_SETTINGS_PARAM 4
+
+struct wl128x_ini_general_params {
+ unsigned char ref_clock;
+ unsigned char settling_time;
+ unsigned char clk_valid_on_wakeup;
+ unsigned char tcxo_ref_clock;
+ unsigned char tcxo_settling_time;
+ unsigned char tcxo_valid_on_wakeup;
+ unsigned char tcxo_ldo_voltage;
+ unsigned char xtal_itrim_val;
+ unsigned char platform_conf;
+ unsigned char dual_mode_select;
+ unsigned char tx_bip_fem_auto_detect;
+ unsigned char tx_bip_fem_manufacturer;
+ unsigned char general_settings[WL128X_INI_MAX_SETTINGS_PARAM];
+ unsigned char sr_state;
+ unsigned char srf1[WL1271_INI_MAX_SMART_REFLEX_PARAM];
+ unsigned char srf2[WL1271_INI_MAX_SMART_REFLEX_PARAM];
+ unsigned char srf3[WL1271_INI_MAX_SMART_REFLEX_PARAM];
+} __attribute__((packed));
+
+#define WL1271_INI_RSSI_PROCESS_COMPENS_SIZE 15
+
+struct wl1271_ini_band_params_2 {
+ unsigned char rx_trace_insertion_loss;
+ unsigned char tx_trace_loss;
+ unsigned char
+ rx_rssi_process_compens[WL1271_INI_RSSI_PROCESS_COMPENS_SIZE];
+} __attribute__((packed));
+
+#define WL1271_INI_CHANNEL_COUNT_2 14
+
+struct wl128x_ini_band_params_2 {
+ unsigned char rx_trace_insertion_loss;
+ unsigned char tx_trace_loss[WL1271_INI_CHANNEL_COUNT_2];
+ unsigned char
+ rx_rssi_process_compens[WL1271_INI_RSSI_PROCESS_COMPENS_SIZE];
+} __attribute__((packed));
+
+#define WL1271_INI_RATE_GROUP_COUNT 6
+
+struct wl1271_ini_fem_params_2 {
+ __le16 tx_bip_ref_pd_voltage;
+ unsigned char tx_bip_ref_power;
+ unsigned char tx_bip_ref_offset;
+ unsigned char
+ tx_per_rate_pwr_limits_normal[WL1271_INI_RATE_GROUP_COUNT];
+ unsigned char
+ tx_per_rate_pwr_limits_degraded[WL1271_INI_RATE_GROUP_COUNT];
+ unsigned char
+ tx_per_rate_pwr_limits_extreme[WL1271_INI_RATE_GROUP_COUNT];
+ unsigned char tx_per_chan_pwr_limits_11b[WL1271_INI_CHANNEL_COUNT_2];
+ unsigned char tx_per_chan_pwr_limits_ofdm[WL1271_INI_CHANNEL_COUNT_2];
+ unsigned char tx_pd_vs_rate_offsets[WL1271_INI_RATE_GROUP_COUNT];
+ unsigned char tx_ibias[WL1271_INI_RATE_GROUP_COUNT];
+ unsigned char rx_fem_insertion_loss;
+ unsigned char degraded_low_to_normal_thr;
+ unsigned char normal_to_degraded_high_thr;
+} __attribute__((packed));
+
+#define WL128X_INI_RATE_GROUP_COUNT 7
+/* low and high temperatures*/
+#define WL128X_INI_PD_VS_TEMPERATURE_RANGES 2
+
+struct wl128x_ini_fem_params_2 {
+ __le16 tx_bip_ref_pd_voltage;
+ unsigned char tx_bip_ref_power;
+ unsigned char tx_bip_ref_offset;
+ unsigned char
+ tx_per_rate_pwr_limits_normal [WL128X_INI_RATE_GROUP_COUNT];
+ unsigned char
+ tx_per_rate_pwr_limits_degraded [WL128X_INI_RATE_GROUP_COUNT];
+ unsigned char
+ tx_per_rate_pwr_limits_extreme [WL128X_INI_RATE_GROUP_COUNT];
+ unsigned char tx_per_chan_pwr_limits_11b[WL1271_INI_CHANNEL_COUNT_2];
+ unsigned char tx_per_chan_pwr_limits_ofdm[WL1271_INI_CHANNEL_COUNT_2];
+ unsigned char tx_pd_vs_rate_offsets[WL128X_INI_RATE_GROUP_COUNT];
+ unsigned char tx_ibias[WL128X_INI_RATE_GROUP_COUNT + 1];
+ unsigned char tx_pd_vs_chan_offsets[WL1271_INI_CHANNEL_COUNT_2];
+ unsigned char tx_pd_vs_temperature[WL128X_INI_PD_VS_TEMPERATURE_RANGES];
+ unsigned char rx_fem_insertion_loss;
+ unsigned char degraded_low_to_normal_thr;
+ unsigned char normal_to_degraded_high_thr;
+} __attribute__((packed));
+
+#define WL1271_INI_CHANNEL_COUNT_5 35
+#define WL1271_INI_SUB_BAND_COUNT_5 7
+
+struct wl1271_ini_band_params_5 {
+ unsigned char rx_trace_insertion_loss[WL1271_INI_SUB_BAND_COUNT_5];
+ unsigned char tx_trace_loss[WL1271_INI_SUB_BAND_COUNT_5];
+ unsigned char
+ rx_rssi_process_compens[WL1271_INI_RSSI_PROCESS_COMPENS_SIZE];
+} __attribute__((packed));
+
+struct wl128x_ini_band_params_5 {
+ unsigned char rx_trace_insertion_loss[WL1271_INI_SUB_BAND_COUNT_5];
+ unsigned char tx_trace_loss[WL1271_INI_CHANNEL_COUNT_5];
+ unsigned char
+ rx_rssi_process_compens[WL1271_INI_RSSI_PROCESS_COMPENS_SIZE];
+} __attribute__((packed));
+
+struct wl1271_ini_fem_params_5 {
+ __le16 tx_bip_ref_pd_voltage[WL1271_INI_SUB_BAND_COUNT_5];
+ unsigned char tx_bip_ref_power[WL1271_INI_SUB_BAND_COUNT_5];
+ unsigned char tx_bip_ref_offset[WL1271_INI_SUB_BAND_COUNT_5];
+ unsigned char
+ tx_per_rate_pwr_limits_normal[WL1271_INI_RATE_GROUP_COUNT];
+ unsigned char
+ tx_per_rate_pwr_limits_degraded[WL1271_INI_RATE_GROUP_COUNT];
+ unsigned char
+ tx_per_rate_pwr_limits_extreme[WL1271_INI_RATE_GROUP_COUNT];
+ unsigned char tx_per_chan_pwr_limits_ofdm[WL1271_INI_CHANNEL_COUNT_5];
+ unsigned char tx_pd_vs_rate_offsets[WL1271_INI_RATE_GROUP_COUNT];
+ unsigned char tx_ibias[WL1271_INI_RATE_GROUP_COUNT];
+ unsigned char rx_fem_insertion_loss[WL1271_INI_SUB_BAND_COUNT_5];
+ unsigned char degraded_low_to_normal_thr;
+ unsigned char normal_to_degraded_high_thr;
+} __attribute__((packed));
+
+struct wl128x_ini_fem_params_5 {
+ __le16 tx_bip_ref_pd_voltage[WL1271_INI_SUB_BAND_COUNT_5];
+ unsigned char tx_bip_ref_power[WL1271_INI_SUB_BAND_COUNT_5];
+ unsigned char tx_bip_ref_offset[WL1271_INI_SUB_BAND_COUNT_5];
+ unsigned char
+ tx_per_rate_pwr_limits_normal [WL128X_INI_RATE_GROUP_COUNT];
+ unsigned char
+ tx_per_rate_pwr_limits_degraded [WL128X_INI_RATE_GROUP_COUNT];
+ unsigned char
+ tx_per_rate_pwr_limits_extreme [WL128X_INI_RATE_GROUP_COUNT];
+ unsigned char tx_per_chan_pwr_limits_ofdm[WL1271_INI_CHANNEL_COUNT_5];
+ unsigned char tx_pd_vs_rate_offsets[WL128X_INI_RATE_GROUP_COUNT];
+ unsigned char tx_ibias[WL128X_INI_RATE_GROUP_COUNT];
+ unsigned char tx_pd_vs_chan_offsets[WL1271_INI_CHANNEL_COUNT_5];
+ unsigned char tx_pd_vs_temperature[WL1271_INI_SUB_BAND_COUNT_5 *
+ WL128X_INI_PD_VS_TEMPERATURE_RANGES];
+ unsigned char rx_fem_insertion_loss[WL1271_INI_SUB_BAND_COUNT_5];
+ unsigned char degraded_low_to_normal_thr;
+ unsigned char normal_to_degraded_high_thr;
+} __attribute__((packed));
+
+/* NVS data structure */
+#define WL1271_INI_NVS_SECTION_SIZE 468
+
+/* We have four FEM module types: 0-RFMD, 1-TQS, 2-SKW, 3-TQS_HP */
+#define WL1271_INI_FEM_MODULE_COUNT 4
+
+#define WL1271_INI_LEGACY_NVS_FILE_SIZE 800
+/*
+ * In NVS we only store two FEM module entries -
+ * FEM modules 0,2,3 are stored in entry 0
+ * FEM module 1 is stored in entry 1
+ */
+#define WL12XX_NVS_FEM_MODULE_COUNT 2
+
+#define WL12XX_FEM_TO_NVS_ENTRY(ini_fem_module) \
+ ((ini_fem_module) == 1 ? 1 : 0)
+
+struct wl1271_nvs_ini {
+ struct wl1271_ini_general_params general_params;
+ unsigned char padding1;
+ struct wl1271_ini_band_params_2 stat_radio_params_2;
+ unsigned char padding2;
+ struct {
+ struct wl1271_ini_fem_params_2 params;
+ unsigned char padding;
+ } dyn_radio_params_2[WL12XX_NVS_FEM_MODULE_COUNT];
+ struct wl1271_ini_band_params_5 stat_radio_params_5;
+ unsigned char padding3;
+ struct {
+ struct wl1271_ini_fem_params_5 params;
+ unsigned char padding;
+ } dyn_radio_params_5[WL12XX_NVS_FEM_MODULE_COUNT];
+} __attribute__((packed));
+
+struct wl1271_nvs_file {
+ /* NVS section */
+ unsigned char nvs[WL1271_INI_NVS_SECTION_SIZE];
+ /* INI section */
+ struct wl1271_nvs_ini ini;
+} __attribute__((packed));
+
+struct wl128x_nvs_ini {
+ struct wl128x_ini_general_params general_params;
+ unsigned char fem_vendor_and_options;
+ struct wl128x_ini_band_params_2 stat_radio_params_2;
+ unsigned char padding2;
+ struct {
+ struct wl128x_ini_fem_params_2 params;
+ unsigned char padding;
+ } dyn_radio_params_2[WL12XX_NVS_FEM_MODULE_COUNT];
+ struct wl128x_ini_band_params_5 stat_radio_params_5;
+ unsigned char padding3;
+ struct {
+ struct wl128x_ini_fem_params_5 params;
+ unsigned char padding;
+ } dyn_radio_params_5[WL12XX_NVS_FEM_MODULE_COUNT];
+} __attribute__((packed));
+
+struct wl128x_nvs_file {
+ /* NVS section */
+ unsigned char nvs[WL1271_INI_NVS_SECTION_SIZE];
+ /* INI section */
+ struct wl128x_nvs_ini ini;
+} __attribute__((packed));
+
+struct wl1271_ini {
+ struct wl1271_ini_general_params general_params;
+ unsigned char padding1;
+ struct wl1271_ini_band_params_2 stat_radio_params_2;
+ unsigned char padding2;
+ struct {
+ struct wl1271_ini_fem_params_2 params;
+ unsigned char padding;
+ } dyn_radio_params_2[WL1271_INI_FEM_MODULE_COUNT];
+ struct wl1271_ini_band_params_5 stat_radio_params_5;
+ unsigned char padding3;
+ struct {
+ struct wl1271_ini_fem_params_5 params;
+ unsigned char padding;
+ } dyn_radio_params_5[WL1271_INI_FEM_MODULE_COUNT];
+} __attribute__((packed));
+
+struct wl128x_ini {
+ struct wl128x_ini_general_params general_params;
+ unsigned char fem_vendor_and_options;
+ struct wl128x_ini_band_params_2 stat_radio_params_2;
+ unsigned char padding2;
+ struct {
+ struct wl128x_ini_fem_params_2 params;
+ unsigned char padding;
+ } dyn_radio_params_2[WL1271_INI_FEM_MODULE_COUNT];
+ struct wl128x_ini_band_params_5 stat_radio_params_5;
+ unsigned char padding3;
+ struct {
+ struct wl128x_ini_fem_params_5 params;
+ unsigned char padding;
+ } dyn_radio_params_5[WL1271_INI_FEM_MODULE_COUNT];
+} __attribute__((packed));
+
+enum wl1271_ini_section {
+ UKNOWN_SECTION,
+ GENERAL_PRMS,
+ FEM_PRMS,
+ BAND2_PRMS,
+ BAND5_PRMS,
+ FEM0_BAND2_PRMS,
+ FEM1_BAND2_PRMS,
+ FEM2_BAND2_PRMS,
+ FEM3_BAND2_PRMS,
+ FEM0_BAND5_PRMS,
+ FEM1_BAND5_PRMS,
+ FEM2_BAND5_PRMS,
+ FEM3_BAND5_PRMS
+};
+
+enum wl12xx_arch {
+ UNKNOWN_ARCH,
+ WL1271_ARCH = 0x0403,
+ WL128X_ARCH = 0x0503
+};
+
+struct wl12xx_ini {
+ union {
+ struct wl1271_ini ini1271;
+ struct wl128x_ini ini128x;
+ };
+};
+
+#define DUAL_MODE_UNSET 0xff
+
+struct wl12xx_common {
+ enum wl12xx_arch arch;
+ unsigned char auto_fem;
+ unsigned int fem0_bands;
+ unsigned int fem1_bands;
+ unsigned int fem2_bands;
+ unsigned int fem3_bands;
+ struct wl12xx_parse_ops *parse_ops;
+ struct wl12xx_nvs_ops *nvs_ops;
+ struct wl12xx_ini ini;
+ char *nvs_name;
+};
+
+struct wl12xx_parse_ops {
+ int (*prs_general_prms)(char *l, struct wl12xx_common *cmn,
+ struct wl12xx_ini *p);
+ /* int (*prs_fem_prms)(char *l, void *gp); */
+ int (*prs_band2_prms)(char *l, struct wl12xx_ini *p);
+ int (*prs_band5_prms)(char *l, struct wl12xx_ini *p);
+ int (*prs_fem0_band2_prms)(char *l, struct wl12xx_ini *p);
+ int (*prs_fem1_band2_prms)(char *l, struct wl12xx_ini *p);
+ int (*prs_fem2_band2_prms)(char *l, struct wl12xx_ini *p);
+ int (*prs_fem3_band2_prms)(char *l, struct wl12xx_ini *p);
+ int (*prs_fem0_band5_prms)(char *l, struct wl12xx_ini *p);
+ int (*prs_fem1_band5_prms)(char *l, struct wl12xx_ini *p);
+ int (*prs_fem2_band5_prms)(char *l, struct wl12xx_ini *p);
+ int (*prs_fem3_band5_prms)(char *l, struct wl12xx_ini *p);
+ int (*is_dual_mode)(struct wl12xx_ini *p);
+};
+
+struct wl12xx_nvs_ops {
+ int (*nvs_fill_radio_prms)(int fd, struct wl12xx_ini *p, char *buf);
+ int (*nvs_set_autofem)(int fd, char *buf, unsigned char val);
+ int (*nvs_set_fem_manuf)(int fd, char *buf, unsigned char val);
+};
+
+int nvs_get_arch(int file_size, struct wl12xx_common *cmn);
+
+int read_ini(const char *filename, struct wl12xx_common *cmn);
+
+int ini_get_dual_mode(struct wl12xx_common *cmn);
+#endif