• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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: dmaradar
15  * Create: 2020-7-5
16  */
17 
18 #ifndef __HMAC_RADAR_H__
19 #define __HMAC_RADAR_H__
20 
21 #if defined(_PRE_WLAN_FEATURE_DFS_OPTIMIZE) || defined(_PRE_WLAN_FEATURE_DFS_ENABLE)
22 /*****************************************************************************
23   1 其他头文件包含
24 *****************************************************************************/
25 #include "hal_ext_if.h"
26 #include "mac_device_ext.h"
27 #endif
28 
29 #ifdef __cplusplus
30 #if __cplusplus
31 extern "C" {
32 #endif
33 #endif
34 
35 #if defined(_PRE_WLAN_FEATURE_DFS_OPTIMIZE) || defined(_PRE_WLAN_FEATURE_DFS_ENABLE)
36 #undef THIS_FILE_ID
37 #define THIS_FILE_ID OAM_FILE_ID_DMAC_RADAR_H
38 
39 /*****************************************************************************
40   2 宏定义
41 *****************************************************************************/
42 #define STAGGER_MAX_DURATION 100          /* STAGGER类型雷达最大宽度 */
43 #define STAGGER_PULSE_MARGIN 4            /* STAGGER类型雷达相同脉冲间隔误差 */
44 #define RADAR_PULSE_MARGIN_ETSI 4         /* ETSI脉冲间隔最小误差 */
45 #define RADAR_PULSE_MARGIN_FCC 3          /* FCC脉冲间隔最小误差 */
46 #define RADAR_PULSE_MARGIN_FCC_LOW_TYPE 3 /* FCC TYPE0~TYPE2脉冲间隔最小误差 */
47 
48 #define RADAR_PULSE_DURATION_MARGIN 20          /* 脉冲宽度最小误差 */
49 #define RADAR_PULSE_POWER_MARGIN 20             /* 脉冲功率最小误差 */
50 #define RADAR_PULSE_DURATION_MARGIN_ERROR 100   /* 脉冲宽度最大误差 */
51 #define RADAR_FCC_CHIRP_PULSE_DURATION_MARGIN 5 /* 脉冲宽度最小误差 */
52 
53 #define MAX_RADAR_NORMAL_PULSE_ANA_CNT 5            /* 非chirp雷达脉冲信息分析最大个数 */
54 #define MAX_RADAR_NORMAL_PULSE_ANA_CNT_ETSI_TYPE3 8 /* ETSI type3雷达脉冲信息分析最大个数 */
55 #define EXTRA_PULSE_CNT 3                           /* buf中额外查询的脉冲个数 */
56 
57 #define MAX_RADAR_STAGGER_NUM 3        /* STAGGER类型脉冲最大个数 */
58 #define MIN_RADAR_STAGGER_DURATION 9   /* STAGGER类型脉冲最小宽度 */
59 #define MEAN_RADAR_STAGGER_DURATION 80 /* STAGGER类型脉冲最大宽度 */
60 
61 #define MIN_RADAR_NORMAL_DURATION 9     /* normal类型脉冲最小宽度 */
62 #define MIN_RADAR_NORMAL_DURATION_MKK 8 /* normal类型脉冲最小宽度 */
63 
64 #define MIN_RADAR_NORMAL_DURATION_ETSI_TYPE3 180 /* ETSI TYPE3 最小宽度 */
65 #define MAX_RADAR_NORMAL_DURATION_FCC_TYPE2 110  /* FCC TYPE2  最大宽度 */
66 #define MIN_RADAR_NORMAL_DURATION_FCC_TYPE4 40   /* FCC TYPE4  最小宽度 */
67 
68 #define MIN_RADAR_PULSE_PRI 148 /* 雷达脉冲最小间距(us) */
69 #define MIN_ETSI_PULSE_PRI 248  /* ETSI雷达脉冲最小间距(us) */
70 
71 #define MIN_ETSI_CHIRP_PRI 245   /* ETSI chirp雷达最小脉冲间隔(us) */
72 #define MIN_FCC_CHIRP_PRI 990    /* FCC chirp雷达最小脉冲间隔(us) */
73 #define MIN_MKK_CHIRP_PRI 990    /* MKK chirp雷达最小脉冲间隔(us) */
74 #define MIN_ETSI_CHIRP_PRI_NUM 4 /* ETSI chirp雷达最小脉冲间隔个数 */
75 #define MIN_FCC_CHIRP_PRI_NUM 1  /* FCC chirp雷达最小脉冲间隔个数 */
76 #define MIN_MKK_CHIRP_PRI_NUM 1  /* MKK chirp雷达最小脉冲间隔个数 */
77 
78 #define MIN_RADAR_PULSE_POWER 394              /* 脉冲power最小值 */
79 #define MIN_RADAR_PULSE_POWER_FCC_TYPE0 390    /* FCC type0脉冲power最小值 */
80 #define MIN_RADAR_PULSE_POWER_ETSI_STAGGER 394 /* ETSI Stagger脉冲power最小值 */
81 
82 #define RADAR_NORMAL_PULSE_TYPE 0 /* 非chirp雷达脉冲类型 */
83 #define RADAR_CHIRP_PULSE_TYPE 1  /* chirp雷达脉冲类型 */
84 
85 #define MAX_PULSE_TIMES 4 /* 脉冲间隔之间最大倍数 */
86 
87 #define MAX_STAGGER_PULSE_TIMES 4          /* stagger脉冲间隔相差的最大倍数关系 */
88 #define MIN_FCC_TOW_TIMES_INT_PRI 100      // 200    /* FCC chirp雷达两次中断的最小时间间隔(ms) */
89 #define MAX_FCC_TOW_TIMES_INT_PRI 8000     /* FCC chirp雷达两次中断的最大时间间隔(ms) */
90 #define MAX_FCC_CHIRP_PULSE_CNT_IN_600US 5 /* FCC chirp雷达一个中断600ms内最大脉冲个数 */
91 #define MAX_FCC_CHIRP_EQ_DURATION_NUM 3    /* FCC chirp连续相同duration的最大个数 */
92 
93 #define RADAR_PULSE_NO_PERIOD 0     /* 脉冲不具备周期性 */
94 #define RADAR_PULSE_NORMAL_PERIOD 1 /* 脉冲具备周期性 */
95 #define RADAR_PULSE_BIG_PERIOD 2    /* 脉冲间隔相差较大 */
96 #define RADAR_PULSE_ONE_DIFF_PRI 3  /* 等间隔脉冲中出现一个不等间隔 */
97 
98 #define RADAR_ETSI_PPS_MARGIN 2
99 #define RADAR_ETSI_TYPE5_MIN_PPS_DIFF (20 - RADAR_ETSI_PPS_MARGIN)  /* ETSI type5不同PRI之间最小PPS偏差度 */
100 #define RADAR_ETSI_TYPE5_MAX_PPS_DIFF (50 + RADAR_ETSI_PPS_MARGIN)  /* ETSI type5不同PRI之间最大PPS偏差度 */
101 #define RADAR_ETSI_TYPE6_MIN_PPS_DIFF (80 - RADAR_ETSI_PPS_MARGIN)  /* ETSI type6不同PRI之间最小PPS偏差度 */
102 #define RADAR_ETSI_TYPE6_MAX_PSS_DIFF (400 + RADAR_ETSI_PPS_MARGIN) /* ETSI type6不同PRI之间最大PPS偏差度 */
103 
104 #define RADAR_ONE_SEC_IN_US 1000000
105 
106 #define TWO_TIMES_STAGGER_PULSE_MARGIN (2 * STAGGER_PULSE_MARGIN)
107 #define THREE_TIMES_STAGGER_PULSE_MARGIN (3 * STAGGER_PULSE_MARGIN)
108 #define FOUR_TIMES_STAGGER_PULSE_MARGIN (4 * STAGGER_PULSE_MARGIN)
109 
110 /* chirp crazy repot */
111 #define MAX_IRQ_CNT_IN_CHIRP_CRAZY_REPORT_DET_FCC 100
112 #define MAX_IRQ_CNT_IN_CHIRP_CRAZY_REPORT_DET_ETSI 40
113 
114 /*****************************************************************************
115   3 枚举定义
116 *****************************************************************************/
117 /* stagger模式周期检测类型 */
118 typedef enum {
119     HMAC_RADAR_STAGGER_PERIOD_PRI_EQUAL, /* 存在相同的PRI,且PRI符合范围要求 */
120     HMAC_RADAR_STAGGER_PERIOD_PRI_ERR,   /* 存在相同的PRI,但PRI不符合范围要求 */
121     HMAC_RADAR_STAGGER_PERIOD_NOT_DEC,   /* 不存在相同的PRI,无法确定周期性,需做进一步检查 */
122 
123     HMAC_RADAR_STAGGER_PERIOD_BUTT
124 } hmac_radar_stagger_period_enum;
125 
126 typedef osal_u8 hmac_radar_stagger_period_enum_uint8;
127 
128 /* stagger模式radar类型 */
129 typedef enum {
130     HMAC_RADAR_STAGGER_TYPE_INVALID,
131     HMAC_RADAR_STAGGER_TYPE5,
132     HMAC_RADAR_STAGGER_TYPE6,
133 
134     HMAC_RADAR_STAGGER_TYPE_BUTT
135 } hmac_radar_stagger_type_enum;
136 
137 typedef osal_u8 hmac_radar_stagger_type_enum_uint8;
138 
139 /*****************************************************************************
140   7 STRUCT定义
141 *****************************************************************************/
142 /* 脉冲信息分析结果 */
143 typedef struct {
144     osal_u32 min_pri;                  /* 最小脉冲间隔 */
145     osal_u16 min_duration;             /* 最小脉冲宽度 */
146     osal_u16 max_power;                /* 脉冲power最大值 */
147     osal_u32 pri[MAX_RADAR_PULSE_NUM]; /* 所有脉冲间隔 */
148 
149     osal_u8 pri_cnt;     /* 脉冲间隔个数 */
150     osal_u8 stagger_cnt; /* stagger脉冲数目 */
151     osal_u8 begin;       /* 分析脉冲信息的起始index */
152     osal_u8 resv1[1];    /* 保留位 */
153 
154     osal_u16 avrg_power;    /* 平均脉冲功率 */
155     osal_u16 duration_diff; /* 最小脉冲宽度 */
156     osal_u32 extra_pri;     /* stagger type6额外读取一个pri */
157     osal_u32 pri_diff;      /* 最小脉冲间隔 */
158 
159     osal_u16 power_diff;    /* 脉冲power最大值 */
160     osal_u16 avrg_duration; /* 平均脉冲间隔 */
161 } hmac_radar_pulse_analysis_result_stru;
162 
163 typedef struct {
164     osal_u8 stagger_cnt;
165     osal_u16 min_duration;
166     osal_u16 max_duration;
167     osal_u32 min_pri;
168     osal_u32 max_pri;
169     osal_u16 max_power;
170     osal_u16 min_power;
171     osal_u8 index;
172     osal_u32 sum_power;
173     osal_u32 sum_duration;
174 } hmac_radar_pulse_analysis_info;
175 
176 /*****************************************************************************
177   8 内联函数
178 *****************************************************************************/
check_radar_etsi_type1_pri(osal_u32 val)179 static INLINE__ osal_u8 check_radar_etsi_type1_pri(osal_u32 val)
180 {
181     return ((val >= 998 && val <= 5002) ? OSAL_TRUE : OSAL_FALSE);
182 }
183 
check_radar_etsi_type2_pri(osal_u32 val)184 static INLINE__ osal_u8 check_radar_etsi_type2_pri(osal_u32 val)
185 {
186     return ((val >= 623 && val <= 5002) ? OSAL_TRUE : OSAL_FALSE);
187 }
188 
check_radar_etsi_type3_pri(osal_u32 val)189 static INLINE__ osal_u8 check_radar_etsi_type3_pri(osal_u32 val)
190 {
191     return ((val >= 248 && val <= 500) ? OSAL_TRUE : OSAL_FALSE);
192 }
193 
check_radar_etsi_type5_pri(osal_u32 val)194 static INLINE__ osal_u8 check_radar_etsi_type5_pri(osal_u32 val)
195 {
196     return ((val >= 2500 && val <= 3333) ? OSAL_TRUE : OSAL_FALSE);
197 }
198 
check_radar_etsi_type6_pri(osal_u32 val)199 static INLINE__ osal_u8 check_radar_etsi_type6_pri(osal_u32 val)
200 {
201     return ((val >= 833 && val <= 2500) ? OSAL_TRUE : OSAL_FALSE);
202 }
203 
check_radar_etsi_stagger_pri(osal_u32 val)204 static INLINE__ osal_u8 check_radar_etsi_stagger_pri(osal_u32 val)
205 {
206     return ((val >= 833 && val <= 3333) ? OSAL_TRUE : OSAL_FALSE);
207 }
208 
check_radar_etsi_type6_duration_diff(osal_u16 val)209 static INLINE__ osal_u8 check_radar_etsi_type6_duration_diff(osal_u16 val)
210 {
211     return ((val <= 47) ? OSAL_TRUE : OSAL_FALSE);
212 }
213 
check_radar_etsi_short_pulse(osal_u16 val)214 static INLINE__ osal_u8 check_radar_etsi_short_pulse(osal_u16 val)
215 {
216     return ((val >= 10 && val <= 30) ? OSAL_TRUE : OSAL_FALSE);
217 }
218 
check_radar_fcc_type0_pri(osal_u32 val)219 static INLINE__ osal_u8 check_radar_fcc_type0_pri(osal_u32 val)
220 {
221     return ((val >= 1426 && val <= 1430) ? OSAL_TRUE : OSAL_FALSE);
222 }
223 
check_radar_fcc_type3_pri(osal_u32 val)224 static INLINE__ osal_u8 check_radar_fcc_type3_pri(osal_u32 val)
225 {
226     return ((val >= 198 && val <= 502) ? OSAL_TRUE : OSAL_FALSE);
227 }
228 
check_radar_fcc_type4_pri(osal_u32 val)229 static INLINE__ osal_u8 check_radar_fcc_type4_pri(osal_u32 val)
230 {
231     return ((val >= 198 && val <= 502) ? OSAL_TRUE : OSAL_FALSE);
232 }
233 
check_radar_fcc_type4_pri_small(osal_u32 val)234 static INLINE__ osal_u8 check_radar_fcc_type4_pri_small(osal_u32 val)
235 {
236     return (((val >= 233 && val <= 330) || (val >= 336 && val <= 502)) ? OSAL_TRUE : OSAL_FALSE);
237 }
238 
check_radar_fcc_type5_pri(osal_u32 val)239 static INLINE__ osal_u8 check_radar_fcc_type5_pri(osal_u32 val)
240 {
241     return ((val >= 998 && val <= (2002 * 2)) ? OSAL_TRUE : OSAL_FALSE);
242 }
243 
check_radar_fcc_type6_pri(osal_u32 val)244 static INLINE__ osal_u8 check_radar_fcc_type6_pri(osal_u32 val)
245 {
246     return ((val >= 331 && val <= 335) ? OSAL_TRUE : OSAL_FALSE);
247 }
248 
check_radar_fcc_type2_pri_small(osal_u32 val)249 static INLINE__ osal_u8 check_radar_fcc_type2_pri_small(osal_u32 val)
250 {
251     return ((val >= 148 && val <= 198) ? OSAL_TRUE : OSAL_FALSE);
252 }
253 
check_radar_fcc_chirp_total_cnt(osal_u8 val)254 static INLINE__ osal_u8 check_radar_fcc_chirp_total_cnt(osal_u8 val)
255 {
256     return ((val >= 3 && val <= 15) ? OSAL_TRUE : OSAL_FALSE);
257 }
258 
check_radar_fcc_type4_duration(osal_u16 val)259 static INLINE__ osal_u8 check_radar_fcc_type4_duration(osal_u16 val)
260 {
261     return ((val >= 5 && val <= 220) ? OSAL_TRUE : OSAL_FALSE);
262 }
263 
check_radar_fcc_chirp_pow_diff(osal_u16 val)264 static INLINE__ osal_u8 check_radar_fcc_chirp_pow_diff(osal_u16 val)
265 {
266     return ((val <= 65) ? OSAL_TRUE : OSAL_FALSE);
267 }
268 
two_times(osal_u32 val)269 static INLINE__ osal_u32 two_times(osal_u32 val)
270 {
271     return (val << 1);
272 }
273 
check_radar_etsi_type2_hw(hal_dfs_radar_type_enum_uint8 radar_type,osal_u8 radar_type_num)274 static INLINE__ osal_u8 check_radar_etsi_type2_hw(hal_dfs_radar_type_enum_uint8 radar_type, osal_u8 radar_type_num)
275 {
276     return ((radar_type_num == 2) && (radar_type == HAL_DFS_RADAR_TYPE_ETSI));
277 }
278 
check_radar_etsi_type3_hw(hal_dfs_radar_type_enum_uint8 radar_type,osal_u8 radar_type_num)279 static INLINE__ osal_u8 check_radar_etsi_type3_hw(hal_dfs_radar_type_enum_uint8 radar_type, osal_u8 radar_type_num)
280 {
281     return ((radar_type_num == 3) && (radar_type == HAL_DFS_RADAR_TYPE_ETSI));
282 }
283 
check_radar_fcc_type3_hw(hal_dfs_radar_type_enum_uint8 radar_type,osal_u8 radar_type_num)284 static INLINE__ osal_u8 check_radar_fcc_type3_hw(hal_dfs_radar_type_enum_uint8 radar_type, osal_u8 radar_type_num)
285 {
286     return ((radar_type_num == 3) && (radar_type == HAL_DFS_RADAR_TYPE_FCC));
287 }
288 
check_radar_fcc_type4_hw(hal_dfs_radar_type_enum_uint8 radar_type,osal_u8 radar_type_num)289 static INLINE__ osal_u8 check_radar_fcc_type4_hw(hal_dfs_radar_type_enum_uint8 radar_type, osal_u8 radar_type_num)
290 {
291     return ((radar_type_num == 4) && (radar_type == HAL_DFS_RADAR_TYPE_FCC));
292 }
293 
check_radar_etsi_type23_or_fcc_type34_hw(hal_dfs_radar_type_enum_uint8 radar_type,osal_u8 radar_type_num)294 static INLINE__ osal_u8 check_radar_etsi_type23_or_fcc_type34_hw(
295     hal_dfs_radar_type_enum_uint8 radar_type, osal_u8 radar_type_num)
296 {
297     return (check_radar_etsi_type2_hw(radar_type, radar_type_num) ||
298         check_radar_etsi_type3_hw(radar_type, radar_type_num) ||
299         check_radar_fcc_type3_hw(radar_type, radar_type_num) ||
300         check_radar_fcc_type4_hw(radar_type, radar_type_num));
301 }
302 
check_radar_etsi_type2_irq_num(osal_u8 num_a,osal_u8 num_b)303 static INLINE__ osal_u8 check_radar_etsi_type2_irq_num(osal_u8 num_a, osal_u8 num_b)
304 {
305     return ((num_a >= 1 && num_a <= 3 && (0 == num_b || (num_b >= 1 && num_b <= 8))) ? OSAL_TRUE : OSAL_FALSE);
306 }
307 
check_radar_etsi_type3_irq_num(osal_u8 num_a,osal_u8 num_b)308 static INLINE__ osal_u8 check_radar_etsi_type3_irq_num(osal_u8 num_a, osal_u8 num_b)
309 {
310     return ((num_a >= 1 && num_a <= 5 && (0 == num_b || (num_b >= 1 && num_b <= 8))) ? OSAL_TRUE : OSAL_FALSE);
311 }
312 
check_radar_fcc_type4_irq_num(osal_u8 num_a,osal_u8 num_b)313 static INLINE__ osal_u8 check_radar_fcc_type4_irq_num(osal_u8 num_a, osal_u8 num_b)
314 {
315     return ((num_a >= 1 && num_a <= 3 && (0 == num_b || (num_b >= 1 && num_b <= 4))) ? OSAL_TRUE : OSAL_FALSE);
316 }
317 
check_radar_fcc_type3_irq_num(osal_u8 num_a,osal_u8 num_b)318 static INLINE__ osal_u8 check_radar_fcc_type3_irq_num(osal_u8 num_a, osal_u8 num_b)
319 {
320     return ((num_a >= 1 && num_a <= 4 && (0 == num_b || (num_b >= 1 && num_b <= 4))) ? OSAL_TRUE : OSAL_FALSE);
321 }
322 
323 /*****************************************************************************
324   9 OTHERS定义
325 *****************************************************************************/
326 oal_bool_enum_uint8 hmac_radar_filter(hmac_device_stru *hmac_device, hal_radar_det_event_stru *radar_det_info);
327 oal_bool_enum_uint8 hmac_radar_crazy_report_det_timer(hal_to_dmac_device_stru *hal_device);
328 
329 #endif /* _PRE_WLAN_FEATURE_DFS_OPTIMIZE */
330 
331 #ifdef __cplusplus
332 #if __cplusplus
333 }
334 #endif
335 #endif
336 
337 #endif /* end of hmac_radar.h */
338