diff --git a/components/shell/CMakeLists.txt b/components/shell/CMakeLists.txt index 17860aec..a23cd9b3 100644 --- a/components/shell/CMakeLists.txt +++ b/components/shell/CMakeLists.txt @@ -1,3 +1,7 @@ sdk_generate_library() sdk_library_add_sources(shell.c) -sdk_add_include_directories(.) \ No newline at end of file +sdk_add_include_directories(.) + +if(CONFIG_FREERTOS) +sdk_library_add_sources(shell_freertos.c) +endif() \ No newline at end of file diff --git a/components/shell/shell.c b/components/shell/shell.c index 007f5b63..7b911618 100644 --- a/components/shell/shell.c +++ b/components/shell/shell.c @@ -1,27 +1,24 @@ -/** - * @file shell.c - * @brief +/* + * Copyright (c) 2006-2021, RT-Thread Development Team * - * Copyright (c) 2021 Bouffalolab team - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. The - * ASF licenses this file to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the - * License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. + * SPDX-License-Identifier: Apache-2.0 * + * Change Logs: + * Date Author Notes + * 2006-04-30 Bernard the first version for FinSH + * 2006-05-08 Bernard change finsh thread stack to 2048 + * 2006-06-03 Bernard add support for skyeye + * 2006-09-24 Bernard remove the code related with hardware + * 2010-01-18 Bernard fix down then up key bug. + * 2010-03-19 Bernard fix backspace issue and fix device read in shell. + * 2010-04-01 Bernard add prompt output when start and remove the empty history + * 2011-02-23 Bernard fix variable section end issue of finsh shell + * initialization when use GNU GCC compiler. + * 2016-11-26 armink add password authentication + * 2018-07-02 aozima add custom prompt support. */ + #include "shell.h" -#include #if defined(SHELL_USING_FS) #include "ff.h" #endif diff --git a/components/shell/shell.h b/components/shell/shell.h index fe140325..f0df04d7 100644 --- a/components/shell/shell.h +++ b/components/shell/shell.h @@ -1,24 +1,11 @@ -/** - * @file shell.h - * @brief +/* + * Copyright (c) 2006-2021, RT-Thread Development Team * - * Copyright (c) 2021 Bouffalolab team - * - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. The - * ASF licenses this file to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance with the - * License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT - * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the - * License for the specific language governing permissions and limitations - * under the License. + * SPDX-License-Identifier: Apache-2.0 * + * Change Logs: + * Date Author Notes + * 2011-06-02 Bernard Add finsh_get_prompt function declaration */ #ifndef __SHELL_H__ #define __SHELL_H__ diff --git a/components/shell/shell_config.h b/components/shell/shell_config.h index b90536d2..090aefc7 100644 --- a/components/shell/shell_config.h +++ b/components/shell/shell_config.h @@ -28,4 +28,12 @@ //#define SHELL_USING_FS //#define SHELL_USING_COLOR +#ifndef SHELL_THREAD_STACK_SIZE +#define SHELL_THREAD_STACK_SIZE 1024 +#endif + +#ifndef SHELL_THREAD_PRIO +#define SHELL_THREAD_PRIO 5 +#endif + #endif \ No newline at end of file diff --git a/components/shell/shell_freertos.c b/components/shell/shell_freertos.c new file mode 100644 index 00000000..3d457bc1 --- /dev/null +++ b/components/shell/shell_freertos.c @@ -0,0 +1,71 @@ +#include "shell.h" +#include +#include "semphr.h" +#include "ring_buffer.h" +#include "bflb_uart.h" + +static TaskHandle_t shell_handle; +SemaphoreHandle_t sem_shell = NULL; + +Ring_Buffer_Type shell_rb; + +uint8_t shell_buffer[512]; + +void shell_release_sem(void) +{ + BaseType_t xHigherPriorityTaskWoken = pdFALSE; + + int ret = xSemaphoreGiveFromISR(sem_shell, &xHigherPriorityTaskWoken); + if (ret == pdPASS) { + portYIELD_FROM_ISR(xHigherPriorityTaskWoken); + } +} + +static struct bflb_device_s *uart_shell; + +void uart_shell_isr(int irq, void *arg) +{ + uint32_t intstatus = bflb_uart_get_intstatus(uart_shell); + if (intstatus & UART_INTSTS_RX_FIFO) { + while (bflb_uart_rxavailable(uart_shell)) { + Ring_Buffer_Write_Byte(&shell_rb, bflb_uart_getchar(uart_shell)); + } + shell_release_sem(); + } + if (intstatus & UART_INTSTS_RTO) { + while (bflb_uart_rxavailable(uart_shell)) { + Ring_Buffer_Write_Byte(&shell_rb, bflb_uart_getchar(uart_shell)); + } + shell_release_sem(); + bflb_uart_int_clear(uart_shell, UART_INTCLR_RTO); + } +} + +static void shell_task(void *pvParameters) +{ + uint8_t data; + uint32_t len; + while (1) { + if (xSemaphoreTake(sem_shell, portMAX_DELAY) == pdTRUE) { + len = Ring_Buffer_Get_Length(&shell_rb); + for (uint32_t i = 0; i < len; i++) { + Ring_Buffer_Read_Byte(&shell_rb, &data); + shell_handler(data); + } + } + } +} + +void shell_init_with_task(struct bflb_device_s *shell) +{ + uart_shell = shell; + bflb_uart_rxint_mask(uart_shell, false); + bflb_irq_attach(uart_shell->irq_num, uart_shell_isr, NULL); + bflb_irq_enable(uart_shell->irq_num); + + Ring_Buffer_Init(&shell_rb, shell_buffer, sizeof(shell_buffer), NULL, NULL); + + shell_init(); + vSemaphoreCreateBinary(sem_shell); + xTaskCreate(shell_task, (char *)"shell_task", SHELL_THREAD_STACK_SIZE, NULL, SHELL_THREAD_PRIO, &shell_handle); +} \ No newline at end of file diff --git a/examples/shell/CMakeLists.txt b/examples/shell/shell_no_os/CMakeLists.txt similarity index 87% rename from examples/shell/CMakeLists.txt rename to examples/shell/shell_no_os/CMakeLists.txt index c3159783..b4760fe2 100644 --- a/examples/shell/CMakeLists.txt +++ b/examples/shell/shell_no_os/CMakeLists.txt @@ -6,4 +6,4 @@ find_package(bouffalo_sdk REQUIRED HINTS $ENV{BL_SDK_BASE}) sdk_set_main_file(main.c) -project(shell) +project(shell_no_os) diff --git a/examples/shell/Makefile b/examples/shell/shell_no_os/Makefile similarity index 83% rename from examples/shell/Makefile rename to examples/shell/shell_no_os/Makefile index 34b2f3fa..9b01b7fe 100644 --- a/examples/shell/Makefile +++ b/examples/shell/shell_no_os/Makefile @@ -1,5 +1,5 @@ SDK_DEMO_PATH ?= . -BL_SDK_BASE ?= $(SDK_DEMO_PATH)/../.. +BL_SDK_BASE ?= $(SDK_DEMO_PATH)/../../.. export BL_SDK_BASE diff --git a/examples/shell/main.c b/examples/shell/shell_no_os/main.c similarity index 86% rename from examples/shell/main.c rename to examples/shell/shell_no_os/main.c index 7c75c637..045d323b 100644 --- a/examples/shell/main.c +++ b/examples/shell/shell_no_os/main.c @@ -1,8 +1,7 @@ #include "bflb_mtimer.h" #include "bflb_uart.h" #include "shell.h" - -extern void board_init(void); +#include "board.h" static struct bflb_device_s *uart0; @@ -24,6 +23,7 @@ void uart_isr(int irq, void *arg) int main(void) { + int ch; board_init(); uart0 = bflb_device_get_by_name("uart0"); bflb_uart_rxint_mask(uart0, false); @@ -31,5 +31,9 @@ int main(void) bflb_irq_enable(uart0->irq_num); shell_init(); while (1) { + if((ch = bflb_uart_getchar(uart0)) != -1) + { + shell_handler(ch); + } } } diff --git a/examples/shell/proj.conf b/examples/shell/shell_no_os/proj.conf similarity index 100% rename from examples/shell/proj.conf rename to examples/shell/shell_no_os/proj.conf diff --git a/examples/shell/shell_os/CMakeLists.txt b/examples/shell/shell_os/CMakeLists.txt new file mode 100644 index 00000000..bb931591 --- /dev/null +++ b/examples/shell/shell_os/CMakeLists.txt @@ -0,0 +1,11 @@ +cmake_minimum_required(VERSION 3.15) + +include(proj.conf) + +find_package(bouffalo_sdk REQUIRED HINTS $ENV{BL_SDK_BASE}) + +sdk_add_include_directories(.) + +sdk_set_main_file(main.c) + +project(shell_os) diff --git a/examples/shell/shell_os/FreeRTOSConfig.h b/examples/shell/shell_os/FreeRTOSConfig.h new file mode 100644 index 00000000..6b521a6a --- /dev/null +++ b/examples/shell/shell_os/FreeRTOSConfig.h @@ -0,0 +1,127 @@ +/* + * FreeRTOS Kernel V10.2.1 + * Copyright (C) 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of + * the Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER + * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN + * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + * http://www.FreeRTOS.org + * http://aws.amazon.com/freertos + * + * 1 tab == 4 spaces! + */ + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ +#include "stdio.h" + +#ifdef BL702 +#define configMTIME_BASE_ADDRESS (0x02000000UL + 0xBFF8UL) +#define configMTIMECMP_BASE_ADDRESS (0x02000000UL + 0x4000UL) +#else +#define configMTIME_BASE_ADDRESS (0xE0000000UL + 0xBFF8UL) +#define configMTIMECMP_BASE_ADDRESS (0xE0000000UL + 0x4000UL) +#endif + +// #define configSUPPORT_STATIC_ALLOCATION 1 +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 0 +#define configUSE_TICK_HOOK 0 +#define configCPU_CLOCK_HZ ((uint32_t)(1 * 1000 * 1000)) +#define configTICK_RATE_HZ ((TickType_t)1000) +#define configMAX_PRIORITIES (7) +#define configMINIMAL_STACK_SIZE ((unsigned short)128) /* Only needs to be this high as some demo tasks also use this constant. In production only the idle task would use this. */ +#define configTOTAL_HEAP_SIZE ((size_t)12 * 1024) +#define configMAX_TASK_NAME_LEN (16) +#define configUSE_TRACE_FACILITY 1 +#define configUSE_STATS_FORMATTING_FUNCTIONS 1 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_MUTEXES 1 +#define configQUEUE_REGISTRY_SIZE 8 +#define configCHECK_FOR_STACK_OVERFLOW 2 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configUSE_MALLOC_FAILED_HOOK 1 +#define configUSE_APPLICATION_TASK_TAG 0 +#define configUSE_COUNTING_SEMAPHORES 1 +#define configGENERATE_RUN_TIME_STATS 0 +#define configUSE_PORT_OPTIMISED_TASK_SELECTION 1 +#define configUSE_TICKLESS_IDLE 0 + +/* Co-routine definitions. */ +#define configUSE_CO_ROUTINES 0 +#define configMAX_CO_ROUTINE_PRIORITIES (2) + +/* Software timer definitions. */ +#define configUSE_TIMERS 1 +#define configTIMER_TASK_PRIORITY (configMAX_PRIORITIES - 1) +#define configTIMER_QUEUE_LENGTH 4 +#define configTIMER_TASK_STACK_DEPTH (configMINIMAL_STACK_SIZE) + +/* Task priorities. Allow these to be overridden. */ +#ifndef uartPRIMARY_PRIORITY +#define uartPRIMARY_PRIORITY (configMAX_PRIORITIES - 3) +#endif + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 1 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_eTaskGetState 1 +#define INCLUDE_xTimerPendFunctionCall 1 +#define INCLUDE_xTaskAbortDelay 1 +#define INCLUDE_xTaskGetHandle 1 +#define INCLUDE_xSemaphoreGetMutexHolder 1 + +/* Normal assert() semantics without relying on the provision of an assert.h +header file. */ +void vApplicationMallocFailedHook(void); +void vAssertCalled(void); +#define configASSERT(x) \ + if ((x) == 0) { \ + printf("file [%s]\r\n", __FILE__); \ + printf("func [%s]\r\n", __FUNCTION__); \ + printf("line [%d]\r\n", __LINE__); \ + printf("%s\r\n", (const char *)(#x)); \ + vAssertCalled(); \ + } + +#if (configUSE_TICKLESS_IDLE != 0) +void vApplicationSleep(uint32_t xExpectedIdleTime); +#define portSUPPRESS_TICKS_AND_SLEEP(xExpectedIdleTime) vApplicationSleep(xExpectedIdleTime) +#endif + +// #define portUSING_MPU_WRAPPERS + +#endif /* FREERTOS_CONFIG_H */ diff --git a/examples/shell/shell_os/Makefile b/examples/shell/shell_os/Makefile new file mode 100644 index 00000000..9b01b7fe --- /dev/null +++ b/examples/shell/shell_os/Makefile @@ -0,0 +1,13 @@ +SDK_DEMO_PATH ?= . +BL_SDK_BASE ?= $(SDK_DEMO_PATH)/../../.. + +export BL_SDK_BASE + +CHIP ?= bl616 +BOARD ?= bl616dk +CROSS_COMPILE ?= riscv64-unknown-elf- + +# add custom cmake definition +#cmake_definition+=-Dxxx=sss + +include $(BL_SDK_BASE)/project.build diff --git a/examples/shell/shell_os/main.c b/examples/shell/shell_os/main.c new file mode 100644 index 00000000..87584bc8 --- /dev/null +++ b/examples/shell/shell_os/main.c @@ -0,0 +1,35 @@ +#include "bflb_mtimer.h" +#include "bflb_uart.h" +#include "shell.h" +#include +#include "semphr.h" +#include "board.h" + +static uint8_t freertos_heap[configTOTAL_HEAP_SIZE]; + +static HeapRegion_t xHeapRegions[] = { + { (uint8_t *)freertos_heap, 0 }, + { NULL, 0 }, /* Terminates the array. */ + { NULL, 0 } /* Terminates the array. */ +}; + +static struct bflb_device_s *uart0; + +extern void shell_init_with_task(struct bflb_device_s *shell); + +int main(void) +{ + board_init(); + xHeapRegions[0].xSizeInBytes = configTOTAL_HEAP_SIZE; + vPortDefineHeapRegions(xHeapRegions); + + configASSERT((configMAX_PRIORITIES > 4)); + + uart0 = bflb_device_get_by_name("uart0"); + shell_init_with_task(uart0); + + vTaskStartScheduler(); + + while (1) { + } +} diff --git a/examples/shell/shell_os/proj.conf b/examples/shell/shell_os/proj.conf new file mode 100644 index 00000000..9aa717c8 --- /dev/null +++ b/examples/shell/shell_os/proj.conf @@ -0,0 +1,4 @@ +set(CONFIG_VLIBC 0) +set(CONFIG_BFLOG 0) +set(CONFIG_FREERTOS 1) +set(CONFIG_SHELL 1) \ No newline at end of file