1 /*
2 * Copyright (c) 2020 HiSilicon (Shanghai) Technologies CO., LIMITED.
3 * Licensed under the Apache License, Version 2.0 (the "License");
4 * you may not use this file except in compliance with the License.
5 * You may obtain a copy of the License at
6 *
7 * http://www.apache.org/licenses/LICENSE-2.0
8 *
9 * Unless required by applicable law or agreed to in writing, software
10 * distributed under the License is distributed on an "AS IS" BASIS,
11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 * See the License for the specific language governing permissions and
13 * limitations under the License.
14 * Description: Header file of RF resource management interfaces.
15 */
16
17 #ifndef FE_RF_DEV_ROM_H
18 #define FE_RF_DEV_ROM_H
19 #include "fe_extern_if_device.h"
20 #include "frw_msg_rom.h"
21 #include "dmac_ext_if_rom.h"
22 #ifdef __cplusplus
23 #if __cplusplus
24 extern "C" {
25 #endif
26 #endif
27
28 typedef osal_u8 hal_rf_power_work_mode_uint8;
29
30 typedef struct hh503_cali_param_tag cali_param_stru;
31
32 /* hal rf device 结构体 */
33 typedef struct {
34 osal_u8 rf_id; /* rf device 编号 */
35 osal_u8 pll_id; /* 使用的PLL ID */
36 osal_s16 tx_power_dc; /* 当前通道下TX PWR的DC值,20M/40M/80M实测相差较小,公用使用一个 */
37 hal_rf_chn_param chn_para; /* 工作信道参数 */
38 osal_u32 rf_reg_base; /* rf寄存器基地址 */
39 osal_u32 rf_pll_reg_base; /* rf PLL寄存器基地址 */
40 osal_u32 rf_ctl_reg_offset; /* rf ctl寄存器偏移地址 */
41 osal_u16 aus_base_txpwr_delt_value[WLAN_BAND_BUTT];
42 osal_void *owner; /* 指向当前占用rf dev的hal device */
43 cali_param_stru *cali_data; /* 校准数据指针 */
44 oal_bool_enum_uint8 is_calibrated; /* rf是否已经校准 */
45 hal_rf_power_work_mode_uint8 rf_work_mode; /* rf work状态的工作模式 */
46 osal_u8 rf_power_state;
47 osal_u8 cur_cali_upc;
48 osal_u8 base_power[WLAN_BAND_BUTT]; /* 基准最大发射功率 */
49 osal_u8 upc_idx2code[HAL_POW_UPC_LUT_NUM];
50 osal_s16 curr_temperature; /* 保存当前温度 */
51 osal_s16 upc_amend;
52 oal_bool_enum_uint8 upc_code_tobe_updated; /* 是否需要更新upc_code的lut表 */
53 osal_char dp_2g11b;
54 osal_char dp_2gofdm20;
55 osal_char dp_2gofdm40;
56 hal_pwr_fit_para_stru *pwr_fit_para_2g;
57 osal_u8 cur_rf_fsm_state; /* 当前rf状态机状态 */
58 hal_dyn_cali_adj_type_enum_uint8 cali_pdet_adjust_flag; /* 动态校准调整状态标志 */
59 osal_s16 delt_dbb_scale_dyn_val;
60 #ifdef _PRE_WLAN_ONLINE_DPD
61 osal_u32 *dpd_system;
62 #endif
63 uintptr_t *_rom; /* ROM化后资源扩展指针 */
64 } hal_rf_dev;
65
66 /* rf 资源管理结构体 */
67 typedef struct {
68 hal_rf_dev *hal_rf_res[WLAN_RF_CHANNEL_NUMS]; /* 指向rf dev数组 */
69 osal_u32 free_bitmap; /* 标记空闲的rf dev */
70 osal_u8 master_rf_id;
71 osal_u8 rf_num; /* rf dev的总数 */
72 oal_bool_enum_uint8 comm_rf_ldo_state; /* rf公用的ldo是否打开 打开:true 关闭:false */
73 oal_bool_enum_uint8 is_mimo;
74 osal_u8 pll0_lock_state;
75 osal_u8 pll1_lock_state;
76 osal_u8 pll_use_cnt[WLAN_RF_PLL_NUMS]; /* RF对应的PLL的使用计数,对应枚举hal_rf_pll_user_enum_uint8 */
77 osal_u8 rsv;
78 uintptr_t *_rom; /* ROM化后资源扩展指针 */
79 } hal_rf_res_manager;
80
81 hal_rf_res_manager* hal_rf_get_res(osal_void);
82
83 typedef osal_void (*hal_rf_dev_ldo_ops_ptr)(osal_u8 rf_id);
84
85 /* rf dev work状态的工作模式 */
86 typedef enum {
87 HAL_RF_WORK_MODE_RX_ONLY, /* 只开接收 */
88 HAL_RF_WORK_MODE_TXRX, /* 收发全开 */
89
90 HAL_RF_WORK_MODE_BUTT
91 } hal_rf_work_mode_enum;
92
93 typedef struct {
94 hal_rf_dev_ldo_ops_ptr poweron;
95 hal_rf_dev_ldo_ops_ptr poweroff;
96 hal_rf_dev_ldo_ops_ptr tx;
97 hal_rf_dev_ldo_ops_ptr dis_tx;
98 } hal_rf_dev_ops;
99
100 hal_rf_dev_ops* hal_rf_get_dev_ops(osal_void);
101
102 /* PLL使用者标识枚举 */
103 typedef enum {
104 HAL_RF_PLL_USER_NONE = 0,
105 HAL_RF_PLL_USER_C0 = 1,
106 HAL_RF_PLL_USER_C1 = 2,
107 HAL_RF_PLL_USER_MIMO = 3,
108
109 HAL_RF_PLL_USER_BUTT
110 } hal_rf_pll_user_enum;
111 typedef osal_u8 hal_rf_pll_user_enum_uint8;
112
113 typedef enum {
114 HAL_RF_ALWAYS_POWER_ON,
115 HAL_RF_SWITCH_ALL_LDO,
116 HAL_RF_SWITCH_PA_PPA,
117
118 HAL_RF_OPS_CFG_BUTT
119 } hal_rf_ops_cfg_enum;
120 typedef osal_u8 hal_rf_ops_cfg_uint8;
121
122 /* 设置是否同时打开两个rf的电源 */
rf_res_set_is_mimo(osal_u8 rf_chain)123 static inline osal_void rf_res_set_is_mimo(osal_u8 rf_chain)
124 {
125 unref_param(rf_chain);
126 hal_rf_get_res()->is_mimo = OSAL_FALSE;
127 }
128
129
130 osal_u32 hal_rf_res_init(osal_void);
131 osal_void hal_rf_res_free(const hal_rf_dev *rf_dev);
132
133 osal_void hal_rf_res_alloc_by_id(hal_to_dmac_device_stru *device, osal_u8 rf_id, osal_u8 pll_id);
134
135 osal_void fe_rf_dev_enable_tx(osal_u8 rf_id);
136
137 osal_u8 fe_rf_fsm_get_state(osal_u8 rf_id);
138
139 osal_void hal_rf_fsm_set_state(hal_rf_dev *rf_dev, osal_u8 state);
140 osal_void hal_rf_fsm_set_state_byidx(osal_u8 rf_dev_idx, osal_u8 state);
141 osal_void hal_rf_fsm_work_entry(osal_u8 rf_id);
142
143 osal_void fe_rf_set_rf_channel(const hal_rf_chn_param *chn_para);
144 osal_void hal_rf_dev_disable_tx(osal_u8 rf_id);
145 osal_void hal_rf_dev_poweron(osal_u8 rf_id);
146 osal_void hal_rf_dev_poweroff(osal_u8 rf_id);
147
148 osal_void fe_rf_dev_sleep(osal_u8 rf_id);
149
150 osal_void fe_rf_proc_rf_awake(osal_void);
151 osal_void fe_rf_enable_rf_tx(osal_void);
152
153 osal_void fe_rf_proc_rf_sleep(osal_void);
154
155 osal_void fe_rf_disable_rf_tx(osal_void);
156
157 osal_u8 hal_get_rf_switch_cfg(osal_void);
158 osal_void hal_set_rf_switch_cfg(osal_u8 switch_cfg);
159 hal_rf_dev* fe_get_rf_dev(osal_u8 rf_id);
160
161 osal_u32 fe_initialize_rf_dev(void);
162 osal_u32 fe_reset_rf_dev(const hal_to_dmac_device_stru *hal_device);
163 osal_s32 fe_rf_proc_rf_sleep_msg(dmac_vap_stru *dmac_vap, frw_msg *msg);
164 osal_s32 hal_dev_rf_sleep_poweroff(dmac_vap_stru *dmac_vap, frw_msg *msg);
165 osal_s32 hal_dev_set_rf_option(dmac_vap_stru *dmac_vap, frw_msg *msg);
166 #ifdef __cplusplus
167 #if __cplusplus
168 }
169 #endif
170 #endif
171
172 #endif