WS63 SDK 文档 7021f4f@fbb_ws63
ws63 和 ws63e 解决方案的 SDK 文档
载入中...
搜索中...
未找到
oal_util_hcm.h
浏览该文件的文档.
1/*
2 * Copyright (c) HiSilicon (Shanghai) Technologies Co., Ltd. 2020-2020. All rights reserved.
3 * Description: Header file of WLAN product specification macro definition.
4 * Create: 2020-10-18
5 */
6
7#ifndef __OAL_UTIL_HCM_H__
8#define __OAL_UTIL_HCM_H__
9
10#include "securec.h"
11#include "osal_types.h"
12#include "osal_adapt.h"
13#include "oal_types.h"
14#include "wlan_util_common.h"
15#if defined(_PRE_OS_VERSION_LINUX) && defined(_PRE_OS_VERSION) && (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
16#include <linux/etherdevice.h>
17#endif
18#if defined(_PRE_OS_VERSION_LITEOS) && defined(_PRE_OS_VERSION) && (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
19#include <sys/time.h>
20#include <stdio.h>
21#include <ctype.h>
22#endif
23
24#ifdef __cplusplus
25#if __cplusplus
26extern "C" {
27#endif
28#endif
29
30#ifdef CONTROLLER_CUSTOMIZATION
31#define wifi_printf_always(fmt, ...) \
32 printk(KERN_EMERG KBUILD_MODNAME "[%s:%d]:" fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__)
33#else
34#define wifi_printf_always(fmt, arg...) osal_printk(fmt, ##arg)
35#endif
36
37#ifdef _PRE_WIFI_PRINTK
38#ifdef CONTROLLER_CUSTOMIZATION
39#define wifi_printf(fmt, ...) printk(KERN_EMERG KBUILD_MODNAME "[%s:%d]:" fmt, __FUNCTION__, __LINE__, ##__VA_ARGS__)
40#else
41#define wifi_printf(fmt, arg...) osal_printk(fmt, ##arg)
42#endif
43#else
44#define wifi_printf(fmt, arg...)
45#endif
46
47/*****************************************************************************
48 2 宏定义
49*****************************************************************************/
50#define OAL_DECLARE_PACKED __attribute__((__packed__))
51#define WIFI_ROM_TEXT __attribute__ ((section(".wifi.rom.text"))) /* ROM代码段 */
52#define WIFI_ROM_RODATA __attribute__ ((section(".wifi.rom.rodata"))) /* ROM const全局变量段 可与text段复用 */
53#define WIFI_ROM_DATA __attribute__ ((section(".wifi.rom.data"))) /* ROM 初值非0全局变量段 不能与bss混用 */
54#define WIFI_ROM_BSS __attribute__ ((section(".wifi.rom.bss"))) /* ROM 初值0或未赋值全局变量段
55 可以data段混用 只会影响RAM段大小 */
56#if defined(_PRE_WLAN_FEATURE_WS63)
57#define WIFI_TCM_TEXT __attribute__((section(".wifi.tcm.text")))
58#define WIFI_TCM_RODATA __attribute__((section(".wifi.tcm.rodata")))
59#define WIFI_HMAC_TCM_TEXT
60#define WIFI_HMAC_TCM_RODATA
61#elif defined(_PRE_WLAN_FEATURE_WS53)
62#define WIFI_TCM_TEXT
63#define WIFI_TCM_RODATA __attribute__((section(".wifi.tcm.rodata")))
64#define WIFI_HMAC_TCM_TEXT __attribute__((section(".wifi.tcm.text")))
65#define WIFI_HMAC_TCM_RODATA
66#else
67#define WIFI_TCM_TEXT
68#define WIFI_TCM_RODATA
69#define WIFI_HMAC_TCM_TEXT
70#define WIFI_HMAC_TCM_RODATA
71#endif
72
73/* 拼接为16 bit或者 32bit */
74#define OAL_MAKE_WORD16(lsb, msb) ((((osal_u16)(msb) << 8) & 0xFF00) | (lsb))
75#define OAL_MAKE_WORD32(lsw, msw) ((((osal_u32)(msw) << 16) & 0xFFFF0000) | (lsw))
76
77/* 比较宏 */
78#define OAL_MIN(_A, _B) (((_A) < (_B)) ? (_A) : (_B))
79
80/* 比较宏 */
81#define OAL_MAX(_A, _B) (((_A) > (_B)) ? (_A) : (_B))
82#define OAL_SUB(_A, _B) (((_A) > (_B)) ? ((_A) - (_B)) : (0))
83#define OAL_ABSOLUTE_SUB(_A, _B) (((_A) > (_B)) ? ((_A) - (_B)) : ((_B) - (_A)))
85#define OAL_ARRAY_SIZE(_ast_array) (sizeof(_ast_array) / sizeof((_ast_array)[0]))
86
87/* 修改_PRE_BIG_CPU_ENDIAN保持HMAC&DMAC统一 */
88/* BIG_ENDIAN */
89#if defined(_PRE_BIG_CPU_ENDIAN) && defined(_PRE_CPU_ENDIAN) && (_PRE_BIG_CPU_ENDIAN == _PRE_CPU_ENDIAN)
90#define oal_ntoh_16(_val) (_val)
91#define oal_ntoh_32(_val) (_val)
92#define oal_hton_16(_val) (_val)
93#define oal_hton_32(_val) (_val)
94#define OAL_NTOH_16(_val) (_val)
95#define OAL_NTOH_32(_val) (_val)
96#define OAL_HTON_16(_val) (_val)
97#define OAL_HTON_32(_val) (_val)
98
99#else /* LITTLE_ENDIAN */
100#define oal_ntoh_16(_val) oal_swap_byteorder_16(_val)
101#define oal_ntoh_32(_val) oal_swap_byteorder_32(_val)
102#define oal_hton_16(_val) oal_swap_byteorder_16(_val)
103#define oal_hton_32(_val) oal_swap_byteorder_32(_val)
104#define OAL_NTOH_16(_val) oal_swap_byteorder_16(_val)
105#define OAL_NTOH_32(_val) oal_swap_byteorder_32(_val)
106#define OAL_HTON_16(_val) oal_swap_byteorder_16(_val)
107#define OAL_HTON_32(_val) oal_swap_byteorder_32(_val)
108#endif
109
110/* 获取大小 */
111#define OAL_SIZEOF sizeof
113#define HCC_DATA_LEN_ALIGN 32
114/* 获取数组大小 */
115#define osal_array_size(_array) (sizeof(_array) / sizeof((_array)[0]))
116
117/* 从某个设备读取某个寄存器地址的32-bit寄存器的值。 */
118#define OAL_REG_READ32(_addr) \
119 *((OAL_VOLATILE osal_u32 *)(_addr))
121#define OAL_REG_READ16(_addr) \
122 *((OAL_VOLATILE osal_u16 *)(_addr))
123
124/* 往某个设备某个32-bit寄存器地址写入某个值 */
125#define OAL_REG_WRITE32(_addr, _val) \
126 (*((OAL_VOLATILE osal_u32 *)(_addr)) = (_val))
127#define OAL_REG_WRITE16(_addr, _val) \
128 (*((OAL_VOLATILE osal_u16 *)(_addr)) = (_val))
129
130#ifndef round_mask
131#define round_mask(x, y) ((__typeof__(x))((y) - 1))
132#endif
133
134#ifndef round_up
135#define round_up(x, y) ((((x) - 1) | round_mask(x, y)) + 1)
136#endif
137#define OAL_ROUND_UP round_up
138
139#ifndef round_down
140#define round_down(x, y) ((x) & ~round_mask(x, y))
141#endif
142#define OAL_ROUND_DOWN round_down
144#define OAL_IPV4_ADDR_LEN 6
145#define OAL_IPV6_ADDR_LEN 16
146
147/* 获取CORE ID */
148#define OAL_GET_CORE_ID() (0)
150typedef osal_ulong oal_bitops;
152#define OAL_OFFSET_OF offsetof
154typedef ssize_t oal_ssize_t; /* hi1102-cb for sys interface 51/02 */
155typedef size_t oal_size_t;
157#define OAL_STRLEN osal_strlen
158#define OAL_MEMCMP osal_memcmp
159#define OAL_STRSTR osal_strstr
161#define todigit(c) ((c) - '0')
162#define tochar(n) ((n) + '0')
163#define oal_tolower(x) ((osal_u8)(x) | 0x20)
164#define oal_isdigit(c) ('0' <= (c) && (c) <= '9')
165#define oal_isxdigit(c) (('0' <= (c) && (c) <= '9') || ('a' <= (c) && (c) <= 'f') || ('A' <= (c) && (c) <= 'F'))
167#define oal_is_null_ptr4(ptr1, ptr2, ptr3, ptr4) \
168 ((NULL == (ptr1)) || (NULL == (ptr2)) || (NULL == (ptr3)) || (NULL == (ptr4)))
169
170static inline osal_slong oal_strtol(OAL_CONST osal_s8 *pc_nptr, osal_s8 **ppc_endptr, osal_s32 l_base);
171/*****************************************************************************
172 函 数 名 : oal_bit_find_first_zero_one_byte
173 功能描述 : 找到1字节右数第一个是0的位数
174*****************************************************************************/
175static inline osal_u8 oal_bit_find_first_zero_one_byte(osal_u8 byte)
176{
177 osal_u8 zero_bit = 0;
178
179 byte = ~byte;
180 byte = byte & (-byte);
181
182 while (byte != 1) {
183 zero_bit++;
184 byte = (byte >> 1);
185
186 if (zero_bit > 7) { /* 7表示超过字节最大bit数。退出循环 */
187 return zero_bit;
188 }
189 }
190
191 return zero_bit;
192}
193
194/*****************************************************************************
195 函 数 名 : oal_set_mac_addr_zero
196 功能描述 : mac地址置零
197*****************************************************************************/
198static inline osal_void oal_set_mac_addr_zero(osal_u8 *mac_addr)
199{
200 const osal_u32 mac_len = 6; /* 6字节mac地址长度 */
201 (osal_void)memset_s(mac_addr, mac_len, 0, mac_len);
202}
203
204/*****************************************************************************
205 函 数 名 : osal_strtohex
206 功能描述 : 将一个字符转化成16进制数
207*****************************************************************************/
208static inline osal_u8 oal_strtohex(const osal_s8 *string)
209{
210 osal_u8 ret = 0;
211
212 if (*string >= '0' && *string <= '9') {
213 ret = (osal_u8)(*string - '0');
214 } else if (*string >= 'A' && *string <= 'F') {
215 ret = (osal_u8)(*string - 'A' + 10); /* 10进制转换 */
216 } else if (*string >= 'a' && *string <= 'f') {
217 ret = (osal_u8)(*string - 'a' + 10); /* 10进制转换 */
218 } else {
219 ret = 0xff;
220 }
221
222 return ret;
223}
224
225/* ****************************************************************************
226 函 数 名 : oal_strtoaddr
227 功能描述 : 字符串转MAC地址
228**************************************************************************** */
229static inline osal_void oal_strtoaddr(const osal_char *pc_param, osal_u8 *mac_addr)
230{
231 osal_u8 char_index;
232
233 /* 获取mac地址,16进制转换 */
234 for (char_index = 0; char_index < 12; char_index++) { /* 12 mac地址字符长度 */
235 while ((*pc_param == ':') || (*pc_param == '-')) {
236 pc_param++;
237
238 continue;
239 }
240
241 /* 处理2字符, 16表字节内高4bit */
242 mac_addr[char_index / 2] = (osal_u8)(mac_addr[char_index / 2] * 16 * (char_index % 2) +
243 oal_strtohex((const osal_s8 *)pc_param));
244 pc_param++;
245 }
246}
247
248/*****************************************************************************
249 函 数 名 : oal_strtoipv6
250 功能描述 : 字符串转ipv6地址
251 输入参数 : pc_param: ipv6地址字符串, 格式 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx
252 输出参数 : mac_addr: 转换成16进制后的ipv6地址
253*****************************************************************************/
254static inline osal_void oal_strtoipv6(const osal_s8 *pc_param, osal_u8 *ipv6_addr)
255{
256 osal_u8 char_index;
257
258 /* 获取ipv6地址,16进制转换,每个byte对应2位十六进制数 */
259 for (char_index = 0; char_index < OAL_IPV6_ADDR_LEN * 2; char_index++) {
260 if ((*pc_param == ':')) {
261 pc_param++;
262 if (char_index != 0) {
263 char_index--;
264 }
265 continue;
266 }
267 /* 将ipv6字符串转换为16进制数组,4 2分别用作位移数及求余 */
268 ipv6_addr[char_index >> 1] = (osal_u8)(((ipv6_addr[char_index>>1]) << 4) * (char_index % 2) +
269 oal_strtohex(pc_param));
270 pc_param++;
271 }
272}
273
274static inline osal_void oal_strtoipv4(const osal_s8 *ip_str, osal_u8 *ipv4_addr)
275{
276 osal_char *pc_token;
277 osal_char *pc_ctx;
278 osal_char *pc_sep = ".";
279 osal_s8 param_num = 3; /* IPV4地址有4段, 数组idx为0/1/2/3 */
280
281 pc_token = strtok_s((osal_char *)ip_str, (OAL_CONST osal_char *)pc_sep, &pc_ctx);
282 while (pc_token) {
283 /* 10 base权值 */
284 *(ipv4_addr + param_num) = (osal_u8)oal_strtol((OAL_CONST osal_s8 *)pc_token, OAL_PTR_NULL, 10);
285 pc_token = strtok_s(OAL_PTR_NULL, (OAL_CONST osal_char *)pc_sep, &pc_ctx);
286 param_num--;
287 }
288}
289
290/*****************************************************************************
291 函 数 名 : oal_gen_random
292 功能描述 : 产生随机数
293 输入参数 : val:随机种子 rst_flag:0:不更新随机种子,非0:更新随机种子
294*****************************************************************************/
295static inline osal_u8 oal_gen_random(osal_u32 val, osal_u8 rst_flag)
296{
297 OAL_STATIC osal_u32 rand = 0;
298 if (rst_flag != 0) {
299 rand = val;
300 }
301 rand = rand * 1664525L + 1013904223L;
302 /* 32位 - 8位 = 24位,右移24位得到u8 */
303 return (osal_u8) (rand >> 24);
304}
305
306/*****************************************************************************
307 函 数 名 : oal_strim
308 功能描述 : 去掉字符串开始与结尾的空格
309 输入参数 : 无
310 输出参数 : 无
311*****************************************************************************/
312static inline osal_s8 *oal_strim(osal_s8 *s)
313{
314 osal_s8 *end;
315
316 while (*s == ' ') {
317 ++s;
318 }
319
320 end = s;
321 while ((*end != ' ') && (*end != '\0')) {
322 ++end;
323 }
324
325 *end = '\0';
326
327 return s;
328}
329
330static inline void oal_random_ether_addr(osal_u8 *addr, osal_u8 len)
331{
332#if defined(_PRE_OS_VERSION_LITEOS) && defined(_PRE_OS_VERSION) && (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
333 struct timeval tv1;
334 struct timeval tv2;
335 unref_param(len);
336
337 /* 获取随机种子 */
338 gettimeofday(&tv1, NULL);
339
340 /* 防止秒级种子为0 */
341 tv1.tv_sec += 2; /* 加2 */
342
343 tv2.tv_sec = (osal_slong)((td_u32)((td_u64)tv1.tv_sec * (td_u64)tv1.tv_sec) * (td_u64)tv1.tv_usec);
344 tv2.tv_usec = (osal_slong)((td_u32)((td_u64)tv1.tv_sec * (td_u64)tv1.tv_usec) * (td_u64)tv1.tv_usec);
345
346 /* 生成随机的mac地址 */
347 addr[0] = ((td_u32)tv2.tv_sec & 0xff) & 0xfe;
348 addr[1] = (osal_u8)((td_u32)tv2.tv_usec & 0xff);
349 addr[2] = (osal_u8)(((td_u32)tv2.tv_sec & 0xff0) >> 4); /* mac_addr[2]右移4 bit */
350 addr[3] = (osal_u8)(((td_u32)tv2.tv_usec & 0xff0) >> 4); /* mac_addr[3]右移4 bit */
351 addr[4] = (osal_u8)(((td_u32)tv2.tv_sec & 0xff00) >> 8); /* mac_addr[4]右移8 bit */
352 addr[5] = (osal_u8)(((td_u32)tv2.tv_usec & 0xff00) >> 8); /* mac_addr[5]右移8 bit */
353#endif
354#if defined(_PRE_OS_VERSION_LINUX) && defined(_PRE_OS_VERSION) && (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
355 unref_param(len);
356 random_ether_addr(addr);
357#endif
358}
359
360/*****************************************************************************
361 函 数 名 : oal_byteorder_host_to_net_uint16
362 功能描述 : 将16位本地字节序转换为网络字节序
363 输入参数 : byte: 需要字节序转换的变量
364 输出参数 : 无
365 返 回 值 : 转换好的变量
366*****************************************************************************/
367static inline osal_u16 oal_byteorder_net_to_host_uint16(osal_u16 byte)
368{
369 return oal_ntoh_16(byte);
370}
371
372/*****************************************************************************
373 函 数 名 : oal_byteorder_host_to_net_uint16
374 功能描述 : 将32位本地字节序转换为网络字节序
375 输入参数 : byte: 需要字节序转换的变量
376 输出参数 : 无
377 返 回 值 : 转换好的变量
378*****************************************************************************/
379static inline osal_u32 oal_byteorder_host_to_net_uint32(osal_u32 byte)
380{
381 return oal_hton_32(byte);
382}
383
384/*****************************************************************************
385 函 数 名 : oal_atoi
386 功能描述 : 字符串类型转换成整形
387 输入参数 : c_string: 字符串地址
388*****************************************************************************/
389static inline osal_s32 oal_atoi(const osal_s8 *string)
390{
391 osal_s32 ret = 0;
392 osal_s32 flag = 0;
393
394 for (; ; string++) {
395 switch (*string) {
396 case '0'...'9':
397 /* 乘10进位 */
398 ret = 10 * ret + (*string - '0');
399 break;
400 case '-':
401 flag = 1;
402 break;
403
404 case ' ':
405 continue;
406
407 default:
408 return ((flag == 0) ? ret : (-ret));
409 }
410 }
411}
412
413static inline unsigned int simple_guess_base(const char *cp)
414{
415 if (cp[0] == '0') {
416 if (oal_tolower(cp[1]) == 'x' && oal_isxdigit(cp[2])) {
417 /* 对应16进制 */
418 return 16;
419 } else {
420 /* 对应8进制 */
421 return 8;
422 }
423 } else {
424 /* 对应10进制 */
425 return 10;
426 }
427}
428
429static inline unsigned long long oal_simple_strtoull(const osal_s8 *cp, osal_s8 **endp, unsigned int base)
430{
431 unsigned long long result = 0;
432
433 if (base == 0) {
434 base = simple_guess_base((const char *)cp);
435 }
436 /* 对应16进制 */
437 if (base == 16 && cp[0] == '0' && oal_tolower(cp[1]) == 'x') {
438 /* 指针后移2位 */
439 cp += 2;
440 }
441 while (oal_isxdigit(*cp)) {
442 unsigned int value;
443 /* 16进制下,a对应10 */
444 value = oal_isdigit(*cp) ? *cp - '0' : oal_tolower(*cp) - 'a' + 10;
445 if (value >= base) {
446 break;
447 }
448 result = result * base + value;
449 cp++;
450 }
451 if (endp) {
452 *endp = (osal_s8 *)cp;
453 }
454 return result;
455}
456
457static inline osal_slong oal_strtol(OAL_CONST osal_s8 *pc_nptr, osal_s8 **ppc_endptr, osal_s32 l_base)
458{
459 /* 跳过空格 */
460 while ((*pc_nptr) == ' ') {
461 pc_nptr++;
462 }
463
464 if (*pc_nptr == '-') {
465 return (osal_slong)(-oal_simple_strtoull(pc_nptr + 1, ppc_endptr, (osal_u32)l_base));
466 }
467 return (osal_slong)oal_simple_strtoull(pc_nptr, ppc_endptr, (osal_u32)l_base);
468}
469
470#if defined(_PRE_OS_VERSION_LITEOS) && defined(_PRE_OS_VERSION) && (_PRE_OS_VERSION_LITEOS == _PRE_OS_VERSION)
471#ifdef _PRE_WIFI_PRINTK
472static inline osal_void oal_print_hex_dump(const osal_u8* addr, osal_s32 len, osal_s32 groupsize,
473 const osal_char* pre_str)
474{
475 unref_param(groupsize);
476 wifi_printf("%s: len = %d", pre_str, len);
477 for (td_s32 i = 0; i < len; i++) {
478 if (((td_u32)i & 0x000f) == 0) {
479 wifi_printf("\r\n%04d: ", i);
480 }
481 wifi_printf(" %02x", addr[i]);
482 }
483 wifi_printf("\r\n");
484}
485#endif
486static inline osal_void oal_dump_stack(osal_void)
487{
488#if defined(_PRE_OS_VERSION_LINUX) && defined(_PRE_OS_VERSION) && (_PRE_OS_VERSION_LINUX == _PRE_OS_VERSION)
489 ArchBackTrace();
490#endif
491 return;
492}
493#endif
494
495#ifdef __cplusplus
496#if __cplusplus
497}
498#endif
499#endif
500
501#endif
502
#define NULL
Definition common_def.h:21
#define unref_param(P)
Definition dmac_misc_type.h:33
INT32 ssize_t
Definition los_typedef.h:77
#define OAL_CONST
Definition oal_types.h:45
#define OAL_PTR_NULL
Definition oal_types_device_rom.h:30
#define OAL_IPV6_ADDR_LEN
Definition oal_util_hcm.h:144
#define oal_tolower(x)
Definition oal_util_hcm.h:162
#define oal_hton_32(_val)
Definition oal_util_hcm.h:102
size_t oal_size_t
Definition oal_util_hcm.h:154
#define oal_isxdigit(c)
Definition oal_util_hcm.h:164
#define oal_ntoh_16(_val)
Definition oal_util_hcm.h:99
#define oal_isdigit(c)
Definition oal_util_hcm.h:163
osal_ulong oal_bitops
Definition oal_util_hcm.h:149
#define wifi_printf(fmt, arg...)
Definition oal_util_hcm.h:44
ssize_t oal_ssize_t
Definition oal_util_hcm.h:153
int osal_s32
Definition osal_types.h:19
long osal_slong
Definition osal_types.h:21
unsigned char osal_u8
Definition osal_types.h:11
signed char osal_s8
Definition osal_types.h:17
char osal_char
Definition osal_types.h:16
void osal_void
Definition osal_types.h:29
unsigned int osal_u32
Definition osal_types.h:13
unsigned short osal_u16
Definition osal_types.h:12
unsigned long osal_ulong
Definition osal_types.h:15
errno_t memset_s(void *dest, size_t destMax, int c, size_t count)
char * strtok_s(char *strToken, const char *strDelimit, char **context)
#define OAL_STATIC
Definition soc_wifi_service_api.c:30
unsigned int td_u32
Definition td_type.h:38
int td_s32
Definition td_type.h:44
unsigned long long td_u64
Definition td_type.h:39