diff --git a/bsp/allwinner/d1/.config b/bsp/allwinner/d1/.config index 583ce6d70fad..19b503d5eb83 100644 --- a/bsp/allwinner/d1/.config +++ b/bsp/allwinner/d1/.config @@ -191,7 +191,7 @@ CONFIG_RT_USING_DEVICE_OPS=y # CONFIG_RT_USING_THREADSAFE_PRINTF is not set CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=256 -CONFIG_RT_CONSOLE_DEVICE_NAME="uart" +CONFIG_RT_CONSOLE_DEVICE_NAME="uart0" CONFIG_RT_USING_CONSOLE_OUTPUT_CTL=y CONFIG_RT_VER_NUM=0x50300 CONFIG_RT_USING_STDC_ATOMIC=y @@ -201,7 +201,7 @@ CONFIG_RT_BACKTRACE_LEVEL_MAX_NR=32 CONFIG_ARCH_CPU_64BIT=y CONFIG_RT_USING_CACHE=y CONFIG_ARCH_MM_MMU=y -CONFIG_KERNEL_VADDR_START=0x150000000 +CONFIG_KERNEL_VADDR_START=0x45000000 CONFIG_ARCH_RISCV=y CONFIG_ARCH_RISCV_FPU=y CONFIG_ARCH_RISCV_FPU_D=y @@ -290,12 +290,7 @@ CONFIG_RT_PAGECACHE_GC_STOP_LEVEL=70 # end of page cache config # end of DFS: device virtual file system -CONFIG_RT_USING_FAL=y -CONFIG_FAL_USING_DEBUG=y -CONFIG_FAL_PART_HAS_TABLE_CFG=y -# CONFIG_FAL_USING_SFUD_PORT is not set -CONFIG_FAL_DEV_NAME_MAX=24 -CONFIG_FAL_DEV_BLK_MAX=6 +# CONFIG_RT_USING_FAL is not set # # Device Drivers @@ -308,10 +303,11 @@ CONFIG_RT_USING_SYSTEM_WORKQUEUE=y CONFIG_RT_SYSTEM_WORKQUEUE_STACKSIZE=8192 CONFIG_RT_SYSTEM_WORKQUEUE_PRIORITY=23 CONFIG_RT_USING_SERIAL=y -CONFIG_RT_USING_SERIAL_V1=y -# CONFIG_RT_USING_SERIAL_V2 is not set -CONFIG_RT_SERIAL_USING_DMA=y -CONFIG_RT_SERIAL_RB_BUFSZ=64 +# CONFIG_RT_USING_SERIAL_V1 is not set +CONFIG_RT_USING_SERIAL_V2=y +# CONFIG_RT_SERIAL_BUF_STRATEGY_DROP is not set +CONFIG_RT_SERIAL_BUF_STRATEGY_OVERWRITE=y +# CONFIG_RT_SERIAL_USING_DMA is not set CONFIG_RT_USING_SERIAL_BYPASS=y # CONFIG_RT_USING_CAN is not set CONFIG_RT_USING_CLOCK_TIME=y @@ -1641,6 +1637,7 @@ CONFIG_BOARD_allwinnerd1=y CONFIG_ENABLE_FPU=y # CONFIG_RT_USING_USERSPACE_32BIT_LIMIT is not set CONFIG___STACKSIZE__=16384 +CONFIG_BSP_UART_DEFAULT_BAUDRATE=115200 # # General Drivers Configuration @@ -1728,7 +1725,16 @@ CONFIG_DRIVERS_GPIO=y # # SDMMC Devices # -# CONFIG_DRIVERS_SDMMC is not set +CONFIG_DRIVERS_SDMMC=y +CONFIG_USE_SD=y +CONFIG_USE_SDIO=y +# CONFIG_USE_MMC is not set +CONFIG_DETECT_CARD=y +CONFIG_SDC_DMA_USED=y +CONFIG_SDIO_IRQ_SUPPORT=y +# CONFIG_SD_TEST is not set +CONFIG_SDC_DMA_BUF_SIZE=64 +CONFIG_DRIVERS_SDC_CDPIN_PRESENT_VAL=0 # end of SDMMC Devices # diff --git a/bsp/allwinner/d1/Kconfig b/bsp/allwinner/d1/Kconfig index 4e6fdea26c25..756d469090fd 100644 --- a/bsp/allwinner/d1/Kconfig +++ b/bsp/allwinner/d1/Kconfig @@ -31,5 +31,9 @@ config __STACKSIZE__ int "stack size for interrupt" default 4096 +config BSP_UART_DEFAULT_BAUDRATE + int "Default UART baud rate" + default 115200 + rsource "../libraries/drivers/Kconfig" rsource "../libraries/Kconfig" diff --git a/bsp/allwinner/d1/README.md b/bsp/allwinner/d1/README.md index afd01088dd88..42b672e17703 100644 --- a/bsp/allwinner/d1/README.md +++ b/bsp/allwinner/d1/README.md @@ -1,8 +1,18 @@ # RT-Thread全志D1移植 -全志 d1-allwinner-nezha 属于 riscv64 平台 +全志 D1 是采用玄铁 C906 RV64 处理器的 RISC-V SoC。本 BSP 已在 +Sipeed Lichee RV 86 Panel 类 D1 硬件上验证 RT-Smart 启动和交互式 +`msh />` shell。 -## 编译环境搭建 +## 硬件配置 + +- SoC:Allwinner D1 +- CPU:T-Head/XuanTie C906 RV64 +- 验证板卡:Sipeed Lichee RV 86 Panel 类 D1 板卡 +- 控制台:UART0,115200 8N1 +- 内核加载地址:`0x45000000` + +## 编译环境 - 拉取 RT-Thread Smart的代码仓库 `git clone https://gitee.com/guozhanxin/rtthread-smart.git` @@ -36,10 +46,19 @@ ## 开发与编译 -- windows 下使用RT-Thread ENV 工具, `menuconfig` 配置工程,`scons` 编译工程 +- windows 下使用 RT-Thread ENV 工具,`menuconfig` 配置工程,`scons` 编译工程 -- ubuntu 下 使用shell 终端: `scons --menuconfig` 配置工程, `scons` 编译工程 +- Linux 下进入本 BSP 目录,设置包含 + `riscv64-unknown-linux-musl-` 工具链的目录后编译: + +```sh +cd bsp/allwinner/d1 +RTT_EXEC_PATH=/path/to/riscv64-musl-toolchain/bin scons -j +sh generateimg.sh +``` +生成的 `rtthread.img` 是加载地址和入口地址均为 `0x45000000` 的 +U-Boot legacy kernel image。 ## 下载验证 diff --git a/bsp/allwinner/d1/applications/mnt.c b/bsp/allwinner/d1/applications/mnt.c index 6730896ff327..09302bef15af 100644 --- a/bsp/allwinner/d1/applications/mnt.c +++ b/bsp/allwinner/d1/applications/mnt.c @@ -6,16 +6,14 @@ int mnt_init(void) { - - rt_thread_mdelay(200); - - if (dfs_mount("boot", "/", "elm", 0, 0) != 0) + if (dfs_mount(RT_NULL, "/", "rom", 0, &romfs_root) != 0) { - rt_kprintf("Dir /boot mount failed!\n"); + rt_kprintf("Mount ROMFS on \"/\" failed!\n"); + return -RT_ERROR; } - rt_kprintf("file system initialization done!\n"); - return 0; + rt_kprintf("Mount ROMFS on \"/\" success.\n"); + return RT_EOK; } INIT_ENV_EXPORT(mnt_init); #endif diff --git a/bsp/allwinner/d1/board/board.c b/bsp/allwinner/d1/board/board.c index f60390efeb01..53b40cbe472b 100644 --- a/bsp/allwinner/d1/board/board.c +++ b/bsp/allwinner/d1/board/board.c @@ -13,6 +13,7 @@ #include #include "board.h" +#include "mm_aspace.h" #include "tick.h" #include "drv_uart.h" @@ -41,11 +42,39 @@ }; //内核页表 - volatile rt_size_t MMUTable[__SIZE(VPN2_BIT)] __attribute__((aligned(4 * 1024))); - rt_mmu_info mmu_info; + extern volatile rt_size_t MMUTable[__SIZE(VPN2_BIT)] __attribute__((aligned(4 * 1024))); + + struct mem_desc platform_mem_desc[] = + { + {KERNEL_VADDR_START, + KERNEL_VADDR_START + 0x8000000 - 1, + (rt_size_t)ARCH_MAP_FAILED, + NORMAL_MEM}, + {0x1000, + 0x3ffff000 - 1, + (rt_size_t)ARCH_MAP_FAILED, + DEVICE_MEM}, + }; + +#define NUM_MEM_DESC (sizeof(platform_mem_desc) / sizeof(platform_mem_desc[0])) #endif +#define D1_RISCV_WDT_MODE ((volatile rt_uint32_t *)0x06011018UL) +#define D1_RISCV_WDT_KEY 0x16aa0000U + +static void d1_disable_inherited_watchdog(void) +{ + /* Some bootloaders leave the RISC-V subsystem watchdog running. */ + *D1_RISCV_WDT_MODE = D1_RISCV_WDT_KEY; + rt_hw_dsb(); +} + +rt_uint64_t rt_hw_get_clock_timer_freq(void) +{ + return 24000000ULL; +} + //初始化BSS节区 void init_bss(void) { @@ -67,8 +96,6 @@ static void __rt_assert_handler(const char *ex_string, const char *func, rt_size //BSP的C入口 void primary_cpu_entry(void) { - //初始化BSS - init_bss(); //关中断 rt_hw_interrupt_disable(); rt_assert_set_hook(__rt_assert_handler); @@ -76,30 +103,31 @@ void primary_cpu_entry(void) entry(); } +#define IOREMAP_SIZE (1ul << 30) //这个初始化程序由内核主动调用,此时调度器还未启动,因此在此不能使用依赖线程上下文的函数 void rt_hw_board_init(void) { #ifdef RT_USING_SMART + rt_hw_mmu_map_init(&rt_kernel_space, + (void *)(USER_VADDR_START - IOREMAP_SIZE), + IOREMAP_SIZE, + (rt_size_t *)MMUTable, + 0); rt_page_init(init_page_region); - rt_hw_mmu_map_init(&mmu_info,(void *)USER_VADDR_START, USER_VADDR_TOP - USER_VADDR_START, (rt_size_t *)MMUTable, 0); - //将低1GB MMIO区域设置为无Cache与Strong Order访存模式 - MMUTable[0] &= ~PTE_CACHE; - MMUTable[0] &= ~PTE_SHARE; - MMUTable[0] |= PTE_SO; - rt_hw_mmu_switch((void *)MMUTable); + rt_hw_mmu_setup(&rt_kernel_space, platform_mem_desc, NUM_MEM_DESC); #endif - /* initalize interrupt */ - rt_hw_interrupt_init(); + d1_disable_inherited_watchdog(); #ifdef RT_USING_HEAP rt_kprintf("heap: [0x%08x - 0x%08x]\n", (rt_ubase_t) RT_HW_HEAP_BEGIN, (rt_ubase_t) RT_HW_HEAP_END); /* initialize memory system */ rt_system_heap_init(RT_HW_HEAP_BEGIN, RT_HW_HEAP_END); #endif + /* initalize interrupt */ + rt_hw_interrupt_init(); /* init hal hardware */ hal_clock_init(); hal_gpio_init(); - hal_uart_init(0); hal_dma_init(); /* init rtthread hardware */ @@ -108,7 +136,7 @@ void rt_hw_board_init(void) #ifdef RT_USING_CONSOLE /* set console device */ - rt_console_set_device("uart"); + rt_console_set_device(RT_CONSOLE_DEVICE_NAME); #endif /* RT_USING_CONSOLE */ #ifdef RT_USING_COMPONENTS_INIT @@ -116,9 +144,11 @@ void rt_hw_board_init(void) #endif } +#if !defined(RT_USING_WDT) || !defined(BSP_USING_WDT) void rt_hw_cpu_reset(void) { sbi_shutdown(); while(1); } MSH_CMD_EXPORT_ALIAS(rt_hw_cpu_reset, reboot, reset machine); +#endif diff --git a/bsp/allwinner/d1/link.lds b/bsp/allwinner/d1/link.lds index e6a3829fc8a8..1ba85442046a 100644 --- a/bsp/allwinner/d1/link.lds +++ b/bsp/allwinner/d1/link.lds @@ -30,6 +30,7 @@ SECTIONS . = 0x45000000 ; /* __STACKSIZE__ = 4096; */ + __text_start = .; .start : { @@ -82,6 +83,8 @@ SECTIONS .eh_frame : ONLY_IF_RO { KEEP (*(.eh_frame)) } > SRAM . = ALIGN(8); + __text_end = .; + __text_size = __text_end - __text_start; .data : { diff --git a/bsp/allwinner/d1/ports/SConscript b/bsp/allwinner/d1/ports/SConscript new file mode 100644 index 000000000000..ca95be14e2b8 --- /dev/null +++ b/bsp/allwinner/d1/ports/SConscript @@ -0,0 +1,12 @@ +import os +from building import * + +objs = [] +cwd = GetCurrentDir() +list = os.listdir(cwd) + +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + objs = objs + SConscript(os.path.join(item, 'SConscript')) + +Return('objs') diff --git a/bsp/allwinner/d1/ports/partition/SConscript b/bsp/allwinner/d1/ports/partition/SConscript new file mode 100644 index 000000000000..57f18deef649 --- /dev/null +++ b/bsp/allwinner/d1/ports/partition/SConscript @@ -0,0 +1,11 @@ +from building import * +import rtconfig + +cwd = GetCurrentDir() + +src = Glob('*.c') +CPPPATH = [cwd] + +group = DefineGroup('partition', src, depend = ['BSP_USING_SDMMC'], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/allwinner/d1/ports/partition/partition.c b/bsp/allwinner/d1/ports/partition/partition.c new file mode 100644 index 000000000000..1c30d29e5f10 --- /dev/null +++ b/bsp/allwinner/d1/ports/partition/partition.c @@ -0,0 +1,183 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2016-09-20 Bernard the first version + */ + +#include +#include +#include + +#include +#include + +#include "partition.h" + +// #define PARTITION_DEBUG + +#ifdef PARTITION_DEBUG +#define DEBUG_TRACE rt_kprintf("[part] "); rt_kprintf +#else +#define DEBUG_TRACE(...) +#endif + +struct partition_device +{ + struct rt_device parent; /* parent block device */ + + int sector_size; + int block_size; + + struct rt_device *block_device; + const struct rt_partition *partition; +}; + +/* RT-Thread device interface */ +static rt_err_t partition_init(rt_device_t dev) +{ + return RT_EOK; +} + +static rt_err_t partition_open(rt_device_t dev, rt_uint16_t oflag) +{ + return RT_EOK; +} + +static rt_err_t partition_close(rt_device_t dev) +{ + return RT_EOK; +} + +#if RTTHREAD_VERSION >= 30000 +static rt_err_t partition_control(rt_device_t dev, int cmd, void *args) +#else +static rt_err_t partition_control(rt_device_t dev, rt_uint8_t cmd, void *args) +#endif +{ + struct partition_device *part; + + part = (struct partition_device*) dev; + RT_ASSERT(part != RT_NULL); + + if (cmd == RT_DEVICE_CTRL_BLK_GETGEOME) + { + struct rt_device_blk_geometry *geometry; + + geometry = (struct rt_device_blk_geometry *)args; + if (geometry == RT_NULL) return -RT_ERROR; + + geometry->bytes_per_sector = part->sector_size; + geometry->sector_count = part->partition->size / part->sector_size; + geometry->block_size = part->block_size; + } + + return RT_EOK; +} + +static rt_ssize_t partition_read(rt_device_t dev, + rt_off_t pos, + void* buffer, + rt_size_t size) +{ + struct partition_device *part; + + part = (struct partition_device*) dev; + RT_ASSERT(part != RT_NULL); + + DEBUG_TRACE("read block: %d, size=%d\n", pos + part->partition->offset/part->sector_size, size); + + return rt_device_read(part->block_device, pos + part->partition->offset/part->sector_size, buffer, size); +} + +static rt_ssize_t partition_write(rt_device_t dev, + rt_off_t pos, + const void* buffer, + rt_size_t size) +{ + struct partition_device *part; + + part = (struct partition_device*) dev; + RT_ASSERT(part != RT_NULL); + + if (part->partition->flags & PARTITION_WRITEABLE) + { + DEBUG_TRACE("write block: %d, size=%d\n", pos + part->partition->offset/part->sector_size, size); + + return rt_device_write(part->block_device, pos + part->partition->offset/part->sector_size, + buffer, size); + } + + DEBUG_TRACE("read-only partition!\n"); + return 0; +} + +#ifdef RT_USING_DEVICE_OPS +const static struct rt_device_ops _partition_ops = +{ + .init = partition_init, + .open = partition_open, + .close = partition_close, + .read = partition_read, + .write = partition_write, + .control = partition_control, +}; +#endif /* RT_USING_DEVICE_OPS */ + +int rt_partition_init(const char* flash_device, const struct rt_partition* parts, rt_size_t num) +{ + struct rt_device *device; + struct partition_device *part_dev; + const struct rt_partition* part; + struct rt_device_blk_geometry geometry; + + device = (struct rt_device *)rt_device_find(flash_device); + if(device == RT_NULL) + { + DEBUG_TRACE("block device %s not found!\r\n", flash_device); + return -RT_ENOSYS; + } + + /* open the block device */ + rt_device_open(device, RT_DEVICE_OFLAG_RDWR); + /* get block device geometry */ + rt_device_control(device, RT_DEVICE_CTRL_BLK_GETGEOME, &geometry); + + /* create each partition device */ + while(num --) + { + part = parts ++; + part_dev = (struct partition_device*)rt_malloc (sizeof(struct partition_device)); + if (part_dev) + { + part_dev->block_device = device; + part_dev->partition = part; + part_dev->sector_size = geometry.bytes_per_sector; + part_dev->block_size = geometry.block_size; + + /* register device */ + part_dev->parent.type = RT_Device_Class_Block; +#ifndef RT_USING_DEVICE_OPS + part_dev->parent.init = partition_init; + part_dev->parent.open = partition_open; + part_dev->parent.close = partition_close; + part_dev->parent.read = partition_read; + part_dev->parent.write = partition_write; + part_dev->parent.control = partition_control; +#else + part_dev->parent.ops = &_partition_ops; +#endif /* RT_USING_DEVICE_OPS */ + /* no private */ + part_dev->parent.user_data = RT_NULL; + + DEBUG_TRACE("add partition: %s\n", part->name); + rt_device_register(RT_DEVICE(part_dev), part->name, + RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_STANDALONE); + } + } + + return RT_EOK; +} diff --git a/bsp/allwinner/d1/ports/partition/partition.h b/bsp/allwinner/d1/ports/partition/partition.h new file mode 100644 index 000000000000..3ed7c3f6458d --- /dev/null +++ b/bsp/allwinner/d1/ports/partition/partition.h @@ -0,0 +1,30 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2016-09-20 Bernard the first version + */ + +#ifndef PARTITION_H__ +#define PARTITION_H__ + +#define PARTITION_RDONLY 0x000 +#define PARTITION_WRITEABLE 0x100 /* Device is writable */ +#define PARTITION_POWERUP_LOCK 0x200 /* Always locked after reset */ + +struct rt_partition +{ + char name[8]; + + rt_uint32_t offset; + rt_uint32_t size; + + rt_uint32_t flags; +}; + +int rt_partition_init(const char* flash_device, const struct rt_partition* parts, rt_size_t num); + +#endif diff --git a/bsp/allwinner/d1/rtconfig.h b/bsp/allwinner/d1/rtconfig.h index 8711e08ce3fb..2ab581e1f116 100644 --- a/bsp/allwinner/d1/rtconfig.h +++ b/bsp/allwinner/d1/rtconfig.h @@ -119,7 +119,7 @@ #define RT_USING_DEVICE_OPS #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 256 -#define RT_CONSOLE_DEVICE_NAME "uart" +#define RT_CONSOLE_DEVICE_NAME "uart0" #define RT_USING_CONSOLE_OUTPUT_CTL #define RT_VER_NUM 0x50300 #define RT_USING_STDC_ATOMIC @@ -128,7 +128,7 @@ #define ARCH_CPU_64BIT #define RT_USING_CACHE #define ARCH_MM_MMU -#define KERNEL_VADDR_START 0x150000000 +#define KERNEL_VADDR_START 0x45000000 #define ARCH_RISCV #define ARCH_RISCV_FPU #define ARCH_RISCV_FPU_D @@ -195,11 +195,6 @@ #define RT_PAGECACHE_GC_STOP_LEVEL 70 /* end of page cache config */ /* end of DFS: device virtual file system */ -#define RT_USING_FAL -#define FAL_USING_DEBUG -#define FAL_PART_HAS_TABLE_CFG -#define FAL_DEV_NAME_MAX 24 -#define FAL_DEV_BLK_MAX 6 /* Device Drivers */ @@ -210,9 +205,8 @@ #define RT_SYSTEM_WORKQUEUE_STACKSIZE 8192 #define RT_SYSTEM_WORKQUEUE_PRIORITY 23 #define RT_USING_SERIAL -#define RT_USING_SERIAL_V1 -#define RT_SERIAL_USING_DMA -#define RT_SERIAL_RB_BUFSZ 64 +#define RT_USING_SERIAL_V2 +#define RT_SERIAL_BUF_STRATEGY_OVERWRITE #define RT_USING_SERIAL_BYPASS #define RT_USING_CLOCK_TIME #define CLOCK_TIMER_FREQ 0 @@ -581,6 +575,7 @@ #define BOARD_allwinnerd1 #define ENABLE_FPU #define __STACKSIZE__ 16384 +#define BSP_UART_DEFAULT_BAUDRATE 115200 /* General Drivers Configuration */ @@ -631,6 +626,14 @@ /* SDMMC Devices */ +#define DRIVERS_SDMMC +#define USE_SD +#define USE_SDIO +#define DETECT_CARD +#define SDC_DMA_USED +#define SDIO_IRQ_SUPPORT +#define SDC_DMA_BUF_SIZE 64 +#define DRIVERS_SDC_CDPIN_PRESENT_VAL 0 /* end of SDMMC Devices */ /* SPI Devices */ diff --git a/bsp/allwinner/d1/rtconfig.py b/bsp/allwinner/d1/rtconfig.py index 40a230cf3bb8..315d39201c74 100644 --- a/bsp/allwinner/d1/rtconfig.py +++ b/bsp/allwinner/d1/rtconfig.py @@ -39,7 +39,7 @@ DEVICE = ' -mcmodel=medany -march=rv64imafdc -mabi=lp64' CFLAGS = DEVICE + ' -fvar-tracking -ffreestanding -fno-common -ffunction-sections -fdata-sections -fstrict-volatile-bitfields ' - AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -D__ASSEMBLY__' LFLAGS = DEVICE + ' -nostartfiles -Wl,--gc-sections,-Map=rtthread.map,-cref,-u,_start -T link.lds' + ' -lsupc++ -lgcc -static' CPATH = '' LPATH = '' diff --git a/bsp/allwinner/libraries/drivers/Kconfig b/bsp/allwinner/libraries/drivers/Kconfig index d6c5fa0da02a..fd938fdd5f6d 100644 --- a/bsp/allwinner/libraries/drivers/Kconfig +++ b/bsp/allwinner/libraries/drivers/Kconfig @@ -261,9 +261,9 @@ menuconfig BSP_USING_FS bool "Enable File System" select RT_USING_DFS select BSP_USING_SDMMC - select RT_USING_FAL - select FAL_DEBUG_CONFIG - select FAL_PART_HAS_TABLE_CFG + select RT_USING_FAL if !BOARD_allwinnerd1 + select FAL_DEBUG_CONFIG if !BOARD_allwinnerd1 + select FAL_PART_HAS_TABLE_CFG if !BOARD_allwinnerd1 default y menuconfig BSP_USING_LCD diff --git a/bsp/allwinner/libraries/drivers/drv_uart.c b/bsp/allwinner/libraries/drivers/drv_uart.c index 18956e5e8074..86e94aa0e385 100644 --- a/bsp/allwinner/libraries/drivers/drv_uart.c +++ b/bsp/allwinner/libraries/drivers/drv_uart.c @@ -21,7 +21,11 @@ #include #include +#ifdef BSP_UART_DEFAULT_BAUDRATE +#define UART_DEFAULT_BAUDRATE BSP_UART_DEFAULT_BAUDRATE +#else #define UART_DEFAULT_BAUDRATE 500000 +#endif #ifdef UART0_TX_USING_GPIOB8 #define UART0_TX GPIOB(8) diff --git a/bsp/allwinner/libraries/drivers/sdmmc/drv_sdmmc.c b/bsp/allwinner/libraries/drivers/sdmmc/drv_sdmmc.c index fb4efde1b5c7..861b6781d2cc 100644 --- a/bsp/allwinner/libraries/drivers/sdmmc/drv_sdmmc.c +++ b/bsp/allwinner/libraries/drivers/sdmmc/drv_sdmmc.c @@ -496,7 +496,7 @@ int driver_sdmmc_init(void) { int ret = -1; int i = 0; - rt_device_t device[SDMMC_CARD_NR]; + int initialized = 0; int32_t used_card_no = 0x01; char name[12]; @@ -510,11 +510,27 @@ int driver_sdmmc_init(void) for (i = 0; i < SDMMC_CARD_NR; ++i) { + if ((used_card_no & (1U << i)) == 0) + { + continue; + } + rt_sprintf(name, "sdmmc%d", i); dev_sdmmc[i].host_id = i; - ret = init_sdmmc_device(device[i], (void *)&dev_sdmmc[i], name); + ret = init_sdmmc_device(RT_NULL, (void *)&dev_sdmmc[i], name); + if (ret != RT_EOK) + { + return ret; + } + initialized++; } - return ret; + + if (initialized == 0) + { + return -RT_ERROR; + } + + return RT_EOK; } void sd_mmc1_init(void) diff --git a/bsp/allwinner/libraries/libos/src/os.c b/bsp/allwinner/libraries/libos/src/os.c index 9e00413c4604..e5e04d8c6504 100644 --- a/bsp/allwinner/libraries/libos/src/os.c +++ b/bsp/allwinner/libraries/libos/src/os.c @@ -388,7 +388,11 @@ int32_t esCFG_GetKeyValue(char *SecName, char *KeyName, int32_t Value[], int32_t return 0; } else if (!rt_strcmp("used_card_no", KeyName)) { +#if defined(BOARD_allwinnerd1) + *Value = 0x01; +#else *Value = 0x03; +#endif return 0; } }