From 7c53d46ba781fbf156cbe3dfe9d6e2d325aaae3a Mon Sep 17 00:00:00 2001 From: Sherman <56910863+ShermanShao@users.noreply.github.com> Date: Fri, 11 Mar 2022 09:17:46 +0800 Subject: [PATCH] =?UTF-8?q?[update]=20=E6=B7=BB=E5=8A=A0=20RA=20=E7=B3=BB?= =?UTF-8?q?=E5=88=97=20BSP=20=E5=BC=80=E5=8F=91=E6=95=99=E7=A8=8B=EF=BC=9A?= =?UTF-8?q?=20(#5598)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 添加 RA 系列 BSP 开发教程 - 添加 ra6m4-iot PPP 上网 - 整理 驱动文件 --- bsp/renesas/README.md | 22 + bsp/renesas/docs/RA系列BSP制作教程.md | 383 ++++++++++ bsp/renesas/docs/RA系列BSP外设驱动使用教程.md | 93 +++ .../RA系列使用FSP配置外设驱动.md} | 171 +++-- bsp/renesas/docs/RA系列外设驱动添加指南.md | 63 ++ bsp/renesas/docs/RA系列驱动介绍.md | 62 ++ .../figures}/1635909864954.png | Bin bsp/renesas/docs/figures/1635929089445.png | Bin 0 -> 11350 bytes bsp/renesas/docs/figures/Kconfig.png | Bin 0 -> 100933 bytes bsp/renesas/docs/figures/Peripheral.png | Bin 0 -> 23233 bytes .../picture => docs/figures}/adc_config.png | Bin .../picture => docs/figures}/adc_config1.png | Bin bsp/renesas/docs/figures/adc_dac.png | Bin 0 -> 8337 bytes bsp/renesas/docs/figures/add_flash.png | Bin 0 -> 29746 bytes bsp/renesas/docs/figures/add_gpt1.png | Bin 0 -> 28223 bytes .../picture => docs/figures}/add_gpt2.png | Bin .../picture => docs/figures}/add_gpt3.png | Bin bsp/renesas/docs/figures/add_uart.png | Bin 0 -> 74399 bytes bsp/renesas/docs/figures/add_uart1.png | Bin 0 -> 95223 bytes bsp/renesas/docs/figures/add_uart2.png | Bin 0 -> 28810 bytes bsp/renesas/docs/figures/add_uart3.png | Bin 0 -> 62100 bytes bsp/renesas/docs/figures/add_uart4.png | Bin 0 -> 57228 bytes bsp/renesas/docs/figures/add_uart5.png | Bin 0 -> 45483 bytes bsp/renesas/docs/figures/add_uart6.png | Bin 0 -> 48348 bytes bsp/renesas/docs/figures/add_uart7.png | Bin 0 -> 28556 bytes bsp/renesas/docs/figures/add_uart8.png | Bin 0 -> 35051 bytes bsp/renesas/docs/figures/add_uart9.png | Bin 0 -> 4678 bytes bsp/renesas/docs/figures/board_config.png | Bin 0 -> 66556 bytes bsp/renesas/docs/figures/bsp_crate.png | Bin 0 -> 18185 bytes bsp/renesas/docs/figures/bsp_crate1.png | Bin 0 -> 23726 bytes bsp/renesas/docs/figures/bsp_crate2.png | Bin 0 -> 14746 bytes bsp/renesas/docs/figures/bsp_gpio.png | Bin 0 -> 81829 bytes bsp/renesas/docs/figures/can.png | Bin 0 -> 16549 bytes .../picture => docs/figures}/can_callback.png | Bin .../figures}/can_menuconfig.png | Bin bsp/renesas/docs/figures/config1.png | Bin 0 -> 36184 bytes bsp/renesas/docs/figures/config2.png | Bin 0 -> 30636 bytes .../picture => docs/figures}/config_flash.png | Bin .../picture => docs/figures}/config_irq4.png | Bin bsp/renesas/docs/figures/cpk-ra6m4.png | Bin 0 -> 932716 bytes .../picture => docs/figures}/customize.png | Bin .../picture => docs/figures}/dac_config0.png | Bin .../picture => docs/figures}/dac_config1.png | Bin .../picture => docs/figures}/dac_config2.png | Bin .../picture => docs/figures}/dmac_config.png | Bin .../picture => docs/figures}/dmac_int.png | Bin .../picture => docs/figures}/drv_rw007.png | Bin bsp/renesas/docs/figures/e2studio.png | Bin 0 -> 19415 bytes bsp/renesas/docs/figures/e2studio1.png | Bin 0 -> 24671 bytes bsp/renesas/docs/figures/e2studio2.png | Bin 0 -> 50612 bytes bsp/renesas/docs/figures/e2studio3.png | Bin 0 -> 39023 bytes bsp/renesas/docs/figures/e2studio4.png | Bin 0 -> 61764 bytes bsp/renesas/docs/figures/e2studio5.png | Bin 0 -> 59433 bytes bsp/renesas/docs/figures/e2studio6.png | Bin 0 -> 5566 bytes .../figures}/flash_menuconfig.png | Bin bsp/renesas/docs/figures/frame.png | Bin 0 -> 62959 bytes .../figures/fsp_config.png} | Bin .../figures/fsp_config1.png} | Bin bsp/renesas/docs/figures/fsp_crate.png | Bin 0 -> 17168 bytes bsp/renesas/docs/figures/fsp_crate1.png | Bin 0 -> 24555 bytes bsp/renesas/docs/figures/fsp_crate2.png | Bin 0 -> 51745 bytes bsp/renesas/docs/figures/fsp_crate3.png | Bin 0 -> 5847 bytes bsp/renesas/docs/figures/fsp_crate4.png | Bin 0 -> 28436 bytes bsp/renesas/docs/figures/fsp_crate5.png | Bin 0 -> 100529 bytes bsp/renesas/docs/figures/fsp_crate6.png | Bin 0 -> 13733 bytes bsp/renesas/docs/figures/fsp_spi.png | Bin 0 -> 39277 bytes bsp/renesas/docs/figures/fsp_spi1.png | Bin 0 -> 47517 bytes bsp/renesas/docs/figures/fsp_spi2.png | Bin 0 -> 31631 bytes bsp/renesas/docs/figures/fsp_uart.png | Bin 0 -> 52734 bytes bsp/renesas/docs/figures/fsp_uart1.png | Bin 0 -> 37826 bytes .../picture => docs/figures}/fsp_version.png | Bin .../docs/picture => docs/figures}/gpio.png | Bin .../picture => docs/figures}/gpio_irq.png | Bin .../picture => docs/figures}/icu_stack.png | Bin .../figures}/import_changes.png | Bin .../docs/picture => docs/figures}/irq0.png | Bin .../docs/picture => docs/figures}/irq1.png | Bin bsp/renesas/docs/figures/jflash.png | Bin 0 -> 23547 bytes bsp/renesas/docs/figures/jflash1.png | Bin 0 -> 5392 bytes bsp/renesas/docs/figures/jflash2.png | Bin 0 -> 9796 bytes bsp/renesas/docs/figures/jflash3.png | Bin 0 -> 26983 bytes bsp/renesas/docs/figures/linkscript.png | Bin 0 -> 24070 bytes bsp/renesas/docs/figures/linkscript1.png | Bin 0 -> 10510 bytes bsp/renesas/docs/figures/mdk_build.png | Bin 0 -> 11992 bytes bsp/renesas/docs/figures/mdk_build1.png | Bin 0 -> 89184 bytes bsp/renesas/docs/figures/menuconfig2.png | Bin 0 -> 22495 bytes bsp/renesas/docs/figures/menuconfig_1.png | Bin 0 -> 10087 bytes bsp/renesas/docs/figures/menuconfig_2.png | Bin 0 -> 24539 bytes bsp/renesas/docs/figures/menuconfig_3.png | Bin 0 -> 19336 bytes bsp/renesas/docs/figures/menuconfig_4.png | Bin 0 -> 19418 bytes .../docs/figures/menuconfig_ra6m4cpk.png | Bin 0 -> 10018 bytes bsp/renesas/docs/figures/menuconfig_spi.png | Bin 0 -> 38452 bytes bsp/renesas/docs/figures/menuconfig_spi1.png | Bin 0 -> 21608 bytes .../picture => docs/figures}/openrasc.png | Bin .../docs/picture => docs/figures}/p105.png | Bin .../docs/picture => docs/figures}/pwm_env.png | Bin bsp/renesas/docs/figures/readme_faq1.png | Bin 0 -> 19419 bytes bsp/renesas/docs/figures/rtc.png | Bin 0 -> 27755 bytes .../picture => docs/figures}/rtc_config.png | Bin .../docs/picture => docs/figures}/rtc_env.png | Bin bsp/renesas/docs/figures/rtconfig_py.png | Bin 0 -> 25812 bytes bsp/renesas/docs/figures/rtdevice.png | Bin 0 -> 16327 bytes bsp/renesas/docs/figures/run_spi1.png | Bin 0 -> 5234 bytes .../picture => docs/figures}/rw007_int.png | Bin .../picture => docs/figures}/rw007_mdk.png | Bin .../figures}/rw007_mempool.png | Bin .../picture => docs/figures}/rw007_netdev.png | Bin .../picture => docs/figures}/rw007_ping.png | Bin .../picture => docs/figures}/rw007_pkg.png | Bin .../picture => docs/figures}/rw007_reset.png | Bin .../picture => docs/figures}/rw007_spi.png | Bin .../picture => docs/figures}/rw007_test.png | Bin .../figures}/rw007_wifijoin.png | Bin .../picture => docs/figures}/rw007_wlan.png | Bin bsp/renesas/docs/figures/save.png | Bin 0 -> 7427 bytes bsp/renesas/docs/figures/scons_mdk5.png | Bin 0 -> 19951 bytes .../picture => docs/figures}/sdhi_config.png | Bin .../picture => docs/figures}/sdhi_config1.png | Bin .../picture => docs/figures}/sdhi_dfs.png | Bin .../picture => docs/figures}/sdhi_env.png | Bin bsp/renesas/docs/figures/spi_add.png | Bin 0 -> 27415 bytes bsp/renesas/docs/figures/spi_env.png | Bin 0 -> 16502 bytes bsp/renesas/docs/figures/startup_c.png | Bin 0 -> 36896 bytes bsp/renesas/docs/figures/template_config.png | Bin 0 -> 48553 bytes bsp/renesas/docs/figures/template_config1.png | Bin 0 -> 15433 bytes bsp/renesas/docs/figures/template_config2.png | Bin 0 -> 33966 bytes bsp/renesas/docs/figures/template_config3.png | Bin 0 -> 33362 bytes bsp/renesas/docs/figures/template_config4.png | Bin 0 -> 34022 bytes bsp/renesas/docs/figures/template_config5.png | Bin 0 -> 25707 bytes bsp/renesas/docs/figures/template_open.png | Bin 0 -> 16007 bytes bsp/renesas/docs/figures/wdt.png | Bin 0 -> 19732 bytes .../picture => docs/figures}/wdt_config.png | Bin .../docs/picture => docs/figures}/wdt_env.png | Bin bsp/renesas/libraries/.ignore_format.yml | 6 + bsp/renesas/libraries/HAL_Drivers/Kconfig | 20 + .../HAL_Drivers}/SConscript | 0 .../HAL_Drivers}/config/drv_config.h | 26 +- .../HAL_Drivers}/config/ra6m4/adc_config.h | 0 .../HAL_Drivers}/config/ra6m4/can_config.h | 0 .../HAL_Drivers}/config/ra6m4/dac_config.h | 0 .../HAL_Drivers}/config/ra6m4/pwm_config.h | 0 .../HAL_Drivers/config/ra6m4/uart_config.h | 136 ++++ .../HAL_Drivers}/drv_adc.c | 0 .../HAL_Drivers}/drv_can.c | 0 .../HAL_Drivers}/drv_can.h | 0 .../HAL_Drivers}/drv_common.c | 2 +- .../HAL_Drivers}/drv_common.h | 0 .../HAL_Drivers}/drv_dac.c | 0 .../HAL_Drivers}/drv_flash.c | 0 .../HAL_Drivers}/drv_flash.h | 0 .../HAL_Drivers}/drv_gpio.c | 123 +--- .../HAL_Drivers}/drv_gpio.h | 1 + .../HAL_Drivers}/drv_pwm.c | 0 .../HAL_Drivers}/drv_pwm.h | 0 .../HAL_Drivers}/drv_rtc.c | 0 .../HAL_Drivers}/drv_sdhi.c | 0 .../HAL_Drivers}/drv_sdhi.h | 0 .../HAL_Drivers}/drv_soft_i2c.c | 0 .../HAL_Drivers}/drv_soft_i2c.h | 0 .../HAL_Drivers}/drv_spi.c | 4 +- .../HAL_Drivers}/drv_spi.h | 0 .../libraries/HAL_Drivers/drv_usart_v2.c | 500 +++++++++++++ .../HAL_Drivers}/drv_usart_v2.h | 0 .../HAL_Drivers}/drv_wdt.c | 0 bsp/renesas/libraries/Kconfig | 16 + bsp/renesas/libraries/bsp-template/.config | 692 ++++++++++++++++++ bsp/renesas/libraries/bsp-template/.gitignore | 5 + .../libraries/bsp-template/.ignore_format.yml | 9 + bsp/renesas/libraries/bsp-template/Kconfig | 29 + bsp/renesas/libraries/bsp-template/README.md | 191 +++++ bsp/renesas/libraries/bsp-template/SConscript | 30 + bsp/renesas/libraries/bsp-template/SConstruct | 54 ++ .../libraries/bsp-template/board/Kconfig | 58 ++ .../bsp-template/board}/SConscript | 0 .../bsp-template/board/ports/SConscript | 24 + .../bsp-template/board/ports/gpio_cfg.h | 82 +++ .../libraries/bsp-template/ra/SConscript | 34 + .../libraries/bsp-template/ra_cfg/SConscript | 22 + .../libraries/bsp-template/ra_gen/SConscript | 22 + bsp/renesas/libraries/bsp-template/rtconfig.h | 219 ++++++ .../libraries/bsp-template/rtconfig.py | 102 +++ bsp/renesas/ra6m4-cpk/.config | 46 +- bsp/renesas/ra6m4-cpk/.ignore_format.yml | 1 + .../ra6m4-cpk/.settings/standalone.prefs | 2 +- bsp/renesas/ra6m4-cpk/Kconfig | 13 +- bsp/renesas/ra6m4-cpk/README.md | 14 +- .../ra6m4-cpk/RTE/_Target_1/RTE_Components.h | 4 +- bsp/renesas/ra6m4-cpk/SConscript | 8 +- bsp/renesas/ra6m4-cpk/SConstruct | 14 + bsp/renesas/ra6m4-cpk/board/Kconfig | 474 ++++++++++++ .../ports => ra6m4-cpk/board}/SConscript | 4 + .../ra6m4-cpk/{drivers => board}/board.h | 0 bsp/renesas/ra6m4-cpk/board/ports/SConscript | 24 + .../{ports/rw007 => board/ports}/drv_rw007.c | 0 .../{ports/fal => board/ports}/fal_cfg.h | 0 bsp/renesas/ra6m4-cpk/board/ports/gpio_cfg.h | 82 +++ bsp/renesas/ra6m4-cpk/buildinfo.gpdsc | 3 + bsp/renesas/ra6m4-cpk/configuration.xml | 2 +- .../ra6m4-cpk/docs/picture/1635929089445.png | Bin 20086 -> 0 bytes .../ra6m4-cpk/docs/picture/adc_dac.png | Bin 15738 -> 0 bytes .../ra6m4-cpk/docs/picture/add_flash.png | Bin 23258 -> 0 bytes .../ra6m4-cpk/docs/picture/add_gpt1.png | Bin 59633 -> 0 bytes bsp/renesas/ra6m4-cpk/docs/picture/can.png | Bin 28449 -> 0 bytes .../ra6m4-cpk/docs/picture/rascuart.png | Bin 47912 -> 0 bytes .../ra6m4-cpk/docs/picture/rascuart1.png | Bin 67133 -> 0 bytes bsp/renesas/ra6m4-cpk/docs/picture/rtc.png | Bin 26149 -> 0 bytes .../ra6m4-cpk/docs/picture/rw007_spicfg.png | Bin 40655 -> 0 bytes bsp/renesas/ra6m4-cpk/docs/picture/spi.png | Bin 47012 -> 0 bytes .../ra6m4-cpk/docs/picture/spi_add.png | Bin 27753 -> 0 bytes .../ra6m4-cpk/docs/picture/spi_env.png | Bin 19124 -> 0 bytes .../ra6m4-cpk/docs/picture/spi_pin.png | Bin 26460 -> 0 bytes bsp/renesas/ra6m4-cpk/docs/picture/wdt.png | Bin 24188 -> 0 bytes bsp/renesas/ra6m4-cpk/drivers/Kconfig | 235 ------ bsp/renesas/ra6m4-cpk/drivers/SConscript | 55 -- .../ra6m4-cpk/drivers/config/drv_config.h | 46 -- .../drivers/config/ra6m4/uart_config.h | 36 - bsp/renesas/ra6m4-cpk/drivers/drv_common.c | 185 ----- bsp/renesas/ra6m4-cpk/drivers/drv_usart_v2.c | 199 ----- bsp/renesas/ra6m4-cpk/ports/fal/SConscript | 22 - bsp/renesas/ra6m4-cpk/ports/rw007/SConscript | 22 - bsp/renesas/ra6m4-cpk/project.uvoptx | 482 +++++++++++- bsp/renesas/ra6m4-cpk/project.uvprojx | 328 ++++----- bsp/renesas/ra6m4-cpk/ra/SConscript | 18 +- bsp/renesas/ra6m4-cpk/ra_cfg/SConscript | 10 +- bsp/renesas/ra6m4-cpk/ra_gen/SConscript | 8 +- bsp/renesas/ra6m4-cpk/ra_gen/hal_data.c | 2 +- bsp/renesas/ra6m4-cpk/ra_gen/hal_data.h | 4 +- bsp/renesas/ra6m4-cpk/ra_gen/vector_data.c | 2 +- bsp/renesas/ra6m4-cpk/rtconfig.h | 16 +- bsp/renesas/ra6m4-cpk/rtconfig.py | 38 +- bsp/renesas/ra6m4-cpk/template.uvprojx | 2 +- bsp/renesas/ra6m4-iot/.config | 45 +- bsp/renesas/ra6m4-iot/.ignore_format.yml | 1 + .../ra6m4-iot/.settings/standalone.prefs | 3 +- bsp/renesas/ra6m4-iot/Kconfig | 13 +- bsp/renesas/ra6m4-iot/README.md | 14 +- .../ra6m4-iot/RTE/_Target_1/RTE_Components.h | 4 +- bsp/renesas/ra6m4-iot/SConscript | 8 +- bsp/renesas/ra6m4-iot/SConstruct | 18 +- bsp/renesas/ra6m4-iot/board/Kconfig | 481 ++++++++++++ bsp/renesas/ra6m4-iot/board/SConscript | 16 + .../ra6m4-iot/{drivers => board}/board.h | 0 bsp/renesas/ra6m4-iot/board/ports/SConscript | 24 + .../{ports/rw007 => board/ports}/drv_rw007.c | 0 .../{ports/fal => board/ports}/fal_cfg.h | 0 bsp/renesas/ra6m4-iot/board/ports/gpio_cfg.h | 72 ++ bsp/renesas/ra6m4-iot/buildinfo.gpdsc | 20 + bsp/renesas/ra6m4-iot/configuration.xml | 2 +- .../ra6m4-iot/docs/picture/1635909864954.png | Bin 34028 -> 0 bytes .../ra6m4-iot/docs/picture/1635929089445.png | Bin 20086 -> 0 bytes .../ra6m4-iot/docs/picture/adc_config.png | Bin 23810 -> 0 bytes .../ra6m4-iot/docs/picture/adc_config1.png | Bin 36349 -> 0 bytes .../ra6m4-iot/docs/picture/adc_dac.png | Bin 15738 -> 0 bytes .../ra6m4-iot/docs/picture/add_flash.png | Bin 23258 -> 0 bytes .../ra6m4-iot/docs/picture/add_gpt1.png | Bin 59633 -> 0 bytes .../ra6m4-iot/docs/picture/add_gpt2.png | Bin 80595 -> 0 bytes .../ra6m4-iot/docs/picture/add_gpt3.png | Bin 36542 -> 0 bytes bsp/renesas/ra6m4-iot/docs/picture/board.png | Bin 0 -> 14176 bytes bsp/renesas/ra6m4-iot/docs/picture/can.png | Bin 28449 -> 0 bytes .../ra6m4-iot/docs/picture/can_callback.png | Bin 21634 -> 0 bytes .../ra6m4-iot/docs/picture/can_menuconfig.png | Bin 22685 -> 0 bytes .../ra6m4-iot/docs/picture/config_flash.png | Bin 11975 -> 0 bytes .../ra6m4-iot/docs/picture/config_irq4.png | Bin 16147 -> 0 bytes .../docs/picture/config_ppp_device_code.png | Bin 0 -> 73077 bytes .../docs/picture/configure_apn_modem.png | Bin 0 -> 33491 bytes .../ra6m4-iot/docs/picture/configure_lwip.png | Bin 0 -> 86933 bytes .../ra6m4-iot/docs/picture/dac_config0.png | Bin 24703 -> 0 bytes .../ra6m4-iot/docs/picture/dac_config1.png | Bin 31852 -> 0 bytes .../ra6m4-iot/docs/picture/dac_config2.png | Bin 20677 -> 0 bytes .../ra6m4-iot/docs/picture/dmac_config.png | Bin 17767 -> 0 bytes .../ra6m4-iot/docs/picture/dmac_int.png | Bin 32127 -> 0 bytes .../ra6m4-iot/docs/picture/drv_rw007.png | Bin 25804 -> 0 bytes .../docs/picture/flash_menuconfig.png | Bin 18934 -> 0 bytes .../ra6m4-iot/docs/picture/fsp_version.png | Bin 5006 -> 0 bytes bsp/renesas/ra6m4-iot/docs/picture/gpio.png | Bin 35359 -> 0 bytes .../ra6m4-iot/docs/picture/gpio_irq.png | Bin 43464 -> 0 bytes .../ra6m4-iot/docs/picture/icu_stack.png | Bin 25432 -> 0 bytes .../ra6m4-iot/docs/picture/import_changes.png | Bin 14142 -> 0 bytes bsp/renesas/ra6m4-iot/docs/picture/irq0.png | Bin 36998 -> 0 bytes bsp/renesas/ra6m4-iot/docs/picture/irq1.png | Bin 15952 -> 0 bytes bsp/renesas/ra6m4-iot/docs/picture/p105.png | Bin 25303 -> 0 bytes .../ra6m4-iot/docs/picture/ppp_sim.png | Bin 0 -> 124749 bytes .../ra6m4-iot/docs/picture/ppp_test.png | Bin 0 -> 35426 bytes .../ra6m4-iot/docs/picture/ppp_test1.png | Bin 0 -> 17917 bytes .../ra6m4-iot/docs/picture/pwm_env.png | Bin 33223 -> 0 bytes .../ra6m4-iot/docs/picture/rascuart.png | Bin 47912 -> 0 bytes .../ra6m4-iot/docs/picture/rascuart1.png | Bin 67133 -> 0 bytes bsp/renesas/ra6m4-iot/docs/picture/rtc.png | Bin 26149 -> 0 bytes .../ra6m4-iot/docs/picture/rtc_config.png | Bin 25772 -> 0 bytes .../ra6m4-iot/docs/picture/rtc_env.png | Bin 16930 -> 0 bytes .../ra6m4-iot/docs/picture/rw007_int.png | Bin 16547 -> 0 bytes .../ra6m4-iot/docs/picture/rw007_mdk.png | Bin 26640 -> 0 bytes .../ra6m4-iot/docs/picture/rw007_mempool.png | Bin 11818 -> 0 bytes .../ra6m4-iot/docs/picture/rw007_netdev.png | Bin 21237 -> 0 bytes .../ra6m4-iot/docs/picture/rw007_ping.png | Bin 18219 -> 0 bytes .../ra6m4-iot/docs/picture/rw007_pkg.png | Bin 20854 -> 0 bytes .../ra6m4-iot/docs/picture/rw007_reset.png | Bin 19932 -> 0 bytes .../ra6m4-iot/docs/picture/rw007_spi.png | Bin 18049 -> 0 bytes .../ra6m4-iot/docs/picture/rw007_spicfg.png | Bin 40655 -> 0 bytes .../ra6m4-iot/docs/picture/rw007_test.png | Bin 30349 -> 0 bytes .../ra6m4-iot/docs/picture/rw007_wifijoin.png | Bin 11478 -> 0 bytes .../ra6m4-iot/docs/picture/rw007_wlan.png | Bin 17945 -> 0 bytes .../ra6m4-iot/docs/picture/sdhi_config.png | Bin 32652 -> 0 bytes .../ra6m4-iot/docs/picture/sdhi_config1.png | Bin 30659 -> 0 bytes .../ra6m4-iot/docs/picture/sdhi_env.png | Bin 28889 -> 0 bytes .../docs/picture/select_ppp_device.png | Bin 0 -> 93008 bytes bsp/renesas/ra6m4-iot/docs/picture/spi.png | Bin 47012 -> 0 bytes .../ra6m4-iot/docs/picture/spi_add.png | Bin 27753 -> 0 bytes .../ra6m4-iot/docs/picture/spi_env.png | Bin 19124 -> 0 bytes .../ra6m4-iot/docs/picture/spi_pin.png | Bin 26460 -> 0 bytes bsp/renesas/ra6m4-iot/docs/picture/wdt.png | Bin 24188 -> 0 bytes .../ra6m4-iot/docs/picture/wdt_config.png | Bin 20947 -> 0 bytes .../ra6m4-iot/docs/picture/wdt_env.png | Bin 22934 -> 0 bytes bsp/renesas/ra6m4-iot/docs/使用PPP方式上网.md | 36 + .../ra6m4-iot/docs/使用瑞萨FSP配置工具.md | 329 --------- bsp/renesas/ra6m4-iot/drivers/Kconfig | 274 ------- .../drivers/config/ra6m4/adc_config.h | 41 -- .../drivers/config/ra6m4/can_config.h | 48 -- .../drivers/config/ra6m4/dac_config.h | 41 -- .../drivers/config/ra6m4/pwm_config.h | 68 -- .../drivers/config/ra6m4/uart_config.h | 47 -- bsp/renesas/ra6m4-iot/drivers/drv_adc.c | 132 ---- bsp/renesas/ra6m4-iot/drivers/drv_can.c | 310 -------- bsp/renesas/ra6m4-iot/drivers/drv_can.h | 48 -- bsp/renesas/ra6m4-iot/drivers/drv_common.h | 36 - bsp/renesas/ra6m4-iot/drivers/drv_dac.c | 113 --- bsp/renesas/ra6m4-iot/drivers/drv_flash.c | 283 ------- bsp/renesas/ra6m4-iot/drivers/drv_flash.h | 64 -- bsp/renesas/ra6m4-iot/drivers/drv_gpio.c | 589 --------------- bsp/renesas/ra6m4-iot/drivers/drv_gpio.h | 42 -- bsp/renesas/ra6m4-iot/drivers/drv_pwm.c | 220 ------ bsp/renesas/ra6m4-iot/drivers/drv_pwm.h | 34 - bsp/renesas/ra6m4-iot/drivers/drv_rtc.c | 226 ------ bsp/renesas/ra6m4-iot/drivers/drv_soft_i2c.c | 218 ------ bsp/renesas/ra6m4-iot/drivers/drv_soft_i2c.h | 53 -- bsp/renesas/ra6m4-iot/drivers/drv_spi.c | 290 -------- bsp/renesas/ra6m4-iot/drivers/drv_spi.h | 51 -- bsp/renesas/ra6m4-iot/drivers/drv_usart_v2.c | 236 ------ bsp/renesas/ra6m4-iot/drivers/drv_usart_v2.h | 40 - bsp/renesas/ra6m4-iot/drivers/drv_wdt.c | 94 --- bsp/renesas/ra6m4-iot/ports/fal/SConscript | 22 - bsp/renesas/ra6m4-iot/ports/rw007/SConscript | 22 - bsp/renesas/ra6m4-iot/project.uvoptx | 478 +++++++++++- bsp/renesas/ra6m4-iot/project.uvprojx | 297 ++++---- bsp/renesas/ra6m4-iot/ra/SConscript | 18 +- bsp/renesas/ra6m4-iot/ra_cfg/SConscript | 9 +- bsp/renesas/ra6m4-iot/ra_gen/SConscript | 8 +- bsp/renesas/ra6m4-iot/ra_gen/hal_data.c | 2 +- bsp/renesas/ra6m4-iot/ra_gen/hal_data.h | 4 +- bsp/renesas/ra6m4-iot/rtconfig.h | 16 +- bsp/renesas/ra6m4-iot/rtconfig.py | 38 +- bsp/renesas/ra6m4-iot/template.uvprojx | 2 +- bsp/renesas/tools/sdk_dist.py | 20 + 353 files changed, 5727 insertions(+), 5495 deletions(-) create mode 100644 bsp/renesas/README.md create mode 100644 bsp/renesas/docs/RA系列BSP制作教程.md create mode 100644 bsp/renesas/docs/RA系列BSP外设驱动使用教程.md rename bsp/renesas/{ra6m4-cpk/docs/使用瑞萨FSP配置工具.md => docs/RA系列使用FSP配置外设驱动.md} (63%) create mode 100644 bsp/renesas/docs/RA系列外设驱动添加指南.md create mode 100644 bsp/renesas/docs/RA系列驱动介绍.md rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/1635909864954.png (100%) create mode 100644 bsp/renesas/docs/figures/1635929089445.png create mode 100644 bsp/renesas/docs/figures/Kconfig.png create mode 100644 bsp/renesas/docs/figures/Peripheral.png rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/adc_config.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/adc_config1.png (100%) create mode 100644 bsp/renesas/docs/figures/adc_dac.png create mode 100644 bsp/renesas/docs/figures/add_flash.png create mode 100644 bsp/renesas/docs/figures/add_gpt1.png rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/add_gpt2.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/add_gpt3.png (100%) create mode 100644 bsp/renesas/docs/figures/add_uart.png create mode 100644 bsp/renesas/docs/figures/add_uart1.png create mode 100644 bsp/renesas/docs/figures/add_uart2.png create mode 100644 bsp/renesas/docs/figures/add_uart3.png create mode 100644 bsp/renesas/docs/figures/add_uart4.png create mode 100644 bsp/renesas/docs/figures/add_uart5.png create mode 100644 bsp/renesas/docs/figures/add_uart6.png create mode 100644 bsp/renesas/docs/figures/add_uart7.png create mode 100644 bsp/renesas/docs/figures/add_uart8.png create mode 100644 bsp/renesas/docs/figures/add_uart9.png create mode 100644 bsp/renesas/docs/figures/board_config.png create mode 100644 bsp/renesas/docs/figures/bsp_crate.png create mode 100644 bsp/renesas/docs/figures/bsp_crate1.png create mode 100644 bsp/renesas/docs/figures/bsp_crate2.png create mode 100644 bsp/renesas/docs/figures/bsp_gpio.png create mode 100644 bsp/renesas/docs/figures/can.png rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/can_callback.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/can_menuconfig.png (100%) create mode 100644 bsp/renesas/docs/figures/config1.png create mode 100644 bsp/renesas/docs/figures/config2.png rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/config_flash.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/config_irq4.png (100%) create mode 100644 bsp/renesas/docs/figures/cpk-ra6m4.png rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/customize.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/dac_config0.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/dac_config1.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/dac_config2.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/dmac_config.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/dmac_int.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/drv_rw007.png (100%) create mode 100644 bsp/renesas/docs/figures/e2studio.png create mode 100644 bsp/renesas/docs/figures/e2studio1.png create mode 100644 bsp/renesas/docs/figures/e2studio2.png create mode 100644 bsp/renesas/docs/figures/e2studio3.png create mode 100644 bsp/renesas/docs/figures/e2studio4.png create mode 100644 bsp/renesas/docs/figures/e2studio5.png create mode 100644 bsp/renesas/docs/figures/e2studio6.png rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/flash_menuconfig.png (100%) create mode 100644 bsp/renesas/docs/figures/frame.png rename bsp/renesas/{ra6m4-iot/docs/picture/customize.png => docs/figures/fsp_config.png} (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture/openrasc.png => docs/figures/fsp_config1.png} (100%) create mode 100644 bsp/renesas/docs/figures/fsp_crate.png create mode 100644 bsp/renesas/docs/figures/fsp_crate1.png create mode 100644 bsp/renesas/docs/figures/fsp_crate2.png create mode 100644 bsp/renesas/docs/figures/fsp_crate3.png create mode 100644 bsp/renesas/docs/figures/fsp_crate4.png create mode 100644 bsp/renesas/docs/figures/fsp_crate5.png create mode 100644 bsp/renesas/docs/figures/fsp_crate6.png create mode 100644 bsp/renesas/docs/figures/fsp_spi.png create mode 100644 bsp/renesas/docs/figures/fsp_spi1.png create mode 100644 bsp/renesas/docs/figures/fsp_spi2.png create mode 100644 bsp/renesas/docs/figures/fsp_uart.png create mode 100644 bsp/renesas/docs/figures/fsp_uart1.png rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/fsp_version.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/gpio.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/gpio_irq.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/icu_stack.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/import_changes.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/irq0.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/irq1.png (100%) create mode 100644 bsp/renesas/docs/figures/jflash.png create mode 100644 bsp/renesas/docs/figures/jflash1.png create mode 100644 bsp/renesas/docs/figures/jflash2.png create mode 100644 bsp/renesas/docs/figures/jflash3.png create mode 100644 bsp/renesas/docs/figures/linkscript.png create mode 100644 bsp/renesas/docs/figures/linkscript1.png create mode 100644 bsp/renesas/docs/figures/mdk_build.png create mode 100644 bsp/renesas/docs/figures/mdk_build1.png create mode 100644 bsp/renesas/docs/figures/menuconfig2.png create mode 100644 bsp/renesas/docs/figures/menuconfig_1.png create mode 100644 bsp/renesas/docs/figures/menuconfig_2.png create mode 100644 bsp/renesas/docs/figures/menuconfig_3.png create mode 100644 bsp/renesas/docs/figures/menuconfig_4.png create mode 100644 bsp/renesas/docs/figures/menuconfig_ra6m4cpk.png create mode 100644 bsp/renesas/docs/figures/menuconfig_spi.png create mode 100644 bsp/renesas/docs/figures/menuconfig_spi1.png rename bsp/renesas/{ra6m4-iot/docs/picture => docs/figures}/openrasc.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/p105.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/pwm_env.png (100%) create mode 100644 bsp/renesas/docs/figures/readme_faq1.png create mode 100644 bsp/renesas/docs/figures/rtc.png rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/rtc_config.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/rtc_env.png (100%) create mode 100644 bsp/renesas/docs/figures/rtconfig_py.png create mode 100644 bsp/renesas/docs/figures/rtdevice.png create mode 100644 bsp/renesas/docs/figures/run_spi1.png rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/rw007_int.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/rw007_mdk.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/rw007_mempool.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/rw007_netdev.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/rw007_ping.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/rw007_pkg.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/rw007_reset.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/rw007_spi.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/rw007_test.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/rw007_wifijoin.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/rw007_wlan.png (100%) create mode 100644 bsp/renesas/docs/figures/save.png create mode 100644 bsp/renesas/docs/figures/scons_mdk5.png rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/sdhi_config.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/sdhi_config1.png (100%) rename bsp/renesas/{ra6m4-iot/docs/picture => docs/figures}/sdhi_dfs.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/sdhi_env.png (100%) create mode 100644 bsp/renesas/docs/figures/spi_add.png create mode 100644 bsp/renesas/docs/figures/spi_env.png create mode 100644 bsp/renesas/docs/figures/startup_c.png create mode 100644 bsp/renesas/docs/figures/template_config.png create mode 100644 bsp/renesas/docs/figures/template_config1.png create mode 100644 bsp/renesas/docs/figures/template_config2.png create mode 100644 bsp/renesas/docs/figures/template_config3.png create mode 100644 bsp/renesas/docs/figures/template_config4.png create mode 100644 bsp/renesas/docs/figures/template_config5.png create mode 100644 bsp/renesas/docs/figures/template_open.png create mode 100644 bsp/renesas/docs/figures/wdt.png rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/wdt_config.png (100%) rename bsp/renesas/{ra6m4-cpk/docs/picture => docs/figures}/wdt_env.png (100%) create mode 100644 bsp/renesas/libraries/.ignore_format.yml create mode 100644 bsp/renesas/libraries/HAL_Drivers/Kconfig rename bsp/renesas/{ra6m4-iot/drivers => libraries/HAL_Drivers}/SConscript (100%) rename bsp/renesas/{ra6m4-iot/drivers => libraries/HAL_Drivers}/config/drv_config.h (63%) rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/config/ra6m4/adc_config.h (100%) rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/config/ra6m4/can_config.h (100%) rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/config/ra6m4/dac_config.h (100%) rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/config/ra6m4/pwm_config.h (100%) create mode 100644 bsp/renesas/libraries/HAL_Drivers/config/ra6m4/uart_config.h rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/drv_adc.c (100%) rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/drv_can.c (100%) rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/drv_can.h (100%) rename bsp/renesas/{ra6m4-iot/drivers => libraries/HAL_Drivers}/drv_common.c (99%) rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/drv_common.h (100%) rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/drv_dac.c (100%) rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/drv_flash.c (100%) rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/drv_flash.h (100%) rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/drv_gpio.c (84%) rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/drv_gpio.h (99%) rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/drv_pwm.c (100%) rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/drv_pwm.h (100%) rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/drv_rtc.c (100%) rename bsp/renesas/{ra6m4-iot/drivers => libraries/HAL_Drivers}/drv_sdhi.c (100%) rename bsp/renesas/{ra6m4-iot/drivers => libraries/HAL_Drivers}/drv_sdhi.h (100%) rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/drv_soft_i2c.c (100%) rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/drv_soft_i2c.h (100%) rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/drv_spi.c (98%) rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/drv_spi.h (100%) create mode 100644 bsp/renesas/libraries/HAL_Drivers/drv_usart_v2.c rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/drv_usart_v2.h (100%) rename bsp/renesas/{ra6m4-cpk/drivers => libraries/HAL_Drivers}/drv_wdt.c (100%) create mode 100644 bsp/renesas/libraries/Kconfig create mode 100644 bsp/renesas/libraries/bsp-template/.config create mode 100644 bsp/renesas/libraries/bsp-template/.gitignore create mode 100644 bsp/renesas/libraries/bsp-template/.ignore_format.yml create mode 100644 bsp/renesas/libraries/bsp-template/Kconfig create mode 100644 bsp/renesas/libraries/bsp-template/README.md create mode 100644 bsp/renesas/libraries/bsp-template/SConscript create mode 100644 bsp/renesas/libraries/bsp-template/SConstruct create mode 100644 bsp/renesas/libraries/bsp-template/board/Kconfig rename bsp/renesas/{ra6m4-cpk/ports => libraries/bsp-template/board}/SConscript (100%) create mode 100644 bsp/renesas/libraries/bsp-template/board/ports/SConscript create mode 100644 bsp/renesas/libraries/bsp-template/board/ports/gpio_cfg.h create mode 100644 bsp/renesas/libraries/bsp-template/ra/SConscript create mode 100644 bsp/renesas/libraries/bsp-template/ra_cfg/SConscript create mode 100644 bsp/renesas/libraries/bsp-template/ra_gen/SConscript create mode 100644 bsp/renesas/libraries/bsp-template/rtconfig.h create mode 100644 bsp/renesas/libraries/bsp-template/rtconfig.py create mode 100644 bsp/renesas/ra6m4-cpk/board/Kconfig rename bsp/renesas/{ra6m4-iot/ports => ra6m4-cpk/board}/SConscript (70%) rename bsp/renesas/ra6m4-cpk/{drivers => board}/board.h (100%) create mode 100644 bsp/renesas/ra6m4-cpk/board/ports/SConscript rename bsp/renesas/ra6m4-cpk/{ports/rw007 => board/ports}/drv_rw007.c (100%) rename bsp/renesas/ra6m4-cpk/{ports/fal => board/ports}/fal_cfg.h (100%) create mode 100644 bsp/renesas/ra6m4-cpk/board/ports/gpio_cfg.h delete mode 100644 bsp/renesas/ra6m4-cpk/docs/picture/1635929089445.png delete mode 100644 bsp/renesas/ra6m4-cpk/docs/picture/adc_dac.png delete mode 100644 bsp/renesas/ra6m4-cpk/docs/picture/add_flash.png delete mode 100644 bsp/renesas/ra6m4-cpk/docs/picture/add_gpt1.png delete mode 100644 bsp/renesas/ra6m4-cpk/docs/picture/can.png delete mode 100644 bsp/renesas/ra6m4-cpk/docs/picture/rascuart.png delete mode 100644 bsp/renesas/ra6m4-cpk/docs/picture/rascuart1.png delete mode 100644 bsp/renesas/ra6m4-cpk/docs/picture/rtc.png delete mode 100644 bsp/renesas/ra6m4-cpk/docs/picture/rw007_spicfg.png delete mode 100644 bsp/renesas/ra6m4-cpk/docs/picture/spi.png delete mode 100644 bsp/renesas/ra6m4-cpk/docs/picture/spi_add.png delete mode 100644 bsp/renesas/ra6m4-cpk/docs/picture/spi_env.png delete mode 100644 bsp/renesas/ra6m4-cpk/docs/picture/spi_pin.png delete mode 100644 bsp/renesas/ra6m4-cpk/docs/picture/wdt.png delete mode 100644 bsp/renesas/ra6m4-cpk/drivers/Kconfig delete mode 100644 bsp/renesas/ra6m4-cpk/drivers/SConscript delete mode 100644 bsp/renesas/ra6m4-cpk/drivers/config/drv_config.h delete mode 100644 bsp/renesas/ra6m4-cpk/drivers/config/ra6m4/uart_config.h delete mode 100644 bsp/renesas/ra6m4-cpk/drivers/drv_common.c delete mode 100644 bsp/renesas/ra6m4-cpk/drivers/drv_usart_v2.c delete mode 100644 bsp/renesas/ra6m4-cpk/ports/fal/SConscript delete mode 100644 bsp/renesas/ra6m4-cpk/ports/rw007/SConscript create mode 100644 bsp/renesas/ra6m4-iot/board/Kconfig create mode 100644 bsp/renesas/ra6m4-iot/board/SConscript rename bsp/renesas/ra6m4-iot/{drivers => board}/board.h (100%) create mode 100644 bsp/renesas/ra6m4-iot/board/ports/SConscript rename bsp/renesas/ra6m4-iot/{ports/rw007 => board/ports}/drv_rw007.c (100%) rename bsp/renesas/ra6m4-iot/{ports/fal => board/ports}/fal_cfg.h (100%) create mode 100644 bsp/renesas/ra6m4-iot/board/ports/gpio_cfg.h delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/1635909864954.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/1635929089445.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/adc_config.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/adc_config1.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/adc_dac.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/add_flash.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/add_gpt1.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/add_gpt2.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/add_gpt3.png create mode 100644 bsp/renesas/ra6m4-iot/docs/picture/board.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/can.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/can_callback.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/can_menuconfig.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/config_flash.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/config_irq4.png create mode 100644 bsp/renesas/ra6m4-iot/docs/picture/config_ppp_device_code.png create mode 100644 bsp/renesas/ra6m4-iot/docs/picture/configure_apn_modem.png create mode 100644 bsp/renesas/ra6m4-iot/docs/picture/configure_lwip.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/dac_config0.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/dac_config1.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/dac_config2.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/dmac_config.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/dmac_int.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/drv_rw007.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/flash_menuconfig.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/fsp_version.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/gpio.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/gpio_irq.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/icu_stack.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/import_changes.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/irq0.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/irq1.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/p105.png create mode 100644 bsp/renesas/ra6m4-iot/docs/picture/ppp_sim.png create mode 100644 bsp/renesas/ra6m4-iot/docs/picture/ppp_test.png create mode 100644 bsp/renesas/ra6m4-iot/docs/picture/ppp_test1.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/pwm_env.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/rascuart.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/rascuart1.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/rtc.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/rtc_config.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/rtc_env.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/rw007_int.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/rw007_mdk.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/rw007_mempool.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/rw007_netdev.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/rw007_ping.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/rw007_pkg.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/rw007_reset.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/rw007_spi.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/rw007_spicfg.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/rw007_test.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/rw007_wifijoin.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/rw007_wlan.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/sdhi_config.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/sdhi_config1.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/sdhi_env.png create mode 100644 bsp/renesas/ra6m4-iot/docs/picture/select_ppp_device.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/spi.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/spi_add.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/spi_env.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/spi_pin.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/wdt.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/wdt_config.png delete mode 100644 bsp/renesas/ra6m4-iot/docs/picture/wdt_env.png create mode 100644 bsp/renesas/ra6m4-iot/docs/使用PPP方式上网.md delete mode 100644 bsp/renesas/ra6m4-iot/docs/使用瑞萨FSP配置工具.md delete mode 100644 bsp/renesas/ra6m4-iot/drivers/Kconfig delete mode 100644 bsp/renesas/ra6m4-iot/drivers/config/ra6m4/adc_config.h delete mode 100644 bsp/renesas/ra6m4-iot/drivers/config/ra6m4/can_config.h delete mode 100644 bsp/renesas/ra6m4-iot/drivers/config/ra6m4/dac_config.h delete mode 100644 bsp/renesas/ra6m4-iot/drivers/config/ra6m4/pwm_config.h delete mode 100644 bsp/renesas/ra6m4-iot/drivers/config/ra6m4/uart_config.h delete mode 100644 bsp/renesas/ra6m4-iot/drivers/drv_adc.c delete mode 100644 bsp/renesas/ra6m4-iot/drivers/drv_can.c delete mode 100644 bsp/renesas/ra6m4-iot/drivers/drv_can.h delete mode 100644 bsp/renesas/ra6m4-iot/drivers/drv_common.h delete mode 100644 bsp/renesas/ra6m4-iot/drivers/drv_dac.c delete mode 100644 bsp/renesas/ra6m4-iot/drivers/drv_flash.c delete mode 100644 bsp/renesas/ra6m4-iot/drivers/drv_flash.h delete mode 100644 bsp/renesas/ra6m4-iot/drivers/drv_gpio.c delete mode 100644 bsp/renesas/ra6m4-iot/drivers/drv_gpio.h delete mode 100644 bsp/renesas/ra6m4-iot/drivers/drv_pwm.c delete mode 100644 bsp/renesas/ra6m4-iot/drivers/drv_pwm.h delete mode 100644 bsp/renesas/ra6m4-iot/drivers/drv_rtc.c delete mode 100644 bsp/renesas/ra6m4-iot/drivers/drv_soft_i2c.c delete mode 100644 bsp/renesas/ra6m4-iot/drivers/drv_soft_i2c.h delete mode 100644 bsp/renesas/ra6m4-iot/drivers/drv_spi.c delete mode 100644 bsp/renesas/ra6m4-iot/drivers/drv_spi.h delete mode 100644 bsp/renesas/ra6m4-iot/drivers/drv_usart_v2.c delete mode 100644 bsp/renesas/ra6m4-iot/drivers/drv_usart_v2.h delete mode 100644 bsp/renesas/ra6m4-iot/drivers/drv_wdt.c delete mode 100644 bsp/renesas/ra6m4-iot/ports/fal/SConscript delete mode 100644 bsp/renesas/ra6m4-iot/ports/rw007/SConscript create mode 100644 bsp/renesas/tools/sdk_dist.py diff --git a/bsp/renesas/README.md b/bsp/renesas/README.md new file mode 100644 index 0000000000..fbaaa21db9 --- /dev/null +++ b/bsp/renesas/README.md @@ -0,0 +1,22 @@ + +# RA BSP 说明 + +RA 系列 BSP 目前支持情况如下表所示: + +| **BSP 文件夹名称** | **开发板名称** | +|:------------------------- |:-------------------------- | +| **RA6 系列** | | +| [ra6m4-cpk](ra6m4-cpk) | Renesas 官方 CPK-RA6M4 开发板 | +| [ra6m4-iot](ra6m4-iot) | Renesas 官方 IOT-RA6M4 开发板 | + +可以通过阅读相应 BSP 下的 README 来快速上手,如果想要使用 BSP 更多功能可参考 docs 文件夹下提供的说明文档,如下表所示: + +| **BSP 使用教程** | **简介** | +|:-------------------- |:------------------------------------------------- | +| [外设驱动使用教程](docs/RA系列BSP外设驱动使用教程.md) | 讲解 BSP 上更多外设驱动的使用方法 | +| [外设驱动介绍与应用](docs/RA系列驱动介绍.md) | 讲解 RA 系列 BSP 驱动的支持情况,以及如何利用驱动框架开发应用程序 | +| [使用 FSP 配置外设驱动](docs/RA系列使用FSP配置外设驱动.md) | 介绍如何使用 FSP 工具添加和配置外设 | +| **BSP 制作与提交** | **简介** | +| [BSP 制作教程](docs/RA系列BSP制作教程.md) | 讲解 RA 系列 BSP 的制作方法,以及在制作 BSP 和提交 BSP 时应当遵守的规范 | +| [外设驱动添加指南](docs/RA系列外设驱动添加指南.md) | 讲解 BSP 添加更多设备驱动的方法 | + diff --git a/bsp/renesas/docs/RA系列BSP制作教程.md b/bsp/renesas/docs/RA系列BSP制作教程.md new file mode 100644 index 0000000000..ffc0615de1 --- /dev/null +++ b/bsp/renesas/docs/RA系列BSP制作教程.md @@ -0,0 +1,383 @@ +# RA 系列 BSP 制作教程 + +本文主要介绍 RENESAS RA 系列开发板的 BSP 制作教程,此教程能够帮助开发者更加方便快捷的制作新的 RA 系列 BSP,更好的理解 RA 系列 BSP 的框架结构。 + +在 RA 系列的每个 BSP 目录中包含 RA 模板工程、board、RT-Thread 的工程配置及构建脚本等,而对接到 RT-Thread 系统的通用驱动文件则存放在`renesas\libraries\HAL_Drivers`中。这两个部分共同组成一个完整的 BSP 工程。 + +在 RA 系列的 BSP 中引入了瑞萨电子的**[灵活配置软件包](https://www2.renesas.cn/jp/zh/software-tool/flexible-software-package-fsp)**(下文简称 FSP)配置工具,为使用 RA 系列 ARM 微控制器的嵌入式系统设计提供简单易用且可扩展的高质量软件。FSP 包括高性能、低内存占用的业界一流的 HAL 驱动程序,具有图形化配置界面和智能代码生成器。 + +RA 系列 BSP 框架的主要特性如下: + +- 使用 FSP 生成的 RA 模板工程,降低新 BSP 的添加难度; +- 通用的驱动文件,开发者可以方便地使用所有驱动; +- 使用 FSP 配置工具对芯片外设进行图形化配置; + +## 1. BSP 框架介绍 + +BSP 框架结构如下图所示: + +![BSP 框架图](./figures/frame.png) + +每一个 BSP 主要由两部分组成,分别是通用驱动库、特定开发板 BSP,下面的表格以 ra6m4-cpk 为例介绍这几个部分: + +|项目|文件夹|说明| +| - | - | :-- | +| 通用库 | renesas\libraries\HAL_Drivers | 用于存放对接 RT-Thread 驱动框架的通用外设驱动 | +| 特定开发板 BSP | renesas\ra6m4-cpk | CPK-RA6M4 开发板的 BSP 工程 | + +## 2. 知识准备 + +制作一个 BSP 的过程就是构建一个新系统的过程,因此想要制作出好用的 BSP,要对 RT-Thread 系统的构建过程有一定了解,需要的知识准备如下所示: + +- 掌握 RA 系列 BSP 的使用方法 + + 了解 BSP 的使用方法,可以阅读 [BSP 说明文档](../README.md) 中使用教程表格内的文档。了解外设驱动的添加方法可以参考《外设驱动添加指南》。 + +- 了解 [Scons](https://www.rt-thread.org/document/site/#/development-tools/scons/scons) 工程构建方法 + + RT-Thread 使用 Scons 作为系统的构建工具,因此了解 Scons 的常用命令对制作新 BSP 是基本要求。 + +- 了解[设备驱动框架](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/device) + + 在 RT-Thread 系统中,应用程序通过设备驱动框架来操作硬件,因此了解设备驱动框架,对添加 BSP 驱动是很重要的。 + +- 了解 [Kconfig](https://www.rt-thread.org/document/site/#/development-tools/kconfig/kconfig) 语法 + + RT-Thread 系统通过 menuconfig 的方式进行配置,而 menuconfig 中的选项是由 Kconfig 文件决定的,因此想要对 RT-Thread 系统进行配置,需要对 kconfig 语法有一定了解。 + +- 熟悉 [FSP](https://www2.renesas.cn/jp/zh/software-tool/flexible-software-package-fsp) 配置工具的使用 + + FSP 提供了图形化配置工具和智能代码生成器,在制作和使用 BSP 的过程中经常会用到 FSP 配置工具。 + +## 3. BSP 制作方法 + +本节以制作 CPK-RA6M4 开发板的 BSP 为例,讲解如何为一个新的开发板添加 BSP,最终制作完成的 BSP 将支持 MDK 和 scons 两种方式构建。 + +BSP 的制作过程分为如下步骤: + +1. 创建 BSP 目录 +2. 创建 RA 模板工程 +3. 配置模板工程 +4. 修改 Kconfig 文件 +5. 修改工程构建和配置文件 +6. 重新生成工程 +7. 添加 GCC 格式链接脚本 +8. 修改 rtconfig.py 中的编译参数 + +在接下来的章节中将会详细介绍这些步骤,帮助开发者创建所需要的 BSP。 + +### 3.1 创建 BSP 目录 + +- 创建 BSP 目录不需要直接创建空文件夹,只要复制 BSP 模板 `\renesas\libraries\bsp-template` 文件夹到 `\renesas` 目录并将名称修改为待添加的开发板名即可。命令可参考 **CPK-RA6M4** 的 BSP 命名为 **ra6m4-cpk**,因为 ra6m4-cpk 已经存在,所以本教程使用 **ra6m4-test** 作为新创建的 BSP 名称。 + +![image-20220217155725977](figures/bsp_crate.png) + +![image-20220217160140135](figures/bsp_crate1.png) + +![image-20220217161302858](figures/bsp_crate2.png) + +### 3.2 创建 RA 模板工程 + +第一步是使用 FSP 来创建一个 RA 模板工程。 + +- 在 FSP 安装目录下找到 /eclipse/rasc.exe 双击打开,开启后会自动进入创建工程界面。 + +![fsp_crate](figures/fsp_crate.png) + +![fsp_crate1](figures/fsp_crate1.png) + +![fsp_crate2](figures/fsp_crate2.png) + +![fsp_crate3](figures/fsp_crate3.png) + +![fsp_crate4](figures/fsp_crate4.png) + +![fsp_crate5](figures/fsp_crate5.png) + +![image-20220211182959790](figures/fsp_crate6.png) + +创建完成后会得到一个 RA 模板工程和 BSP 最基本的配置文件和驱动文件,如上图所示。 + +### 3.3 配置模板工程 + +RA 模板工程创建完成后,需要做些修改并添加基础外设 GPIO、UART。 + +- 打开模板工程 `template.uvprojx` + +![image-20220214174740157](figures/template_open.png) + +- 修改 MDK 工程配置 +> **Debug 配置:** 先截图记录下修改前的 Debug 页配置,修改 Device 后 Debug 页的部分配置会发生修改,改完 Device 后手动修改到默认配置。 + +![img](figures/template_config4.png) + +> **Device 配置:**修改 Device 选项,根据开发板使用的具体芯片型号选择 device。 + +![img](figures/template_config.png) + +> **Output 配置:** 修改 `Name of Exexutable`为 rtthread,勾选 `Create HEX File`,因为最终烧录的是 HEX 文件。 + +![image-20220218144358105](figures/template_config1.png) + +> **User 配置:**在用到 TrustZone 时,有额外调用的划分 Secure & Non-Secure 用到的一些指令,如果开发时用的都是 Flat mode 的话,这部分可以忽略。如果需要可以添加命令【cmd /c "start "Renesas" /w cmd /c ""$Slauncher\rasc_launcher.bat" "3.5.0" --gensecurebundle --compiler ARMv6 "$Pconfiguration.xml" "$L%L" 2> "%%TEMP%%\rasc_stderr.out"""】 + +![img](figures/template_config2.png) + +> **C/C++ 配置:**修改编译参数选项关闭部分警告,删除“-Wextra“、”-Wconversion“、”-Wshadow ” 。 +> +> 以 ra6m4-cpk 为例修改后为:-Wno-license-management -Wuninitialized -Wall -Wmissing-declarations -Wpointer-arith -Waggregate-return -Wfloat-equal + +![img](figures/template_config3.png) + +> **Utilities 配置:**如图勾选`Use External Tool for Flash Programming`。配置完成点击 `OK` 保存配置。 + +![img](figures/template_config5.png) + +- 从 MDK 打开 FSP + +> **如何在 MDK 中打开 FSP:** +> +> 1. 打开 MDK,选择 “Tools -> Customize Tools Menu…” +> 2. 点击 “new” 图标,添加一条自定义命令: RA Smart Configurator +> 3. Command 输入工具的安装路径, 点击“…”找到安装路径下的“rasc.exe”文件并选中 (setup_fsp_xxxxx 安装目录下) +> 4. Initial Folder 输入参数: $P +> 5. Arguments 输入参数: --device $D --compiler ARMv6 configuration.xml +> 6. 点击 OK 保存命令“Tools -> RA smart Configurator” + ![img](figures/fsp_config.png) +> 7. 点击添加的命令打开配置工具:**RA Smart Config** + ![img](figures/fsp_config1.png) + +- 添加 UART 端口 +> 选择 Stacks 配置页,点击 New Stack 找到 UART。 + ![image](figures/fsp_uart.png) +> 确认开发板可用于 msh 的 UART 通道。配置 UART 参数,因为需要适配 RT-Thread 驱动中使用的命名所以需要修改,设置 **name** 、**channel** 、**callback** 为一致的标号。格式:channel = **X**,name = g_uart**X**、callback = user_uart**X**_callback + ![image](figures/fsp_uart1.png) + +### 3.4 修改 Kconfig 选项 + +在本小节中修改 `board/Kconfig` 文件的内容有如下两点: + +- 芯片型号和系列 +- BSP 上的外设支持选项 + +芯片系列的定义在`renesas\libraries\Kconfig` 中,修改前先确认是否存在添加的芯片系列定义,如果是一个未添加的系列,需要先添加该芯片系列的定义。芯片型号和系列的命名格式如下表所示。 + +| 宏定义 | 意义 | 格式 | +| ------------------ | -------- | ------------------ | +| SOC_R7FA6M4AF | 芯片型号 | SOC_R7FAxxxxx | +| SOC_SERIES_R7FA6M4 | 芯片系列 | SOC_SERIES_R7FAxxx | + +关于 BSP 上的外设支持选项,一个初次提交的 BSP 仅仅需要支持 GPIO 驱动和串口驱动即可,因此在配置选项中只需保留这两个驱动配置项,如下图所示: + +![修改 Kconfig](./figures/Kconfig.png) + +### 3.5 修改工程构建和配置文件 +接下来需要修改用于构建工程相关的文件。 + +- 修改启动文件 startup.c + +> 源文件路径:**ra6m4-cpk\ra\fsp\src\bsp\cmsis\Device\RENESAS\Source\startup.c** + +```c +#ifdef __ARMCC_VERSION + main(); +#elif defined(__GNUC__) + extern int entry(void); + entry(); +#endif +``` + +![img](figures/startup_c.png) + +- 修改 SRAM 大小配置 + +![image-20220303113833249](figures/board_config.png) + +- 修改 GPIO 中断配置 + +根据 BSP 使用芯片支持的 IRQ 中断情况修改配置文件。可以使用 FSP 配置工具对照查看 IO 引脚号对应的 IRQ 通道。 + +![image-20220217174433724](figures/bsp_gpio.png) + +- 修改初始应用层代码 + +在 RA 系列的 BSP 中,应用层代码存放在 `src/hal_entry.c` 中。使用 FSP 生成的默认应用代码需要全部替换为如下代码,如果开发板没有板载 LED 可以将 `while(1)` 中的代码删除。 + +```c +/* + * Copyright (c) 2006-2021, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2021-10-10 Sherman first version + */ + +#include +#include "hal_data.h" +#include + +#define LED_PIN BSP_IO_PORT_01_PIN_06 /* Onboard LED pins */ + +void hal_entry(void) +{ + rt_kprintf("\nHello RT-Thread!\n"); + + while (1) + { + rt_pin_write(LED_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED_PIN, PIN_LOW); + rt_thread_mdelay(500); + } +} +``` + + + +### 3.6 重新生成工程 + +重新生成工程需要使用 Env 工具。 + +- 重新生成 rtconfig.h 文件 + +在 Env 界面输入命令 menuconfig 对工程进行配置,并生成新的 rtconfig.h 文件。如下图所示: + +![输入menuconfig进入配置界面](./figures/menuconfig_1.png) + +打开 GPIO 和 console 使用的 UART 端口。 + +![选择要打开的外设](./figures/menuconfig_2.png) + +修改 console 输出使用的设备名称。 + +![image-20220303103240414](figures/menuconfig2.png) + +- 生成 MDK 应用工程 +下面以重新生成 MDK 工程为例,介绍如何重新生成 BSP 工程。 + +使用 env 工具输入命令 `scons --target=mdk5` 重新生成工程,如下图所示: + +![重新生成 BSP 工程](./figures/menuconfig_3.png) + +重新生成工程成功: + +![重新生成 BSP 工程](./figures/menuconfig_4.png) + +到这一步,基于 MDK 开发的 BSP 就可以使用了。如果要使用 GCC 工具链编译还需加入 GCC 格式的链接脚本。 + +### 3.7 添加 GCC 格式链接脚本 + +GCC 格式的链接脚本需要使用到瑞萨的 IDE 工具 e2studio。在 e2studio 中创建新的工程,步骤如下: + +![image-20220218114041568](figures/e2studio1.png) + +![image-20220218113955219](figures/e2studio.png) + +![image-20220218114633339](figures/e2studio2.png) + +![image-20220218114839257](figures/e2studio3.png) + +![image-20220218115035562](figures/e2studio4.png) + +![image-20220218115332866](figures/e2studio5.png) + +工程创建完成后,我们需要将工程中的两个 xxx.ld 文件 copy 到 BSP 中的 script 目录下。 + +![image-20220218115715957](figures/e2studio6.png) + +- 修改链接脚本 + +> 链接脚本文件路径:**ra6m4-cpk\script\fsp.ld** + +![image-20220215182642126](figures/linkscript1.png) + +> 将下面的代码复制到 text 段中,**注意要添加到 text{ } 括号内** + +```shell +/* section information for finsh shell */ +. = ALIGN(4); +__fsymtab_start = .; +KEEP(*(FSymTab)) +__fsymtab_end = .; + +. = ALIGN(4); +__vsymtab_start = .; +KEEP(*(VSymTab)) +__vsymtab_end = .; + +/* section information for initial. */ +. = ALIGN(4); +__rt_init_start = .; +KEEP(*(SORT(.rti_fn*))) +__rt_init_end = .; + +. = ALIGN(4); +KEEP(*(FalPartTable)) +``` + +> 添加后如下图所示: + +![img](figures/linkscript.png) + +### 3.8 修改 rtconfig.py 中的编译参数 + +![image-20220303165348085](figures/rtconfig_py.png) + +除了上图的内核类型,还有编译参数的配置需要确认。相关配置项说明可查看文档中心对于 scons 工具的介绍。[跳转链接](https://www.rt-thread.org/document/site/#/development-tools/scons/scons?id=编译器选项) + + + +至此,一个基础的支持 GCC 和 MDK 的 BSP 工程就创建完成了,接着就可以使用 MDK 或 scons 验证开发的工程是否可编译、可运行。 + +感谢每一位贡献代码的开发者,RT-Thread 将与你一同成长。 + +## 4. 规范 + +本章节介绍 RT-Thread RA 系列 BSP 制作与提交时应当遵守的规范 。开发人员在 BSP 制作完成后,可以根据本规范提出的检查点对制作的 BSP 进行检查,确保 BSP 在提交前有较高的质量 。 + +### 4.1 BSP 制作规范 + +RA 的制作规范主要分为 3 个方面:工程配置,ENV 配置和 IDE 配置。在已有的 RA 系列 BSP 的模板中,已经根据下列规范对模板进行配置。在制作新 BSP 的过程中,拷贝模板进行修改时,需要注意的是不要修改这些默认的配置。BSP 制作完成后,需要对新制作的 BSP 进行功能测试,功能正常后再进行代码提交。 + +下面将详细介绍 BSP 的制作规范。 + +#### 4.1.1 工程配置 + +- 遵从RT-Thread 编码规范,代码注释风格统一 +- main 函数功能保持一致 + - 如果有 LED 的话,main 函数里**只放一个** LED 1HZ 闪烁的程序 +- 在 `rt_hw_board_init` 中需要完成堆的初始化:调用 `rt_system_heap_init` +- 默认只初始化 GPIO 驱动和 FinSH 对应的串口驱动,不使用 DMA +- 当使能板载外设驱动时,应做到不需要修改代码就能编译下载使用 +- 提交前应检查 GCC、MDK 编译器直接编译或者重新生成后编译是否成功 +- 使用 `scons --dist` 命令对 BSP 进行发布,检查使用 `dist` 命令生成的工程是否可以正常使用 + +#### 4.1.2 ENV 配置 + +- 系统心跳统一设置为 1000(宏:RT_TICK_PER_SECOND) +- BSP 中需要打开调试选项中的断言(宏:RT_DEBUG) +- 系统空闲线程栈大小统一设置为 256(宏:IDLE_THREAD_STACK_SIZE) +- 开启组件自动初始化(宏:RT_USING_COMPONENTS_INIT) +- 需要开启 user main 选项(宏:RT_USING_USER_MAIN) +- 默认关闭 libc(宏:RT_USING_LIBC) +- FinSH 默认只使用 MSH 模式(宏:FINSH_USING_MSH_ONLY) + +#### 4.1.3 IDE 配置 + +- 使能下载代码后自动运行 +- 使能 C99 支持 +- 使能 One ELF Section per Function(MDK) +- MDK/IAR 生成的临时文件分别放到build下的 MDK/IAR 文件夹下 +- MDK/GCC/IAR 生成 hex 文件名字统一成 rtthread.hex + +### 4.2 BSP 提交规范 + +- 提交前请认真修改 BSP 的 README.md 文件,README.md 文件的外设支持表单只填写 BSP 支持的外设,可参考其他 BSP 填写。查看文档[《RA系列驱动介绍》](./RA系列驱动介绍.md)了解驱动分类。 +- 提交 BSP 分为 2 个阶段提交: + - 第一阶段:基础 BSP 包括串口驱动和 GPIO 驱动,能运行 FinSH 控制台。完成 MDK5 、IAR 和 GCC 编译器支持,如果芯片不支持某款编译器(比如MDK4)可以不用做。 BSP 的 README.md 文件需要填写第二阶段要完成的驱动。 + - 第二阶段:完成板载外设驱动支持,所有板载外设使用 menuconfig 配置后就能直接使用。若开发板没有板载外设,则此阶段可以不用完成。不同的驱动要分开提交,方便 review 和合并。 +- 只提交 BSP 必要的文件,删除无关的中间文件,能够提交的文件请对照其他 BSP。 +- 提交前要对 BSP 进行编译测试,确保在不同编译器下编译正常 +- 提交前要对 BSP 进行功能测试,确保 BSP 的在提交前符合工程配置章节中的要求 diff --git a/bsp/renesas/docs/RA系列BSP外设驱动使用教程.md b/bsp/renesas/docs/RA系列BSP外设驱动使用教程.md new file mode 100644 index 0000000000..35f218a862 --- /dev/null +++ b/bsp/renesas/docs/RA系列BSP外设驱动使用教程.md @@ -0,0 +1,93 @@ +# RA系列BSP外设驱动使用教程 + +## 1. 简介 + +本文档是为需要在 RT-Thread 操作系统上使用更多开发板资源的开发者准备的。通过使用 ENV 工具对 BSP 进行配置,可以开启更多板载资源,实现更多高级功能。 + +主要包括以下内容: + +1. 如何使用开发板上更多的板载资源 +2. 如何使用更多的片上资源 +3. 如何添加更多片上资源选项 + +## 2. 前提要求 + +- 学会如何使用 ENV 工具,参考:[RT-Thread env 工具用户手册](https://www.rt-thread.org/document/site/programming-manual/env/env/) +- 熟悉 [FSP](https://www2.renesas.cn/jp/zh/software-tool/flexible-software-package-fsp) 配置工具的使用 + +## 3. 如何使用更多的外设资源 + +开发板上一般有很多外设资源,如 SPI、SDIO、ADC 等,但是 BSP 工程默认没有开启这些外设驱动。RT-Thread 提供了 ENV 工具来开启或关闭 BSP 的外设驱动。本文以 RA6M4-CPK 开发板上开启 SPI 驱动为例,一步步地展示如何使用 ENV 工具对 BSP 进行配置。 + +### 3.1 打开配置工具 + +在 BSP 目录下打开 menuconfig 配置界面。 + +![image-20220218162910778](figures/menuconfig_ra6m4cpk.png) + +打开的配置工具界面如下所示: + ![config1](figures/config1.png) + +通过键盘上的上下键移动光标,选中 `Hardware Drivers Config`然后按回车键进入硬件驱动配置菜单。 + +### 3.2 进入硬件驱动配置菜单 + +在硬件配置菜单里有三个选项,分别是 **板载外设配置菜单**、**片上外设配置菜单**和**扩展模块配置菜单**,使用下键切换到片上外设,按回车键进入配置菜单。 + +![硬件驱动配置菜单](figures/config2.png) + +### 3.3 在板载外设配置菜单里开启 SPI Flash 选项 + +![image-20220218163357420](figures/menuconfig_spi.png) + +![image-20220218163714429](figures/menuconfig_spi1.png) + + + +### 3.4 保存退出 + +然后右移光标选中 Save 按回车键保存,然后按 Esc 键退出配置工具。 + +![保存退出](figures/save.png) + + + +### 3.5 生成 MDK5 工程 + +输入命令 `scons --target=mdk5` 重新生成 MDK5 的工程。 + +![image-20220218164532436](figures/scons_mdk5.png) + +### 3.6 FSP 添加 SPI 外设 + +![image-20220218171841353](figures/fsp_spi.png) + +![image-20220218172446068](figures/fsp_spi1.png) + +在 Pins 中配置 SPI1 端口引脚。**注意: SSLx 片选引脚设为 None,片选引脚的控制在驱动程序中由软件控制。** + +配置完成,保存退出 FSP。 + +![image-20220218174145848](figures/fsp_spi2.png) + +### 3.7 测试验证 + +回到生成的 MDK5 工程并编译。使用 FSP 配置完成后如果有新的文件添加进工程中,不会马上添加进去。需要先编译一次,如果弹出如下提醒,选择 “是” 然后再次编译即可。 + +![image-20220218174811328](figures/mdk_build.png) + +编译成功后,点击 debug 按钮下载并进入调试页面。 + +![image-20220218175442360](figures/mdk_build1.png) + +### 3.8 查看运行结果 + +程序运行后,输入命令 `list_device` 可以看到名为 spi1 的总线设备,此时 SPI1 总线已经可以使用了。 + +![image-20220218175926965](figures/run_spi1.png) + +## 4. 总结 + +本文以 SPI 为例介绍了外设驱动使用的操作流程,其他类型的外设如何使用和配置请查看:[RA系列使用FSP配置外设驱动.md](RA系列使用FSP配置外设驱动.md) + +当开发者需要使用未开启的外设时,只要在 ENV 工具中使能相关的外设,然后在 FSP 中添加即可,重新生成的工程中就会添加对应的驱动文件。 \ No newline at end of file diff --git a/bsp/renesas/ra6m4-cpk/docs/使用瑞萨FSP配置工具.md b/bsp/renesas/docs/RA系列使用FSP配置外设驱动.md similarity index 63% rename from bsp/renesas/ra6m4-cpk/docs/使用瑞萨FSP配置工具.md rename to bsp/renesas/docs/RA系列使用FSP配置外设驱动.md index 41c91fae80..5e4ef2ebae 100644 --- a/bsp/renesas/ra6m4-cpk/docs/使用瑞萨FSP配置工具.md +++ b/bsp/renesas/docs/RA系列使用FSP配置外设驱动.md @@ -1,6 +1,8 @@ -## 在 MDK 中使用 FSP +# RA系列使用 FSP 配置外设驱动 -### 添加RA Smart Config +## 1. 准备工作 + +### 1.1 在 MDK 中添加用于启动FSP的自定义命令 1. 打开 MDK,选择 “Tools -> Customize Tools Menu…” 2. 点击 “new” 图标,添加一条自定义命令: RA Smart Configurator @@ -9,52 +11,45 @@ 5. Arguments 输入参数: --device $D --compiler ARMv6 configuration.xml 6. 点击 OK 保存命令 -![img](picture/customize.png) +![img](figures/customize.png) 7. 点击添加的命令 “Tools -> RA smart Configurator”,**打开配置工具**:RA Smart Config -![image.png](picture/openrasc.png) +![image.png](figures/openrasc.png) -### 添加 Device Partition Manager,添加步骤同上。 +PS:以上相关操作也可以在 FSP 的说明文档中找到。 -1. 输入命令名称:`Device Partition Manager` -2. Command: 在安装路径选中`rasc.exe` -3. Initial Folder :`$P` -4. Arguments:`-application com.renesas.cdt.ddsc.dpm.ui.dpmapplication configuration.xml "SL%L"` +FSP 文档:https://www2.renesas.cn/jp/zh/software-tool/flexible-software-package-fsp#document -> PS:以上相关操作也可以在 FSP 的说明文档中找到。 -> -> 文档路径(本地):在 FSP 的安装目录下 .\fsp_documentation\v3.5.0\fsp_user_manual_v3.5.0\index.html -> -> 文档路径(官网):https://www2.renesas.cn/jp/zh/software-tool/flexible-software-package-fsp#document +### 1.2 注意事项 -### FSP 版本选择 +#### 1.2.1 FSP 版本选择 -此 BSP 已更新 **FSP 3.5.0** 版本的支持,请使用 **FSP 3.5.0** 版本进行配置修改。下文中部分操作截图使用的是 FSP 3.1.0 版本,仅供参考。 +RA系列已更新 **FSP 3.5.0** 版本的支持,请使用 **FSP 3.5.0** 版本进行配置修改,**旧版本可能存在兼容性问题**。 **使用 RASC 前请务必检查 FSP version 、Board、Device 配置项是否正确。** -![fsp_version](picture/fsp_version.png) +![fsp_version](figures/fsp_version.png) -## 更新工程配置 +#### 1.2.2 更新工程配置 使用 FSP 配置完成后如果有新的文件添加进工程中,不会马上添加进去。需要先编译一次,如果弹出如下提醒,选择 “是” 然后再次编译即可。 -![img](picture/import_changes.png) +![img](figures/import_changes.png) -## 如何使用 RASC 添加外设 +## 2. 使用 FSP 添加并配置外设 -**注意:文档中的外设添加步骤均为单独配置的说明,排版顺序不代表外设添加顺序,如遇到引脚冲突请查阅开发板及芯片手册的相关章节。** +**PS:文档中的外设添加步骤均为单独配置的说明,排版顺序不代表外设添加顺序,如遇到引脚冲突请查阅开发板及芯片手册的相关章节。** ### UART 如何添加一个 UART 端口外设配置? 1. 选择 Stacks 配置页,点击 New Stack 找到 UART。 +![image.png](figures/fsp_uart.png) -![image.png](picture/rascuart.png) - -2. 配置 UART 参数,因为需要适配 RT-Thread 驱动中使用的命名,所以需要修改命名,设置**name** 、**channel** 、**callback** 是一致的标号。![image.png](picture/rascuart1.png) +2. 配置 UART 参数,因为需要适配 RT-Thread 驱动中使用的命名,所以需要修改命名,设置**name** 、**channel** 、**callback** 为一致的标号。 +![image.png](figures/fsp_uart1.png) ### GPIO 中断 @@ -62,17 +57,17 @@ 1. 选择引脚编号,进入配置,比如选择 P105 做为中断引脚。可先找到引脚查看可配置成的 IRQx 通道号。 -![image-20211103200949759](picture/p105.png) +![image-20211103200949759](figures/p105.png) 2. 打开 ICU 中断通道 IRQ00 -![image-20211103200813467](picture/irq0.png) +![image-20211103200813467](figures/irq0.png) -3. 创建 stack 并进入配置。因为需要适配 RT-Thread 驱动中使用的命名,所以需要修改命名,设置**name** 、**channel** 、**callback** 是一致的标号。选择你希望的触发方式,最后保存配置,生成配置代码。 +3. 创建 stack 并进入配置。因为需要适配 RT-Thread 驱动中使用的命名,所以需要修改命名,设置 **name** 、**channel** 、**callback** 为一致的标号。选择你希望的触发方式,最后保存配置,生成配置代码。 -![](picture/1635929089445.png) +![](figures/1635929089445.png) -![image-20211103201047103](picture/irq1.png) +![image-20211103201047103](figures/irq1.png) 4. 测试中断是否成功开启 @@ -106,78 +101,78 @@ 1. 创建 WDT -![image-20211019152302939](picture/wdt.png) +![image-20211019152302939](figures/wdt.png) 2. 配置 WDT,需要注意在 RT-Thread 中只使用了一个 WDT 设备,所以没有对其进行编号,如果是新创建的 WDT 设备需要注意 name 字段,在驱动中默认使用的是`g_wdt` 。 -![image-20211019152407572](picture/wdt_config.png) +![image-20211019152407572](figures/wdt_config.png) 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) +![image-20211027183406251](figures/wdt_env.png) ### RTC 1. 添加 RTC 设备 -![image-20211019152536749](picture/rtc.png) +![image-20211019152536749](figures/rtc.png) 2. 配置 RTC,需要注意在 RT-Thread 中只是用了一个 RTC 设备,所以没有对其进行编号,如果是新创建的 RTC 设备需要注意 name 字段,在驱动中默认使用的是`g_rtc` 。修改 Callback 为 rtc_callback -![image-20211019152627412](picture/rtc_config.png) +![image-20211019152627412](figures/rtc_config.png) 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) +![image-20211027181550233](figures/rtc_env.png) ### Flash 1. 创建 Flash -![image-20211026105031200](picture/add_flash.png) +![image-20211026105031200](figures/add_flash.png) 2. 配置 Flash,需要注意在 RT-Thread 中只使用了一个 flash 设备,所以没有对其进行编号,如果是新创建的 flash 设备需要注意 name 字段,在驱动中默认使用的是`g_flash` 。 -![image-20211026105628706](picture/config_flash.png) +![image-20211026105628706](figures/config_flash.png) 3. 如何在 ENV 中打开 Flash -![image-20211026123252310](picture/flash_menuconfig.png) +![image-20211026123252310](figures/flash_menuconfig.png) ### SPI 1. 添加一个 SPI 外设端口 -![image-20211027180820968](picture/spi_add.png) +![image-20211027180820968](figures/spi_add.png) 2. 配置 channel、name、Clock Phase、Clock Polarity、Callback、 SPI Mode 等参数,波特率在代码中可通过 API 修改,这里可以设置一个默认值。 -![img](picture/spi.png) +![img](figures/fsp_spi1.png) -3. 在 Pins 中打开 SPI0 ,配置端口引脚。**注意:请勿在此处配置 SSLx 片选引脚,片选引脚的控制在驱动程序中由软件控制。** +3. 在 Pins 中打开 SPI1 ,配置端口引脚。**注意:请勿在此处配置 SSLx 片选引脚,片选引脚的控制在驱动程序中由软件控制。** -![image-20211209162334093](picture/spi_pin.png) +![image-20211209162334093](figures/fsp_spi2.png) 4. 如何在 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) + ![image-20211027181444023](figures/spi_env.png) ### ADC/DAC 创建 ADC/DAC -![img](picture/adc_dac.png) +![img](figures/adc_dac.png) - **ADC** 1. 配置 name、unit、mode,选择扫描的通道编号 -![img](picture/adc_config.png) +![img](figures/adc_config.png) 2. 配置扫描通道对应的引脚 -![img](picture/adc_config1.png) +![img](figures/adc_config1.png) 3. 在 menuconfig 中打开对应的通道 @@ -185,28 +180,29 @@ 1. 需要先关闭 P014 的默认 mode -![img](picture/dac_config0.png) +![img](figures/dac_config0.png) 2. 开启 DAC0 通道 -![img](picture/dac_config1.png) +![img](figures/dac_config1.png) 3. 修改通道号为 0,与 DAC0 对应 -![img](picture/dac_config2.png) +![img](figures/dac_config2.png) 4. 在 menuconfig 中打开对应的通道 -### 通用 PWM 定时器(GPT) +### PWM(GPT) GPT 定时器在该芯片中可作为通用定时器,也可以用于产生 PWM 信号。在将其用于产生 PWM 信号时,GPT 定时器提供了 gpt0 - gpt9 总共 10 个通道,每个通道可以设定两个输出端口。当前版本的 PWM 驱动将每个通道都看做一个单独的 PWM 设备,每个设备都只有一个通道。用户可以选择开启一个通道的任意一个输出端口,或将两个端口均开启,但在同时开启两个端口的情况下,它们输出的波形将完全一致。 1. 添加 GPT 设备 - ![img](./picture/add_gpt1.png) +![img](./figures/add_gpt1.png) + 2. 配置通道 - ![img](./picture/add_gpt2.png) +![img](./figures/add_gpt2.png) 对 GPT 较为关键的配置如图所示,具体解释如下: @@ -217,81 +213,112 @@ GPT 定时器在该芯片中可作为通用定时器,也可以用于产生 PWM 5. 此处设置 GPT 通道下两个输出端口各自对应的引脚。 3. 配置输出引脚 - ![img](./picture/add_gpt3.png) +![img](./figures/add_gpt3.png) 在完成上一步对 GPT 定时器的设置后,根据图示找到对应 GPT 通道输出引脚设置的界面(这里是 GPT3),将图中标号 **1** 处设置为 ``GTIOCA or GTIOCB`` ,并根据需要在图中标号 **2** 处设置 GPT 通道下两个输出端口各自对应的输出引脚。 4. 在 menuconfig 中打开对应的通道,[RT-Thread 的 pwm 框架介绍](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/pwm/pwm) - ![image-20211103202216381](picture/pwm_env.png) +![image-20211103202216381](figures/pwm_env.png) ### CAN 1. 添加CAN -![image-20211102145023112](picture/can.png) +![image-20211102145023112](figures/can.png) 2. 配置Callback为 `can0_callback` 或 `can1_callback` -![image-20211102145227603](picture/can_callback.png) +![image-20211102145227603](figures/can_callback.png) 3. 配置其他选项,并生成代码。 4. 使用ENV使能CAN。[CAN设备使用说明](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/can/can) -![image-20211102145613309](picture/can_menuconfig.png) +![image-20211102145613309](figures/can_menuconfig.png) +### SDHI -### 使用 WiFi 模块 [RW007 ](https://github.com/RT-Thread-packages/rw007) +1. 添加sdhi驱动 -1. 软件包配置中找到 RW007,并修改为下图配置 +![添加sdhi驱动](figures/sdhi_config.png) -![image-20211108142805319](picture/rw007_pkg.png) +1. 添加DMAC + +![添加DMAC](figures/dmac_config.png) + +2. 设置DMAC中断 + +![设置DMAC中断](figures/dmac_int.png) + +3. 设置SDHI中断和引脚 + +![设置SDHI](figures/sdhi_config1.png) + +4. 在ENV中打开SDHI + +![打开SDHI](figures/sdhi_env.png) + +5. 在ENV中配置DFS,添加文件系统,如FatFS + +![配置DFS](figures/sdhi_dfs.png) + +6. 在命令行中,使用 `mkfs sd0 -t elm` 格式化sd卡 + +7. 在命令行中,使用 `mount sd0 / elm` 将sd0挂载到 `/` + +8. 参考RT-Thread DFS使用手册[虚拟文件系统 (rt-thread.org)](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/filesystem/filesystem) + +### WiFi 模块: [RW007 ](https://github.com/RT-Thread-packages/rw007) + +1. 软件包配置中找到 RW007,并修改为下图配置。 + +![image-20211108142805319](figures/rw007_pkg.png) 2. menuconfig 中打开驱动的 RW007 配置,默认使用了 SPI1 端口。所以需要打开 SPI1 总线。 -![image-20211108142453678](picture/rw007_spi.png) +![image-20211108142453678](figures/rw007_spi.png) -![image-20211213212034701](picture/drv_rw007.png) +![image-20211213212034701](figures/drv_rw007.png) 3. 在设备驱动框架中打开 [WLAN 框架](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/wlan/wlan), -![image-20211108143027485](picture/rw007_wlan.png) +![image-20211108143027485](figures/rw007_wlan.png) 在网络配置中打开 NETDEV 组件: -![image-20211108143712513](picture/rw007_netdev.png) +![image-20211108143712513](figures/rw007_netdev.png) 在 kernel 中打开 mempool 配置: -![image-20211209161902884](picture/rw007_mempool.png) +![image-20211209161902884](figures/rw007_mempool.png) 4. FSP 中打开添加 SPI 外设端口,[如何添加SPI](#SPI)。下图以 SPI1 端口为例的配置如下: -![image-20211108183631379](picture/rw007_spicfg.png) +![image-20211108183631379](figures/fsp_spi1.png) 5. RW007 有一个从机控制的 INT 引脚,需要占用一个 IRQ 通道,下图以 P506 为例的配置如下: -![image-20211108183724282](picture/rw007_int.png) +![image-20211108183724282](figures/rw007_int.png) 6. RW007 的 RESET 控制引脚修改默认配置,这里在 RASC 中 mode 设为关闭,交由 RW007 中进行控制。 -![image-20211213144108558](picture/rw007_reset.png) +![image-20211213144108558](figures/rw007_reset.png) 7. 配置完成,检查 MDK 工程中是否加入了必要的文件 -![image-20211109102232233](picture/rw007_mdk.png) +![image-20211109102232233](figures/rw007_mdk.png) 8. 编译下载,验证结果。 系统启动会自动获取 RW007 的信息,输入`wifi scan` 命令扫描环境中的 WiFi 信号。[更多 WiFi 命令](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/wlan/wlan?id=finsh-%e5%91%bd%e4%bb%a4) -![image-20211109103856130](picture/rw007_test.png) +![image-20211109103856130](figures/rw007_test.png) 使用 `WiFi join` 命令连接 WiFi 热点 : -![image-20211109104735733](picture/rw007_wifijoin.png) +![image-20211109104735733](figures/rw007_wifijoin.png) 使用 `ping rt-thread.com` 测试网络连接: -![image-20211109104700939](picture/rw007_ping.png) \ No newline at end of file +![image-20211109104700939](figures/rw007_ping.png) \ No newline at end of file diff --git a/bsp/renesas/docs/RA系列外设驱动添加指南.md b/bsp/renesas/docs/RA系列外设驱动添加指南.md new file mode 100644 index 0000000000..b5fb0da716 --- /dev/null +++ b/bsp/renesas/docs/RA系列外设驱动添加指南.md @@ -0,0 +1,63 @@ +# RA 系列外设驱动添加指南 + +## 1. 简介 + +本文档是为需要给现有的 RA 系列 BSP 添加更多外设驱动的开发者准备的。通过阅读本文,开发者可以按照自己的实际情况给现有 BSP 添加自己需要的驱动。 + +## 2. 前提要求 + +- 熟练使用 ENV 工具,参考:[RT-Thread env 工具用户手册](https://www.rt-thread.org/document/site/rtthread-development-guide/rtthread-tool-manual/env/env-user-manual/) +- 熟悉 [Kconfig](https://www.rt-thread.org/document/site/#/development-tools/kconfig/kconfig) 语法 +- 熟悉 [FSP](https://www2.renesas.cn/jp/zh/software-tool/flexible-software-package-fsp) 工具 +- 了解 RT-Thread [设备驱动框架](https://www.rt-thread.org/document/site/#/rt-thread-version/rt-thread-standard/programming-manual/device/device) + +## 3. 如何添加更多的外设驱动选项 + +本章节以添加片上外设驱动为例,讲解如何为 BSP 添加更多可用驱动。如果想使用的片上外设是 `片上外设配置菜单` 里没有的,就需要开发者自己添加了。下面我们将演示如何为 ra6m4-cpk 添加 UART9 端口。 + +添加 UART 的外设支持需要以下步骤: + +### 3.1 修改 Kconfig 文件 + +打开 BSP 中的 board\kconfig 文件,添加 UART9 配置。 + +![image-20220221161853343](figures/add_uart.png) + +![image-20220221163152761](figures/add_uart1.png) + +修改完成后,在 BSP 目录下打开 ENV 工具,命令行输入 `menuconfig` 命令查看 UART9 配置是否已添加。 + +![image-20220221164229974](figures/add_uart2.png) + +### 3.2 修改 uart_config.h 文件 + +Kconfig 的配置添加完成,还需要在配置文件和驱动文件中添加相应的配置。 + +打开 `libraries\HAL_Drivers\config\ra6m4\uart_config.h` 文件添加 UART9 配置。 + +![image-20220221170945734](figures/add_uart3.png) + +### 3.3 修改 drv_usart_v2.h 文件 + +打开 `libraries\HAL_Drivers\drv_usart_v2.c`,添加如下代码: + +![image-20220221171806580](figures/add_uart4.png) + +![image-20220221172034531](figures/add_uart5.png) + +### 3.4 测试验证 + +1. 在 menuconfig 中打开 UART9 并保存配置,使用 `scons --target=mdk5` 命令重新生成 MDK 工程。 +2. 从 project 工程中打开 FSP 配置工具,添加 UART9 端口 + +![image-20220221180942314](figures/add_uart6.png) + +![image-20220221183752087](figures/add_uart8.png) + +3. 配置 UART9 对应的 IO 引脚,保存并退出。 + +![image-20220221183405828](figures/add_uart7.png) + +4. 编译、debug 下载,输入 list_device 命令可以看到 uart9 设备已经注册到内核,说明设备添加成功,接下来就可以使用 UART9 端口进行通信了。 + +![image-20220221185534932](figures/add_uart9.png) diff --git a/bsp/renesas/docs/RA系列驱动介绍.md b/bsp/renesas/docs/RA系列驱动介绍.md new file mode 100644 index 0000000000..b125bf0c94 --- /dev/null +++ b/bsp/renesas/docs/RA系列驱动介绍.md @@ -0,0 +1,62 @@ +# RA系列驱动介绍 + +在 RT-Thread 实时操作系统中,各种各样的设备驱动是通过一套 I/O 设备管理框架来管理的。设备管理框架给上层应用提供了一套标准的设备操作 API,开发者通过调用这些标准设备操作 API,可以高效地完成和底层硬件外设的交互。设备管理框架的结构如下图所示: + +![image-20220308143402996](figures/rtdevice.png) + +使用 I/O 设备管理框架开发应用程序,有如下优点: + +- 使用同一套标准的 API 开发应用程序,使应用程序具有更好的移植性 +- 底层驱动的升级和修改不会影响到上层代码 +- 驱动和应用程序相互独立,方便多个开发者协同开发 + +## 1. 驱动分类介绍 + +本小节介绍 BSP 提供的不同类别驱动的概念,对一个 BSP 而言,有如下三类驱动: + +- **板载外设驱动**(Onboard Peripheral Drivers):指 MCU 之外,开发板上外设,例如 TF 卡、以太网等 +- **片上外设驱动**(On-chip Peripheral Drivers):指 MCU 芯片上的外设,例如硬件定时器、ADC 和看门狗等 +- **扩展模块驱动**(Board extended module Drivers):指可以通过扩展接口或者杜邦线连接的开发板的模块,例如 RW007 模块 + +这三种外设的示意图如下所示: + +![Peripheral](figures/Peripheral.png) + +## 2. 外设驱动的使用方法 + +当前 RT-Thread 提供的驱动库已经支持 RA 多个系列的 BSP。点击下表中的驱动名称,即可跳转到对应驱动框架的介绍文档。开发者可以通过阅读相关资料,了解如何在应用开发中通过设备驱动框架来使用这些外设驱动。 + +### 2.1 片上外设 + +| 驱动 | 简介 | +| ------------------------------------------------------------ | ------------------------------------------------ | +| [GPIO](https://www.rt-thread.org/document/site/programming-manual/device/pin/pin/) | 操作 GPIO 管脚 | +| [UART](https://www.rt-thread.org/document/site/programming-manual/device/uart/uart/) | 通过串口收发数据 | +| [I2C](https://www.rt-thread.org/document/site/programming-manual/device/i2c/i2c/) | 通过软件 I2C 收发数据 | +| [SPI](https://www.rt-thread.org/document/site/programming-manual/device/spi/spi/) | 通过 SPI 收发数据 | +| [ADC](https://www.rt-thread.org/document/site/programming-manual/device/adc/adc/) | 测量管脚上的模拟量 | +| SDIO | 通过 SDIO 读写数据 | +| [TIMER](https://www.rt-thread.org/document/site/programming-manual/device/hwtimer/hwtimer/) | 使用硬件定时器实现测量时间和定时执行回调函数功能 | +| [PWM](https://www.rt-thread.org/document/site/programming-manual/device/pwm/pwm/) | 在特定的管脚输出 PWM 波形 | +| [RTC](https://www.rt-thread.org/document/site/programming-manual/device/rtc/rtc/) | 设置和读取时间 | +| [WDT](https://www.rt-thread.org/document/site/programming-manual/device/watchdog/watchdog/) | 看门狗驱动 | +| [QSPI](https://www.rt-thread.org/document/site/programming-manual/device/spi/spi/#qspi_1) | 通过 SPI(1、2、4线) 收发数据 | + +### 2.2 板载外设 + +| 驱动 | 简介 | +| ------- | --------------------------------------- | +| I2C | 板载 I2C 传感器 | +| SDIO | 适用于 SPI 接口或 SDIO 接口的 SD(TF) 卡 | + +### 2.3 扩展模块 + +| 驱动 | 简介 | +| -------- | ---------------------- | +| [RW007](https://github.com/RT-Thread-packages/rw007) | SPI 接口 WIFI 模块 | +| [HS300x](https://github.com/Guozhanxin/hs300x) | I2C 接口的温湿度传感器 | +| [ZMOD4410](https://github.com/ShermanShao/zmod4410) | I2C 接口的室内空气质量传感器 | + +### 2.4 驱动示例代码 + +在 RT-Thread 的 `examples\test` 目录下,有 RT-Thread 提供的基于不同外设驱动的示例代码。在 env 工具中开启 BSP 中要测试的驱动,并将 `examples\test` 中对应的驱动框架测试文件加入工程,即可快速测试 BSP 中提供的驱动。 \ No newline at end of file diff --git a/bsp/renesas/ra6m4-cpk/docs/picture/1635909864954.png b/bsp/renesas/docs/figures/1635909864954.png similarity index 100% rename from bsp/renesas/ra6m4-cpk/docs/picture/1635909864954.png rename to bsp/renesas/docs/figures/1635909864954.png diff --git a/bsp/renesas/docs/figures/1635929089445.png b/bsp/renesas/docs/figures/1635929089445.png new file mode 100644 index 0000000000000000000000000000000000000000..24262797b8fffd33b4b02595e03ab08e6db81521 GIT binary patch literal 11350 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