Initial commit: CCU621_M firmware project with BLE debug link support.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-07-08 17:28:36 +08:00
commit 9ceb218f80
1597 changed files with 724159 additions and 0 deletions
+48
View File
@@ -0,0 +1,48 @@
/**
* @file app_myshell.c
* @brief 扩展 Shell 命令(与 CCU601E_D\BSP\letter_shell\app_myshell.c 对齐的串口打印开关等)
*/
#include "publicdata/public_define.h"
#if (MY_SHELL_EN)
#include "letter_shell/shell_port.h"
#include "usart.h"
#include "shell.h"
#include "publicdata/publicdata.h"
/* slot 0~6 对应:USART0, USART2, UART3, UART4, USART5, UART6, UART7(与 u16_usart_* 的 E_USART_ID 一致) */
static const uint8_t s_usart_slot_hw_num[USART_NUM_PRINT_CNT] = { 0U, 2U, 3U, 4U, 5U, 6U, 7U };
void usart_printf_Func(int id, int on)
{
if ((id < 0) || (id >= (int)USART_NUM_PRINT_CNT)) {
v_shell_print("usart_printf: id must be 0~6 (0=USART0,1=USART2,2=UART3,...)\r\n");
return;
}
if ((on < 0) || (on > 1)) {
v_shell_print("usart_printf: on must be 0 or 1\r\n");
return;
}
u8_uasrt_print[(uint8_t)id] = (U8_T)on;
v_shell_print("usart slot[%d] hw=USART%u print=%d\r\n", id, (unsigned int)s_usart_slot_hw_num[(uint8_t)id], on);
v_shell_print("flags [%d][%d][%d][%d] [%d][%d][%d]\r\n",
(int)u8_uasrt_print[0], (int)u8_uasrt_print[1], (int)u8_uasrt_print[2], (int)u8_uasrt_print[3],
(int)u8_uasrt_print[4], (int)u8_uasrt_print[5], (int)u8_uasrt_print[6]);
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0) | SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC),
usart_printf,
usart_printf_Func,
shell-- usart_printf slot(0-6) on(0/1) dump u16 send/recv);
// 命令
static void v_reboot_func(void)
{
v_shell_print("Execute system reboot command\r\n");
v_sys_reboot();
}
SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC), reboot, v_reboot_func, myshlle-- reboot sys);
#endif /* MY_SHELL_EN */
+179
View File
@@ -0,0 +1,179 @@
/**
* @file shell_cfg_user.h
* @author Letter (nevermindzzt@gmail.com)
* @brief shell config
* @version 3.0.0
* @date 2019-12-31
*
* @copyright (c) 2019 Letter
*
*/
#ifndef __SHELL_CFG_USER_H__
#define __SHELL_CFG_USER_H__
#include "main.h"
#include "FreeRTOS.h"
#include "task.h"
/**
* @brief 是否使用默认shell任务while循环,使能宏`SHELL_USING_TASK`后此宏有意义
* 使能此宏,则`shellTask()`函数会一直循环读取输入,一般使用操作系统建立shell
* 任务时使能此宏,关闭此宏的情况下,一般适用于无操作系统,在主循环中调用`shellTask()`
*/
#define SHELL_TASK_WHILE 1
/**
* @brief 是否使用命令导出方式
* 使能此宏后,可以使用`SHELL_EXPORT_CMD()`等导出命令
* 定义shell命令,关闭此宏的情况下,需要使用命令表的方式
*/
#define SHELL_USING_CMD_EXPORT 1
/**
* @brief 是否使用shell伴生对象
* 一些扩展的组件(文件系统支持,日志工具等)需要使用伴生对象
*/
#define SHELL_USING_COMPANION 0
/**
* @brief 支持shell尾行模式
*/
#define SHELL_SUPPORT_END_LINE 1
/**
* @brief 是否在输出命令列表中列出用户
*/
#define SHELL_HELP_LIST_USER 0
/**
* @brief 是否在输出命令列表中列出变量
*/
#define SHELL_HELP_LIST_VAR 0
/**
* @brief 是否在输出命令列表中列出按键
*/
#define SHELL_HELP_LIST_KEY 0
/**
* @brief 是否在输出命令列表中展示命令权限
*/
#define SHELL_HELP_SHOW_PERMISSION 1
/**
* @brief 使用LF作为命令行回车触发
* 可以和SHELL_ENTER_CR同时开启
*/
#define SHELL_ENTER_LF 0
/**
* @brief 使用CR作为命令行回车触发
* 可以和SHELL_ENTER_LF同时开启
*/
#define SHELL_ENTER_CR 1
/**
* @brief 使用CRLF作为命令行回车触发
* 不可以和SHELL_ENTER_LF或SHELL_ENTER_CR同时开启
*/
#define SHELL_ENTER_CRLF 0
/**
* @brief 使用执行未导出函数的功能
* 启用后,可以通过`exec [addr] [args]`直接执行对应地址的函数
* @attention 如果地址错误,可能会直接引起程序崩溃
*/
#define SHELL_EXEC_UNDEF_FUNC 0
/**
* @brief shell命令参数最大数量
* 包含命令名在内,超过16个参数并且使用了参数自动转换的情况下,需要修改源码
*/
#define SHELL_PARAMETER_MAX_NUMBER 4
/**
* @brief 历史命令记录数量
*/
#define SHELL_HISTORY_MAX_NUMBER 5
/**
* @brief 双击间隔(ms)
* 使能宏`SHELL_LONG_HELP`后此宏生效,定义双击tab补全help的时间间隔
*/
#define SHELL_DOUBLE_CLICK_TIME 200
/**
* @brief 管理的最大shell数量 --允许最多 2 个 Shell 实例
*/
#define SHELL_MAX_NUMBER 1
/**
* @brief shell格式化输出的缓冲大小
* 为0时不使用shell格式化输出
*/
#define SHELL_PRINT_BUFFER 128
/**
* @brief shell格式化输入的缓冲大小
* 为0时不使用shell格式化输入
* @note shell格式化输入会阻塞shellTask, 仅适用于在有操作系统的情况下使用
*/
#define SHELL_SCAN_BUFFER 0
/**
* @brief 获取系统时间(ms)
* 定义此宏为获取系统Tick,如`HAL_GetTick()`
* @note 此宏不定义时无法使用双击tab补全命令help,无法使用shell超时锁定
*/
#define SHELL_GET_TICK() ((uint32_t)(xTaskGetTickCount() * portTICK_PERIOD_MS))
/**
* @brief 使用锁
* @note 使用shell锁时,需要对加锁和解锁进行实现
*/
#define SHELL_USING_LOCK 1
/**
* @brief shell内存分配
* shell本身不需要此接口,若使用shell伴生对象,需要进行定义
*/
#define SHELL_MALLOC(size) 0
/**
* @brief shell内存释放
* shell本身不需要此接口,若使用shell伴生对象,需要进行定义
*/
#define SHELL_FREE(obj) 0
/**
* @brief 是否显示shell信息
*/
#define SHELL_SHOW_INFO 1
/**
* @brief 是否在登录后清除命令行
*/
#define SHELL_CLS_WHEN_LOGIN 1
/**
* @brief shell默认用户
*/
#define SHELL_DEFAULT_USER "jiankalka"
/**
* @brief shell默认用户密码
* 若默认用户不需要密码,设为""
*/
#define SHELL_DEFAULT_USER_PASSWORD ""//"ieszt1234"
/**
* @brief shell自动锁定超时
* shell当前用户密码有效的时候生效,超时后会自动重新锁定shell
* 设置为0时关闭自动锁定功能,时间单位为`SHELL_GET_TICK()`单位
* @note 使用超时锁定必须保证`SHELL_GET_TICK()`有效
*/
#define SHELL_LOCK_TIMEOUT 0 * 60 * 1000
#endif
+184
View File
@@ -0,0 +1,184 @@
/**
* @file shell_port.c
* @author Letter (NevermindZZT@gmail.com)
* @brief
* @version 0.1
* @date 2019-02-22
*
* @copyright (c) 2019 Letter
*
*/
#include "publicdata/public_define.h"
#if (MY_SHELL_EN)
#include "shell.h"
#include <stdarg.h>
#include <stdio.h>
#include "FreeRTOS.h"
#include "semphr.h"
#include "task.h"
#include "usart.h"
#include "wdt_task/wdt_task.h"
#include "app_init/app_init.h"
Shell shell;
char shellBuffer[512];
#define SHELL_USART_ID ((E_USART_ID)DEBUG_SHELL_USART_ID)
static SemaphoreHandle_t shellMutex;
/**
* @brief 用户shell写
*
* @param data 数据
* @param len 数据长度
*
* @return short 实际写入的数据长度
*/
short userShellWrite(char *data, unsigned short len)
{
if ((uint8_t)DEBUG_SHELL_USART_ID == (uint8_t)DEBUG_SHELL_USART_NULL) {
return 0;
}
u16_usart_send(SHELL_USART_ID,(uint8_t *)data,len);
return len;
}
/**
* @brief 用户shell读
*
* @param data 数据
* @param len 数据长度
*
* @return short 实际读取到
*/
short userShellRead(char *data, unsigned short len)
{
short recv_len;
if ((uint8_t)DEBUG_SHELL_USART_ID == (uint8_t)DEBUG_SHELL_USART_NULL) {
return 0;
}
recv_len = u16_usart_recv(SHELL_USART_ID,(uint8_t *)data,len);
return recv_len;
}
/**
* @brief 用户shell上锁
*
* @param shell shell
*
* @return int 0
*/
int userShellLock(Shell *shell)
{
(void)shell;
if (shellMutex != NULL) {
(void)xSemaphoreTakeRecursive(shellMutex, portMAX_DELAY);
}
return 0;
}
/**
* @brief 用户shell解锁
*
* @param shell shell
*
* @return int 0
*/
int userShellUnlock(Shell *shell)
{
(void)shell;
if (shellMutex != NULL) {
(void)xSemaphoreGiveRecursive(shellMutex);
}
return 0;
}
/**
* @brief 用户shell初始化
*
*/
void userShellInit(void)
{
if ((uint8_t)DEBUG_SHELL_USART_ID == (uint8_t)DEBUG_SHELL_USART_NULL) {
return;
}
shellMutex = xSemaphoreCreateRecursiveMutex();
shell.write = userShellWrite;
shell.read = userShellRead;
shell.lock = userShellLock;
shell.unlock = userShellUnlock;
shellInit(&shell, shellBuffer, 512);
}
//CEVENT_EXPORT(EVENT_INIT_STAGE2, userShellInit);
void v_myshell_task(void *argument)
{
for (;;) {
v_wdt_setFlag(TASK_ID_MyShell);
shellTask(argument);
/* shellTask 内部有 while(1) + vTaskDelay(10ms)
* 正常情况下不会执行到这里;若返回则重新进入 */
mSleep(10U);
}
}
#else /* MY_SHELL_EN */
/* 关闭 Shell 时,该文件不产生任何可执行代码 */
#endif /* MY_SHELL_EN */
/************************************************************************************* */
#if (MY_SHELL_EN)
unsigned short shell_send_String(const char *string)
{
unsigned short count = 0;
const char *p = string;
SHELL_ASSERT(shell.write, return 0);
while(*p++)
{
count ++;
}
return shell.write((char *)string, count);
}
#define SHELL_PRINT_BUFFER_SIZE 256 // 可调整缓冲区大小
// 类似printf的格式化输出函数
void v_shell_print(const char *format, ...)
{
va_list args;
char buffer[SHELL_PRINT_BUFFER_SIZE];
int len;
// 1. 处理可变参数
va_start(args, format);
// 2. 安全格式化字符串
len = vsnprintf(buffer, sizeof(buffer), format, args);
va_end(args);
// 3. 校验长度有效性
if(len <= 0) return; // 格式化失败
if(len >= (int)sizeof(buffer)) {
// 截断到最大长度
buffer[sizeof(buffer) - 1] = '\0';
len = sizeof(buffer) - 1;
}
// 4. 发送数据到串口
if(len > 0) {
if ((uint8_t)DEBUG_SHELL_USART_ID == (uint8_t)DEBUG_SHELL_USART_NULL) {
return;
}
u16_usart_send(SHELL_USART_ID, (uint8_t *)buffer, (uint16_t)len);
}
}
#endif /* MY_SHELL_EN */
+33
View File
@@ -0,0 +1,33 @@
/**
* @file shell_port.h
* @author Letter (NevermindZZT@gmail.com)
* @brief
* @version 0.1
* @date 2019-02-22
*
* @copyright (c) 2019 Letter
*
*/
#ifndef __SHELL_PORT_H__
#define __SHELL_PORT_H__
#include "publicdata/public_define.h"
#if (MY_SHELL_EN)
#include "shell.h"
#endif
/* MY_SHELL_EN=0 时提供空桩,避免链接进 shell 代码 */
#if (MY_SHELL_EN)
extern Shell shell;
void userShellInit(void);
void v_myshell_task(void *argument);
#else
static inline void userShellInit(void) {}
static inline void v_myshell_task(void *argument) { (void)argument; }
#endif
unsigned short shell_send_String(const char *string);
void v_shell_print(const char *format, ...);
#endif