summaryrefslogtreecommitdiff
path: root/bsp
diff options
context:
space:
mode:
authorgodmial <[email protected]>2025-06-09 16:31:19 +0800
committerGitHub <[email protected]>2025-06-09 16:31:19 +0800
commitaec10aa0a83b27765829047b78449f0ee0fa5cd0 (patch)
tree8c5d61ceee81d57cc6e27118f1d3700337b1965e /bsp
parent7568ec961892a29ca9faa4d5ca556b42b93923b4 (diff)
bsp: gd32470z-lckfb: 增加 SPI Flash 支持及使用说明 (#10347)
Diffstat (limited to 'bsp')
-rw-r--r--bsp/gd32/arm/gd32470z-lckfb/README.md37
-rw-r--r--bsp/gd32/arm/gd32470z-lckfb/board/Kconfig15
-rw-r--r--bsp/gd32/arm/libraries/gd32_drivers/drv_spi_flash.c129
3 files changed, 124 insertions, 57 deletions
diff --git a/bsp/gd32/arm/gd32470z-lckfb/README.md b/bsp/gd32/arm/gd32470z-lckfb/README.md
index b20546911b..36aa07e249 100644
--- a/bsp/gd32/arm/gd32470z-lckfb/README.md
+++ b/bsp/gd32/arm/gd32470z-lckfb/README.md
@@ -13,7 +13,7 @@ GD32470Z-LCKFB梁山派是立创开发板推出的一款GD32F470系列的开发�
- GD32F470ZGT6,主频 240MHz,CPU内核:ARM Cortex-M4,1024KB FLASH ,512KB RAM
- 常用外设
- - 用户LED :4个,LED1 (PE3),LED2(PD7),LED3(PG3),LED4(PA5)
+ - 用户LED :4个,LED1(PE3),LED2(PD7),LED3(PG3),LED4(PA5)
- 电源指示灯:一个红色LED
- 按键:3个,KEY_UP(PA0),RESET(NRST),BOOT0(PB2)
- General TM * 10、Advanced TM * 2、Basic TM * 2
@@ -44,14 +44,18 @@ GD32470Z-LCKFB梁山派是立创开发板推出的一款GD32F470系列的开发�
## 外设支持
-本 BSP 目前对外设的支持情况如下:
| **片上外设** | **支持情况** | **备注** |
-|:-------- |:--------:|:-------------------------------- |
-| GPIO | 支持 | PA0, PA1... ---> PIN: 0, 1...113 |
-| UART | 支持 | UART0 - UART7 |
-| **扩展模块** | **支持情况** | **备注** |
-| LCD+触摸屏 | 支持 | 暂不支持中文显示(因 Keil5 编码限制),使用方法请查看bsp\gd32\arm\gd32470z-lckfb\board\ports\README.md |
+|:------------|:------------:|:----------------------------------|
+| GPIO | 支持 | PA0, PA1... ---> PIN: 0, 1...113 |
+| UART | 支持 | UART0 - UART7 |
+| SPI | 支持 | 支持 SPI0 ~ SPI4,可配置多个总线 |
+| **扩展模块** | **支持情况** | **备注** |
+| LCD+触摸屏 | 支持 | 暂不支持中文显示(因 Keil5 编码限制),使用方法请查看bsp\gd32\arm\gd32470z-lckfb\board\ports\README.md |
+| **板载外设** | **支持情况** | **备注** |
+| SPI Flash | 支持 | 板载 W25Q64,挂载在 SPI4,总线名:spi4,设备名:spi40 |
+
+
## 使用说明
@@ -107,10 +111,27 @@ msh />
## 注意事项
-暂无
+
+- 目前DFS支持有问题,若需使用板载 SPI Flash,请在 `menuconfig` 中启用以下配置:
+
+```
+RT-Thread Components --->
+ DFS: device virtual file system --->
+ [ ] DFS: device virtual file system (RT_USING_DFS) 关闭DFS
+ Device Drivers --->
+ [*] Enable SPI BUS support (RT_USING_SPI)
+ [*] Enable SFUD for SPI Flash (RT_USING_SFUD)
+
+Hardware Drivers Config --->
+ On-chip Peripheral Drivers --->
+ [*] Enable SPI BUS (BSP_USING_SPI)
+ [*] Enable SPI4 BUS (BSP_USING_SPI4)
+```
+
## 联系人信息
维护人:
+- [godmial](https://github.com/godmial), 邮箱:<[email protected]>
- [yuanzihao](https://github.com/zihao-yuan/), 邮箱:<[email protected]>
diff --git a/bsp/gd32/arm/gd32470z-lckfb/board/Kconfig b/bsp/gd32/arm/gd32470z-lckfb/board/Kconfig
index 6d36887be5..b419b53d18 100644
--- a/bsp/gd32/arm/gd32470z-lckfb/board/Kconfig
+++ b/bsp/gd32/arm/gd32470z-lckfb/board/Kconfig
@@ -319,6 +319,21 @@ menu "On-chip Peripheral Drivers"
depends on BSP_USING_SPI1
select BSP_SPI1_TX_USING_DMA
default n
+
+ config BSP_USING_SPI4
+ bool "Enable SPI4 BUS"
+ default n
+
+ config BSP_SPI4_TX_USING_DMA
+ bool "Enable SPI4 TX DMA"
+ depends on BSP_USING_SPI4
+ default n
+
+ config BSP_SPI4_RX_USING_DMA
+ bool "Enable SPI4 RX DMA"
+ depends on BSP_USING_SPI4
+ select BSP_SPI4_TX_USING_DMA
+ default n
endif
menuconfig BSP_USING_I2C1
diff --git a/bsp/gd32/arm/libraries/gd32_drivers/drv_spi_flash.c b/bsp/gd32/arm/libraries/gd32_drivers/drv_spi_flash.c
index 5645322026..c3ba5ada74 100644
--- a/bsp/gd32/arm/libraries/gd32_drivers/drv_spi_flash.c
+++ b/bsp/gd32/arm/libraries/gd32_drivers/drv_spi_flash.c
@@ -7,6 +7,7 @@
* Date Author Notes
* 2021-12-31 BruceOu first implementation
* 2023-06-03 CX fixed sf probe error bug
+ * 2024-05-30 godmial refactor driver for multi-SPI bus auto-mount
*/
#include <board.h>
#include "drv_spi.h"
@@ -19,72 +20,102 @@
#include <rthw.h>
#include <finsh.h>
-#define SPI_BUS_NAME "spi0"
-#define SPI_DEVICE_NAME "spi01"
-#define SPI_FLASH_DEVICE_NAME "gd25q"
+#ifdef RT_USING_DFS
+#include <dfs_fs.h>
+#endif
-#define GD25Q_SPI_CS_GPIOX_CLK RCU_GPIOE
-#define GD25Q_SPI_CS_GPIOX GPIOE
-#define GD25Q_SPI_CS_GPIOX_PIN_X GPIO_PIN_3
+struct spi_flash_config
+{
+ const char *bus_name;
+ const char *device_name;
+ const char *flash_name;
+ rt_base_t cs_pin;
+};
-static int rt_hw_spi_flash_init(void)
+static const struct spi_flash_config flash_configs[] =
{
- rt_err_t res;
- static struct rt_spi_device spi_dev_gd25q; /* SPI device */
- static struct gd32_spi_cs spi_cs;
- spi_cs.GPIOx = GD25Q_SPI_CS_GPIOX;
- spi_cs.GPIO_Pin = GD25Q_SPI_CS_GPIOX_PIN_X;
+#ifdef BSP_USING_SPI0
+ {
+ .bus_name = "spi0",
+ .device_name = "spi00",
+ .flash_name = "gd25q_spi0",
+ .cs_pin = GET_PIN(A, 4),
+ },
+#endif
- rcu_periph_clock_enable(GD25Q_SPI_CS_GPIOX_CLK);
-#if defined SOC_SERIES_GD32F4xx
- gpio_mode_set(spi_cs.GPIOx, GPIO_MODE_OUTPUT, GPIO_PUPD_NONE, spi_cs.GPIO_Pin);
- gpio_output_options_set(spi_cs.GPIOx, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, spi_cs.GPIO_Pin);
+#ifdef BSP_USING_SPI1
+ {
+ .bus_name = "spi1",
+ .device_name = "spi10",
+ .flash_name = "gd25q_spi1",
+ .cs_pin = GET_PIN(B, 9),
+ },
+#endif
- gpio_bit_set(spi_cs.GPIOx, spi_cs.GPIO_Pin);
-#else
- gpio_init(spi_cs.GPIOx, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, spi_cs.GPIO_Pin);
+#ifdef BSP_USING_SPI2
+ {
+ .bus_name = "spi2",
+ .device_name = "spi20",
+ .flash_name = "gd25q_spi2",
+ .cs_pin = GET_PIN(B, 12),
+ },
+#endif
+#ifdef BSP_USING_SPI3
+ {
+ .bus_name = "spi3",
+ .device_name = "spi30",
+ .flash_name = "gd25q_spi3",
+ .cs_pin = GET_PIN(E, 4),
+ },
#endif
- res = rt_spi_bus_attach_device(&spi_dev_gd25q, SPI_FLASH_DEVICE_NAME, SPI_BUS_NAME, (void*)&spi_cs);
- if (res != RT_EOK)
+#ifdef BSP_USING_SPI4
{
- rt_kprintf("rt_spi_bus_attach_device() run failed!\n");
- return res;
- }
+ .bus_name = "spi4",
+ .device_name = "spi40",
+ .flash_name = "gd25q_spi4",
+ .cs_pin = GET_PIN(F, 6),
+ },
+#endif
+};
- return RT_EOK;
-}
-INIT_DEVICE_EXPORT(rt_hw_spi_flash_init);
-#ifdef RT_USING_SFUD
-static int rt_hw_spi_flash_with_sfud_init(void)
+static int spi_flash_init(void)
{
- if (RT_NULL == rt_sfud_flash_probe(SPI_FLASH_DEVICE_NAME, SPI_DEVICE_NAME))
+ int result = RT_EOK;
+
+ for (size_t i = 0; i < sizeof(flash_configs) / sizeof(flash_configs[0]); i++)
{
- return -RT_ERROR;
- };
+ const struct spi_flash_config *cfg = &flash_configs[i];
- return RT_EOK;
-}
-INIT_COMPONENT_EXPORT(rt_hw_spi_flash_with_sfud_init);
+ result = rt_hw_spi_device_attach(cfg->bus_name, cfg->device_name, cfg->cs_pin);
+ if (result != RT_EOK)
+ {
+ rt_kprintf("Failed to attach device %s on bus %s\n", cfg->device_name, cfg->bus_name);
+ continue;
+ }
+
+#ifdef RT_USING_SFUD
+ if (RT_NULL == rt_sfud_flash_probe(cfg->flash_name, cfg->device_name))
+ {
+ rt_kprintf("SFUD probe failed: %s\n", cfg->flash_name);
+ continue;
+ }
#endif
#ifdef RT_USING_DFS
-#include <dfs_fs.h>
-
-int mnt_init(void)
-{
- if (dfs_mount(SPI_FLASH_DEVICE_NAME, "/", "elm", 0, 0) == 0)
- {
- rt_kprintf("spi flash mount success !\n");
- }
- else
- {
- rt_kprintf("spi flash mount failed!\n");
+ if (dfs_mount(cfg->flash_name, "/", "elm", 0, 0) == RT_EOK)
+ {
+ rt_kprintf("SPI flash %s mount success!\n", cfg->flash_name);
+ }
+ else
+ {
+ rt_kprintf("SPI flash %s mount failed!\n", cfg->flash_name);
+ }
+#endif
}
- return 0;
+ return result;
}
-MSH_CMD_EXPORT(mnt_init, mount spi flash to file system);
-#endif
+INIT_COMPONENT_EXPORT(spi_flash_init);