Initial commit: TXW82x FPV v2.7.0.7-42229 SDK + project sources

This commit is contained in:
2026-07-06 11:30:13 +08:00
commit e76462eeb7
3451 changed files with 1415300 additions and 0 deletions

637
sdk/lib/common/string.c Normal file
View File

@@ -0,0 +1,637 @@
#include "basic_include.h"
#include "lib/heap/sysheap.h"
#ifndef PRINT_LEVEL_DEFAULT
#define PRINT_LEVEL_DEFAULT (6)
#endif
#ifndef PRINT_BUFF_SIZE
#define PRINT_BUFF_SIZE (256)
#endif
#define LOWCASE(c) (((c)>='A'&&(c) <= 'Z')?(c)+32:(c))
#define _PRINT_DISABLED_ (BIT(0))
#define _PRINT_COLOR_DISABLED_ (BIT(1))
#define _PRINT_TIME_DISABLED_ (BIT(2))
#define _PRINT_TIME_NTP_ (BIT(3))
#define _PRINT_REDIRECT_DUAL_ (BIT(4))
__bobj static osprint_hook __print_hook;
__bobj static void *__print_hook_priv;
__bobj void *console_handle;
__bobj int8 __print_level__;
__bobj uint8 __print_ctrl__;
__bobj char _print_buff_p[PRINT_BUFF_SIZE];
static const char *__print_color__[] = {
"\e[40;35;7m", //KERN_EMERG : Red
"\e[40;35;7m", //KERN_ALERT : Red
"\e[40;35;7m", //KERN_CRIT : Red
"\e[40;31m", //KERN_ERR : Red
"\e[40;33m", //KERN_WARNING: Yellow
"\e[40;32m", //KERN_NOTICE : Green
"\e[40;34m", //KERN_INFO : Blue
"\e[40;30m", //KERN_DEBUG : Black/Default
"\e[0m", //END
};
int printf(const char *format, ...) __alias(hgprintf);
int puts(const char *s) __alias(hgputs);
int __wrap_printf(const char *format, ...) __alias(hgprintf);
int __cskyvprintfprintf(const char *format, ...) __alias(hgprintf);
////////////////////////////////////////////////////////////////////////
int32 hexchr2int(char c)
{
if (c >= '0' && c <= '9') {
return c - '0';
}
if (c >= 'a' && c <= 'f') {
return c - 'a' + 10;
}
if (c >= 'A' && c <= 'F') {
return c - 'A' + 10;
}
return -1;
}
int32 hex2char(char *hex_str)
{
int a, b;
a = hexchr2int(*hex_str++);
if (a < 0) {
return -1;
}
b = hexchr2int(*hex_str++);
if (b < 0) {
return -1;
}
return (a << 4) | b;
}
int32 hex2bin(char *hex_str, uint8 *bin, uint32 len)
{
uint32 i = 0;
uint32 str_len = 0;
int32 a;
char *ipos = hex_str;
uint8 *opos = bin;
if (!hex_str || !bin) {
return i;
}
str_len = os_strlen(hex_str);
for (i = 0; i < len && (i * 2) + 2 <= str_len; i++) {
a = hex2char(ipos);
if (a < 0) {
return i;
}
*opos++ = (uint8)a;
ipos += 2;
}
return i;
}
void str2mac(char *macstr, uint8 *mac)
{
mac[0] = hex2char(macstr);
mac[1] = hex2char(macstr + 3);
mac[2] = hex2char(macstr + 6);
mac[3] = hex2char(macstr + 9);
mac[4] = hex2char(macstr + 12);
mac[5] = hex2char(macstr + 15);
}
uint32 str2ip(char *ipstr)
{
char *ptr = ipstr;
uint32 ip = os_atoi(ipstr);
do {
if (*ptr == '.') {
ptr++;
ip = (ip << 8 | os_atoi(ptr));
}
ptr++;
} while (*ptr);
return os_htonl(ip);
}
uint64 _os_atoh(char *str, int8 count)
{
uint64 val = 0;
int32 s = 0;
int8 cnt = 1;
if (os_strlen(str) > 2 && str[0] == '0' && (str[1] == 'x' || str[1] == 'X')) {
str += 2;
}
while (*str && cnt++ <= count) {
s = hexchr2int(*str);
if (s == -1) {
break;
}
val = (val << 4) + s;
str++;
}
return val;
}
uint32 os_atoh(char *str)
{
return (uint32)_os_atoh(str, 8);
}
uint64 os_atohl(char *str)
{
return _os_atoh(str, 16);
}
char *os_strdup(const char *s)
{
size_t len;
char *d;
if (s == NULL) {
return NULL;
}
len = strlen(s);
d = os_malloc(len + 1);
if (d == NULL) {
return NULL;
}
os_memcpy(d, s, len);
d[len] = '\0';
return d;
}
void print_redirect(osprint_hook print, void *priv, uint8 dual_out)
{
uint32 flag = disable_irq();
__print_hook = print;
__print_hook_priv = priv;
if(dual_out){
__print_ctrl__ |= _PRINT_REDIRECT_DUAL_;
} else {
__print_ctrl__ &= ~ _PRINT_REDIRECT_DUAL_;
}
enable_irq(flag);
}
void print_level(int8 level)
{
__print_level__ = level;
}
void disable_print(int8_t dis)
{
if(dis){
__print_ctrl__ |= _PRINT_DISABLED_;
}else{
__print_ctrl__ &= ~ _PRINT_DISABLED_;
}
}
void disable_print_color(int8_t dis)
{
if(dis){
__print_ctrl__ |= _PRINT_COLOR_DISABLED_;
}else{
__print_ctrl__ &= ~ _PRINT_COLOR_DISABLED_;
}
}
void disable_print_time(int8_t dis)
{
if(dis){
__print_ctrl__ |= _PRINT_TIME_DISABLED_;
}else{
__print_ctrl__ &= ~ _PRINT_TIME_DISABLED_;
}
}
void print_with_ntp(uint8 en)
{
if(en){
__print_ctrl__ |= _PRINT_TIME_NTP_;
}else{
__print_ctrl__ &= ~ _PRINT_TIME_NTP_;
}
}
static void hgprintf_uart(char *str, int32 len)
{
int32 off = 0;
if (len == 0) { len = os_strlen(str); }
while (off < len) {
uart_putc((struct uart_device *)console_handle, str[off++]);
}
}
void hgprintf_out(char *str, int32 len, uint8 level)
{
osprint_hook _print;
void *_print_priv;
uint8 color = 0;
uint32 flag = disable_irq();
_print_priv = __print_hook_priv;
_print = __print_hook;
enable_irq(flag);
if (__print_level__ && level > __print_level__) {
return;
}
if (level > 7)
level = 7;
if(level < 7 && !(__print_ctrl__ & _PRINT_COLOR_DISABLED_))
color = level;
if (_print) {
if (color) _print(_print_priv, (char *)__print_color__[color], 0);
_print(_print_priv, str, len);
if (color) _print(_print_priv, (char *)__print_color__[8], 0);
}
if(_print == NULL || (__print_ctrl__ & _PRINT_REDIRECT_DUAL_)){
if (color) hgprintf_uart((char *)__print_color__[color], 0);
hgprintf_uart(str, len);
if (color) hgprintf_uart((char *)__print_color__[8], 0);
}
if (color) sys_errlog_save((char *)__print_color__[color], 0, level);
sys_errlog_save(str, len, level);
if (color) sys_errlog_save((char *)__print_color__[8], 0, level);
}
void hgvprintf(const char *fmt, va_list ap)
{
int32 ret = 0;
int32 len = 0;
uint8 level = 7;
uint8 tick = 0;
struct timeval tv;
struct tm *tm_t;
if (__print_ctrl__ & _PRINT_DISABLED_) {
return;
}
if (fmt[0] == 2) {
tick = !(__print_ctrl__ & _PRINT_TIME_DISABLED_);
fmt++;
}
if (fmt[0] == 1) {
level = fmt[1] - '0';
fmt += 2;
}
if (__print_level__ && level > __print_level__) {
return;
}
if (tick) {
len = sprintf(_print_buff_p, "[%llu]", os_jiffies_to_msecs(os_jiffies()));
if (__print_ctrl__ & _PRINT_TIME_NTP_) {
gettimeofday(&tv, NULL);
if(tv.tv_sec > 1704038400){
tm_t = localtime((const time_t *)&tv.tv_sec);
len += sprintf(_print_buff_p + len, "[%02d/%02d %02d:%02d:%02d-%03llu]",
tm_t->tm_mon + 1, tm_t->tm_mday, tm_t->tm_hour,
tm_t->tm_min, tm_t->tm_sec, tv.tv_usec / 1000);
}
}
}
ret = vsnprintf(_print_buff_p + len, (PRINT_BUFF_SIZE - 2 - len), fmt, ap);
if (ret < 0 || ret > (PRINT_BUFF_SIZE - 2 - len)) {
len = PRINT_BUFF_SIZE - 1;
_print_buff_p[len - 1] = '\n';
_print_buff_p[len - 2] = '\r';
} else {
len += ret;
}
if (len > 0) {
if (_print_buff_p[len - 1] == '\n' && _print_buff_p[len - 2] != '\r') {
_print_buff_p[len - 1] = '\r';
_print_buff_p[len++] = '\n';
}
_print_buff_p[len] = 0;
hgprintf_out(_print_buff_p, len, level);
}
}
void hgprintf(const char *fmt, ...)
{
va_list ap;
va_start(ap, fmt);
hgvprintf(fmt, ap);
va_end(ap);
}
int hgputs(const char *s)
{
hgprintf("%s", s);
return os_strlen(s) + 1;
}
void dump_hex(char *title, uint8 *data, uint32 len, int32 newline)
{
int i = 0;
if (data && len) {
_os_printf("[dump address: %p]\r\n", data);
if (title) _os_printf("%s", title);
for (i = 0; i < len; i++) {
if (i > 0 && newline) {
if ((i & 0x7) == 0) _os_printf(" ");
if ((i & 0xf) == 0) _os_printf("\r\n");
}
_os_printf("%02x ", data[i] & 0xFF);
}
_os_printf("\r\n");
}
}
void dump_memory(char *title, uint32 *data, uint32 len)
{
int i = 0;
if (data && len) {
if (title) _os_printf("%s", title);
for (i = 0; i < len; i++) {
if ((i & 0x7) == 0) _os_printf("0x%x: ", data+i);
if ((i & 0x7) == 7) _os_printf("\r\n");
_os_printf("%x ", data[i]);
}
_os_printf("\r\n");
}
}
void dump_key(char *str, uint8 *key, uint32 len, uint32 sp)
{
int32 i = 0;
if (key && len) {
if (str) _os_printf("%s", str);
for (i = 0; i < len; i++) {
if (sp) {
_os_printf("%02x ", key[i]);
} else {
_os_printf("%02x", key[i]);
}
}
_os_printf("\r\n");
}
}
// str_buf申请的空间需要比key_len多1bytesprintf会额外在字符串结束添加0
void key_str(uint8 *key, uint32 key_len, char *str_buf)
{
int32 i = 0;
for (i = 0; i < key_len; i++) {
os_sprintf(str_buf + i * 2, "%02x", key[i]);
}
}
void *_os_memcpy(void *str1, const void *str2, int32 n)
{
#ifdef MEM_TRACE
#ifdef PSRAM_HEAP
void *heap = IS_PSRAM_ADDR(str1) ? (void *)(&psram_heap) : (void *)(&sram_heap);
#else
void *heap = &sram_heap;
#endif
int32 ret = sysheap_of_check(heap, str1, n);
if (ret == 0) {
os_printf(KERN_WARNING"%s: memroy %p maybe overflow!!\r\n", __FUNCTION__, str1);
}
#endif
return memcpy(str1, str2, n);
}
char *_os_strcpy(char *dest, const char *src)
{
#ifdef MEM_TRACE
#ifdef PSRAM_HEAP
void *heap = IS_PSRAM_ADDR(dest) ? (void *)(&psram_heap) : (void *)(&sram_heap);
#else
void *heap = &sram_heap;
#endif
int32 n = strlen(src) + 1; // +'\0'
int32 ret = sysheap_of_check(heap, dest, n);
if (ret == 0) {
os_printf(KERN_WARNING"%s: memroy %p maybe overflow!!\r\n", __FUNCTION__, dest);
}
#endif
return strcpy(dest, src);
}
void *_os_memset(void *str, int c, int32 n)
{
#ifdef MEM_TRACE
#ifdef PSRAM_HEAP
void *heap = IS_PSRAM_ADDR(str) ? (void *)(&psram_heap) : (void *)(&sram_heap);
#else
void *heap = &sram_heap;
#endif
int32 ret = sysheap_of_check(heap, str, n);
if (ret == 0) {
os_printf(KERN_WARNING"%s: memroy %p maybe overflow!!\r\n", __FUNCTION__, str);
}
#endif
return memset(str, c, n);
}
void *_os_memmove(void *str1, const void *str2, size_t n)
{
#ifdef MEM_TRACE
#ifdef PSRAM_HEAP
void *heap = IS_PSRAM_ADDR(str1) ? (void *)(&psram_heap) : (void *)(&sram_heap);
#else
void *heap = &sram_heap;
#endif
int32 ret = sysheap_of_check(heap, str1, n);
if (ret == 0) {
os_printf(KERN_WARNING"%s: memroy %p maybe overflow!!\r\n", __FUNCTION__, str1);
}
#endif
return memmove(str1, str2, n);
}
char *_os_strncpy(char *dest, const char *src, int32 n)
{
#ifdef MEM_TRACE
#ifdef PSRAM_HEAP
void *heap = IS_PSRAM_ADDR(dest) ? (void *)(&psram_heap) : (void *)(&sram_heap);
#else
void *heap = &sram_heap;
#endif
int32 ret = sysheap_of_check(heap, dest, n);
if (ret == 0) {
os_printf(KERN_WARNING"%s: memroy %p maybe overflow!!\r\n", __FUNCTION__, dest);
}
#endif
return strncpy(dest, src, n);
}
int _os_sprintf(char *str, const char *format, ...)
{
#ifdef MEM_TRACE
int ret;
#ifdef PSRAM_HEAP
void *heap = IS_PSRAM_ADDR(str) ? (void *)(&psram_heap) : (void *)(&sram_heap);
#else
void *heap = &sram_heap;
#endif
#endif
int len;
va_list ap;
va_start(ap, format);
len = vsprintf(str, format, ap);
va_end(ap);
#ifdef MEM_TRACE
ret = sysheap_of_check(heap, str, len+1);
if (ret == 0) {
os_printf(KERN_WARNING"%s: memroy %p maybe overflow!!\r\n", __FUNCTION__, str);
}
#endif
return len;
}
int _os_vsnprintf(char *s, size_t n, const char *format, va_list arg)
{
#ifdef MEM_TRACE
#ifdef PSRAM_HEAP
void *heap = IS_PSRAM_ADDR(s) ? (void *)(&psram_heap) : (void *)(&sram_heap);
#else
void *heap = &sram_heap;
#endif
#endif
int len = vsnprintf(s, n, format, arg);
#ifdef MEM_TRACE
int check_len = (len < n) ? len + 1 : n;
int ret = sysheap_of_check(heap, s, check_len);
if (ret == 0) {
os_printf(KERN_WARNING"%s: memroy %p maybe overflow!!\r\n", __FUNCTION__, s);
}
#endif
return len;
}
int _os_snprintf(char *str, size_t size, const char *format, ...)
{
#ifdef MEM_TRACE
int ret;
#ifdef PSRAM_HEAP
void *heap = IS_PSRAM_ADDR(str) ? (void *)(&psram_heap) : (void *)(&sram_heap);
#else
void *heap = &sram_heap;
#endif
#endif
int len;
va_list ap;
va_start(ap, format);
len = vsnprintf(str, size, format, ap);
va_end(ap);
#ifdef MEM_TRACE
int check_len = (len < size) ? len + 1 : size;
ret = sysheap_of_check(heap, str, check_len);
if (ret == 0) {
os_printf(KERN_WARNING"%s: memroy %p maybe overflow!!\r\n", __FUNCTION__, str);
}
#endif
return len;
}
int32 os_strtok(char *str, char *separator, char *argv[], int argv_size)
{
int32 cnt = 0;
char *ptr = str;
if (str == NULL || separator == NULL || argv == NULL || argv_size <= 0) {
return 0;
}
argv[cnt++] = ptr;
ptr = os_strstr(ptr, separator);
while (ptr && cnt < argv_size) {
*ptr = 0;
ptr += os_strlen(separator);
if (os_strlen(ptr) == 0) {
break;
}
argv[cnt++] = ptr;
ptr = os_strstr(ptr, separator);
}
return cnt;
}
const char *os_strncasechr(const char *s, char c, int32 n)
{
if (!s) return NULL;
c = LOWCASE(c);
// strcasechr
if (n < 0) {
while (*s) {
if (LOWCASE(*s) == c) {
return s;
}
s++;
}
return NULL;
} else {
for (int32 i = 0; i < n; i++) {
if (s[i] == '\0') break;
if (LOWCASE(s[i]) == c) {
return &s[i];
}
}
return NULL;
}
}
const char *os_strncasestr(const char *str1, const char *str2, int32 n)
{
if (!str1 || !str2) return NULL;
if (str2[0] == '\0') return str1;
int32 len2 = 0;
while (str2[len2]) len2++;
int32 len1 = n;
if (n < 0) {
len1 = 0x7FFFFFFF;
}
if (len2 > len1) return NULL;
const char *p = str1;
while (*p && (p - str1) <= len1 - len2) {
if (LOWCASE(p[0]) == LOWCASE(str2[0])) {
if (os_strncasecmp(p, str2, len2) == 0) {
return p;
}
}
p++;
}
return NULL;
}