summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--bsp/ra6m4-cpk/docs/picture/adc_config.pngbin0 -> 23810 bytes
-rw-r--r--bsp/ra6m4-cpk/docs/picture/adc_config1.pngbin0 -> 36349 bytes
-rw-r--r--bsp/ra6m4-cpk/docs/picture/adc_dac.pngbin0 -> 15738 bytes
-rw-r--r--bsp/ra6m4-cpk/docs/picture/add_flash.pngbin0 -> 23258 bytes
-rw-r--r--bsp/ra6m4-cpk/docs/picture/config_flash.pngbin0 -> 11975 bytes
-rw-r--r--bsp/ra6m4-cpk/docs/picture/dac_config0.pngbin0 -> 24703 bytes
-rw-r--r--bsp/ra6m4-cpk/docs/picture/dac_config1.pngbin0 -> 31852 bytes
-rw-r--r--bsp/ra6m4-cpk/docs/picture/dac_config2.pngbin0 -> 20677 bytes
-rw-r--r--bsp/ra6m4-cpk/docs/picture/flash_menuconfig.pngbin0 -> 18934 bytes
-rw-r--r--bsp/ra6m4-cpk/docs/picture/rtc_env.pngbin0 -> 15672 bytes
-rw-r--r--bsp/ra6m4-cpk/docs/picture/spi.pngbin0 -> 47012 bytes
-rw-r--r--bsp/ra6m4-cpk/docs/picture/spi_add.pngbin0 -> 27753 bytes
-rw-r--r--bsp/ra6m4-cpk/docs/picture/spi_env.pngbin0 -> 19124 bytes
-rw-r--r--bsp/ra6m4-cpk/docs/picture/wdt_env.pngbin0 -> 22934 bytes
-rw-r--r--bsp/ra6m4-cpk/docs/使用瑞萨FSP配置工具.md70
-rw-r--r--bsp/ra6m4-cpk/drivers/Kconfig3
-rw-r--r--bsp/ra6m4-cpk/drivers/SConscript17
-rw-r--r--bsp/ra6m4-cpk/drivers/drv_flash.c298
-rw-r--r--bsp/ra6m4-cpk/drivers/drv_flash.h64
-rw-r--r--bsp/ra6m4-cpk/drivers/drv_wdt.c1
-rw-r--r--bsp/ra6m4-cpk/ports/SConscript12
-rw-r--r--bsp/ra6m4-cpk/ports/fal/SConscript20
-rw-r--r--bsp/ra6m4-cpk/ports/fal/fal_cfg.h39
23 files changed, 514 insertions, 10 deletions
diff --git a/bsp/ra6m4-cpk/docs/picture/adc_config.png b/bsp/ra6m4-cpk/docs/picture/adc_config.png
new file mode 100644
index 0000000000..087f48e9ee
--- /dev/null
+++ b/bsp/ra6m4-cpk/docs/picture/adc_config.png
Binary files differ
diff --git a/bsp/ra6m4-cpk/docs/picture/adc_config1.png b/bsp/ra6m4-cpk/docs/picture/adc_config1.png
new file mode 100644
index 0000000000..cdbcc9f409
--- /dev/null
+++ b/bsp/ra6m4-cpk/docs/picture/adc_config1.png
Binary files differ
diff --git a/bsp/ra6m4-cpk/docs/picture/adc_dac.png b/bsp/ra6m4-cpk/docs/picture/adc_dac.png
new file mode 100644
index 0000000000..a2aa56169a
--- /dev/null
+++ b/bsp/ra6m4-cpk/docs/picture/adc_dac.png
Binary files differ
diff --git a/bsp/ra6m4-cpk/docs/picture/add_flash.png b/bsp/ra6m4-cpk/docs/picture/add_flash.png
new file mode 100644
index 0000000000..71be7e2a25
--- /dev/null
+++ b/bsp/ra6m4-cpk/docs/picture/add_flash.png
Binary files differ
diff --git a/bsp/ra6m4-cpk/docs/picture/config_flash.png b/bsp/ra6m4-cpk/docs/picture/config_flash.png
new file mode 100644
index 0000000000..52631d7c45
--- /dev/null
+++ b/bsp/ra6m4-cpk/docs/picture/config_flash.png
Binary files differ
diff --git a/bsp/ra6m4-cpk/docs/picture/dac_config0.png b/bsp/ra6m4-cpk/docs/picture/dac_config0.png
new file mode 100644
index 0000000000..20ee094ebf
--- /dev/null
+++ b/bsp/ra6m4-cpk/docs/picture/dac_config0.png
Binary files differ
diff --git a/bsp/ra6m4-cpk/docs/picture/dac_config1.png b/bsp/ra6m4-cpk/docs/picture/dac_config1.png
new file mode 100644
index 0000000000..ec27d0af8b
--- /dev/null
+++ b/bsp/ra6m4-cpk/docs/picture/dac_config1.png
Binary files differ
diff --git a/bsp/ra6m4-cpk/docs/picture/dac_config2.png b/bsp/ra6m4-cpk/docs/picture/dac_config2.png
new file mode 100644
index 0000000000..b02f8fd7ca
--- /dev/null
+++ b/bsp/ra6m4-cpk/docs/picture/dac_config2.png
Binary files differ
diff --git a/bsp/ra6m4-cpk/docs/picture/flash_menuconfig.png b/bsp/ra6m4-cpk/docs/picture/flash_menuconfig.png
new file mode 100644
index 0000000000..13bc010cd2
--- /dev/null
+++ b/bsp/ra6m4-cpk/docs/picture/flash_menuconfig.png
Binary files differ
diff --git a/bsp/ra6m4-cpk/docs/picture/rtc_env.png b/bsp/ra6m4-cpk/docs/picture/rtc_env.png
new file mode 100644
index 0000000000..efc3aae4cb
--- /dev/null
+++ b/bsp/ra6m4-cpk/docs/picture/rtc_env.png
Binary files differ
diff --git a/bsp/ra6m4-cpk/docs/picture/spi.png b/bsp/ra6m4-cpk/docs/picture/spi.png
new file mode 100644
index 0000000000..8d83c4c60b
--- /dev/null
+++ b/bsp/ra6m4-cpk/docs/picture/spi.png
Binary files differ
diff --git a/bsp/ra6m4-cpk/docs/picture/spi_add.png b/bsp/ra6m4-cpk/docs/picture/spi_add.png
new file mode 100644
index 0000000000..b5ff26077d
--- /dev/null
+++ b/bsp/ra6m4-cpk/docs/picture/spi_add.png
Binary files differ
diff --git a/bsp/ra6m4-cpk/docs/picture/spi_env.png b/bsp/ra6m4-cpk/docs/picture/spi_env.png
new file mode 100644
index 0000000000..31fc635ff5
--- /dev/null
+++ b/bsp/ra6m4-cpk/docs/picture/spi_env.png
Binary files differ
diff --git a/bsp/ra6m4-cpk/docs/picture/wdt_env.png b/bsp/ra6m4-cpk/docs/picture/wdt_env.png
new file mode 100644
index 0000000000..a71d29f74e
--- /dev/null
+++ b/bsp/ra6m4-cpk/docs/picture/wdt_env.png
Binary files differ
diff --git a/bsp/ra6m4-cpk/docs/使用瑞萨FSP配置工具.md b/bsp/ra6m4-cpk/docs/使用瑞萨FSP配置工具.md
index 7d3f2a07cb..295f13788b 100644
--- a/bsp/ra6m4-cpk/docs/使用瑞萨FSP配置工具.md
+++ b/bsp/ra6m4-cpk/docs/使用瑞萨FSP配置工具.md
@@ -80,7 +80,9 @@
![image-20211019152407572](picture/wdt_config.png)
-3. [如何在 ENV 中打开 WDT](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/watchdog/watchdog)
+3. 如何在 ENV 中打开 WDT 以及 [WDT 接口使用说明](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/watchdog/watchdog)
+
+![image-20211027183406251](picture/wdt_env.png)
## RTC
@@ -92,4 +94,68 @@
![image-20211019152627412](picture/rtc_config.png)
-3. [如何在 ENV 中打开 RTC](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/rtc/rtc) \ No newline at end of file
+3. 如何在 ENV 中打开 RTC 以及[ RTC 接口使用说明](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/rtc/rtc)
+
+![image-20211027181550233](picture/rtc_env.png)
+
+
+## Flash
+
+1. 创建 Flash
+
+![image-20211026105031200](picture/add_flash.png)
+
+2. 配置 Flash,需要注意在 RT-Thread 中只使用了一个 flash 设备,所以没有对其进行编号,如果是新创建的 flash 设备需要注意 name 字段,在驱动中默认使用的是 `g_flash` 。
+
+![image-20211026105628706](picture/config_flash.png)
+
+3. 如何在 ENV 中打开 Flash
+
+![image-20211026123252310](picture/flash_menuconfig.png)
+
+
+## SPI
+
+1. 添加一个 SPI 外设端口
+
+![image-20211027180820968](picture/spi_add.png)
+
+2. 配置 channel、name、Clock Phase、Clock Polarity、Callback、 SPI Mode 等参数,波特率在代码中可通过 API 修改,这里可以设置一个默认值。
+
+![img](picture/spi.png)
+
+3. 如何在 ENV 中打开 SPI 以及 [SPI 接口使用说明](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/spi/spi)
+
+ ![image-20211027181444023](picture/spi_env.png)
+
+
+
+## ADC/DAC
+
+创建 ADC/DAC
+
+![img](picture/adc_dac.png)
+
+- ADC
+
+1. 配置 name、unit、mode,选择扫描的通道编号
+
+![img](picture/adc_config.png)
+
+2. 配置扫描通道对应的引脚
+
+![img](picture/adc_config1.png)
+
+- DAC
+
+1. 需要先关闭 P014 的默认 mode
+
+![img](picture/dac_config0.png)
+
+2. 开启 DAC0 通道
+
+![img](picture/dac_config1.png)
+
+3. 修改通道号为 0,与 DAC0 对应
+
+![img](picture/dac_config2.png)
diff --git a/bsp/ra6m4-cpk/drivers/Kconfig b/bsp/ra6m4-cpk/drivers/Kconfig
index eac6c1446b..cdae43b1d0 100644
--- a/bsp/ra6m4-cpk/drivers/Kconfig
+++ b/bsp/ra6m4-cpk/drivers/Kconfig
@@ -141,6 +141,9 @@ menu "Hardware Drivers Config"
default n
endif
+ config BSP_USING_ONCHIP_FLASH
+ bool "Enable Onchip FLASH"
+ default n
endmenu
menu "Board extended module Drivers"
diff --git a/bsp/ra6m4-cpk/drivers/SConscript b/bsp/ra6m4-cpk/drivers/SConscript
index f8b5f68e16..5238cb6f60 100644
--- a/bsp/ra6m4-cpk/drivers/SConscript
+++ b/bsp/ra6m4-cpk/drivers/SConscript
@@ -9,35 +9,38 @@ src = Split("""
drv_common.c
""")
-if GetDepend(['RT_USING_SERIAL']):
+if GetDepend(['BSP_USING_SERIAL']):
if GetDepend(['RT_USING_SERIAL_V2']):
src += ['drv_usart_v2.c']
else:
print("\nThe current project does not support serial-v1\n")
Return('group')
-if GetDepend(['RT_USING_PIN']):
+if GetDepend(['BSP_USING_PIN']):
src += ['drv_gpio.c']
-if GetDepend(['RT_USING_WDT']):
+if GetDepend(['BSP_USING_WDT']):
src += ['drv_wdt.c']
if GetDepend(['BSP_USING_ONCHIP_RTC']):
src += ['drv_rtc.c']
-if GetDepend(['RT_USING_I2C', 'RT_USING_I2C_BITOPS']):
+if GetDepend(['BSP_USING_I2C', 'RT_USING_I2C_BITOPS']):
if GetDepend('BSP_USING_I2C0') or GetDepend('BSP_USING_I2C1'):
src += ['drv_soft_i2c.c']
-if GetDepend(['RT_USING_SPI']):
+if GetDepend(['BSP_USING_SPI']):
src += ['drv_spi.c']
-if GetDepend(['RT_USING_ADC']):
+if GetDepend(['BSP_USING_ADC']):
src += ['drv_adc.c']
-if GetDepend(['RT_USING_DAC']):
+if GetDepend(['BSP_USING_DAC']):
src += ['drv_dac.c']
+if GetDepend(['BSP_USING_ONCHIP_FLASH']):
+ src += ['drv_flash.c']
+
path = [cwd]
path += [cwd + '/config']
diff --git a/bsp/ra6m4-cpk/drivers/drv_flash.c b/bsp/ra6m4-cpk/drivers/drv_flash.c
new file mode 100644
index 0000000000..4fa3462773
--- /dev/null
+++ b/bsp/ra6m4-cpk/drivers/drv_flash.c
@@ -0,0 +1,298 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2018-12-5 SummerGift first version
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#include "board.h"
+#include "hal_data.h"
+#include "drv_flash.h"
+
+#include <rtthread.h>
+
+#if defined(PKG_USING_FAL)
+ #include "fal.h"
+#endif
+
+//#define DRV_DEBUG
+#define LOG_TAG "drv.flash"
+#ifdef DRV_DEBUG
+ #define DBG_LVL DBG_LOG
+#else
+ #define DBG_LVL DBG_INFO
+#endif /* DRV_DEBUG */
+#include <rtdbg.h>
+
+int _flash_init(void)
+{
+ fsp_err_t err = FSP_SUCCESS;
+ /* Open Flash_HP */
+ err = R_FLASH_HP_Open(&g_flash_ctrl, &g_flash_cfg);
+ /* Handle Error */
+ if (FSP_SUCCESS != err)
+ {
+ LOG_E("\r\n Flah_HP_Open API failed");
+ }
+ /* Setup Default Block 0 as Startup Setup Block */
+ err = R_FLASH_HP_StartUpAreaSelect(&g_flash_ctrl, FLASH_STARTUP_AREA_BLOCK0, true);
+ if (err != FSP_SUCCESS)
+ {
+ LOG_E("\r\n Flah_HP_StartUpAreaSelect API failed");
+ }
+ return 0;
+}
+
+/**
+ * Read data from flash.
+ * @note This operation's units is word.
+ *
+ * @param addr flash address
+ * @param buf buffer to store read data
+ * @param size read bytes size
+ *
+ * @return result
+ */
+int _flash_read(rt_uint32_t addr, rt_uint8_t *buf, size_t size)
+{
+ size_t i;
+
+ if ((addr + size) > FLASH_HP_CF_BLCOK_10 + BSP_FEATURE_FLASH_HP_CF_REGION1_BLOCK_SIZE)
+ {
+ LOG_E("read outrange flash size! addr is (0x%p)", (void *)(addr + size));
+ return -1;
+ }
+
+ for (i = 0; i < size; i++, buf++, addr++)
+ {
+ *buf = *(rt_uint8_t *) addr;
+ }
+
+ return size;
+}
+
+/**
+ * Write data to flash.
+ * @note This operation's units is word.
+ * @note This operation must after erase. @see flash_erase.
+ *
+ * @param addr flash address
+ * @param buf the write data buffer
+ * @param size write bytes size
+ *
+ * @return result
+ */
+int _flash_write(rt_uint32_t addr, const rt_uint8_t *buf, size_t size)
+{
+ rt_err_t result = RT_EOK;
+ rt_base_t level;
+ fsp_err_t err = FSP_SUCCESS;
+ size_t written_size = 0;
+
+ if ((addr + size) > FLASH_HP_CF_BLCOK_10 + BSP_FEATURE_FLASH_HP_CF_REGION1_BLOCK_SIZE)
+ {
+ LOG_E("write outrange flash size! addr is (0x%p)", (void *)(addr + size));
+ return -RT_EINVAL;
+ }
+
+ if (size % BSP_FEATURE_FLASH_HP_CF_WRITE_SIZE)
+ {
+ LOG_E("Flash Write size must be an integer multiple of %d", BSP_FEATURE_FLASH_HP_CF_WRITE_SIZE);
+ return -RT_EINVAL;
+ }
+
+ while (written_size < size)
+ {
+ level = rt_hw_interrupt_disable();
+ /* Write code flash data*/
+ err = R_FLASH_HP_Write(&g_flash_ctrl, (uint32_t)(buf + written_size), addr + written_size, BSP_FEATURE_FLASH_HP_CF_WRITE_SIZE);
+ rt_hw_interrupt_enable(level);
+
+ /* Error Handle */
+ if (FSP_SUCCESS != err)
+ {
+ LOG_E("Write API failed");
+ return -RT_EIO;
+ }
+
+ written_size += BSP_FEATURE_FLASH_HP_CF_WRITE_SIZE;
+ }
+
+ if (result != RT_EOK)
+ {
+ return result;
+ }
+
+ return size;
+}
+
+/**
+ * Erase data on flash.
+ * @note This operation is irreversible.
+ * @note This operation's units is different which on many chips.
+ *
+ * @param addr flash address
+ * @param size erase bytes size
+ *
+ * @return result
+ */
+int _flash_erase_8k(rt_uint32_t addr, size_t size)
+{
+ fsp_err_t err = FSP_SUCCESS;
+ rt_base_t level;
+
+ if ((addr + size) > BSP_FEATURE_FLASH_HP_CF_REGION0_SIZE)
+ {
+ LOG_E("ERROR: erase outrange flash size! addr is (0x%p)\n", (void *)(addr + size));
+ return -RT_EINVAL;
+ }
+
+ if (size < 1)
+ {
+ return -RT_EINVAL;
+ }
+
+ level = rt_hw_interrupt_disable();
+ /* Erase Block */
+ err = R_FLASH_HP_Erase(&g_flash_ctrl, RT_ALIGN_DOWN(addr, FLASH_HP_CF_BLOCK_SIZE_8KB), (size - 1) / BSP_FEATURE_FLASH_HP_CF_REGION0_BLOCK_SIZE + 1);
+ rt_hw_interrupt_enable(level);
+
+ if (err != FSP_SUCCESS)
+ {
+ LOG_E("Erase API failed");
+ return -RT_EIO;
+ }
+
+ LOG_D("erase done: addr (0x%p), size %d", (void *)addr, size);
+ return size;
+}
+
+int _flash_erase_128k(rt_uint32_t addr, size_t size)
+{
+ fsp_err_t err = FSP_SUCCESS;
+ rt_base_t level;
+
+ if ((addr + size) > FLASH_HP_CF_BLCOK_10 + BSP_FEATURE_FLASH_HP_CF_REGION1_BLOCK_SIZE)
+ {
+ LOG_E("ERROR: erase outrange flash size! addr is (0x%p)\n", (void *)(addr + size));
+ return -RT_EINVAL;
+ }
+
+ if (size < 1)
+ {
+ return -RT_EINVAL;
+ }
+
+ level = rt_hw_interrupt_disable();
+ /* Erase Block */
+ err = R_FLASH_HP_Erase(&g_flash_ctrl, RT_ALIGN_DOWN(addr, FLASH_HP_CF_BLOCK_SIZE_32KB), (size - 1) / BSP_FEATURE_FLASH_HP_CF_REGION1_BLOCK_SIZE + 1);
+ rt_hw_interrupt_enable(level);
+
+ if (err != FSP_SUCCESS)
+ {
+ LOG_E("Erase API failed");
+ return -RT_EIO;
+ }
+
+ LOG_D("erase done: addr (0x%p), size %d", (void *)addr, size);
+ return size;
+}
+
+#if defined(PKG_USING_FAL)
+
+static int fal_flash_read_8k(long offset, rt_uint8_t *buf, size_t size);
+static int fal_flash_read_128k(long offset, rt_uint8_t *buf, size_t size);
+
+static int fal_flash_write_8k(long offset, const rt_uint8_t *buf, size_t size);
+static int fal_flash_write_128k(long offset, const rt_uint8_t *buf, size_t size);
+
+static int fal_flash_erase_8k(long offset, size_t size);
+static int fal_flash_erase_128k(long offset, size_t size);
+
+const struct fal_flash_dev _onchip_flash_8k = { "onchip_flash_8k", FLASH_HP_CF_BLCOK_0, FLASH_HP_CF_BLOCK_8, (8 * 1024), {_flash_init, fal_flash_read_8k, fal_flash_write_8k, fal_flash_erase_8k} };
+const struct fal_flash_dev _onchip_flash_128k = { "onchip_flash_128k", FLASH_HP_CF_BLOCK_8, 32 * 3 * 1024, (128 * 1024), {_flash_init, fal_flash_read_128k, fal_flash_write_128k, fal_flash_erase_128k} };
+
+static int fal_flash_read_8k(long offset, rt_uint8_t *buf, size_t size)
+{
+ return _flash_read(_onchip_flash_8k.addr + offset, buf, size);
+}
+
+static int fal_flash_read_128k(long offset, rt_uint8_t *buf, size_t size)
+{
+ return _flash_read(_onchip_flash_128k.addr + offset, buf, size);
+}
+
+static int fal_flash_write_8k(long offset, const rt_uint8_t *buf, size_t size)
+{
+ return _flash_write(_onchip_flash_8k.addr + offset, buf, size);
+}
+
+static int fal_flash_write_128k(long offset, const rt_uint8_t *buf, size_t size)
+{
+ return _flash_write(_onchip_flash_128k.addr + offset, buf, size);
+}
+
+static int fal_flash_erase_8k(long offset, size_t size)
+{
+ return _flash_erase_8k(_onchip_flash_8k.addr + offset, size);
+}
+
+static int fal_flash_erase_128k(long offset, size_t size)
+{
+ return _flash_erase_128k(_onchip_flash_128k.addr + offset, size);
+}
+
+int flash_test(void)
+{
+#define TEST_OFF 0x10000
+ const struct fal_partition *param;
+ uint8_t write_buffer[BSP_FEATURE_FLASH_HP_CF_WRITE_SIZE] = {0};
+ uint8_t read_buffer[BSP_FEATURE_FLASH_HP_CF_WRITE_SIZE] = {0};
+
+ /* Set write buffer, clear read buffer */
+ for (uint8_t index = 0; index < BSP_FEATURE_FLASH_HP_CF_WRITE_SIZE; index++)
+ {
+ write_buffer[index] = index;
+ read_buffer[index] = 0;
+ }
+
+ fal_init();
+
+ param = fal_partition_find("param");
+ if (param == RT_NULL)
+ {
+ LOG_E("not find partition param!");
+ return -1;
+ }
+ LOG_I("Erase Start...");
+ fal_partition_erase(param, TEST_OFF, BSP_FEATURE_FLASH_HP_CF_REGION1_BLOCK_SIZE);
+ LOG_I("Erase succeeded!");
+ LOG_I("Write Start...");
+ fal_partition_write(param, TEST_OFF, write_buffer, sizeof(write_buffer));
+ LOG_I("Write succeeded!");
+ LOG_I("Read Start...");
+ fal_partition_read(param, TEST_OFF, read_buffer, BSP_FEATURE_FLASH_HP_CF_WRITE_SIZE);
+ LOG_I("Read succeeded!");
+
+ for (int i = 0; i < BSP_FEATURE_FLASH_HP_CF_WRITE_SIZE; i++)
+ {
+ if (read_buffer[i] != write_buffer[i])
+ {
+ LOG_E("Data verification failed!");
+ return -1;
+ }
+ }
+
+ LOG_I("Data verification succeeded!");
+ return 0;
+}
+MSH_CMD_EXPORT(flash_test, "drv flash test.");
+
+#endif
diff --git a/bsp/ra6m4-cpk/drivers/drv_flash.h b/bsp/ra6m4-cpk/drivers/drv_flash.h
new file mode 100644
index 0000000000..8826539f2e
--- /dev/null
+++ b/bsp/ra6m4-cpk/drivers/drv_flash.h
@@ -0,0 +1,64 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2018-12-5 SummerGift first version
+ */
+
+#ifndef __DRV_FLASH_H__
+#define __DRV_FLASH_H__
+
+#include <rtthread.h>
+#include "rtdevice.h"
+#include <rthw.h>
+#include <drv_common.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Code Flash */
+#define FLASH_HP_CF_BLOCK_SIZE_32KB (32*1024) /* Block Size 32 KB */
+#define FLASH_HP_CF_BLOCK_SIZE_8KB (8*1024) /* Block Size 8KB */
+
+#define FLASH_HP_CF_BLCOK_0 0x00000000U /* 8 KB: 0x00000000 - 0x00001FFF */
+#define FLASH_HP_CF_BLOCK_1 0x00002000U /* 8 KB: 0x00002000 - 0x00003FFF */
+#define FLASH_HP_CF_BLOCK_2 0x00004000U /* 8 KB: 0x00004000 - 0x00005FFF */
+#define FLASH_HP_CF_BLOCK_3 0x00006000U /* 8 KB: 0x00006000 - 0x00007FFF */
+#define FLASH_HP_CF_BLOCK_4 0x00008000U /* 8 KB: 0x00008000 - 0x00009FFF */
+#define FLASH_HP_CF_BLOCK_5 0x0000A000U /* 8 KB: 0x0000A000 - 0x0000BFFF */
+#define FLASH_HP_CF_BLOCK_6 0x0000C000U /* 8 KB: 0x0000C000 - 0x0000DFFF */
+#define FLASH_HP_CF_BLOCK_7 0x0000E000U /* 8 KB: 0x0000E000 - 0x0000FFFF */
+#define FLASH_HP_CF_BLOCK_8 0x00010000U /* 32 KB: 0x00010000 - 0x00017FFF */
+#define FLASH_HP_CF_BLOCK_9 0x00018000U /* 32 KB: 0x00018000 - 0x0001FFFF */
+#define FLASH_HP_CF_BLCOK_10 0x00020000U /* 32 KB: 0x00020000 - 0x0004FFFF */
+
+#define FLASH_HP_DF_BLOCK_SIZE (64)
+/* Data Flash */
+#if (defined (BOARD_RA6M4_EK) || defined (BOARD_RA6M5_EK) || defined (BOARD_RA4M3_EK)||defined(BOARD_RA4M2_EK))
+
+#define FLASH_HP_DF_BLOCK_0 0x08000000U /* 64 B: 0x40100000 - 0x4010003F */
+#define FLASH_HP_DF_BLOCK_1 0x08000040U /* 64 B: 0x40100040 - 0x4010007F */
+#define FLASH_HP_DF_BLOCK_2 0x08000080U /* 64 B: 0x40100080 - 0x401000BF */
+#define FLASH_HP_DF_BLOCK_3 0x080000C0U /* 64 B: 0x401000C0 - 0x401000FF */
+
+#else
+
+#define FLASH_HP_DF_BLOCK_0 0x40100000U /* 64 B: 0x40100000 - 0x4010003F */
+#define FLASH_HP_DF_BLOCK_1 0x40100040U /* 64 B: 0x40100040 - 0x4010007F */
+#define FLASH_HP_DF_BLOCK_2 0x40100080U /* 64 B: 0x40100080 - 0x401000BF */
+#define FLASH_HP_DF_BLOCK_3 0x401000C0U /* 64 B: 0x401000C0 - 0x401000FF */
+
+#endif
+
+#define BLOCK_SIZE (128)
+#define BLOCK_NUM (2)
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* __DRV_FLASH_H__ */
diff --git a/bsp/ra6m4-cpk/drivers/drv_wdt.c b/bsp/ra6m4-cpk/drivers/drv_wdt.c
index 56acd86088..44f64a1cce 100644
--- a/bsp/ra6m4-cpk/drivers/drv_wdt.c
+++ b/bsp/ra6m4-cpk/drivers/drv_wdt.c
@@ -44,7 +44,6 @@ static rt_err_t wdt_control(rt_watchdog_t *wdt, int cmd, void *arg)
/* set watchdog timeout */
case RT_DEVICE_CTRL_WDT_SET_TIMEOUT:
/**< set*/
-// g_wdt_cfg.timeout = *(rt_uint32_t *)arg;
break;
case RT_DEVICE_CTRL_WDT_GET_TIMEOUT:
wdt_value = (struct st_wdt_timeout_values *)arg;
diff --git a/bsp/ra6m4-cpk/ports/SConscript b/bsp/ra6m4-cpk/ports/SConscript
new file mode 100644
index 0000000000..ca95be14e2
--- /dev/null
+++ b/bsp/ra6m4-cpk/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/ra6m4-cpk/ports/fal/SConscript b/bsp/ra6m4-cpk/ports/fal/SConscript
new file mode 100644
index 0000000000..e57bdc9e77
--- /dev/null
+++ b/bsp/ra6m4-cpk/ports/fal/SConscript
@@ -0,0 +1,20 @@
+
+from building import *
+import rtconfig
+
+cwd = GetCurrentDir()
+
+src = []
+
+src += Glob('*.c')
+CPPPATH = [cwd]
+LOCAL_CCFLAGS = ''
+
+if rtconfig.CROSS_TOOL == 'gcc':
+ LOCAL_CCFLAGS += ' -std=c99'
+elif rtconfig.CROSS_TOOL == 'keil':
+ LOCAL_CCFLAGS += ' --c99'
+
+group = DefineGroup('FAL', src, depend = ['PKG_USING_FAL'], CPPPATH = CPPPATH, LOCAL_CCFLAGS = LOCAL_CCFLAGS)
+
+Return('group')
diff --git a/bsp/ra6m4-cpk/ports/fal/fal_cfg.h b/bsp/ra6m4-cpk/ports/fal/fal_cfg.h
new file mode 100644
index 0000000000..a10cd6ee37
--- /dev/null
+++ b/bsp/ra6m4-cpk/ports/fal/fal_cfg.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2018-08-21 MurphyZhao the first version
+ */
+#ifndef _FAL_CFG_H_
+#define _FAL_CFG_H_
+
+#include <rtthread.h>
+#include <board.h>
+
+/* enable stm32l4 onchip flash driver sample */
+#define FAL_FLASH_PORT_DRIVER_STM32L4
+/* enable SFUD flash driver sample */
+#define FAL_FLASH_PORT_DRIVER_SFUD
+
+extern const struct fal_flash_dev _onchip_flash_8k;
+extern const struct fal_flash_dev _onchip_flash_128k;
+
+/* flash device table */
+#define FAL_FLASH_DEV_TABLE \
+{ \
+ &_onchip_flash_8k, \
+ &_onchip_flash_128k, \
+}
+/* ====================== Partition Configuration ========================== */
+#ifdef FAL_PART_HAS_TABLE_CFG
+/* partition table */
+#define FAL_PART_TABLE \
+{ \
+ {FAL_PART_MAGIC_WROD, "app", "onchip_flash_8k", 0, 64 * 1024, 0}, \
+ {FAL_PART_MAGIC_WROD, "param", "onchip_flash_128k", 0, 3 * 128 * 1024, 0}, \
+}
+#endif /* FAL_PART_HAS_TABLE_CFG */
+#endif /* _FAL_CFG_H_ */