From 0d1c709fa502f30ecbd8438fe63233ebcd4283a7 Mon Sep 17 00:00:00 2001 From: Wayne Date: Thu, 29 Dec 2022 15:15:13 +0800 Subject: [PATCH] Sync upstream (#6793) Co-authored-by: Wayne Lin --- bsp/nuvoton/README.md | 1 + .../libraries/m460/rtt_port/drv_pdma.c | 12 - .../libraries/m480/StdDriver/src/nu_rtc.c | 92 +- .../Device/Nuvoton/MA35D1/Include/ma35d1.h | 8 +- .../Device/Nuvoton/MA35D1/Include/nfi_reg.h | 913 +-- .../libraries/ma35/StdDriver/SConscript | 16 +- .../libraries/ma35/StdDriver/inc/nu_clk.h | 6 +- .../libraries/ma35/StdDriver/inc/nu_disp.h | 1 + .../libraries/ma35/StdDriver/inc/nu_hwsem.h | 43 +- .../libraries/ma35/StdDriver/inc/nu_sdh.h | 8 + .../libraries/ma35/StdDriver/inc/nu_sys.h | 110 +- .../libraries/ma35/StdDriver/src/nu_clk.c | 8 +- .../libraries/ma35/StdDriver/src/nu_disp.c | 17 + .../libraries/ma35/StdDriver/src/nu_i2s.c | 6 +- .../libraries/ma35/StdDriver/src/nu_pdma.c | 2 +- .../libraries/ma35/StdDriver/src/nu_rtc.c | 10 +- .../libraries/ma35/StdDriver/src/nu_sys.c | 2 +- .../libraries/ma35/UsbHostLib/inc/config.h | 8 +- .../libraries/ma35/UsbHostLib/src/_ehci.c_ | 61 +- .../libraries/ma35/UsbHostLib/src/_ohci.c_ | 46 +- .../libraries/ma35/UsbHostLib/src/mem_alloc.c | 99 +- .../libraries/ma35/UsbHostLib/src/support.c | 5 +- .../libraries/ma35/UsbHostLib/src/usb_core.c | 2 + bsp/nuvoton/libraries/ma35/rtt_port/Kconfig | 65 + .../libraries/ma35/rtt_port/drv_common.h | 27 +- .../{drv_common.c => drv_common_aarch32.c} | 270 +- .../libraries/ma35/rtt_port/drv_common_subm.c | 144 + .../libraries/ma35/rtt_port/drv_disp.c | 36 +- .../libraries/ma35/rtt_port/drv_hwsem.c | 310 + .../libraries/ma35/rtt_port/drv_hwsem.h | 43 + .../libraries/ma35/rtt_port/drv_pdma.c | 109 +- .../libraries/ma35/rtt_port/drv_pdma.h | 1 + .../libraries/ma35/rtt_port/drv_qspi.c | 2 +- bsp/nuvoton/libraries/ma35/rtt_port/drv_rtp.c | 28 +- .../libraries/ma35/rtt_port/drv_sdio.c | 8 +- .../libraries/ma35/rtt_port/drv_ssmcc.c | 29 + .../libraries/ma35/rtt_port/drv_ssmcc.h | 18 + .../libraries/ma35/rtt_port/drv_sspcc.c | 41 + .../libraries/ma35/rtt_port/drv_sspcc.h | 34 + bsp/nuvoton/libraries/ma35/rtt_port/drv_sys.c | 167 +- .../libraries/ma35/rtt_port/drv_uart.c | 519 +- .../libraries/ma35/rtt_port/drv_umctl2.c | 34 + .../libraries/ma35/rtt_port/drv_umctl2.h | 18 + .../libraries/ma35/rtt_port/drv_usbhost.c | 2 +- bsp/nuvoton/libraries/ma35/rtt_port/drv_whc.c | 268 + bsp/nuvoton/libraries/ma35/rtt_port/drv_whc.h | 24 + .../libraries/ma35/rtt_port/nu_clock_init.c | 23 +- bsp/nuvoton/libraries/n9h30/rtt_port/Kconfig | 1 + .../nu_packages/AudioCodec/acodec_nau8822.c | 10 +- .../BMX055/libraries/BMG160_driver/bmg160.h | 2 +- .../BMX055/libraries/BMM050_driver/bmm050.h | 2 +- .../nu_packages/BMX055/sensor_bmx055.c | 107 +- .../nu_packages/BMX055/sensor_bmx055.h | 3 +- .../libraries/nu_packages/Demo/SConscript | 8 +- .../{CCAP_Sensors => Demo}/ccap_demo.c | 9 +- .../libraries/nu_packages/Demo/ccap_saver.c | 409 + .../nu_packages/Demo/hwsem_counter.c | 93 + .../libraries/nu_packages/Demo/smp_demo.c | 177 + .../nu_packages/Demo/wormhole_demo.c | 325 + bsp/nuvoton/libraries/nu_packages/Kconfig | 4 - .../nu_packages/MAX31875/sensor_max31875.c | 7 +- .../nu_packages/MAX31875/sensor_max31875.h | 3 +- .../nu_packages/NCT7717U/sensor_nct7717u.c | 31 +- .../nu_packages/NCT7717U/sensor_nct7717u.h | 2 +- .../nu_packages/SPINAND/drv_spinand.c | 18 +- .../libraries/nu_packages/TPC/ft5446.c | 10 +- bsp/nuvoton/libraries/nu_packages/TPC/gt911.c | 2 +- bsp/nuvoton/libraries/nu_packages/TPC/ili.c | 10 +- .../libraries/nu_packages/TPC/st1663i.c | 10 +- .../libraries/nuc980/Driver/Source/nu_rtc.c | 2 +- bsp/nuvoton/libraries/nuc980/rtt_port/Kconfig | 1 + bsp/nuvoton/ma35-rtp/.config | 333 +- bsp/nuvoton/ma35-rtp/rtthread.bin | Bin 89340 -> 107036 bytes bsp/nuvoton/nk-980iot/.config | 347 +- .../nk-980iot/applications/lvgl/lv_demo.c | 7 +- .../applications/lvgl/lv_port_disp.c | 6 +- .../applications/lvgl/lv_port_disp.h | 23 - .../applications/lvgl/lv_port_indev.h | 28 - bsp/nuvoton/nk-980iot/project.uvproj | 2133 ----- bsp/nuvoton/nk-980iot/rtconfig.h | 442 -- bsp/nuvoton/nk-n9h30/.config | 373 +- bsp/nuvoton/nk-n9h30/applications/SConscript | 4 - .../nk-n9h30/applications/lvgl/lv_conf.h | 9 +- .../nk-n9h30/applications/lvgl/lv_demo.c | 7 +- .../applications/lvgl/lv_gpu_n9h30_ge2d.c | 64 +- .../applications/lvgl/lv_gpu_n9h30_ge2d.h | 4 - .../nk-n9h30/applications/lvgl/lv_port_disp.c | 119 +- .../nk-n9h30/applications/lvgl/lv_port_disp.h | 23 - .../applications/lvgl/lv_port_indev.h | 28 - bsp/nuvoton/nk-n9h30/applications/mnt.c | 25 +- bsp/nuvoton/nk-n9h30/linking_scripts/n9h30.ld | 5 + bsp/nuvoton/nk-n9h30/project.uvproj | 6990 ----------------- bsp/nuvoton/nk-n9h30/rtconfig.h | 422 - bsp/nuvoton/nk-n9h30/rtconfig.py | 4 +- bsp/nuvoton/nk-rtu980/.config | 336 +- bsp/nuvoton/nk-rtu980/project.uvproj | 2284 ------ bsp/nuvoton/nk-rtu980/rtconfig.h | 427 - bsp/nuvoton/nk-rtu980/rtconfig.py | 2 +- bsp/nuvoton/numaker-hmi-ma35d1/.config | 381 +- bsp/nuvoton/numaker-hmi-ma35d1/README.md | 16 +- .../applications/lvgl/lv_conf.h | 4 +- .../applications/lvgl/lv_demo.c | 9 +- .../applications/lvgl/lv_port_disp.c | 66 +- .../applications/lvgl/lv_port_disp.h | 23 - .../applications/lvgl/lv_port_indev.h | 28 - .../numaker-hmi-ma35d1/applications/main.c | 22 - .../numaker-hmi-ma35d1/applications/mnt.c | 33 +- bsp/nuvoton/numaker-hmi-ma35d1/board/Kconfig | 19 +- bsp/nuvoton/numaker-hmi-ma35d1/board/board.h | 3 + .../numaker-hmi-ma35d1/board/board_dev.c | 51 +- .../board/nutool_pincfg/nutool_pincfg.c | 203 +- .../linking_scripts/aarch32.ld | 6 + .../nuwriter_scripts/README.md | 94 +- .../nuwriter_scripts/install_linux.sh | 7 + .../nuwriter_ddr_download_and_run.sh | 8 + .../nuwriter_nand_programming.sh | 11 + .../nuwriter_sd_programming.sh | 11 + .../nuwriter_spinand_programming.sh | 11 + bsp/nuvoton/numaker-hmi-ma35d1/rtconfig.py | 12 +- bsp/nuvoton/numaker-iot-m467/.config | 302 +- .../applications/lvgl/lv_demo.c | 7 +- .../applications/lvgl/lv_port_disp.c | 6 +- .../applications/lvgl/lv_port_disp.h | 23 - .../applications/lvgl/lv_port_indev.h | 28 - bsp/nuvoton/numaker-iot-m467/board/Kconfig | 2 + .../board/NuPinConfig/nutool_pincfg.c | 2 +- .../numaker-iot-m467/board/board_dev.c | 2 +- bsp/nuvoton/numaker-iot-m487/.config | 344 +- .../numaker-iot-m487/Nu_Link_Driver.ini | 1036 --- .../applications/lvgl/lv_port_disp.h | 23 - .../applications/lvgl/lv_port_indev.h | 28 - .../numaker-iot-m487/board/board_dev.c | 4 +- bsp/nuvoton/numaker-iot-m487/project.uvproj | 2383 ------ bsp/nuvoton/numaker-iot-m487/project.uvprojx | 2378 ------ bsp/nuvoton/numaker-iot-m487/rtconfig.h | 398 - bsp/nuvoton/numaker-iot-ma35d1/.config | 1381 ++++ bsp/nuvoton/numaker-iot-ma35d1/Kconfig | 27 + bsp/nuvoton/numaker-iot-ma35d1/README.md | 133 + bsp/nuvoton/numaker-iot-ma35d1/SConscript | 14 + bsp/nuvoton/numaker-iot-ma35d1/SConstruct | 58 + .../applications/SConscript | 11 + .../numaker-iot-ma35d1/applications/main.c | 121 + .../numaker-iot-ma35d1/applications/mnt.c | 283 + bsp/nuvoton/numaker-iot-ma35d1/board/Kconfig | 90 + .../numaker-iot-ma35d1/board/SConscript | 18 + bsp/nuvoton/numaker-iot-ma35d1/board/board.h | 42 + .../numaker-iot-ma35d1/board/board_dev.c | 312 + .../board/nutool_pincfg/nutool_pincfg.c | 476 ++ .../board/nutool_pincfg/nutool_pincfg.cfg | 299 + .../board/nutool_pincfg/nutool_pincfg.h | 90 + .../figures/NuMaker-IoT-MA35D1_B.png | Bin 0 -> 173184 bytes .../figures/NuMaker-IoT-MA35D1_F.png | Bin 0 -> 180404 bytes .../figures/SerialSetting.png | Bin 0 -> 7691 bytes .../linking_scripts/aarch32.ld | 134 + .../nuwriter_scripts/README.md | 87 + .../nuwriter_scripts/UnpackImage.py | 65 + .../_nuwriter_nand_generate_header_bin.bat | 2 + .../_nuwriter_nand_generate_pack_bin.bat | 2 + .../nuwriter_scripts/header-nand.json | 36 + .../nuwriter_scripts/header-sd.json | 36 + .../nuwriter_scripts/nuwriter.py | 1942 +++++ .../nuwriter_ddr2_128mb_download_and_run.bat | 8 + .../nuwriter_ddr3_512mb_download_and_run.bat | 8 + .../nuwriter_nand_programming.bat | 8 + .../nuwriter_sd_programming.bat | 8 + .../nuwriter_spinand_programming.bat | 8 + .../nuwriter_scripts/pack-nand.json | 21 + .../nuwriter_scripts/pack-sd.json | 20 + .../nuwriter_scripts/xusbcom.py | 154 + .../numaker-iot-ma35d1/preload/SConscript | 14 + .../numaker-iot-ma35d1/preload/entry_point.S | 109 + .../numaker-iot-ma35d1/preload/env_build.bat | 7 + .../preload/preload.ld} | 36 - .../numaker-iot-ma35d1/preload/transcode.py | 41 + bsp/nuvoton/numaker-iot-ma35d1/rtconfig.py | 77 + bsp/nuvoton/numaker-m032ki/Nu_Link_Driver.ini | 1038 --- .../applications/lvgl/lv_demo.c | 7 +- .../applications/lvgl/lv_port_disp.c | 6 +- .../applications/lvgl/lv_port_disp.h | 23 - .../applications/lvgl/lv_port_indev.h | 28 - bsp/nuvoton/numaker-m032ki/project.uvprojx | 1256 --- bsp/nuvoton/numaker-m032ki/rtconfig.h | 286 - bsp/nuvoton/numaker-m2354/Nu_Link_Driver.ini | 1037 --- .../numaker-m2354/applications/lvgl/lv_demo.c | 7 +- .../applications/lvgl/lv_port_disp.c | 6 +- .../applications/lvgl/lv_port_disp.h | 23 - .../applications/lvgl/lv_port_indev.h | 28 - bsp/nuvoton/numaker-m2354/project.uvprojx | 2344 ------ bsp/nuvoton/numaker-m2354/rtconfig.h | 381 - .../applications/lvgl/lv_demo.c | 7 +- .../applications/lvgl/lv_port_disp.c | 6 +- .../applications/lvgl/lv_port_disp.h | 23 - .../applications/lvgl/lv_port_indev.h | 28 - .../board/NuPinConfig/nutool_pincfg.c | 3 +- .../numaker-pfm-m487/Nu_Link_Driver.ini | 870 -- .../applications/lvgl/lv_demo.c | 7 +- .../applications/lvgl/lv_port_disp.c | 6 +- .../applications/lvgl/lv_port_disp.h | 23 - .../applications/lvgl/lv_port_indev.h | 28 - .../numaker-pfm-m487/board/board_dev.c | 4 +- bsp/nuvoton/numaker-pfm-m487/project.uvproj | 2525 ------ bsp/nuvoton/numaker-pfm-m487/project.uvprojx | 2520 ------ bsp/nuvoton/numaker-pfm-m487/rtconfig.h | 411 - 203 files changed, 11994 insertions(+), 34486 deletions(-) rename bsp/nuvoton/libraries/ma35/rtt_port/{drv_common.c => drv_common_aarch32.c} (51%) create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_common_subm.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_hwsem.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_hwsem.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_ssmcc.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_ssmcc.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_sspcc.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_sspcc.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_umctl2.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_umctl2.h create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_whc.c create mode 100644 bsp/nuvoton/libraries/ma35/rtt_port/drv_whc.h rename bsp/nuvoton/libraries/nu_packages/{CCAP_Sensors => Demo}/ccap_demo.c (99%) create mode 100644 bsp/nuvoton/libraries/nu_packages/Demo/ccap_saver.c create mode 100644 bsp/nuvoton/libraries/nu_packages/Demo/hwsem_counter.c create mode 100644 bsp/nuvoton/libraries/nu_packages/Demo/smp_demo.c create mode 100644 bsp/nuvoton/libraries/nu_packages/Demo/wormhole_demo.c delete mode 100644 bsp/nuvoton/nk-980iot/applications/lvgl/lv_port_disp.h delete mode 100644 bsp/nuvoton/nk-980iot/applications/lvgl/lv_port_indev.h delete mode 100644 bsp/nuvoton/nk-980iot/project.uvproj delete mode 100644 bsp/nuvoton/nk-980iot/rtconfig.h delete mode 100644 bsp/nuvoton/nk-n9h30/applications/lvgl/lv_port_disp.h delete mode 100644 bsp/nuvoton/nk-n9h30/applications/lvgl/lv_port_indev.h delete mode 100644 bsp/nuvoton/nk-n9h30/project.uvproj delete mode 100644 bsp/nuvoton/nk-n9h30/rtconfig.h delete mode 100644 bsp/nuvoton/nk-rtu980/project.uvproj delete mode 100644 bsp/nuvoton/nk-rtu980/rtconfig.h delete mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_disp.h delete mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_indev.h create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/install_linux.sh create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_ddr_download_and_run.sh create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_nand_programming.sh create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_sd_programming.sh create mode 100644 bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_spinand_programming.sh delete mode 100644 bsp/nuvoton/numaker-iot-m467/applications/lvgl/lv_port_disp.h delete mode 100644 bsp/nuvoton/numaker-iot-m467/applications/lvgl/lv_port_indev.h delete mode 100644 bsp/nuvoton/numaker-iot-m487/Nu_Link_Driver.ini delete mode 100644 bsp/nuvoton/numaker-iot-m487/applications/lvgl/lv_port_disp.h delete mode 100644 bsp/nuvoton/numaker-iot-m487/applications/lvgl/lv_port_indev.h delete mode 100644 bsp/nuvoton/numaker-iot-m487/project.uvproj delete mode 100644 bsp/nuvoton/numaker-iot-m487/project.uvprojx delete mode 100644 bsp/nuvoton/numaker-iot-m487/rtconfig.h create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/.config create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/Kconfig create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/README.md create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/SConscript create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/SConstruct create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/applications/SConscript create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/applications/main.c create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/applications/mnt.c create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/board/Kconfig create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/board/SConscript create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/board/board.h create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/board/board_dev.c create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/board/nutool_pincfg/nutool_pincfg.c create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/board/nutool_pincfg/nutool_pincfg.cfg create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/board/nutool_pincfg/nutool_pincfg.h create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/figures/NuMaker-IoT-MA35D1_B.png create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/figures/NuMaker-IoT-MA35D1_F.png create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/figures/SerialSetting.png create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/linking_scripts/aarch32.ld create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/README.md create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/UnpackImage.py create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/_nuwriter_nand_generate_header_bin.bat create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/_nuwriter_nand_generate_pack_bin.bat create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/header-nand.json create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/header-sd.json create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter.py create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter_ddr2_128mb_download_and_run.bat create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter_ddr3_512mb_download_and_run.bat create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter_nand_programming.bat create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter_sd_programming.bat create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter_spinand_programming.bat create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/pack-nand.json create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/pack-sd.json create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/xusbcom.py create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/preload/SConscript create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/preload/entry_point.S create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/preload/env_build.bat rename bsp/nuvoton/{numaker-hmi-ma35d1/linking_scripts/aarch64.ld => numaker-iot-ma35d1/preload/preload.ld} (77%) create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/preload/transcode.py create mode 100644 bsp/nuvoton/numaker-iot-ma35d1/rtconfig.py delete mode 100644 bsp/nuvoton/numaker-m032ki/Nu_Link_Driver.ini delete mode 100644 bsp/nuvoton/numaker-m032ki/applications/lvgl/lv_port_disp.h delete mode 100644 bsp/nuvoton/numaker-m032ki/applications/lvgl/lv_port_indev.h delete mode 100644 bsp/nuvoton/numaker-m032ki/project.uvprojx delete mode 100644 bsp/nuvoton/numaker-m032ki/rtconfig.h delete mode 100644 bsp/nuvoton/numaker-m2354/Nu_Link_Driver.ini delete mode 100644 bsp/nuvoton/numaker-m2354/applications/lvgl/lv_port_disp.h delete mode 100644 bsp/nuvoton/numaker-m2354/applications/lvgl/lv_port_indev.h delete mode 100644 bsp/nuvoton/numaker-m2354/project.uvprojx delete mode 100644 bsp/nuvoton/numaker-m2354/rtconfig.h delete mode 100644 bsp/nuvoton/numaker-m467hj/applications/lvgl/lv_port_disp.h delete mode 100644 bsp/nuvoton/numaker-m467hj/applications/lvgl/lv_port_indev.h delete mode 100644 bsp/nuvoton/numaker-pfm-m487/Nu_Link_Driver.ini delete mode 100644 bsp/nuvoton/numaker-pfm-m487/applications/lvgl/lv_port_disp.h delete mode 100644 bsp/nuvoton/numaker-pfm-m487/applications/lvgl/lv_port_indev.h delete mode 100644 bsp/nuvoton/numaker-pfm-m487/project.uvproj delete mode 100644 bsp/nuvoton/numaker-pfm-m487/project.uvprojx delete mode 100644 bsp/nuvoton/numaker-pfm-m487/rtconfig.h diff --git a/bsp/nuvoton/README.md b/bsp/nuvoton/README.md index 7cbf783135..c4b93ed78a 100644 --- a/bsp/nuvoton/README.md +++ b/bsp/nuvoton/README.md @@ -14,3 +14,4 @@ Current supported BSP shown in below table: | NuMaker-M467HJ | CORTEX-M4 | [numaker-m467hj](numaker-m467hj) | | NuMaker-IoT-M467 | CORTEX-M4 | [numaker-iot-m467](numaker-iot-m467) | | NuMaker-HMI-MA35D1 | CORTEX-A35, CORTEX-M4 | [numaker-hmi-ma35d1](numaker-hmi-ma35d1), [ma35-rtp](ma35-rtp) | +| NuMaker-IOT-MA35D1 | CORTEX-A35, CORTEX-M4 | [numaker-iot-ma35d1](numaker-iot-ma35d1), [ma35-rtp](ma35-rtp) | diff --git a/bsp/nuvoton/libraries/m460/rtt_port/drv_pdma.c b/bsp/nuvoton/libraries/m460/rtt_port/drv_pdma.c index 22976c66fc..3ee2c2f85e 100644 --- a/bsp/nuvoton/libraries/m460/rtt_port/drv_pdma.c +++ b/bsp/nuvoton/libraries/m460/rtt_port/drv_pdma.c @@ -154,12 +154,6 @@ static const nu_pdma_periph_ctl_t g_nu_pdma_peripheral_ctl_pool[ ] = { PDMA_SPI9_TX, eMemCtl_SrcInc_DstFix }, { PDMA_SPI10_TX, eMemCtl_SrcInc_DstFix }, - { PDMA_I2C0_TX, eMemCtl_SrcInc_DstFix }, - { PDMA_I2C1_TX, eMemCtl_SrcInc_DstFix }, - { PDMA_I2C2_TX, eMemCtl_SrcInc_DstFix }, - { PDMA_I2C3_TX, eMemCtl_SrcInc_DstFix }, - { PDMA_I2C4_TX, eMemCtl_SrcInc_DstFix }, - { PDMA_I2S0_TX, eMemCtl_SrcInc_DstFix }, { PDMA_I2S1_TX, eMemCtl_SrcInc_DstFix }, @@ -215,12 +209,6 @@ static const nu_pdma_periph_ctl_t g_nu_pdma_peripheral_ctl_pool[ ] = { PDMA_EPWM1_P2_RX, eMemCtl_SrcFix_DstInc }, { PDMA_EPWM1_P3_RX, eMemCtl_SrcFix_DstInc }, - { PDMA_I2C0_RX, eMemCtl_SrcFix_DstInc }, - { PDMA_I2C1_RX, eMemCtl_SrcFix_DstInc }, - { PDMA_I2C2_RX, eMemCtl_SrcFix_DstInc }, - { PDMA_I2C3_RX, eMemCtl_SrcFix_DstInc }, - { PDMA_I2C4_RX, eMemCtl_SrcFix_DstInc }, - { PDMA_I2S0_RX, eMemCtl_SrcFix_DstInc }, { PDMA_I2S1_RX, eMemCtl_SrcFix_DstInc }, diff --git a/bsp/nuvoton/libraries/m480/StdDriver/src/nu_rtc.c b/bsp/nuvoton/libraries/m480/StdDriver/src/nu_rtc.c index 0df0ccb443..e7de46e186 100644 --- a/bsp/nuvoton/libraries/m480/StdDriver/src/nu_rtc.c +++ b/bsp/nuvoton/libraries/m480/StdDriver/src/nu_rtc.c @@ -67,15 +67,15 @@ void RTC_Open(S_RTC_TIME_DATA_T *sPt) { RTC->INIT = RTC_INIT_KEY; - if(RTC->INIT != RTC_INIT_ACTIVE_Msk) + if (RTC->INIT != RTC_INIT_ACTIVE_Msk) { RTC->INIT = RTC_INIT_KEY; - while(RTC->INIT != RTC_INIT_ACTIVE_Msk) + while (RTC->INIT != RTC_INIT_ACTIVE_Msk) { } } - if(sPt == 0) + if (sPt == 0) { } else @@ -110,14 +110,14 @@ void RTC_Close(void) void RTC_32KCalibration(int32_t i32FrequencyX10000) { uint64_t u64Compensate; - int32_t i32RegInt,i32RegFra ; + int32_t i32RegInt, i32RegFra ; - if(!(SYS->CSERVER & 0x1)) + if (!(SYS->CSERVER & 0x1)) { u64Compensate = (uint64_t)(0x2710000000000); u64Compensate = (uint64_t)(u64Compensate / (uint64_t)i32FrequencyX10000); - if(u64Compensate >= (uint64_t)0x400000) + if (u64Compensate >= (uint64_t)0x400000) { u64Compensate = (uint64_t)0x3FFFFF; } @@ -128,23 +128,23 @@ void RTC_32KCalibration(int32_t i32FrequencyX10000) else { /* Compute Integer and Fraction for RTC register*/ - i32RegInt = (i32FrequencyX10000/10000) - 32752; - i32RegFra = ((((i32FrequencyX10000%10000)) * 64) + 5000) / 10000; + i32RegInt = (i32FrequencyX10000 / 10000) - 32752; + i32RegFra = ((((i32FrequencyX10000 % 10000)) * 64) + 5000) / 10000; - if(i32RegFra >= 0x40) + if (i32RegFra >= 0x40) { i32RegFra = 0x0; i32RegInt++; } /* Judge Integer part is reasonable */ - if ( (i32RegInt < 0) | (i32RegInt > 31) ) + if ((i32RegInt < 0) | (i32RegInt > 31)) { return; } RTC_WaitAccessEnable(); - RTC->FREQADJ = (uint32_t)((i32RegInt<<8) | i32RegFra); + RTC->FREQADJ = (uint32_t)((i32RegInt << 8) | i32RegFra); } } @@ -204,13 +204,13 @@ void RTC_GetDateAndTime(S_RTC_TIME_DATA_T *sPt) sPt->u32Day = u32Tmp + g_u32loDay; /* Compute 12/24 hour */ - if(sPt->u32TimeScale == RTC_CLOCK_12) + if (sPt->u32TimeScale == RTC_CLOCK_12) { u32Tmp = (g_u32hiHour * 10ul); u32Tmp += g_u32loHour; sPt->u32Hour = u32Tmp; /* AM: 1~12. PM: 21~32. */ - if(sPt->u32Hour >= 21ul) + if (sPt->u32Hour >= 21ul) { sPt->u32AmPm = RTC_PM; sPt->u32Hour -= 20ul; @@ -301,13 +301,13 @@ void RTC_GetAlarmDateAndTime(S_RTC_TIME_DATA_T *sPt) sPt->u32Day = u32Tmp + g_u32loDay; /* Compute 12/24 hour */ - if(sPt->u32TimeScale == RTC_CLOCK_12) + if (sPt->u32TimeScale == RTC_CLOCK_12) { u32Tmp = (g_u32hiHour * 10ul); u32Tmp += g_u32loHour; sPt->u32Hour = u32Tmp; /* AM: 1~12. PM: 21~32. */ - if(sPt->u32Hour >= 21ul) + if (sPt->u32Hour >= 21ul) { sPt->u32AmPm = RTC_PM; sPt->u32Hour -= 20ul; @@ -366,7 +366,7 @@ void RTC_SetDateAndTime(S_RTC_TIME_DATA_T *sPt) { uint32_t u32RegCAL, u32RegTIME; - if(sPt == 0ul) + if (sPt == NULL) { } else @@ -375,14 +375,14 @@ void RTC_SetDateAndTime(S_RTC_TIME_DATA_T *sPt) /* Set RTC 24/12 hour setting and Day of the Week */ /*-----------------------------------------------------------------------------------------------------*/ RTC_WaitAccessEnable(); - if(sPt->u32TimeScale == RTC_CLOCK_12) + if (sPt->u32TimeScale == RTC_CLOCK_12) { RTC->CLKFMT &= ~RTC_CLKFMT_24HEN_Msk; /*-------------------------------------------------------------------------------------------------*/ /* Important, range of 12-hour PM mode is 21 up to 32 */ /*-------------------------------------------------------------------------------------------------*/ - if(sPt->u32AmPm == RTC_PM) + if (sPt->u32AmPm == RTC_PM) { sPt->u32Hour += 20ul; } @@ -447,7 +447,7 @@ void RTC_SetAlarmDateAndTime(S_RTC_TIME_DATA_T *sPt) { uint32_t u32RegCALM, u32RegTALM; - if(sPt == 0) + if (sPt == NULL) { } else @@ -456,14 +456,14 @@ void RTC_SetAlarmDateAndTime(S_RTC_TIME_DATA_T *sPt) /* Set RTC 24/12 hour setting and Day of the Week */ /*-----------------------------------------------------------------------------------------------------*/ RTC_WaitAccessEnable(); - if(sPt->u32TimeScale == RTC_CLOCK_12) + if (sPt->u32TimeScale == RTC_CLOCK_12) { RTC->CLKFMT &= ~RTC_CLKFMT_24HEN_Msk; /*-------------------------------------------------------------------------------------------------*/ /* Important, range of 12-hour PM mode is 21 up to 32 */ /*-------------------------------------------------------------------------------------------------*/ - if(sPt->u32AmPm == RTC_PM) + if (sPt->u32AmPm == RTC_PM) { sPt->u32Hour += 20ul; } @@ -549,7 +549,7 @@ void RTC_SetTime(uint32_t u32Hour, uint32_t u32Minute, uint32_t u32Second, uint3 uint32_t u32RegTIME; /* Important, range of 12-hour PM mode is 21 up to 32 */ - if((u32TimeMode == RTC_CLOCK_12) && (u32AmPm == RTC_PM)) + if ((u32TimeMode == RTC_CLOCK_12) && (u32AmPm == RTC_PM)) { u32Hour += 20ul; } @@ -565,7 +565,7 @@ void RTC_SetTime(uint32_t u32Hour, uint32_t u32Minute, uint32_t u32Second, uint3 /* Set RTC 24/12 hour setting and Day of the Week */ /*-----------------------------------------------------------------------------------------------------*/ RTC_WaitAccessEnable(); - if(u32TimeMode == RTC_CLOCK_12) + if (u32TimeMode == RTC_CLOCK_12) { RTC->CLKFMT &= ~RTC_CLKFMT_24HEN_Msk; } @@ -624,7 +624,7 @@ void RTC_SetAlarmTime(uint32_t u32Hour, uint32_t u32Minute, uint32_t u32Second, uint32_t u32RegTALM; /* Important, range of 12-hour PM mode is 21 up to 32 */ - if((u32TimeMode == RTC_CLOCK_12) && (u32AmPm == RTC_PM)) + if ((u32TimeMode == RTC_CLOCK_12) && (u32AmPm == RTC_PM)) { u32Hour += 20ul; } @@ -640,7 +640,7 @@ void RTC_SetAlarmTime(uint32_t u32Hour, uint32_t u32Minute, uint32_t u32Second, /* Set RTC 24/12 hour setting and Day of the Week */ /*-----------------------------------------------------------------------------------------------------*/ RTC_WaitAccessEnable(); - if(u32TimeMode == RTC_CLOCK_12) + if (u32TimeMode == RTC_CLOCK_12) { RTC->CLKFMT &= ~RTC_CLKFMT_24HEN_Msk; } @@ -861,15 +861,15 @@ void RTC_StaticTamperEnable(uint32_t u32TamperSelect, uint32_t u32DetecLevel, ui RTC_WaitAccessEnable(); u32Reg = RTC->TAMPCTL; - u32TmpReg = ( RTC_TAMPCTL_TAMP0EN_Msk | (u32DetecLevel << RTC_TAMPCTL_TAMP0LV_Pos) | - (u32DebounceEn << RTC_TAMPCTL_TAMP0DBEN_Pos) ); + u32TmpReg = (RTC_TAMPCTL_TAMP0EN_Msk | (u32DetecLevel << RTC_TAMPCTL_TAMP0LV_Pos) | + (u32DebounceEn << RTC_TAMPCTL_TAMP0DBEN_Pos)); - for(i = 0ul; i < MAX_TAMPER_PIN_NUM; i++) + for (i = 0ul; i < MAX_TAMPER_PIN_NUM; i++) { - if(u32TamperSelect & (0x1ul << i)) + if (u32TamperSelect & (0x1ul << i)) { - u32Reg &= ~((RTC_TAMPCTL_TAMP0EN_Msk|RTC_TAMPCTL_TAMP0LV_Msk|RTC_TAMPCTL_TAMP0DBEN_Msk) << (i*4ul)); - u32Reg |= (u32TmpReg << (i*4ul)); + u32Reg &= ~((RTC_TAMPCTL_TAMP0EN_Msk | RTC_TAMPCTL_TAMP0LV_Msk | RTC_TAMPCTL_TAMP0DBEN_Msk) << (i * 4ul)); + u32Reg |= (u32TmpReg << (i * 4ul)); } } @@ -904,11 +904,11 @@ void RTC_StaticTamperDisable(uint32_t u32TamperSelect) u32TmpReg = (RTC_TAMPCTL_TAMP0EN_Msk); - for(i = 0ul; i < MAX_TAMPER_PIN_NUM; i++) + for (i = 0ul; i < MAX_TAMPER_PIN_NUM; i++) { - if(u32TamperSelect & (0x1ul << i)) + if (u32TamperSelect & (0x1ul << i)) { - u32Reg &= ~(u32TmpReg << (i*4ul)); + u32Reg &= ~(u32TmpReg << (i * 4ul)); } } @@ -958,7 +958,7 @@ void RTC_DynamicTamperEnable(uint32_t u32PairSel, uint32_t u32DebounceEn, uint32 u32Reg &= ~(RTC_TAMPCTL_DYN1ISS_Msk | RTC_TAMPCTL_DYN2ISS_Msk); u32Reg |= ((u32Pair1Source & 0x1ul) << RTC_TAMPCTL_DYN1ISS_Pos) | ((u32Pair2Source & 0x1ul) << RTC_TAMPCTL_DYN2ISS_Pos); - if(u32DebounceEn) + if (u32DebounceEn) { u32TmpReg = (RTC_TAMPCTL_TAMP0EN_Msk | RTC_TAMPCTL_TAMP1EN_Msk | RTC_TAMPCTL_TAMP0DBEN_Msk | RTC_TAMPCTL_TAMP1DBEN_Msk | RTC_TAMPCTL_DYNPR0EN_Msk); @@ -968,22 +968,22 @@ void RTC_DynamicTamperEnable(uint32_t u32PairSel, uint32_t u32DebounceEn, uint32 u32TmpReg = (RTC_TAMPCTL_TAMP0EN_Msk | RTC_TAMPCTL_TAMP1EN_Msk | RTC_TAMPCTL_DYNPR0EN_Msk); } - for(i = 0ul; i < MAX_PAIR_NUM; i++) + for (i = 0ul; i < MAX_PAIR_NUM; i++) { - if(u32PairSel & (0x1ul << i)) + if (u32PairSel & (0x1ul << i)) { - u32Reg &= ~((RTC_TAMPCTL_TAMP0DBEN_Msk | RTC_TAMPCTL_TAMP1DBEN_Msk) << (i*8ul)); - u32Reg |= (u32TmpReg << (i*8ul)); + u32Reg &= ~((RTC_TAMPCTL_TAMP0DBEN_Msk | RTC_TAMPCTL_TAMP1DBEN_Msk) << (i * 8ul)); + u32Reg |= (u32TmpReg << (i * 8ul)); } } - if((u32Pair1Source) && (u32PairSel & RTC_PAIR1_SELECT)) + if ((u32Pair1Source) && (u32PairSel & RTC_PAIR1_SELECT)) { u32Reg &= ~RTC_TAMPCTL_TAMP2EN_Msk; u32Reg |= u32Tamper2Debounce; } - if((u32Pair2Source) && (u32PairSel & RTC_PAIR2_SELECT)) + if ((u32Pair2Source) && (u32PairSel & RTC_PAIR2_SELECT)) { u32Reg &= ~RTC_TAMPCTL_TAMP4EN_Msk; u32Reg |= u32Tamper4Debounce; @@ -1015,23 +1015,23 @@ void RTC_DynamicTamperDisable(uint32_t u32PairSel) RTC_WaitAccessEnable(); u32Reg = RTC->TAMPCTL; - if((u32Reg & RTC_TAMPCTL_DYN1ISS_Msk) && (u32PairSel & RTC_PAIR1_SELECT)) + if ((u32Reg & RTC_TAMPCTL_DYN1ISS_Msk) && (u32PairSel & RTC_PAIR1_SELECT)) { u32Tamper2En = u32Reg & RTC_TAMPCTL_TAMP2EN_Msk; } - if((u32Reg & RTC_TAMPCTL_DYN2ISS_Msk) && (u32PairSel & RTC_PAIR2_SELECT)) + if ((u32Reg & RTC_TAMPCTL_DYN2ISS_Msk) && (u32PairSel & RTC_PAIR2_SELECT)) { u32Tamper4En = u32Reg & RTC_TAMPCTL_TAMP4EN_Msk; } u32TmpReg = (RTC_TAMPCTL_TAMP0EN_Msk | RTC_TAMPCTL_TAMP1EN_Msk | RTC_TAMPCTL_DYNPR0EN_Msk); - for(i = 0ul; i < MAX_PAIR_NUM; i++) + for (i = 0ul; i < MAX_PAIR_NUM; i++) { - if(u32PairSel & (0x1ul << i)) + if (u32PairSel & (0x1ul << i)) { - u32Reg &= ~(u32TmpReg << ((i*8ul))); + u32Reg &= ~(u32TmpReg << ((i * 8ul))); } } diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ma35d1.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ma35d1.h index 0481d1ee39..695a97d68c 100644 --- a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ma35d1.h +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/ma35d1.h @@ -239,9 +239,9 @@ typedef enum IRQn /****** Platform Exceptions Numbers ***************************************************/ LVD_IRQn = 32, /*!< Low Voltage detection Interrupt */ A35PMU_IRQn = 33, /*!< A35 PMU Interrupt */ - HSEM_IRQn = 34, /*!< Hardware Semaphore Interrupt */ + HWSEM0_IRQn = 34, /*!< Hardware Semaphore Interrupt */ CKFAIL_IRQn = 35, /*!< Clock failed Interrupt */ - WRHO_IRQn = 36, /*!< Wormhole Interrupt */ + WHC0_IRQn = 36, /*!< Wormhole Interrupt */ RTC_IRQn = 37, /*!< Real Time Clock Interrupt */ TAMPER_IRQn = 38, /*!< Tamper detection Interrupt */ WDT0_IRQn = 39, /*!< Watchdog timer 0 Interrupt */ @@ -266,7 +266,7 @@ typedef enum IRQn SSPCC_IRQn = 58, /*!< SSPCC Interrupt */ GFX_IRQn = 59, /*!< GFX GC520L Interrupt (Graphic Engine) */ VDE_IRQn = 60, /*!< Video Decoder (VC8000) Interrupt */ - WRHO1_IRQn = 61, /*!< WRHO 1 Interrupt */ + WHC1_IRQn = 61, /*!< WRHO 1 Interrupt */ SDH0_IRQn = 62, /*!< SDH 0 Interrupt */ SDH1_IRQn = 63, /*!< SDH 1 Interrupt */ HSUSBD_IRQn = 64, /*!< USB 2.0 High-Speed Device Interrupt */ @@ -468,6 +468,7 @@ typedef enum IRQn #include "sdh_reg.h" #include "ccap_reg.h" +#include "nfi_reg.h" /** @addtogroup PERIPHERAL_MEM_MAP Peripheral Memory Base Memory Mapped Structure for Peripherals @@ -781,6 +782,7 @@ typedef enum IRQn #define CCAP0 ((CCAP_T*) CCAP0_BASE) #define CCAP1 ((CCAP_T*) CCAP1_BASE) +#define NFI ((NFI_T*) NAND_BASE) /*@}*/ /* end of group ERIPHERAL_DECLARATION */ /** @addtogroup IO_ROUTINE I/O Routines diff --git a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/nfi_reg.h b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/nfi_reg.h index de1320210c..25477915bd 100644 --- a/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/nfi_reg.h +++ b/bsp/nuvoton/libraries/ma35/Device/Nuvoton/MA35D1/Include/nfi_reg.h @@ -1803,50 +1803,27 @@ typedef struct * |[31:0] |Data |NAND Flash Redundant Area Word n * | | |This field indicates a 32-bit data of redundant area. */ - __IO uint32_t BUFFER0; /*!< [0x0000] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER1; /*!< [0x0004] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER2; /*!< [0x0008] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER3; /*!< [0x000c] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER4; /*!< [0x0010] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER5; /*!< [0x0014] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER6; /*!< [0x0018] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER7; /*!< [0x001c] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER8; /*!< [0x0020] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER9; /*!< [0x0024] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER10; /*!< [0x0028] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER11; /*!< [0x002c] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER12; /*!< [0x0030] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER13; /*!< [0x0034] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER14; /*!< [0x0038] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER15; /*!< [0x003c] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER16; /*!< [0x0040] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER17; /*!< [0x0044] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER18; /*!< [0x0048] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER19; /*!< [0x004c] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER20; /*!< [0x0050] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER21; /*!< [0x0054] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER22; /*!< [0x0058] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER23; /*!< [0x005c] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER24; /*!< [0x0060] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER25; /*!< [0x0064] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER26; /*!< [0x0068] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER27; /*!< [0x006c] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER28; /*!< [0x0070] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER29; /*!< [0x0074] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER30; /*!< [0x0078] NFI Embedded Buffer Word n */ - __IO uint32_t BUFFER31; /*!< [0x007c] NFI Embedded Buffer Word n */ - __I uint32_t RESERVE0[224]; + __IO uint32_t BUFFER[32]; /*!< [0x0000] NFI Embedded Buffer Word n */ + /** @cond HIDDEN_SYMBOLS */ + __I uint32_t RESERVE0[224]; /*!< [0x0080~0x03FC] */ + /** @endcond */ __IO uint32_t DMACTL; /*!< [0x0400] NFI DMA Control and Status Register */ - __I uint32_t RESERVE1[1]; + /** @cond HIDDEN_SYMBOLS */ + __I uint32_t RESERVE1[1]; /*!< [0x0404] */ + /** @endcond */ __IO uint32_t DMASA; /*!< [0x0408] NFI DMA Transfer Starting Address Register */ __I uint32_t DMABCNT; /*!< [0x040c] NFI DMA Transfer Byte Count Register */ __IO uint32_t DMAINTEN; /*!< [0x0410] NFI DMA Interrupt Enable Control Register */ __I uint32_t DMAINTSTS; /*!< [0x0414] NFI DMA Interrupt Status Register */ - __I uint32_t RESERVE2[250]; + /** @cond HIDDEN_SYMBOLS */ + __I uint32_t RESERVE2[250]; /*!< [0x0418~0x07FC] */ + /** @endcond */ __IO uint32_t GCTL; /*!< [0x0800] NFI Global Control and Status Register */ __IO uint32_t GINTEN; /*!< [0x0804] NFI Global Interrupt Control Register */ __I uint32_t GINTSTS; /*!< [0x0808] NFI Global Interrupt Status Register */ - __I uint32_t RESERVE3[37]; + /** @cond HIDDEN_SYMBOLS */ + __I uint32_t RESERVE3[37]; /*!< [0x080C~0x089C] */ + /** @endcond */ __IO uint32_t NANDCTL; /*!< [0x08a0] NAND Flash Control Register */ __IO uint32_t NANDTMCTL; /*!< [0x08a4] NAND Flash Timing Control Register */ __IO uint32_t NANDINTEN; /*!< [0x08a8] NAND Flash Interrupt Enable Register */ @@ -1856,151 +1833,22 @@ typedef struct __IO uint32_t NANDDATA; /*!< [0x08b8] NAND Flash Data Port Register */ __IO uint32_t NANDRACTL; /*!< [0x08bc] NAND Flash Redundant Area Control Register */ __IO uint32_t NANDECTL; /*!< [0x08c0] NAND Flash Extend Control Register */ - __I uint32_t RESERVE4[3]; - __I uint32_t NANDECCES0; /*!< [0x08d0] NAND Flash ECC Error Status 0 Register */ - __I uint32_t NANDECCES1; /*!< [0x08d4] NAND Flash ECC Error Status 1 Register */ - __I uint32_t NANDECCES2; /*!< [0x08d8] NAND Flash ECC Error Status 2 Register */ - __I uint32_t NANDECCES3; /*!< [0x08dc] NAND Flash ECC Error Status 3 Register */ - __I uint32_t RESERVE5[8]; - __I uint32_t NANDECCEA0; /*!< [0x0900] NAND Flash ECC Error Byte Address 0 Register */ - __I uint32_t NANDECCEA1; /*!< [0x0904] NAND Flash ECC Error Byte Address 1 Register */ - __I uint32_t NANDECCEA2; /*!< [0x0908] NAND Flash ECC Error Byte Address 2 Register */ - __I uint32_t NANDECCEA3; /*!< [0x090c] NAND Flash ECC Error Byte Address 3 Register */ - __I uint32_t NANDECCEA4; /*!< [0x0910] NAND Flash ECC Error Byte Address 4 Register */ - __I uint32_t NANDECCEA5; /*!< [0x0914] NAND Flash ECC Error Byte Address 5 Register */ - __I uint32_t NANDECCEA6; /*!< [0x0918] NAND Flash ECC Error Byte Address 6 Register */ - __I uint32_t NANDECCEA7; /*!< [0x091c] NAND Flash ECC Error Byte Address 7 Register */ - __I uint32_t NANDECCEA8; /*!< [0x0920] NAND Flash ECC Error Byte Address 8 Register */ - __I uint32_t NANDECCEA9; /*!< [0x0924] NAND Flash ECC Error Byte Address 9 Register */ - __I uint32_t NANDECCEA10; /*!< [0x0928] NAND Flash ECC Error Byte Address 10 Register */ - __I uint32_t NANDECCEA11; /*!< [0x092c] NAND Flash ECC Error Byte Address 11 Register */ - __I uint32_t RESERVE6[12]; - __I uint32_t NANDECCED0; /*!< [0x0960] NAND Flash ECC Error Data Register 0 */ - __I uint32_t NANDECCED1; /*!< [0x0964] NAND Flash ECC Error Data Register 1 */ - __I uint32_t NANDECCED2; /*!< [0x0968] NAND Flash ECC Error Data Register 2 */ - __I uint32_t NANDECCED3; /*!< [0x096c] NAND Flash ECC Error Data Register 3 */ - __I uint32_t NANDECCED4; /*!< [0x0970] NAND Flash ECC Error Data Register 4 */ - __I uint32_t NANDECCED5; /*!< [0x0974] NAND Flash ECC Error Data Register 5 */ - __I uint32_t RESERVE7[34]; - __IO uint32_t NANDRA0; /*!< [0x0a00] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA1; /*!< [0x0a04] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA2; /*!< [0x0a08] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA3; /*!< [0x0a0c] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA4; /*!< [0x0a10] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA5; /*!< [0x0a14] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA6; /*!< [0x0a18] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA7; /*!< [0x0a1c] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA8; /*!< [0x0a20] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA9; /*!< [0x0a24] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA10; /*!< [0x0a28] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA11; /*!< [0x0a2c] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA12; /*!< [0x0a30] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA13; /*!< [0x0a34] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA14; /*!< [0x0a38] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA15; /*!< [0x0a3c] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA16; /*!< [0x0a40] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA17; /*!< [0x0a44] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA18; /*!< [0x0a48] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA19; /*!< [0x0a4c] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA20; /*!< [0x0a50] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA21; /*!< [0x0a54] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA22; /*!< [0x0a58] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA23; /*!< [0x0a5c] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA24; /*!< [0x0a60] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA25; /*!< [0x0a64] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA26; /*!< [0x0a68] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA27; /*!< [0x0a6c] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA28; /*!< [0x0a70] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA29; /*!< [0x0a74] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA30; /*!< [0x0a78] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA31; /*!< [0x0a7c] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA32; /*!< [0x0a80] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA33; /*!< [0x0a84] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA34; /*!< [0x0a88] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA35; /*!< [0x0a8c] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA36; /*!< [0x0a90] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA37; /*!< [0x0a94] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA38; /*!< [0x0a98] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA39; /*!< [0x0a9c] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA40; /*!< [0x0aa0] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA41; /*!< [0x0aa4] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA42; /*!< [0x0aa8] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA43; /*!< [0x0aac] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA44; /*!< [0x0ab0] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA45; /*!< [0x0ab4] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA46; /*!< [0x0ab8] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA47; /*!< [0x0abc] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA48; /*!< [0x0ac0] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA49; /*!< [0x0ac4] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA50; /*!< [0x0ac8] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA51; /*!< [0x0acc] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA52; /*!< [0x0ad0] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA53; /*!< [0x0ad4] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA54; /*!< [0x0ad8] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA55; /*!< [0x0adc] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA56; /*!< [0x0ae0] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA57; /*!< [0x0ae4] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA58; /*!< [0x0ae8] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA59; /*!< [0x0aec] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA60; /*!< [0x0af0] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA61; /*!< [0x0af4] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA62; /*!< [0x0af8] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA63; /*!< [0x0afc] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA64; /*!< [0x0b00] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA65; /*!< [0x0b04] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA66; /*!< [0x0b08] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA67; /*!< [0x0b0c] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA68; /*!< [0x0b10] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA69; /*!< [0x0b14] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA70; /*!< [0x0b18] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA71; /*!< [0x0b1c] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA72; /*!< [0x0b20] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA73; /*!< [0x0b24] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA74; /*!< [0x0b28] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA75; /*!< [0x0b2c] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA76; /*!< [0x0b30] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA77; /*!< [0x0b34] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA78; /*!< [0x0b38] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA79; /*!< [0x0b3c] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA80; /*!< [0x0b40] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA81; /*!< [0x0b44] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA82; /*!< [0x0b48] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA83; /*!< [0x0b4c] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA84; /*!< [0x0b50] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA85; /*!< [0x0b54] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA86; /*!< [0x0b58] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA87; /*!< [0x0b5c] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA88; /*!< [0x0b60] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA89; /*!< [0x0b64] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA90; /*!< [0x0b68] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA91; /*!< [0x0b6c] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA92; /*!< [0x0b70] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA93; /*!< [0x0b74] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA94; /*!< [0x0b78] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA95; /*!< [0x0b7c] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA96; /*!< [0x0b80] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA97; /*!< [0x0b84] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA98; /*!< [0x0b88] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA99; /*!< [0x0b8c] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA100; /*!< [0x0b90] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA101; /*!< [0x0b94] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA102; /*!< [0x0b98] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA103; /*!< [0x0b9c] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA104; /*!< [0x0ba0] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA105; /*!< [0x0ba4] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA106; /*!< [0x0ba8] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA107; /*!< [0x0bac] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA108; /*!< [0x0bb0] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA109; /*!< [0x0bb4] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA110; /*!< [0x0bb8] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA111; /*!< [0x0bbc] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA112; /*!< [0x0bc0] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA113; /*!< [0x0bc4] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA114; /*!< [0x0bc8] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA115; /*!< [0x0bcc] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA116; /*!< [0x0bd0] NAND Flash Redundant Area Word n */ - __IO uint32_t NANDRA117; /*!< [0x0bd4] NAND Flash Redundant Area Word n */ - + /** @cond HIDDEN_SYMBOLS */ + __I uint32_t RESERVE4[3]; /*!< [0x08C4~0x08CC] */ + /** @endcond */ + __I uint32_t NANDECCES[4]; /*!< [0x08d0] NAND Flash ECC Error Status 0 Register */ + /** @cond HIDDEN_SYMBOLS */ + __I uint32_t RESERVE5[8]; /*!< [0x08E0~0x08FC] */ + /** @endcond */ + __I uint32_t NANDECCEA[12]; /*!< [0x0900] NAND Flash ECC Error Byte Address 0 Register */ + /** @cond HIDDEN_SYMBOLS */ + __I uint32_t RESERVE6[12]; /*!< [0x0930~0x095C] */ + /** @endcond */ + __I uint32_t NANDECCED[6]; /*!< [0x0960] NAND Flash ECC Error Data Register 0 */ + /** @cond HIDDEN_SYMBOLS */ + __I uint32_t RESERVE7[34]; /*!< [0x0978~0x09FC] */ + /** @endcond */ + __IO uint32_t NANDRA[118]; /*!< [0x0a00] NAND Flash Redundant Area Word n */ } NFI_T; /** @@ -2008,101 +1856,8 @@ typedef struct Constant Definitions for NFI Controller @{ */ -#define NFI_BUFFER0_Data_Pos (0) /*!< NFI_T::BUFFER0: Data Position */ -#define NFI_BUFFER0_Data_Msk (0xfffffffful << NFI_BUFFER0_Data_Pos) /*!< NFI_T::BUFFER0: Data Mask */ - -#define NFI_BUFFER1_Data_Pos (0) /*!< NFI_T::BUFFER1: Data Position */ -#define NFI_BUFFER1_Data_Msk (0xfffffffful << NFI_BUFFER1_Data_Pos) /*!< NFI_T::BUFFER1: Data Mask */ - -#define NFI_BUFFER2_Data_Pos (0) /*!< NFI_T::BUFFER2: Data Position */ -#define NFI_BUFFER2_Data_Msk (0xfffffffful << NFI_BUFFER2_Data_Pos) /*!< NFI_T::BUFFER2: Data Mask */ - -#define NFI_BUFFER3_Data_Pos (0) /*!< NFI_T::BUFFER3: Data Position */ -#define NFI_BUFFER3_Data_Msk (0xfffffffful << NFI_BUFFER3_Data_Pos) /*!< NFI_T::BUFFER3: Data Mask */ - -#define NFI_BUFFER4_Data_Pos (0) /*!< NFI_T::BUFFER4: Data Position */ -#define NFI_BUFFER4_Data_Msk (0xfffffffful << NFI_BUFFER4_Data_Pos) /*!< NFI_T::BUFFER4: Data Mask */ - -#define NFI_BUFFER5_Data_Pos (0) /*!< NFI_T::BUFFER5: Data Position */ -#define NFI_BUFFER5_Data_Msk (0xfffffffful << NFI_BUFFER5_Data_Pos) /*!< NFI_T::BUFFER5: Data Mask */ - -#define NFI_BUFFER6_Data_Pos (0) /*!< NFI_T::BUFFER6: Data Position */ -#define NFI_BUFFER6_Data_Msk (0xfffffffful << NFI_BUFFER6_Data_Pos) /*!< NFI_T::BUFFER6: Data Mask */ - -#define NFI_BUFFER7_Data_Pos (0) /*!< NFI_T::BUFFER7: Data Position */ -#define NFI_BUFFER7_Data_Msk (0xfffffffful << NFI_BUFFER7_Data_Pos) /*!< NFI_T::BUFFER7: Data Mask */ - -#define NFI_BUFFER8_Data_Pos (0) /*!< NFI_T::BUFFER8: Data Position */ -#define NFI_BUFFER8_Data_Msk (0xfffffffful << NFI_BUFFER8_Data_Pos) /*!< NFI_T::BUFFER8: Data Mask */ - -#define NFI_BUFFER9_Data_Pos (0) /*!< NFI_T::BUFFER9: Data Position */ -#define NFI_BUFFER9_Data_Msk (0xfffffffful << NFI_BUFFER9_Data_Pos) /*!< NFI_T::BUFFER9: Data Mask */ - -#define NFI_BUFFER10_Data_Pos (0) /*!< NFI_T::BUFFER10: Data Position */ -#define NFI_BUFFER10_Data_Msk (0xfffffffful << NFI_BUFFER10_Data_Pos) /*!< NFI_T::BUFFER10: Data Mask */ - -#define NFI_BUFFER11_Data_Pos (0) /*!< NFI_T::BUFFER11: Data Position */ -#define NFI_BUFFER11_Data_Msk (0xfffffffful << NFI_BUFFER11_Data_Pos) /*!< NFI_T::BUFFER11: Data Mask */ - -#define NFI_BUFFER12_Data_Pos (0) /*!< NFI_T::BUFFER12: Data Position */ -#define NFI_BUFFER12_Data_Msk (0xfffffffful << NFI_BUFFER12_Data_Pos) /*!< NFI_T::BUFFER12: Data Mask */ - -#define NFI_BUFFER13_Data_Pos (0) /*!< NFI_T::BUFFER13: Data Position */ -#define NFI_BUFFER13_Data_Msk (0xfffffffful << NFI_BUFFER13_Data_Pos) /*!< NFI_T::BUFFER13: Data Mask */ - -#define NFI_BUFFER14_Data_Pos (0) /*!< NFI_T::BUFFER14: Data Position */ -#define NFI_BUFFER14_Data_Msk (0xfffffffful << NFI_BUFFER14_Data_Pos) /*!< NFI_T::BUFFER14: Data Mask */ - -#define NFI_BUFFER15_Data_Pos (0) /*!< NFI_T::BUFFER15: Data Position */ -#define NFI_BUFFER15_Data_Msk (0xfffffffful << NFI_BUFFER15_Data_Pos) /*!< NFI_T::BUFFER15: Data Mask */ - -#define NFI_BUFFER16_Data_Pos (0) /*!< NFI_T::BUFFER16: Data Position */ -#define NFI_BUFFER16_Data_Msk (0xfffffffful << NFI_BUFFER16_Data_Pos) /*!< NFI_T::BUFFER16: Data Mask */ - -#define NFI_BUFFER17_Data_Pos (0) /*!< NFI_T::BUFFER17: Data Position */ -#define NFI_BUFFER17_Data_Msk (0xfffffffful << NFI_BUFFER17_Data_Pos) /*!< NFI_T::BUFFER17: Data Mask */ - -#define NFI_BUFFER18_Data_Pos (0) /*!< NFI_T::BUFFER18: Data Position */ -#define NFI_BUFFER18_Data_Msk (0xfffffffful << NFI_BUFFER18_Data_Pos) /*!< NFI_T::BUFFER18: Data Mask */ - -#define NFI_BUFFER19_Data_Pos (0) /*!< NFI_T::BUFFER19: Data Position */ -#define NFI_BUFFER19_Data_Msk (0xfffffffful << NFI_BUFFER19_Data_Pos) /*!< NFI_T::BUFFER19: Data Mask */ - -#define NFI_BUFFER20_Data_Pos (0) /*!< NFI_T::BUFFER20: Data Position */ -#define NFI_BUFFER20_Data_Msk (0xfffffffful << NFI_BUFFER20_Data_Pos) /*!< NFI_T::BUFFER20: Data Mask */ - -#define NFI_BUFFER21_Data_Pos (0) /*!< NFI_T::BUFFER21: Data Position */ -#define NFI_BUFFER21_Data_Msk (0xfffffffful << NFI_BUFFER21_Data_Pos) /*!< NFI_T::BUFFER21: Data Mask */ - -#define NFI_BUFFER22_Data_Pos (0) /*!< NFI_T::BUFFER22: Data Position */ -#define NFI_BUFFER22_Data_Msk (0xfffffffful << NFI_BUFFER22_Data_Pos) /*!< NFI_T::BUFFER22: Data Mask */ - -#define NFI_BUFFER23_Data_Pos (0) /*!< NFI_T::BUFFER23: Data Position */ -#define NFI_BUFFER23_Data_Msk (0xfffffffful << NFI_BUFFER23_Data_Pos) /*!< NFI_T::BUFFER23: Data Mask */ - -#define NFI_BUFFER24_Data_Pos (0) /*!< NFI_T::BUFFER24: Data Position */ -#define NFI_BUFFER24_Data_Msk (0xfffffffful << NFI_BUFFER24_Data_Pos) /*!< NFI_T::BUFFER24: Data Mask */ - -#define NFI_BUFFER25_Data_Pos (0) /*!< NFI_T::BUFFER25: Data Position */ -#define NFI_BUFFER25_Data_Msk (0xfffffffful << NFI_BUFFER25_Data_Pos) /*!< NFI_T::BUFFER25: Data Mask */ - -#define NFI_BUFFER26_Data_Pos (0) /*!< NFI_T::BUFFER26: Data Position */ -#define NFI_BUFFER26_Data_Msk (0xfffffffful << NFI_BUFFER26_Data_Pos) /*!< NFI_T::BUFFER26: Data Mask */ - -#define NFI_BUFFER27_Data_Pos (0) /*!< NFI_T::BUFFER27: Data Position */ -#define NFI_BUFFER27_Data_Msk (0xfffffffful << NFI_BUFFER27_Data_Pos) /*!< NFI_T::BUFFER27: Data Mask */ - -#define NFI_BUFFER28_Data_Pos (0) /*!< NFI_T::BUFFER28: Data Position */ -#define NFI_BUFFER28_Data_Msk (0xfffffffful << NFI_BUFFER28_Data_Pos) /*!< NFI_T::BUFFER28: Data Mask */ - -#define NFI_BUFFER29_Data_Pos (0) /*!< NFI_T::BUFFER29: Data Position */ -#define NFI_BUFFER29_Data_Msk (0xfffffffful << NFI_BUFFER29_Data_Pos) /*!< NFI_T::BUFFER29: Data Mask */ - -#define NFI_BUFFER30_Data_Pos (0) /*!< NFI_T::BUFFER30: Data Position */ -#define NFI_BUFFER30_Data_Msk (0xfffffffful << NFI_BUFFER30_Data_Pos) /*!< NFI_T::BUFFER30: Data Mask */ - -#define NFI_BUFFER31_Data_Pos (0) /*!< NFI_T::BUFFER31: Data Position */ -#define NFI_BUFFER31_Data_Msk (0xfffffffful << NFI_BUFFER31_Data_Pos) /*!< NFI_T::BUFFER31: Data Mask */ +#define NFI_BUFFER_Data_Pos (0) /*!< NFI_T::BUFFER0: Data Position */ +#define NFI_BUFFER_Data_Msk (0xfffffffful << NFI_BUFFER0_Data_Pos) /*!< NFI_T::BUFFER0: Data Mask */ #define NFI_DMACTL_DMACEN_Pos (0) /*!< NFI_T::DMACTL: DMACEN Position */ #define NFI_DMACTL_DMACEN_Msk (0x1ul << NFI_DMACTL_DMACEN_Pos) /*!< NFI_T::DMACTL: DMACEN Mask */ @@ -2185,6 +1940,9 @@ typedef struct #define NFI_NANDCTL_CS0_Pos (25) /*!< NFI_T::NANDCTL: CS0 Position */ #define NFI_NANDCTL_CS0_Msk (0x1ul << NFI_NANDCTL_CS0_Pos) /*!< NFI_T::NANDCTL: CS0 Mask */ +#define NFI_NANDCTL_CS1_Pos (26) /*!< NFI_T::NANDCTL: CS1 Position */ +#define NFI_NANDCTL_CS1_Msk (0x1ul << NFI_NANDCTL_CS1_Pos) /*!< NFI_T::NANDCTL: CS1 Mask */ + #define NFI_NANDTMCTL_LOWID_Pos (0) /*!< NFI_T::NANDTMCTL: LOWID Position */ #define NFI_NANDTMCTL_LOWID_Msk (0xfful << NFI_NANDTMCTL_LOWID_Pos) /*!< NFI_T::NANDTMCTL: LOWID Mask */ @@ -2245,599 +2003,32 @@ typedef struct #define NFI_NANDECTL_WP_Pos (0) /*!< NFI_T::NANDECTL: WP Position */ #define NFI_NANDECTL_WP_Msk (0x1ul << NFI_NANDECTL_WP_Pos) /*!< NFI_T::NANDECTL: WP Mask */ -#define NFI_NANDECCES0_F1STAT_Pos (0) /*!< NFI_T::NANDECCES0: F1STAT Position */ -#define NFI_NANDECCES0_F1STAT_Msk (0x3ul << NFI_NANDECCES0_F1STAT_Pos) /*!< NFI_T::NANDECCES0: F1STAT Mask */ +#define NFI_NANDECCES_F1STAT_Pos (0) /*!< NFI_T::NANDECCES: F1STAT Position */ +#define NFI_NANDECCES_F1STAT_Msk (0x3ul << NFI_NANDECCES_F1STAT_Pos) /*!< NFI_T::NANDECCES: F1STAT Mask */ -#define NFI_NANDECCES0_F1ECNT_Pos (2) /*!< NFI_T::NANDECCES0: F1ECNT Position */ -#define NFI_NANDECCES0_F1ECNT_Msk (0x1ful << NFI_NANDECCES0_F1ECNT_Pos) /*!< NFI_T::NANDECCES0: F1ECNT Mask */ +#define NFI_NANDECCES_F1ECNT_Pos (2) /*!< NFI_T::NANDECCES: F1ECNT Position */ +#define NFI_NANDECCES_F1ECNT_Msk (0x1ful << NFI_NANDECCES_F1ECNT_Pos) /*!< NFI_T::NANDECCES: F1ECNT Mask */ -#define NFI_NANDECCES0_F2STAT_Pos (8) /*!< NFI_T::NANDECCES0: F2STAT Position */ -#define NFI_NANDECCES0_F2STAT_Msk (0x3ul << NFI_NANDECCES0_F2STAT_Pos) /*!< NFI_T::NANDECCES0: F2STAT Mask */ +#define NFI_NANDECCES_F2STAT_Pos (8) /*!< NFI_T::NANDECCES: F2STAT Position */ +#define NFI_NANDECCES_F2STAT_Msk (0x3ul << NFI_NANDECCES_F2STAT_Pos) /*!< NFI_T::NANDECCES: F2STAT Mask */ -#define NFI_NANDECCES0_F2ECNT_Pos (10) /*!< NFI_T::NANDECCES0: F2ECNT Position */ -#define NFI_NANDECCES0_F2ECNT_Msk (0x1ful << NFI_NANDECCES0_F2ECNT_Pos) /*!< NFI_T::NANDECCES0: F2ECNT Mask */ +#define NFI_NANDECCES_F2ECNT_Pos (10) /*!< NFI_T::NANDECCES: F2ECNT Position */ +#define NFI_NANDECCES_F2ECNT_Msk (0x1ful << NFI_NANDECCES_F2ECNT_Pos) /*!< NFI_T::NANDECCES: F2ECNT Mask */ -#define NFI_NANDECCES0_F3STAT_Pos (16) /*!< NFI_T::NANDECCES0: F3STAT Position */ -#define NFI_NANDECCES0_F3STAT_Msk (0x3ul << NFI_NANDECCES0_F3STAT_Pos) /*!< NFI_T::NANDECCES0: F3STAT Mask */ +#define NFI_NANDECCES_F3STAT_Pos (16) /*!< NFI_T::NANDECCES: F3STAT Position */ +#define NFI_NANDECCES_F3STAT_Msk (0x3ul << NFI_NANDECCES_F3STAT_Pos) /*!< NFI_T::NANDECCES: F3STAT Mask */ -#define NFI_NANDECCES0_F3ECNT_Pos (18) /*!< NFI_T::NANDECCES0: F3ECNT Position */ -#define NFI_NANDECCES0_F3ECNT_Msk (0x1ful << NFI_NANDECCES0_F3ECNT_Pos) /*!< NFI_T::NANDECCES0: F3ECNT Mask */ +#define NFI_NANDECCES_F3ECNT_Pos (18) /*!< NFI_T::NANDECCES: F3ECNT Position */ +#define NFI_NANDECCES_F3ECNT_Msk (0x1ful << NFI_NANDECCES_F3ECNT_Pos) /*!< NFI_T::NANDECCES: F3ECNT Mask */ -#define NFI_NANDECCES0_F4STAT_Pos (24) /*!< NFI_T::NANDECCES0: F4STAT Position */ -#define NFI_NANDECCES0_F4STAT_Msk (0x3ul << NFI_NANDECCES0_F4STAT_Pos) /*!< NFI_T::NANDECCES0: F4STAT Mask */ +#define NFI_NANDECCES_F4STAT_Pos (24) /*!< NFI_T::NANDECCES: F4STAT Position */ +#define NFI_NANDECCES_F4STAT_Msk (0x3ul << NFI_NANDECCES_F4STAT_Pos) /*!< NFI_T::NANDECCES: F4STAT Mask */ -#define NFI_NANDECCES0_F4ECNT_Pos (26) /*!< NFI_T::NANDECCES0: F4ECNT Position */ -#define NFI_NANDECCES0_F4ECNT_Msk (0x1ful << NFI_NANDECCES0_F4ECNT_Pos) /*!< NFI_T::NANDECCES0: F4ECNT Mask */ +#define NFI_NANDECCES_F4ECNT_Pos (26) /*!< NFI_T::NANDECCES: F4ECNT Position */ +#define NFI_NANDECCES_F4ECNT_Msk (0x1ful << NFI_NANDECCES_F4ECNT_Pos) /*!< NFI_T::NANDECCES: F4ECNT Mask */ -#define NFI_NANDECCES1_F5STAT_Pos (0) /*!< NFI_T::NANDECCES1: F5STAT Position */ -#define NFI_NANDECCES1_F5STAT_Msk (0x3ul << NFI_NANDECCES1_F5STAT_Pos) /*!< NFI_T::NANDECCES1: F5STAT Mask */ - -#define NFI_NANDECCES1_F5ECNT_Pos (2) /*!< NFI_T::NANDECCES1: F5ECNT Position */ -#define NFI_NANDECCES1_F5ECNT_Msk (0x1ful << NFI_NANDECCES1_F5ECNT_Pos) /*!< NFI_T::NANDECCES1: F5ECNT Mask */ - -#define NFI_NANDECCES1_F6STAT_Pos (8) /*!< NFI_T::NANDECCES1: F6STAT Position */ -#define NFI_NANDECCES1_F6STAT_Msk (0x3ul << NFI_NANDECCES1_F6STAT_Pos) /*!< NFI_T::NANDECCES1: F6STAT Mask */ - -#define NFI_NANDECCES1_F6ECNT_Pos (10) /*!< NFI_T::NANDECCES1: F6ECNT Position */ -#define NFI_NANDECCES1_F6ECNT_Msk (0x1ful << NFI_NANDECCES1_F6ECNT_Pos) /*!< NFI_T::NANDECCES1: F6ECNT Mask */ - -#define NFI_NANDECCES1_F7STAT_Pos (16) /*!< NFI_T::NANDECCES1: F7STAT Position */ -#define NFI_NANDECCES1_F7STAT_Msk (0x3ul << NFI_NANDECCES1_F7STAT_Pos) /*!< NFI_T::NANDECCES1: F7STAT Mask */ - -#define NFI_NANDECCES1_F7ECNT_Pos (18) /*!< NFI_T::NANDECCES1: F7ECNT Position */ -#define NFI_NANDECCES1_F7ECNT_Msk (0x1ful << NFI_NANDECCES1_F7ECNT_Pos) /*!< NFI_T::NANDECCES1: F7ECNT Mask */ - -#define NFI_NANDECCES1_F8STAT_Pos (24) /*!< NFI_T::NANDECCES1: F8STAT Position */ -#define NFI_NANDECCES1_F8STAT_Msk (0x3ul << NFI_NANDECCES1_F8STAT_Pos) /*!< NFI_T::NANDECCES1: F8STAT Mask */ - -#define NFI_NANDECCES1_F8ECNT_Pos (26) /*!< NFI_T::NANDECCES1: F8ECNT Position */ -#define NFI_NANDECCES1_F8ECNT_Msk (0x1ful << NFI_NANDECCES1_F8ECNT_Pos) /*!< NFI_T::NANDECCES1: F8ECNT Mask */ - -#define NFI_NANDECCES2_F9STAT_Pos (0) /*!< NFI_T::NANDECCES2: F9STAT Position */ -#define NFI_NANDECCES2_F9STAT_Msk (0x3ul << NFI_NANDECCES2_F9STAT_Pos) /*!< NFI_T::NANDECCES2: F9STAT Mask */ - -#define NFI_NANDECCES2_F9ECNT_Pos (2) /*!< NFI_T::NANDECCES2: F9ECNT Position */ -#define NFI_NANDECCES2_F9ECNT_Msk (0x1ful << NFI_NANDECCES2_F9ECNT_Pos) /*!< NFI_T::NANDECCES2: F9ECNT Mask */ - -#define NFI_NANDECCES2_F10STAT_Pos (8) /*!< NFI_T::NANDECCES2: F10STAT Position */ -#define NFI_NANDECCES2_F10STAT_Msk (0x3ul << NFI_NANDECCES2_F10STAT_Pos) /*!< NFI_T::NANDECCES2: F10STAT Mask */ - -#define NFI_NANDECCES2_F10ECNT_Pos (10) /*!< NFI_T::NANDECCES2: F10ECNT Position */ -#define NFI_NANDECCES2_F10ECNT_Msk (0x1ful << NFI_NANDECCES2_F10ECNT_Pos) /*!< NFI_T::NANDECCES2: F10ECNT Mask */ - -#define NFI_NANDECCES2_F11STAT_Pos (16) /*!< NFI_T::NANDECCES2: F11STAT Position */ -#define NFI_NANDECCES2_F11STAT_Msk (0x3ul << NFI_NANDECCES2_F11STAT_Pos) /*!< NFI_T::NANDECCES2: F11STAT Mask */ - -#define NFI_NANDECCES2_F11ECNT_Pos (18) /*!< NFI_T::NANDECCES2: F11ECNT Position */ -#define NFI_NANDECCES2_F11ECNT_Msk (0x1ful << NFI_NANDECCES2_F11ECNT_Pos) /*!< NFI_T::NANDECCES2: F11ECNT Mask */ - -#define NFI_NANDECCES2_F12STAT_Pos (24) /*!< NFI_T::NANDECCES2: F12STAT Position */ -#define NFI_NANDECCES2_F12STAT_Msk (0x3ul << NFI_NANDECCES2_F12STAT_Pos) /*!< NFI_T::NANDECCES2: F12STAT Mask */ - -#define NFI_NANDECCES2_F12ECNT_Pos (26) /*!< NFI_T::NANDECCES2: F12ECNT Position */ -#define NFI_NANDECCES2_F12ECNT_Msk (0x1ful << NFI_NANDECCES2_F12ECNT_Pos) /*!< NFI_T::NANDECCES2: F12ECNT Mask */ - -#define NFI_NANDECCES3_F13STAT_Pos (0) /*!< NFI_T::NANDECCES3: F13STAT Position */ -#define NFI_NANDECCES3_F13STAT_Msk (0x3ul << NFI_NANDECCES3_F13STAT_Pos) /*!< NFI_T::NANDECCES3: F13STAT Mask */ - -#define NFI_NANDECCES3_F13ECNT_Pos (2) /*!< NFI_T::NANDECCES3: F13ECNT Position */ -#define NFI_NANDECCES3_F13ECNT_Msk (0x1ful << NFI_NANDECCES3_F13ECNT_Pos) /*!< NFI_T::NANDECCES3: F13ECNT Mask */ - -#define NFI_NANDECCES3_F14STAT_Pos (8) /*!< NFI_T::NANDECCES3: F14STAT Position */ -#define NFI_NANDECCES3_F14STAT_Msk (0x3ul << NFI_NANDECCES3_F14STAT_Pos) /*!< NFI_T::NANDECCES3: F14STAT Mask */ - -#define NFI_NANDECCES3_F14ECNT_Pos (10) /*!< NFI_T::NANDECCES3: F14ECNT Position */ -#define NFI_NANDECCES3_F14ECNT_Msk (0x1ful << NFI_NANDECCES3_F14ECNT_Pos) /*!< NFI_T::NANDECCES3: F14ECNT Mask */ - -#define NFI_NANDECCES3_F15STAT_Pos (16) /*!< NFI_T::NANDECCES3: F15STAT Position */ -#define NFI_NANDECCES3_F15STAT_Msk (0x3ul << NFI_NANDECCES3_F15STAT_Pos) /*!< NFI_T::NANDECCES3: F15STAT Mask */ - -#define NFI_NANDECCES3_F15ECNT_Pos (18) /*!< NFI_T::NANDECCES3: F15ECNT Position */ -#define NFI_NANDECCES3_F15ECNT_Msk (0x1ful << NFI_NANDECCES3_F15ECNT_Pos) /*!< NFI_T::NANDECCES3: F15ECNT Mask */ - -#define NFI_NANDECCES3_F16STAT_Pos (24) /*!< NFI_T::NANDECCES3: F16STAT Position */ -#define NFI_NANDECCES3_F16STAT_Msk (0x3ul << NFI_NANDECCES3_F16STAT_Pos) /*!< NFI_T::NANDECCES3: F16STAT Mask */ - -#define NFI_NANDECCES3_F16ECNT_Pos (26) /*!< NFI_T::NANDECCES3: F16ECNT Position */ -#define NFI_NANDECCES3_F16ECNT_Msk (0x1ful << NFI_NANDECCES3_F16ECNT_Pos) /*!< NFI_T::NANDECCES3: F16ECNT Mask */ - -#define NFI_NANDECCEA0_ERRADDR0_Pos (0) /*!< NFI_T::NANDECCEA0: ERRADDR0 Position */ -#define NFI_NANDECCEA0_ERRADDR0_Msk (0x7fful << NFI_NANDECCEA0_ERRADDR0_Pos) /*!< NFI_T::NANDECCEA0: ERRADDR0 Mask */ - -#define NFI_NANDECCEA0_ERRADDR1_Pos (16) /*!< NFI_T::NANDECCEA0: ERRADDR1 Position */ -#define NFI_NANDECCEA0_ERRADDR1_Msk (0x7fful << NFI_NANDECCEA0_ERRADDR1_Pos) /*!< NFI_T::NANDECCEA0: ERRADDR1 Mask */ - -#define NFI_NANDECCEA1_ERRADDR2_Pos (0) /*!< NFI_T::NANDECCEA1: ERRADDR2 Position */ -#define NFI_NANDECCEA1_ERRADDR2_Msk (0x7fful << NFI_NANDECCEA1_ERRADDR2_Pos) /*!< NFI_T::NANDECCEA1: ERRADDR2 Mask */ - -#define NFI_NANDECCEA1_ERRADDR3_Pos (16) /*!< NFI_T::NANDECCEA1: ERRADDR3 Position */ -#define NFI_NANDECCEA1_ERRADDR3_Msk (0x7fful << NFI_NANDECCEA1_ERRADDR3_Pos) /*!< NFI_T::NANDECCEA1: ERRADDR3 Mask */ - -#define NFI_NANDECCEA2_ERRADDR4_Pos (0) /*!< NFI_T::NANDECCEA2: ERRADDR4 Position */ -#define NFI_NANDECCEA2_ERRADDR4_Msk (0x7fful << NFI_NANDECCEA2_ERRADDR4_Pos) /*!< NFI_T::NANDECCEA2: ERRADDR4 Mask */ - -#define NFI_NANDECCEA2_ERRADDR5_Pos (16) /*!< NFI_T::NANDECCEA2: ERRADDR5 Position */ -#define NFI_NANDECCEA2_ERRADDR5_Msk (0x7fful << NFI_NANDECCEA2_ERRADDR5_Pos) /*!< NFI_T::NANDECCEA2: ERRADDR5 Mask */ - -#define NFI_NANDECCEA3_ERRADDR6_Pos (0) /*!< NFI_T::NANDECCEA3: ERRADDR6 Position */ -#define NFI_NANDECCEA3_ERRADDR6_Msk (0x7fful << NFI_NANDECCEA3_ERRADDR6_Pos) /*!< NFI_T::NANDECCEA3: ERRADDR6 Mask */ - -#define NFI_NANDECCEA3_ERRADDR7_Pos (16) /*!< NFI_T::NANDECCEA3: ERRADDR7 Position */ -#define NFI_NANDECCEA3_ERRADDR7_Msk (0x7fful << NFI_NANDECCEA3_ERRADDR7_Pos) /*!< NFI_T::NANDECCEA3: ERRADDR7 Mask */ - -#define NFI_NANDECCEA4_ERRADDR8_Pos (0) /*!< NFI_T::NANDECCEA4: ERRADDR8 Position */ -#define NFI_NANDECCEA4_ERRADDR8_Msk (0x7fful << NFI_NANDECCEA4_ERRADDR8_Pos) /*!< NFI_T::NANDECCEA4: ERRADDR8 Mask */ - -#define NFI_NANDECCEA4_ERRADDR9_Pos (16) /*!< NFI_T::NANDECCEA4: ERRADDR9 Position */ -#define NFI_NANDECCEA4_ERRADDR9_Msk (0x7fful << NFI_NANDECCEA4_ERRADDR9_Pos) /*!< NFI_T::NANDECCEA4: ERRADDR9 Mask */ - -#define NFI_NANDECCEA5_ERRADDR10_Pos (0) /*!< NFI_T::NANDECCEA5: ERRADDR10 Position */ -#define NFI_NANDECCEA5_ERRADDR10_Msk (0x7fful << NFI_NANDECCEA5_ERRADDR10_Pos) /*!< NFI_T::NANDECCEA5: ERRADDR10 Mask */ - -#define NFI_NANDECCEA5_ERRADDR11_Pos (16) /*!< NFI_T::NANDECCEA5: ERRADDR11 Position */ -#define NFI_NANDECCEA5_ERRADDR11_Msk (0x7fful << NFI_NANDECCEA5_ERRADDR11_Pos) /*!< NFI_T::NANDECCEA5: ERRADDR11 Mask */ - -#define NFI_NANDECCEA6_ERRADDR12_Pos (0) /*!< NFI_T::NANDECCEA6: ERRADDR12 Position */ -#define NFI_NANDECCEA6_ERRADDR12_Msk (0x7fful << NFI_NANDECCEA6_ERRADDR12_Pos) /*!< NFI_T::NANDECCEA6: ERRADDR12 Mask */ - -#define NFI_NANDECCEA6_ERRADDR13_Pos (16) /*!< NFI_T::NANDECCEA6: ERRADDR13 Position */ -#define NFI_NANDECCEA6_ERRADDR13_Msk (0x7fful << NFI_NANDECCEA6_ERRADDR13_Pos) /*!< NFI_T::NANDECCEA6: ERRADDR13 Mask */ - -#define NFI_NANDECCEA7_ERRADDR14_Pos (0) /*!< NFI_T::NANDECCEA7: ERRADDR14 Position */ -#define NFI_NANDECCEA7_ERRADDR14_Msk (0x7fful << NFI_NANDECCEA7_ERRADDR14_Pos) /*!< NFI_T::NANDECCEA7: ERRADDR14 Mask */ - -#define NFI_NANDECCEA7_ERRADDR15_Pos (16) /*!< NFI_T::NANDECCEA7: ERRADDR15 Position */ -#define NFI_NANDECCEA7_ERRADDR15_Msk (0x7fful << NFI_NANDECCEA7_ERRADDR15_Pos) /*!< NFI_T::NANDECCEA7: ERRADDR15 Mask */ - -#define NFI_NANDECCEA8_ERRADDR16_Pos (0) /*!< NFI_T::NANDECCEA8: ERRADDR16 Position */ -#define NFI_NANDECCEA8_ERRADDR16_Msk (0x7fful << NFI_NANDECCEA8_ERRADDR16_Pos) /*!< NFI_T::NANDECCEA8: ERRADDR16 Mask */ - -#define NFI_NANDECCEA8_ERRADDR17_Pos (16) /*!< NFI_T::NANDECCEA8: ERRADDR17 Position */ -#define NFI_NANDECCEA8_ERRADDR17_Msk (0x7fful << NFI_NANDECCEA8_ERRADDR17_Pos) /*!< NFI_T::NANDECCEA8: ERRADDR17 Mask */ - -#define NFI_NANDECCEA9_ERRADDR18_Pos (0) /*!< NFI_T::NANDECCEA9: ERRADDR18 Position */ -#define NFI_NANDECCEA9_ERRADDR18_Msk (0x7fful << NFI_NANDECCEA9_ERRADDR18_Pos) /*!< NFI_T::NANDECCEA9: ERRADDR18 Mask */ - -#define NFI_NANDECCEA9_ERRADDR19_Pos (16) /*!< NFI_T::NANDECCEA9: ERRADDR19 Position */ -#define NFI_NANDECCEA9_ERRADDR19_Msk (0x7fful << NFI_NANDECCEA9_ERRADDR19_Pos) /*!< NFI_T::NANDECCEA9: ERRADDR19 Mask */ - -#define NFI_NANDECCEA10_ERRADDR20_Pos (0) /*!< NFI_T::NANDECCEA10: ERRADDR20 Position */ -#define NFI_NANDECCEA10_ERRADDR20_Msk (0x7fful << NFI_NANDECCEA10_ERRADDR20_Pos) /*!< NFI_T::NANDECCEA10: ERRADDR20 Mask */ - -#define NFI_NANDECCEA10_ERRADDR21_Pos (16) /*!< NFI_T::NANDECCEA10: ERRADDR21 Position */ -#define NFI_NANDECCEA10_ERRADDR21_Msk (0x7fful << NFI_NANDECCEA10_ERRADDR21_Pos) /*!< NFI_T::NANDECCEA10: ERRADDR21 Mask */ - -#define NFI_NANDECCEA11_ERRADDR22_Pos (0) /*!< NFI_T::NANDECCEA11: ERRADDR22 Position */ -#define NFI_NANDECCEA11_ERRADDR22_Msk (0x7fful << NFI_NANDECCEA11_ERRADDR22_Pos) /*!< NFI_T::NANDECCEA11: ERRADDR22 Mask */ - -#define NFI_NANDECCEA11_ERRADDR23_Pos (16) /*!< NFI_T::NANDECCEA11: ERRADDR23 Position */ -#define NFI_NANDECCEA11_ERRADDR23_Msk (0x7fful << NFI_NANDECCEA11_ERRADDR23_Pos) /*!< NFI_T::NANDECCEA11: ERRADDR23 Mask */ - -#define NFI_NANDECCED0_ERRDATA0_Pos (0) /*!< NFI_T::NANDECCED0: ERRDATA0 Position */ -#define NFI_NANDECCED0_ERRDATA0_Msk (0xfful << NFI_NANDECCED0_ERRDATA0_Pos) /*!< NFI_T::NANDECCED0: ERRDATA0 Mask */ - -#define NFI_NANDECCED0_ERRDATA1_Pos (8) /*!< NFI_T::NANDECCED0: ERRDATA1 Position */ -#define NFI_NANDECCED0_ERRDATA1_Msk (0xfful << NFI_NANDECCED0_ERRDATA1_Pos) /*!< NFI_T::NANDECCED0: ERRDATA1 Mask */ - -#define NFI_NANDECCED0_ERRDATA2_Pos (16) /*!< NFI_T::NANDECCED0: ERRDATA2 Position */ -#define NFI_NANDECCED0_ERRDATA2_Msk (0xfful << NFI_NANDECCED0_ERRDATA2_Pos) /*!< NFI_T::NANDECCED0: ERRDATA2 Mask */ - -#define NFI_NANDECCED0_ERRDATA3_Pos (24) /*!< NFI_T::NANDECCED0: ERRDATA3 Position */ -#define NFI_NANDECCED0_ERRDATA3_Msk (0xfful << NFI_NANDECCED0_ERRDATA3_Pos) /*!< NFI_T::NANDECCED0: ERRDATA3 Mask */ - -#define NFI_NANDECCED1_ERRDATA4_Pos (0) /*!< NFI_T::NANDECCED1: ERRDATA4 Position */ -#define NFI_NANDECCED1_ERRDATA4_Msk (0xfful << NFI_NANDECCED1_ERRDATA4_Pos) /*!< NFI_T::NANDECCED1: ERRDATA4 Mask */ - -#define NFI_NANDECCED1_ERRDATA5_Pos (8) /*!< NFI_T::NANDECCED1: ERRDATA5 Position */ -#define NFI_NANDECCED1_ERRDATA5_Msk (0xfful << NFI_NANDECCED1_ERRDATA5_Pos) /*!< NFI_T::NANDECCED1: ERRDATA5 Mask */ - -#define NFI_NANDECCED1_ERRDATA6_Pos (16) /*!< NFI_T::NANDECCED1: ERRDATA6 Position */ -#define NFI_NANDECCED1_ERRDATA6_Msk (0xfful << NFI_NANDECCED1_ERRDATA6_Pos) /*!< NFI_T::NANDECCED1: ERRDATA6 Mask */ - -#define NFI_NANDECCED1_ERRDATA7_Pos (24) /*!< NFI_T::NANDECCED1: ERRDATA7 Position */ -#define NFI_NANDECCED1_ERRDATA7_Msk (0xfful << NFI_NANDECCED1_ERRDATA7_Pos) /*!< NFI_T::NANDECCED1: ERRDATA7 Mask */ - -#define NFI_NANDECCED2_ERRDATA8_Pos (0) /*!< NFI_T::NANDECCED2: ERRDATA8 Position */ -#define NFI_NANDECCED2_ERRDATA8_Msk (0xfful << NFI_NANDECCED2_ERRDATA8_Pos) /*!< NFI_T::NANDECCED2: ERRDATA8 Mask */ - -#define NFI_NANDECCED2_ERRDATA9_Pos (8) /*!< NFI_T::NANDECCED2: ERRDATA9 Position */ -#define NFI_NANDECCED2_ERRDATA9_Msk (0xfful << NFI_NANDECCED2_ERRDATA9_Pos) /*!< NFI_T::NANDECCED2: ERRDATA9 Mask */ - -#define NFI_NANDECCED2_ERRDATA10_Pos (16) /*!< NFI_T::NANDECCED2: ERRDATA10 Position */ -#define NFI_NANDECCED2_ERRDATA10_Msk (0xfful << NFI_NANDECCED2_ERRDATA10_Pos) /*!< NFI_T::NANDECCED2: ERRDATA10 Mask */ - -#define NFI_NANDECCED2_ERRDATA11_Pos (24) /*!< NFI_T::NANDECCED2: ERRDATA11 Position */ -#define NFI_NANDECCED2_ERRDATA11_Msk (0xfful << NFI_NANDECCED2_ERRDATA11_Pos) /*!< NFI_T::NANDECCED2: ERRDATA11 Mask */ - -#define NFI_NANDECCED3_ERRDATA12_Pos (0) /*!< NFI_T::NANDECCED3: ERRDATA12 Position */ -#define NFI_NANDECCED3_ERRDATA12_Msk (0xfful << NFI_NANDECCED3_ERRDATA12_Pos) /*!< NFI_T::NANDECCED3: ERRDATA12 Mask */ - -#define NFI_NANDECCED3_ERRDATA13_Pos (8) /*!< NFI_T::NANDECCED3: ERRDATA13 Position */ -#define NFI_NANDECCED3_ERRDATA13_Msk (0xfful << NFI_NANDECCED3_ERRDATA13_Pos) /*!< NFI_T::NANDECCED3: ERRDATA13 Mask */ - -#define NFI_NANDECCED3_ERRDATA14_Pos (16) /*!< NFI_T::NANDECCED3: ERRDATA14 Position */ -#define NFI_NANDECCED3_ERRDATA14_Msk (0xfful << NFI_NANDECCED3_ERRDATA14_Pos) /*!< NFI_T::NANDECCED3: ERRDATA14 Mask */ - -#define NFI_NANDECCED3_ERRDATA15_Pos (24) /*!< NFI_T::NANDECCED3: ERRDATA15 Position */ -#define NFI_NANDECCED3_ERRDATA15_Msk (0xfful << NFI_NANDECCED3_ERRDATA15_Pos) /*!< NFI_T::NANDECCED3: ERRDATA15 Mask */ - -#define NFI_NANDECCED4_ERRDATA16_Pos (0) /*!< NFI_T::NANDECCED4: ERRDATA16 Position */ -#define NFI_NANDECCED4_ERRDATA16_Msk (0xfful << NFI_NANDECCED4_ERRDATA16_Pos) /*!< NFI_T::NANDECCED4: ERRDATA16 Mask */ - -#define NFI_NANDECCED4_ERRDATA17_Pos (8) /*!< NFI_T::NANDECCED4: ERRDATA17 Position */ -#define NFI_NANDECCED4_ERRDATA17_Msk (0xfful << NFI_NANDECCED4_ERRDATA17_Pos) /*!< NFI_T::NANDECCED4: ERRDATA17 Mask */ - -#define NFI_NANDECCED4_ERRDATA18_Pos (16) /*!< NFI_T::NANDECCED4: ERRDATA18 Position */ -#define NFI_NANDECCED4_ERRDATA18_Msk (0xfful << NFI_NANDECCED4_ERRDATA18_Pos) /*!< NFI_T::NANDECCED4: ERRDATA18 Mask */ - -#define NFI_NANDECCED4_ERRDATA19_Pos (24) /*!< NFI_T::NANDECCED4: ERRDATA19 Position */ -#define NFI_NANDECCED4_ERRDATA19_Msk (0xfful << NFI_NANDECCED4_ERRDATA19_Pos) /*!< NFI_T::NANDECCED4: ERRDATA19 Mask */ - -#define NFI_NANDECCED5_ERRDATA20_Pos (0) /*!< NFI_T::NANDECCED5: ERRDATA20 Position */ -#define NFI_NANDECCED5_ERRDATA20_Msk (0xfful << NFI_NANDECCED5_ERRDATA20_Pos) /*!< NFI_T::NANDECCED5: ERRDATA20 Mask */ - -#define NFI_NANDECCED5_ERRDATA21_Pos (8) /*!< NFI_T::NANDECCED5: ERRDATA21 Position */ -#define NFI_NANDECCED5_ERRDATA21_Msk (0xfful << NFI_NANDECCED5_ERRDATA21_Pos) /*!< NFI_T::NANDECCED5: ERRDATA21 Mask */ - -#define NFI_NANDECCED5_ERRDATA22_Pos (16) /*!< NFI_T::NANDECCED5: ERRDATA22 Position */ -#define NFI_NANDECCED5_ERRDATA22_Msk (0xfful << NFI_NANDECCED5_ERRDATA22_Pos) /*!< NFI_T::NANDECCED5: ERRDATA22 Mask */ - -#define NFI_NANDECCED5_ERRDATA23_Pos (24) /*!< NFI_T::NANDECCED5: ERRDATA23 Position */ -#define NFI_NANDECCED5_ERRDATA23_Msk (0xfful << NFI_NANDECCED5_ERRDATA23_Pos) /*!< NFI_T::NANDECCED5: ERRDATA23 Mask */ - -#define NFI_NANDRA0_Data_Pos (0) /*!< NFI_T::NANDRA0: Data Position */ -#define NFI_NANDRA0_Data_Msk (0xfffffffful << NFI_NANDRA0_Data_Pos) /*!< NFI_T::NANDRA0: Data Mask */ - -#define NFI_NANDRA1_Data_Pos (0) /*!< NFI_T::NANDRA1: Data Position */ -#define NFI_NANDRA1_Data_Msk (0xfffffffful << NFI_NANDRA1_Data_Pos) /*!< NFI_T::NANDRA1: Data Mask */ - -#define NFI_NANDRA2_Data_Pos (0) /*!< NFI_T::NANDRA2: Data Position */ -#define NFI_NANDRA2_Data_Msk (0xfffffffful << NFI_NANDRA2_Data_Pos) /*!< NFI_T::NANDRA2: Data Mask */ - -#define NFI_NANDRA3_Data_Pos (0) /*!< NFI_T::NANDRA3: Data Position */ -#define NFI_NANDRA3_Data_Msk (0xfffffffful << NFI_NANDRA3_Data_Pos) /*!< NFI_T::NANDRA3: Data Mask */ - -#define NFI_NANDRA4_Data_Pos (0) /*!< NFI_T::NANDRA4: Data Position */ -#define NFI_NANDRA4_Data_Msk (0xfffffffful << NFI_NANDRA4_Data_Pos) /*!< NFI_T::NANDRA4: Data Mask */ - -#define NFI_NANDRA5_Data_Pos (0) /*!< NFI_T::NANDRA5: Data Position */ -#define NFI_NANDRA5_Data_Msk (0xfffffffful << NFI_NANDRA5_Data_Pos) /*!< NFI_T::NANDRA5: Data Mask */ - -#define NFI_NANDRA6_Data_Pos (0) /*!< NFI_T::NANDRA6: Data Position */ -#define NFI_NANDRA6_Data_Msk (0xfffffffful << NFI_NANDRA6_Data_Pos) /*!< NFI_T::NANDRA6: Data Mask */ - -#define NFI_NANDRA7_Data_Pos (0) /*!< NFI_T::NANDRA7: Data Position */ -#define NFI_NANDRA7_Data_Msk (0xfffffffful << NFI_NANDRA7_Data_Pos) /*!< NFI_T::NANDRA7: Data Mask */ - -#define NFI_NANDRA8_Data_Pos (0) /*!< NFI_T::NANDRA8: Data Position */ -#define NFI_NANDRA8_Data_Msk (0xfffffffful << NFI_NANDRA8_Data_Pos) /*!< NFI_T::NANDRA8: Data Mask */ - -#define NFI_NANDRA9_Data_Pos (0) /*!< NFI_T::NANDRA9: Data Position */ -#define NFI_NANDRA9_Data_Msk (0xfffffffful << NFI_NANDRA9_Data_Pos) /*!< NFI_T::NANDRA9: Data Mask */ - -#define NFI_NANDRA10_Data_Pos (0) /*!< NFI_T::NANDRA10: Data Position */ -#define NFI_NANDRA10_Data_Msk (0xfffffffful << NFI_NANDRA10_Data_Pos) /*!< NFI_T::NANDRA10: Data Mask */ - -#define NFI_NANDRA11_Data_Pos (0) /*!< NFI_T::NANDRA11: Data Position */ -#define NFI_NANDRA11_Data_Msk (0xfffffffful << NFI_NANDRA11_Data_Pos) /*!< NFI_T::NANDRA11: Data Mask */ - -#define NFI_NANDRA12_Data_Pos (0) /*!< NFI_T::NANDRA12: Data Position */ -#define NFI_NANDRA12_Data_Msk (0xfffffffful << NFI_NANDRA12_Data_Pos) /*!< NFI_T::NANDRA12: Data Mask */ - -#define NFI_NANDRA13_Data_Pos (0) /*!< NFI_T::NANDRA13: Data Position */ -#define NFI_NANDRA13_Data_Msk (0xfffffffful << NFI_NANDRA13_Data_Pos) /*!< NFI_T::NANDRA13: Data Mask */ - -#define NFI_NANDRA14_Data_Pos (0) /*!< NFI_T::NANDRA14: Data Position */ -#define NFI_NANDRA14_Data_Msk (0xfffffffful << NFI_NANDRA14_Data_Pos) /*!< NFI_T::NANDRA14: Data Mask */ - -#define NFI_NANDRA15_Data_Pos (0) /*!< NFI_T::NANDRA15: Data Position */ -#define NFI_NANDRA15_Data_Msk (0xfffffffful << NFI_NANDRA15_Data_Pos) /*!< NFI_T::NANDRA15: Data Mask */ - -#define NFI_NANDRA16_Data_Pos (0) /*!< NFI_T::NANDRA16: Data Position */ -#define NFI_NANDRA16_Data_Msk (0xfffffffful << NFI_NANDRA16_Data_Pos) /*!< NFI_T::NANDRA16: Data Mask */ - -#define NFI_NANDRA17_Data_Pos (0) /*!< NFI_T::NANDRA17: Data Position */ -#define NFI_NANDRA17_Data_Msk (0xfffffffful << NFI_NANDRA17_Data_Pos) /*!< NFI_T::NANDRA17: Data Mask */ - -#define NFI_NANDRA18_Data_Pos (0) /*!< NFI_T::NANDRA18: Data Position */ -#define NFI_NANDRA18_Data_Msk (0xfffffffful << NFI_NANDRA18_Data_Pos) /*!< NFI_T::NANDRA18: Data Mask */ - -#define NFI_NANDRA19_Data_Pos (0) /*!< NFI_T::NANDRA19: Data Position */ -#define NFI_NANDRA19_Data_Msk (0xfffffffful << NFI_NANDRA19_Data_Pos) /*!< NFI_T::NANDRA19: Data Mask */ - -#define NFI_NANDRA20_Data_Pos (0) /*!< NFI_T::NANDRA20: Data Position */ -#define NFI_NANDRA20_Data_Msk (0xfffffffful << NFI_NANDRA20_Data_Pos) /*!< NFI_T::NANDRA20: Data Mask */ - -#define NFI_NANDRA21_Data_Pos (0) /*!< NFI_T::NANDRA21: Data Position */ -#define NFI_NANDRA21_Data_Msk (0xfffffffful << NFI_NANDRA21_Data_Pos) /*!< NFI_T::NANDRA21: Data Mask */ - -#define NFI_NANDRA22_Data_Pos (0) /*!< NFI_T::NANDRA22: Data Position */ -#define NFI_NANDRA22_Data_Msk (0xfffffffful << NFI_NANDRA22_Data_Pos) /*!< NFI_T::NANDRA22: Data Mask */ - -#define NFI_NANDRA23_Data_Pos (0) /*!< NFI_T::NANDRA23: Data Position */ -#define NFI_NANDRA23_Data_Msk (0xfffffffful << NFI_NANDRA23_Data_Pos) /*!< NFI_T::NANDRA23: Data Mask */ - -#define NFI_NANDRA24_Data_Pos (0) /*!< NFI_T::NANDRA24: Data Position */ -#define NFI_NANDRA24_Data_Msk (0xfffffffful << NFI_NANDRA24_Data_Pos) /*!< NFI_T::NANDRA24: Data Mask */ - -#define NFI_NANDRA25_Data_Pos (0) /*!< NFI_T::NANDRA25: Data Position */ -#define NFI_NANDRA25_Data_Msk (0xfffffffful << NFI_NANDRA25_Data_Pos) /*!< NFI_T::NANDRA25: Data Mask */ - -#define NFI_NANDRA26_Data_Pos (0) /*!< NFI_T::NANDRA26: Data Position */ -#define NFI_NANDRA26_Data_Msk (0xfffffffful << NFI_NANDRA26_Data_Pos) /*!< NFI_T::NANDRA26: Data Mask */ - -#define NFI_NANDRA27_Data_Pos (0) /*!< NFI_T::NANDRA27: Data Position */ -#define NFI_NANDRA27_Data_Msk (0xfffffffful << NFI_NANDRA27_Data_Pos) /*!< NFI_T::NANDRA27: Data Mask */ - -#define NFI_NANDRA28_Data_Pos (0) /*!< NFI_T::NANDRA28: Data Position */ -#define NFI_NANDRA28_Data_Msk (0xfffffffful << NFI_NANDRA28_Data_Pos) /*!< NFI_T::NANDRA28: Data Mask */ - -#define NFI_NANDRA29_Data_Pos (0) /*!< NFI_T::NANDRA29: Data Position */ -#define NFI_NANDRA29_Data_Msk (0xfffffffful << NFI_NANDRA29_Data_Pos) /*!< NFI_T::NANDRA29: Data Mask */ - -#define NFI_NANDRA30_Data_Pos (0) /*!< NFI_T::NANDRA30: Data Position */ -#define NFI_NANDRA30_Data_Msk (0xfffffffful << NFI_NANDRA30_Data_Pos) /*!< NFI_T::NANDRA30: Data Mask */ - -#define NFI_NANDRA31_Data_Pos (0) /*!< NFI_T::NANDRA31: Data Position */ -#define NFI_NANDRA31_Data_Msk (0xfffffffful << NFI_NANDRA31_Data_Pos) /*!< NFI_T::NANDRA31: Data Mask */ - -#define NFI_NANDRA32_Data_Pos (0) /*!< NFI_T::NANDRA32: Data Position */ -#define NFI_NANDRA32_Data_Msk (0xfffffffful << NFI_NANDRA32_Data_Pos) /*!< NFI_T::NANDRA32: Data Mask */ - -#define NFI_NANDRA33_Data_Pos (0) /*!< NFI_T::NANDRA33: Data Position */ -#define NFI_NANDRA33_Data_Msk (0xfffffffful << NFI_NANDRA33_Data_Pos) /*!< NFI_T::NANDRA33: Data Mask */ - -#define NFI_NANDRA34_Data_Pos (0) /*!< NFI_T::NANDRA34: Data Position */ -#define NFI_NANDRA34_Data_Msk (0xfffffffful << NFI_NANDRA34_Data_Pos) /*!< NFI_T::NANDRA34: Data Mask */ - -#define NFI_NANDRA35_Data_Pos (0) /*!< NFI_T::NANDRA35: Data Position */ -#define NFI_NANDRA35_Data_Msk (0xfffffffful << NFI_NANDRA35_Data_Pos) /*!< NFI_T::NANDRA35: Data Mask */ - -#define NFI_NANDRA36_Data_Pos (0) /*!< NFI_T::NANDRA36: Data Position */ -#define NFI_NANDRA36_Data_Msk (0xfffffffful << NFI_NANDRA36_Data_Pos) /*!< NFI_T::NANDRA36: Data Mask */ - -#define NFI_NANDRA37_Data_Pos (0) /*!< NFI_T::NANDRA37: Data Position */ -#define NFI_NANDRA37_Data_Msk (0xfffffffful << NFI_NANDRA37_Data_Pos) /*!< NFI_T::NANDRA37: Data Mask */ - -#define NFI_NANDRA38_Data_Pos (0) /*!< NFI_T::NANDRA38: Data Position */ -#define NFI_NANDRA38_Data_Msk (0xfffffffful << NFI_NANDRA38_Data_Pos) /*!< NFI_T::NANDRA38: Data Mask */ - -#define NFI_NANDRA39_Data_Pos (0) /*!< NFI_T::NANDRA39: Data Position */ -#define NFI_NANDRA39_Data_Msk (0xfffffffful << NFI_NANDRA39_Data_Pos) /*!< NFI_T::NANDRA39: Data Mask */ - -#define NFI_NANDRA40_Data_Pos (0) /*!< NFI_T::NANDRA40: Data Position */ -#define NFI_NANDRA40_Data_Msk (0xfffffffful << NFI_NANDRA40_Data_Pos) /*!< NFI_T::NANDRA40: Data Mask */ - -#define NFI_NANDRA41_Data_Pos (0) /*!< NFI_T::NANDRA41: Data Position */ -#define NFI_NANDRA41_Data_Msk (0xfffffffful << NFI_NANDRA41_Data_Pos) /*!< NFI_T::NANDRA41: Data Mask */ - -#define NFI_NANDRA42_Data_Pos (0) /*!< NFI_T::NANDRA42: Data Position */ -#define NFI_NANDRA42_Data_Msk (0xfffffffful << NFI_NANDRA42_Data_Pos) /*!< NFI_T::NANDRA42: Data Mask */ - -#define NFI_NANDRA43_Data_Pos (0) /*!< NFI_T::NANDRA43: Data Position */ -#define NFI_NANDRA43_Data_Msk (0xfffffffful << NFI_NANDRA43_Data_Pos) /*!< NFI_T::NANDRA43: Data Mask */ - -#define NFI_NANDRA44_Data_Pos (0) /*!< NFI_T::NANDRA44: Data Position */ -#define NFI_NANDRA44_Data_Msk (0xfffffffful << NFI_NANDRA44_Data_Pos) /*!< NFI_T::NANDRA44: Data Mask */ - -#define NFI_NANDRA45_Data_Pos (0) /*!< NFI_T::NANDRA45: Data Position */ -#define NFI_NANDRA45_Data_Msk (0xfffffffful << NFI_NANDRA45_Data_Pos) /*!< NFI_T::NANDRA45: Data Mask */ - -#define NFI_NANDRA46_Data_Pos (0) /*!< NFI_T::NANDRA46: Data Position */ -#define NFI_NANDRA46_Data_Msk (0xfffffffful << NFI_NANDRA46_Data_Pos) /*!< NFI_T::NANDRA46: Data Mask */ - -#define NFI_NANDRA47_Data_Pos (0) /*!< NFI_T::NANDRA47: Data Position */ -#define NFI_NANDRA47_Data_Msk (0xfffffffful << NFI_NANDRA47_Data_Pos) /*!< NFI_T::NANDRA47: Data Mask */ - -#define NFI_NANDRA48_Data_Pos (0) /*!< NFI_T::NANDRA48: Data Position */ -#define NFI_NANDRA48_Data_Msk (0xfffffffful << NFI_NANDRA48_Data_Pos) /*!< NFI_T::NANDRA48: Data Mask */ - -#define NFI_NANDRA49_Data_Pos (0) /*!< NFI_T::NANDRA49: Data Position */ -#define NFI_NANDRA49_Data_Msk (0xfffffffful << NFI_NANDRA49_Data_Pos) /*!< NFI_T::NANDRA49: Data Mask */ - -#define NFI_NANDRA50_Data_Pos (0) /*!< NFI_T::NANDRA50: Data Position */ -#define NFI_NANDRA50_Data_Msk (0xfffffffful << NFI_NANDRA50_Data_Pos) /*!< NFI_T::NANDRA50: Data Mask */ - -#define NFI_NANDRA51_Data_Pos (0) /*!< NFI_T::NANDRA51: Data Position */ -#define NFI_NANDRA51_Data_Msk (0xfffffffful << NFI_NANDRA51_Data_Pos) /*!< NFI_T::NANDRA51: Data Mask */ - -#define NFI_NANDRA52_Data_Pos (0) /*!< NFI_T::NANDRA52: Data Position */ -#define NFI_NANDRA52_Data_Msk (0xfffffffful << NFI_NANDRA52_Data_Pos) /*!< NFI_T::NANDRA52: Data Mask */ - -#define NFI_NANDRA53_Data_Pos (0) /*!< NFI_T::NANDRA53: Data Position */ -#define NFI_NANDRA53_Data_Msk (0xfffffffful << NFI_NANDRA53_Data_Pos) /*!< NFI_T::NANDRA53: Data Mask */ - -#define NFI_NANDRA54_Data_Pos (0) /*!< NFI_T::NANDRA54: Data Position */ -#define NFI_NANDRA54_Data_Msk (0xfffffffful << NFI_NANDRA54_Data_Pos) /*!< NFI_T::NANDRA54: Data Mask */ - -#define NFI_NANDRA55_Data_Pos (0) /*!< NFI_T::NANDRA55: Data Position */ -#define NFI_NANDRA55_Data_Msk (0xfffffffful << NFI_NANDRA55_Data_Pos) /*!< NFI_T::NANDRA55: Data Mask */ - -#define NFI_NANDRA56_Data_Pos (0) /*!< NFI_T::NANDRA56: Data Position */ -#define NFI_NANDRA56_Data_Msk (0xfffffffful << NFI_NANDRA56_Data_Pos) /*!< NFI_T::NANDRA56: Data Mask */ - -#define NFI_NANDRA57_Data_Pos (0) /*!< NFI_T::NANDRA57: Data Position */ -#define NFI_NANDRA57_Data_Msk (0xfffffffful << NFI_NANDRA57_Data_Pos) /*!< NFI_T::NANDRA57: Data Mask */ - -#define NFI_NANDRA58_Data_Pos (0) /*!< NFI_T::NANDRA58: Data Position */ -#define NFI_NANDRA58_Data_Msk (0xfffffffful << NFI_NANDRA58_Data_Pos) /*!< NFI_T::NANDRA58: Data Mask */ - -#define NFI_NANDRA59_Data_Pos (0) /*!< NFI_T::NANDRA59: Data Position */ -#define NFI_NANDRA59_Data_Msk (0xfffffffful << NFI_NANDRA59_Data_Pos) /*!< NFI_T::NANDRA59: Data Mask */ - -#define NFI_NANDRA60_Data_Pos (0) /*!< NFI_T::NANDRA60: Data Position */ -#define NFI_NANDRA60_Data_Msk (0xfffffffful << NFI_NANDRA60_Data_Pos) /*!< NFI_T::NANDRA60: Data Mask */ - -#define NFI_NANDRA61_Data_Pos (0) /*!< NFI_T::NANDRA61: Data Position */ -#define NFI_NANDRA61_Data_Msk (0xfffffffful << NFI_NANDRA61_Data_Pos) /*!< NFI_T::NANDRA61: Data Mask */ - -#define NFI_NANDRA62_Data_Pos (0) /*!< NFI_T::NANDRA62: Data Position */ -#define NFI_NANDRA62_Data_Msk (0xfffffffful << NFI_NANDRA62_Data_Pos) /*!< NFI_T::NANDRA62: Data Mask */ - -#define NFI_NANDRA63_Data_Pos (0) /*!< NFI_T::NANDRA63: Data Position */ -#define NFI_NANDRA63_Data_Msk (0xfffffffful << NFI_NANDRA63_Data_Pos) /*!< NFI_T::NANDRA63: Data Mask */ - -#define NFI_NANDRA64_Data_Pos (0) /*!< NFI_T::NANDRA64: Data Position */ -#define NFI_NANDRA64_Data_Msk (0xfffffffful << NFI_NANDRA64_Data_Pos) /*!< NFI_T::NANDRA64: Data Mask */ - -#define NFI_NANDRA65_Data_Pos (0) /*!< NFI_T::NANDRA65: Data Position */ -#define NFI_NANDRA65_Data_Msk (0xfffffffful << NFI_NANDRA65_Data_Pos) /*!< NFI_T::NANDRA65: Data Mask */ - -#define NFI_NANDRA66_Data_Pos (0) /*!< NFI_T::NANDRA66: Data Position */ -#define NFI_NANDRA66_Data_Msk (0xfffffffful << NFI_NANDRA66_Data_Pos) /*!< NFI_T::NANDRA66: Data Mask */ - -#define NFI_NANDRA67_Data_Pos (0) /*!< NFI_T::NANDRA67: Data Position */ -#define NFI_NANDRA67_Data_Msk (0xfffffffful << NFI_NANDRA67_Data_Pos) /*!< NFI_T::NANDRA67: Data Mask */ - -#define NFI_NANDRA68_Data_Pos (0) /*!< NFI_T::NANDRA68: Data Position */ -#define NFI_NANDRA68_Data_Msk (0xfffffffful << NFI_NANDRA68_Data_Pos) /*!< NFI_T::NANDRA68: Data Mask */ - -#define NFI_NANDRA69_Data_Pos (0) /*!< NFI_T::NANDRA69: Data Position */ -#define NFI_NANDRA69_Data_Msk (0xfffffffful << NFI_NANDRA69_Data_Pos) /*!< NFI_T::NANDRA69: Data Mask */ - -#define NFI_NANDRA70_Data_Pos (0) /*!< NFI_T::NANDRA70: Data Position */ -#define NFI_NANDRA70_Data_Msk (0xfffffffful << NFI_NANDRA70_Data_Pos) /*!< NFI_T::NANDRA70: Data Mask */ - -#define NFI_NANDRA71_Data_Pos (0) /*!< NFI_T::NANDRA71: Data Position */ -#define NFI_NANDRA71_Data_Msk (0xfffffffful << NFI_NANDRA71_Data_Pos) /*!< NFI_T::NANDRA71: Data Mask */ - -#define NFI_NANDRA72_Data_Pos (0) /*!< NFI_T::NANDRA72: Data Position */ -#define NFI_NANDRA72_Data_Msk (0xfffffffful << NFI_NANDRA72_Data_Pos) /*!< NFI_T::NANDRA72: Data Mask */ - -#define NFI_NANDRA73_Data_Pos (0) /*!< NFI_T::NANDRA73: Data Position */ -#define NFI_NANDRA73_Data_Msk (0xfffffffful << NFI_NANDRA73_Data_Pos) /*!< NFI_T::NANDRA73: Data Mask */ - -#define NFI_NANDRA74_Data_Pos (0) /*!< NFI_T::NANDRA74: Data Position */ -#define NFI_NANDRA74_Data_Msk (0xfffffffful << NFI_NANDRA74_Data_Pos) /*!< NFI_T::NANDRA74: Data Mask */ - -#define NFI_NANDRA75_Data_Pos (0) /*!< NFI_T::NANDRA75: Data Position */ -#define NFI_NANDRA75_Data_Msk (0xfffffffful << NFI_NANDRA75_Data_Pos) /*!< NFI_T::NANDRA75: Data Mask */ - -#define NFI_NANDRA76_Data_Pos (0) /*!< NFI_T::NANDRA76: Data Position */ -#define NFI_NANDRA76_Data_Msk (0xfffffffful << NFI_NANDRA76_Data_Pos) /*!< NFI_T::NANDRA76: Data Mask */ - -#define NFI_NANDRA77_Data_Pos (0) /*!< NFI_T::NANDRA77: Data Position */ -#define NFI_NANDRA77_Data_Msk (0xfffffffful << NFI_NANDRA77_Data_Pos) /*!< NFI_T::NANDRA77: Data Mask */ - -#define NFI_NANDRA78_Data_Pos (0) /*!< NFI_T::NANDRA78: Data Position */ -#define NFI_NANDRA78_Data_Msk (0xfffffffful << NFI_NANDRA78_Data_Pos) /*!< NFI_T::NANDRA78: Data Mask */ - -#define NFI_NANDRA79_Data_Pos (0) /*!< NFI_T::NANDRA79: Data Position */ -#define NFI_NANDRA79_Data_Msk (0xfffffffful << NFI_NANDRA79_Data_Pos) /*!< NFI_T::NANDRA79: Data Mask */ - -#define NFI_NANDRA80_Data_Pos (0) /*!< NFI_T::NANDRA80: Data Position */ -#define NFI_NANDRA80_Data_Msk (0xfffffffful << NFI_NANDRA80_Data_Pos) /*!< NFI_T::NANDRA80: Data Mask */ - -#define NFI_NANDRA81_Data_Pos (0) /*!< NFI_T::NANDRA81: Data Position */ -#define NFI_NANDRA81_Data_Msk (0xfffffffful << NFI_NANDRA81_Data_Pos) /*!< NFI_T::NANDRA81: Data Mask */ - -#define NFI_NANDRA82_Data_Pos (0) /*!< NFI_T::NANDRA82: Data Position */ -#define NFI_NANDRA82_Data_Msk (0xfffffffful << NFI_NANDRA82_Data_Pos) /*!< NFI_T::NANDRA82: Data Mask */ - -#define NFI_NANDRA83_Data_Pos (0) /*!< NFI_T::NANDRA83: Data Position */ -#define NFI_NANDRA83_Data_Msk (0xfffffffful << NFI_NANDRA83_Data_Pos) /*!< NFI_T::NANDRA83: Data Mask */ - -#define NFI_NANDRA84_Data_Pos (0) /*!< NFI_T::NANDRA84: Data Position */ -#define NFI_NANDRA84_Data_Msk (0xfffffffful << NFI_NANDRA84_Data_Pos) /*!< NFI_T::NANDRA84: Data Mask */ - -#define NFI_NANDRA85_Data_Pos (0) /*!< NFI_T::NANDRA85: Data Position */ -#define NFI_NANDRA85_Data_Msk (0xfffffffful << NFI_NANDRA85_Data_Pos) /*!< NFI_T::NANDRA85: Data Mask */ - -#define NFI_NANDRA86_Data_Pos (0) /*!< NFI_T::NANDRA86: Data Position */ -#define NFI_NANDRA86_Data_Msk (0xfffffffful << NFI_NANDRA86_Data_Pos) /*!< NFI_T::NANDRA86: Data Mask */ - -#define NFI_NANDRA87_Data_Pos (0) /*!< NFI_T::NANDRA87: Data Position */ -#define NFI_NANDRA87_Data_Msk (0xfffffffful << NFI_NANDRA87_Data_Pos) /*!< NFI_T::NANDRA87: Data Mask */ - -#define NFI_NANDRA88_Data_Pos (0) /*!< NFI_T::NANDRA88: Data Position */ -#define NFI_NANDRA88_Data_Msk (0xfffffffful << NFI_NANDRA88_Data_Pos) /*!< NFI_T::NANDRA88: Data Mask */ - -#define NFI_NANDRA89_Data_Pos (0) /*!< NFI_T::NANDRA89: Data Position */ -#define NFI_NANDRA89_Data_Msk (0xfffffffful << NFI_NANDRA89_Data_Pos) /*!< NFI_T::NANDRA89: Data Mask */ - -#define NFI_NANDRA90_Data_Pos (0) /*!< NFI_T::NANDRA90: Data Position */ -#define NFI_NANDRA90_Data_Msk (0xfffffffful << NFI_NANDRA90_Data_Pos) /*!< NFI_T::NANDRA90: Data Mask */ - -#define NFI_NANDRA91_Data_Pos (0) /*!< NFI_T::NANDRA91: Data Position */ -#define NFI_NANDRA91_Data_Msk (0xfffffffful << NFI_NANDRA91_Data_Pos) /*!< NFI_T::NANDRA91: Data Mask */ - -#define NFI_NANDRA92_Data_Pos (0) /*!< NFI_T::NANDRA92: Data Position */ -#define NFI_NANDRA92_Data_Msk (0xfffffffful << NFI_NANDRA92_Data_Pos) /*!< NFI_T::NANDRA92: Data Mask */ - -#define NFI_NANDRA93_Data_Pos (0) /*!< NFI_T::NANDRA93: Data Position */ -#define NFI_NANDRA93_Data_Msk (0xfffffffful << NFI_NANDRA93_Data_Pos) /*!< NFI_T::NANDRA93: Data Mask */ - -#define NFI_NANDRA94_Data_Pos (0) /*!< NFI_T::NANDRA94: Data Position */ -#define NFI_NANDRA94_Data_Msk (0xfffffffful << NFI_NANDRA94_Data_Pos) /*!< NFI_T::NANDRA94: Data Mask */ - -#define NFI_NANDRA95_Data_Pos (0) /*!< NFI_T::NANDRA95: Data Position */ -#define NFI_NANDRA95_Data_Msk (0xfffffffful << NFI_NANDRA95_Data_Pos) /*!< NFI_T::NANDRA95: Data Mask */ - -#define NFI_NANDRA96_Data_Pos (0) /*!< NFI_T::NANDRA96: Data Position */ -#define NFI_NANDRA96_Data_Msk (0xfffffffful << NFI_NANDRA96_Data_Pos) /*!< NFI_T::NANDRA96: Data Mask */ - -#define NFI_NANDRA97_Data_Pos (0) /*!< NFI_T::NANDRA97: Data Position */ -#define NFI_NANDRA97_Data_Msk (0xfffffffful << NFI_NANDRA97_Data_Pos) /*!< NFI_T::NANDRA97: Data Mask */ - -#define NFI_NANDRA98_Data_Pos (0) /*!< NFI_T::NANDRA98: Data Position */ -#define NFI_NANDRA98_Data_Msk (0xfffffffful << NFI_NANDRA98_Data_Pos) /*!< NFI_T::NANDRA98: Data Mask */ - -#define NFI_NANDRA99_Data_Pos (0) /*!< NFI_T::NANDRA99: Data Position */ -#define NFI_NANDRA99_Data_Msk (0xfffffffful << NFI_NANDRA99_Data_Pos) /*!< NFI_T::NANDRA99: Data Mask */ - -#define NFI_NANDRA100_Data_Pos (0) /*!< NFI_T::NANDRA100: Data Position */ -#define NFI_NANDRA100_Data_Msk (0xfffffffful << NFI_NANDRA100_Data_Pos) /*!< NFI_T::NANDRA100: Data Mask */ - -#define NFI_NANDRA101_Data_Pos (0) /*!< NFI_T::NANDRA101: Data Position */ -#define NFI_NANDRA101_Data_Msk (0xfffffffful << NFI_NANDRA101_Data_Pos) /*!< NFI_T::NANDRA101: Data Mask */ - -#define NFI_NANDRA102_Data_Pos (0) /*!< NFI_T::NANDRA102: Data Position */ -#define NFI_NANDRA102_Data_Msk (0xfffffffful << NFI_NANDRA102_Data_Pos) /*!< NFI_T::NANDRA102: Data Mask */ - -#define NFI_NANDRA103_Data_Pos (0) /*!< NFI_T::NANDRA103: Data Position */ -#define NFI_NANDRA103_Data_Msk (0xfffffffful << NFI_NANDRA103_Data_Pos) /*!< NFI_T::NANDRA103: Data Mask */ - -#define NFI_NANDRA104_Data_Pos (0) /*!< NFI_T::NANDRA104: Data Position */ -#define NFI_NANDRA104_Data_Msk (0xfffffffful << NFI_NANDRA104_Data_Pos) /*!< NFI_T::NANDRA104: Data Mask */ - -#define NFI_NANDRA105_Data_Pos (0) /*!< NFI_T::NANDRA105: Data Position */ -#define NFI_NANDRA105_Data_Msk (0xfffffffful << NFI_NANDRA105_Data_Pos) /*!< NFI_T::NANDRA105: Data Mask */ - -#define NFI_NANDRA106_Data_Pos (0) /*!< NFI_T::NANDRA106: Data Position */ -#define NFI_NANDRA106_Data_Msk (0xfffffffful << NFI_NANDRA106_Data_Pos) /*!< NFI_T::NANDRA106: Data Mask */ - -#define NFI_NANDRA107_Data_Pos (0) /*!< NFI_T::NANDRA107: Data Position */ -#define NFI_NANDRA107_Data_Msk (0xfffffffful << NFI_NANDRA107_Data_Pos) /*!< NFI_T::NANDRA107: Data Mask */ - -#define NFI_NANDRA108_Data_Pos (0) /*!< NFI_T::NANDRA108: Data Position */ -#define NFI_NANDRA108_Data_Msk (0xfffffffful << NFI_NANDRA108_Data_Pos) /*!< NFI_T::NANDRA108: Data Mask */ - -#define NFI_NANDRA109_Data_Pos (0) /*!< NFI_T::NANDRA109: Data Position */ -#define NFI_NANDRA109_Data_Msk (0xfffffffful << NFI_NANDRA109_Data_Pos) /*!< NFI_T::NANDRA109: Data Mask */ - -#define NFI_NANDRA110_Data_Pos (0) /*!< NFI_T::NANDRA110: Data Position */ -#define NFI_NANDRA110_Data_Msk (0xfffffffful << NFI_NANDRA110_Data_Pos) /*!< NFI_T::NANDRA110: Data Mask */ - -#define NFI_NANDRA111_Data_Pos (0) /*!< NFI_T::NANDRA111: Data Position */ -#define NFI_NANDRA111_Data_Msk (0xfffffffful << NFI_NANDRA111_Data_Pos) /*!< NFI_T::NANDRA111: Data Mask */ - -#define NFI_NANDRA112_Data_Pos (0) /*!< NFI_T::NANDRA112: Data Position */ -#define NFI_NANDRA112_Data_Msk (0xfffffffful << NFI_NANDRA112_Data_Pos) /*!< NFI_T::NANDRA112: Data Mask */ - -#define NFI_NANDRA113_Data_Pos (0) /*!< NFI_T::NANDRA113: Data Position */ -#define NFI_NANDRA113_Data_Msk (0xfffffffful << NFI_NANDRA113_Data_Pos) /*!< NFI_T::NANDRA113: Data Mask */ - -#define NFI_NANDRA114_Data_Pos (0) /*!< NFI_T::NANDRA114: Data Position */ -#define NFI_NANDRA114_Data_Msk (0xfffffffful << NFI_NANDRA114_Data_Pos) /*!< NFI_T::NANDRA114: Data Mask */ - -#define NFI_NANDRA115_Data_Pos (0) /*!< NFI_T::NANDRA115: Data Position */ -#define NFI_NANDRA115_Data_Msk (0xfffffffful << NFI_NANDRA115_Data_Pos) /*!< NFI_T::NANDRA115: Data Mask */ - -#define NFI_NANDRA116_Data_Pos (0) /*!< NFI_T::NANDRA116: Data Position */ -#define NFI_NANDRA116_Data_Msk (0xfffffffful << NFI_NANDRA116_Data_Pos) /*!< NFI_T::NANDRA116: Data Mask */ - -#define NFI_NANDRA117_Data_Pos (0) /*!< NFI_T::NANDRA117: Data Position */ -#define NFI_NANDRA117_Data_Msk (0xfffffffful << NFI_NANDRA117_Data_Pos) /*!< NFI_T::NANDRA117: Data Mask */ +#define NFI_NANDRA_Data_Pos (0) /*!< NFI_T::NANDRA: Data Position */ +#define NFI_NANDRA_Data_Msk (0xfffffffful << NFI_NANDRA_Data_Pos) /*!< NFI_T::NANDRA: Data Mask */ /**@}*/ /* NFI_CONST */ /**@}*/ /* end of NFI register group */ diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/SConscript b/bsp/nuvoton/libraries/ma35/StdDriver/SConscript index 9431744b64..6ccd1e29be 100644 --- a/bsp/nuvoton/libraries/ma35/StdDriver/SConscript +++ b/bsp/nuvoton/libraries/ma35/StdDriver/SConscript @@ -8,6 +8,20 @@ src = Glob('*src/*.c') + Glob('src/*.cpp') cpppath = [cwd + '/inc'] libpath = [cwd + '/lib'] -group = DefineGroup('Libraries', src, depend = [''], CPPPATH = cpppath) + +if not GetDepend('BSP_USE_STDDRIVER_SOURCE'): + if rtconfig.CROSS_TOOL == 'keil': + if GetOption('target') == 'mdk5' and os.path.isfile('./lib/libstddriver_keil.lib'): + libs += ['libstddriver_keil'] + elif rtconfig.CROSS_TOOL == 'gcc' and os.path.isfile('./lib/libstddriver_gcc_CM4.a') and GetDepend('USE_MA35D1_SUBM'): + libs += ['libstddriver_gcc_CM4'] + elif rtconfig.CROSS_TOOL == 'gcc' and os.path.isfile('./lib/libstddriver_gcc_CA35.a') and GetDepend('USE_MA35D1_AARCH32'): + libs += ['libstddriver_gcc_CA35'] + +if not libs: + group = DefineGroup('Libraries', src, depend = [''], CPPPATH = cpppath) +else: + src = [] + group = DefineGroup('Libraries', src, depend = [''], CPPPATH = cpppath, LIBS = libs, LIBPATH = libpath) Return('group') diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_clk.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_clk.h index 07cffd0bf3..ac5f0ce84e 100644 --- a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_clk.h +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_clk.h @@ -363,9 +363,9 @@ extern "C" #define PDMA1_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(1UL<<0)) /*!< PDMA1 Module \hideinitializer */ #define PDMA2_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(2UL<<0)) /*!< PDMA2 Module \hideinitializer */ #define PDMA3_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(3UL<<0)) /*!< PDMA3 Module \hideinitializer */ -#define WH0_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(4UL<<0)) /*!< WH0 Module \hideinitializer */ -#define WH1_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(5UL<<0)) /*!< WH1 Module \hideinitializer */ -#define HWS_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(6UL<<0)) /*!< HWS Module \hideinitializer */ +#define WHC0_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(4UL<<0)) /*!< WH0 Module \hideinitializer */ +#define WHC1_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(5UL<<0)) /*!< WH1 Module \hideinitializer */ +#define HWSEM0_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(6UL<<0)) /*!< HWS Module \hideinitializer */ #define EBI_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(7UL<<0)) /*!< EBI Module \hideinitializer */ #define SRAM0_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(8UL<<0)) /*!< SRAM0 Module \hideinitializer */ #define SRAM1_MODULE ((1UL<<29)|(MODULE_NoMsk<<26)|(MODULE_NoMsk<<22)|(MODULE_NoMsk<<17)|(MODULE_NoMsk<<14)|(MODULE_NoMsk<<10)|(MODULE_NoMsk<<5)|(9UL<<0)) /*!< SRAM1 Module \hideinitializer */ diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_disp.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_disp.h index 5bd63f9060..2c9ae7327b 100644 --- a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_disp.h +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_disp.h @@ -190,6 +190,7 @@ void DISP_SetBlendValue(uint32_t u32GloAV_Src, uint32_t u32GloAV_Dst); void DISP_SetColorKeyValue(uint32_t u32ColorKeyLow, uint32_t u32ColorKeyHigh); int DISP_SetFBAddr(E_DISP_LAYER eLayer, uint32_t u32DMAFBStartAddr); int DISP_SetFBFmt(E_DISP_LAYER eLayer, E_FB_FMT eFbFmt, uint32_t u32Pitch); +uint32_t DISP_LCDTIMING_GetFPS(const DISP_LCD_TIMING* psDispLCDTiming); /*@}*/ /* end of group DISP_EXPORTED_FUNCTIONS */ diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_hwsem.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_hwsem.h index 551df1471d..a46de00ae0 100644 --- a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_hwsem.h +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_hwsem.h @@ -13,6 +13,11 @@ extern "C" { #endif +#ifdef __has_include + #if __has_include("rtconfig.h") + #include "rtconfig.h" + #endif +#endif /** @addtogroup Standard_Driver Standard Driver @{ @@ -26,9 +31,23 @@ extern "C" @{ */ #define HWSEM_CNT 8ul /*!SEM[(u32Num)] & (HWSEM_SEM_ID_Msk)) +/** + * @brief + * + * @param[in] hwsem The pointer of the specified HWSEM module. + * @param[in] u32Num HWSEM number, valid values are between 0~7 + * + * @retval 0 The key of specified semaphore. + * \hideinitializer + */ +#define HWSEM_GET_KEY(hwsem, u32Num) (((hwsem)->SEM[(u32Num)]&HWSEM_SEM_KEY_Msk) >> HWSEM_SEM_KEY_Pos) + /** * @brief Enable specified HWSEM interrupt * @@ -67,7 +97,7 @@ extern "C" * * \hideinitializer */ -#define HWSEM_ENABLE_INT(hwsem, u32Num) ((hwsem)->INTENM4 |= (HWSEM_INTENM4_SEM0IEN_Msk << (u32Num))) +#define HWSEM_ENABLE_INT(hwsem, u32Num) ((hwsem)->INTEN_CORE |= (HWSEM_INTEN_SEM0IEN_Msk << (u32Num))) /** @@ -79,7 +109,7 @@ extern "C" * * \hideinitializer */ -#define HWSEM_DISABLE_INT(hwsem, u32Num) ((hwsem)->INTENM4 &= ~(HWSEM_INTENM4_SEM0IEN_Msk << (u32Num))) +#define HWSEM_DISABLE_INT(hwsem, u32Num) ((hwsem)->INTEN_CORE &= ~(HWSEM_INTEN_SEM0IEN_Msk << (u32Num))) /** * @brief Get specified interrupt flag @@ -91,7 +121,7 @@ extern "C" * Otherwise The specified interrupt is happened. * \hideinitializer */ -#define HWSEM_GET_INT_FLAG(hwsem, u32Num) ((hwsem)->INTSTSM4 & (HWSEM_INTSTSM4_SEM0IF_Msk << (u32Num))) +#define HWSEM_GET_INT_FLAG(hwsem, u32Num) ((hwsem)->INTSTS_CORE & (HWSEM_INTSTS_SEM0IF_Msk << (u32Num))) /** @@ -102,7 +132,7 @@ extern "C" * * \hideinitializer */ -#define HWSEM_CLR_INT_FLAG(hwsem, u32Num) ((hwsem)->INTSTSM4 = (HWSEM_INTSTSM4_SEM0IF_Msk << (u32Num))) +#define HWSEM_CLR_INT_FLAG(hwsem, u32Num) ((hwsem)->INTSTS_CORE = (HWSEM_INTSTS_SEM0IF_Msk << (u32Num))) /** @@ -115,6 +145,7 @@ extern "C" * \hideinitializer */ #define HWSEM_UNLOCK(hwsem, u32Num, u8Key) ((hwsem)->SEM[(u32Num)] = ((u8Key) << HWSEM_SEM_KEY_Pos) & HWSEM_SEM_KEY_Msk) +#define HWSEM_LOCK HWSEM_UNLOCK /* Declare these inline functions here to avoid MISRA C 2004 rule 8.1 error */ __STATIC_INLINE int32_t HWSEM_Try_Lock(HWSEM_T *hwsem, uint32_t u32Num, uint8_t u8Key); @@ -133,7 +164,7 @@ __STATIC_INLINE void HWSEM_Spin_Lock(HWSEM_T *hwsem, uint32_t u32Num, uint8_t u8 __STATIC_INLINE int32_t HWSEM_Try_Lock(HWSEM_T *hwsem, uint32_t u32Num, uint8_t u8Key) { hwsem->SEM[u32Num] = (u8Key << HWSEM_SEM_KEY_Pos); - if ((hwsem->SEM[u32Num] & HWSEM_SEM_ID_Msk) == HWSEM_LOCK_BY_M4 && + if ((hwsem->SEM[u32Num] & HWSEM_SEM_ID_Msk) == HWSEM_LOCK_BY_OWNER && (hwsem->SEM[u32Num] & HWSEM_SEM_KEY_Msk) == (u8Key << HWSEM_SEM_KEY_Pos)) return 0; else @@ -154,7 +185,7 @@ __STATIC_INLINE void HWSEM_Spin_Lock(HWSEM_T *hwsem, uint32_t u32Num, uint8_t u8 while (1) { hwsem->SEM[u32Num] = (u8Key << HWSEM_SEM_KEY_Pos); - if ((hwsem->SEM[u32Num] & HWSEM_SEM_ID_Msk) == HWSEM_LOCK_BY_M4 && + if ((hwsem->SEM[u32Num] & HWSEM_SEM_ID_Msk) == HWSEM_LOCK_BY_OWNER && (hwsem->SEM[u32Num] & HWSEM_SEM_KEY_Msk) == (u8Key << HWSEM_SEM_KEY_Pos)) break; } diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_sdh.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_sdh.h index 4473f6fba1..1f6aec5b57 100644 --- a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_sdh.h +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_sdh.h @@ -8,6 +8,10 @@ #ifndef __NU_SDH_H__ #define __NU_SDH_H__ +#if defined ( __CC_ARM ) + #pragma anon_unions +#endif + #ifdef __cplusplus extern "C" { @@ -116,6 +120,10 @@ void SDH_SetPower(SDH_T *sdh, uint32_t u32OnOff); } #endif +#if defined ( __CC_ARM ) + #pragma no_anon_unions +#endif + #endif diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_sys.h b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_sys.h index 567d9b5f10..f7cf078ffe 100644 --- a/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_sys.h +++ b/bsp/nuvoton/libraries/ma35/StdDriver/inc/nu_sys.h @@ -36,15 +36,15 @@ extern "C" #define PDMA2_RST ((0UL<<24) | SYS_IPRST0_PDMA2RST_Pos) /*!< Reset PDMA2 \hideinitializer */ #define PDMA3_RST ((0UL<<24) | SYS_IPRST0_PDMA3RST_Pos) /*!< Reset PDMA3 \hideinitializer */ #define DISPC_RST ((0UL<<24) | SYS_IPRST0_DISPCRST_Pos) /*!< Reset DISPC \hideinitializer */ -#define CCAP0_RST ((0UL<<24) | SYS_IPRST0_CCAP0RST_Pos) /*!< Reset VCAP0 \hideinitializer */ -#define CCAP1_RST ((0UL<<24) | SYS_IPRST0_CCAP1RST_Pos) /*!< Reset VCAP1 \hideinitializer */ +#define CCAP0_RST ((0UL<<24) | SYS_IPRST0_CCAP0RST_Pos) /*!< Reset CCAP0 \hideinitializer */ +#define CCAP1_RST ((0UL<<24) | SYS_IPRST0_CCAP1RST_Pos) /*!< Reset CCAP1 \hideinitializer */ #define GFX_RST ((0UL<<24) | SYS_IPRST0_GFXRST_Pos) /*!< Reset GFX \hideinitializer */ #define VDEC_RST ((0UL<<24) | SYS_IPRST0_VDECRST_Pos) /*!< Reset VDEC \hideinitializer */ -#define WRHO0_RST ((0UL<<24) | SYS_IPRST0_WRHO0RST_Pos) /*!< Reset WRHO0 \hideinitializer */ -#define WRHO1_RST ((0UL<<24) | SYS_IPRST0_WRHO1RST_Pos) /*!< Reset WRHO1 \hideinitializer */ +#define WHC0_RST ((0UL<<24) | SYS_IPRST0_WRHO0RST_Pos) /*!< Reset WRHO0 \hideinitializer */ +#define WHC1_RST ((0UL<<24) | SYS_IPRST0_WRHO1RST_Pos) /*!< Reset WRHO1 \hideinitializer */ #define GMAC0_RST ((0UL<<24) | SYS_IPRST0_GMAC0RST_Pos) /*!< Reset GMAC0 \hideinitializer */ #define GMAC1_RST ((0UL<<24) | SYS_IPRST0_GMAC1RST_Pos) /*!< Reset GMAC1 \hideinitializer */ -#define HWSEM_RST ((0UL<<24) | SYS_IPRST0_HWSEMRST_Pos) /*!< Reset HWSEM \hideinitializer */ +#define HWSEM0_RST ((0UL<<24) | SYS_IPRST0_HWSEMRST_Pos) /*!< Reset HWSEM \hideinitializer */ #define EBI_RST ((0UL<<24) | SYS_IPRST0_EBIRST_Pos) /*!< Reset EBI \hideinitializer */ #define HSUSBH0_RST ((0UL<<24) | SYS_IPRST0_HSUSBH0RST_Pos) /*!< Reset HSUSBH0 \hideinitializer */ #define HSUSBH1_RST ((0UL<<24) | SYS_IPRST0_HSUSBH1RST_Pos) /*!< Reset HSUSBH1 \hideinitializer */ @@ -184,7 +184,7 @@ Example 1: If user want to set PA.0 as SC0_CLK in initial function, #define SYS_GPA_MFPH_PA8MFP_GPIO (0x00UL<u32HA + psDispLCDTiming->u32HBP + psDispLCDTiming->u32HFP + psDispLCDTiming->u32HSL; + u32VTotal = psDispLCDTiming->u32VA + psDispLCDTiming->u32VBP + psDispLCDTiming->u32VFP + psDispLCDTiming->u32VSL; + + u32FPS = psDispLCDTiming->u32PCF / u32HTotal / u32VTotal; + } + + return u32FPS; +} + int DISP_Trigger(E_DISP_LAYER eLayer, uint32_t u32Action) { switch (eLayer) diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_i2s.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_i2s.c index 6fd974f097..f95507f630 100644 --- a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_i2s.c +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_i2s.c @@ -28,10 +28,8 @@ static uint32_t I2S_GetSourceClockFreq(I2S_T *i2s); * @param[in] i2s The pointer of the specified I2S module. * @return Source clock frequency of I2S peripheral. * @details - * 0: _HXT - * 1: APLL - * 2: PCLK0 - * 3: HIRC + * 0: APLL + * 1: SYSCLK1_DIV2 */ static uint32_t I2S_GetSourceClockFreq(I2S_T *i2s) diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_pdma.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_pdma.c index ff56e0ccb8..3e98dbe14f 100644 --- a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_pdma.c +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_pdma.c @@ -240,8 +240,8 @@ void PDMA_SetTransferMode(PDMA_T *pdma, uint32_t u32Ch, uint32_t u32Peripheral, if (u32ScatterEn) { - pdma->DSCT[u32Ch].CTL = (pdma->DSCT[u32Ch].CTL & ~PDMA_DSCT_CTL_OPMODE_Msk) | PDMA_OP_SCATTER; pdma->DSCT[u32Ch].NEXT = u32DescAddr; + pdma->DSCT[u32Ch].CTL = (pdma->DSCT[u32Ch].CTL & ~PDMA_DSCT_CTL_OPMODE_Msk) | PDMA_OP_SCATTER; } else { diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_rtc.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_rtc.c index 4f16700b96..adac9a992d 100644 --- a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_rtc.c +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_rtc.c @@ -65,12 +65,12 @@ static volatile uint32_t g_u32hiHour, g_u32loHour, g_u32hiMin, g_u32loMin, g_u32 int32_t RTC_Open(S_RTC_TIME_DATA_T *sPt) { RTC->INIT = RTC_INIT_KEY; - if (RTC->INIT != RTC_INIT_ACTIVE_Msk) + if ((RTC->INIT & RTC_INIT_ACTIVE_Msk) != RTC_INIT_ACTIVE_Msk) { - uint32_t u32Timeout = 10000000ul; + uint32_t volatile u32Timeout = 10000000ul; RTC->INIT = RTC_INIT_KEY; - while ((u32Timeout > 0) && (RTC->INIT != RTC_INIT_ACTIVE_Msk)) + while ((u32Timeout > 0) && ((RTC->INIT & RTC_INIT_ACTIVE_Msk) != RTC_INIT_ACTIVE_Msk)) { u32Timeout--; } @@ -317,7 +317,7 @@ void RTC_SetDateAndTime(S_RTC_TIME_DATA_T *sPt) { uint32_t u32RegCAL, u32RegTIME; - if (sPt == 0ul) + if (sPt == NULL) { } else @@ -396,7 +396,7 @@ void RTC_SetAlarmDateAndTime(S_RTC_TIME_DATA_T *sPt) { uint32_t u32RegCALM, u32RegTALM; - if (sPt == 0) + if (sPt == NULL) { } else diff --git a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_sys.c b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_sys.c index 98a23a2757..38cd15bb6c 100644 --- a/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_sys.c +++ b/bsp/nuvoton/libraries/ma35/StdDriver/src/nu_sys.c @@ -42,7 +42,7 @@ extern "C" * - \ref WRHO1_RST * - \ref GMAC0_RST * - \ref GMAC1_RST - * - \ref HWSEM_RST + * - \ref HWSEM0_RST * - \ref EBI_RST * - \ref HSUSBH0_RST * - \ref HSUSBH1_RST diff --git a/bsp/nuvoton/libraries/ma35/UsbHostLib/inc/config.h b/bsp/nuvoton/libraries/ma35/UsbHostLib/inc/config.h index 892cbbb32b..327abb47da 100644 --- a/bsp/nuvoton/libraries/ma35/UsbHostLib/inc/config.h +++ b/bsp/nuvoton/libraries/ma35/UsbHostLib/inc/config.h @@ -25,8 +25,6 @@ #define HCLK_MHZ 700 /* used for loop-delay. must be larger than true HCLK clock MHz */ -#define NON_CACHE_MASK (0xC0000000) - static __inline void ENABLE_OHCI_IRQ(void) { rt_hw_interrupt_umask(USBH0_IRQn); @@ -87,7 +85,7 @@ static __inline void DISABLE_EHCI_IRQ(void) limited. */ #define MAX_UDEV_DRIVER 8 /*!< Maximum number of registered drivers */ -#define MAX_ALT_PER_IFACE 8 /*!< maximum number of alternative interfaces per interface */ +#define MAX_ALT_PER_IFACE 32 /*!< maximum number of alternative interfaces per interface */ #define MAX_EP_PER_IFACE 6 /*!< maximum number of endpoints per interface */ #define MAX_HUB_DEVICE 8 /*!< Maximum number of hub devices */ @@ -95,8 +93,8 @@ static __inline void DISABLE_EHCI_IRQ(void) are all allocated from this pool. Allocated unit size is determined by MEM_POOL_UNIT_SIZE. May allocate one or more units depend on hardware descriptor type. */ -#define MEM_POOL_UNIT_SIZE 64 /*!< A fixed hard coding setting. Do not change it! */ -#define MEM_POOL_UNIT_NUM 256 /*!< Increase this or heap size if memory allocate failed. */ +#define MEM_POOL_UNIT_SIZE 256 /*!< A fixed hard coding setting. Do not change it! */ +#define MEM_POOL_UNIT_NUM 64 /*!< Increase this or heap size if memory allocate failed. */ /*----------------------------------------------------------------------------------------*/ /* Re-defined staff for various compiler */ diff --git a/bsp/nuvoton/libraries/ma35/UsbHostLib/src/_ehci.c_ b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/_ehci.c_ index 958844b806..1a1a10701c 100644 --- a/bsp/nuvoton/libraries/ma35/UsbHostLib/src/_ehci.c_ +++ b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/_ehci.c_ @@ -11,15 +11,15 @@ /// @cond HIDDEN_SYMBOLS -static QH_T *_H_qh; /* head of reclamation list */ -static qTD_T *_ghost_qtd; /* used as a terminator qTD */ -static QH_T *qh_remove_list; +static QH_T *_H_qh __attribute__((section(".usbhostlib._H_qh"))); /* head of reclamation list */ +static qTD_T *_ghost_qtd __attribute__((section(".usbhostlib._ghost_qtd"))); /* used as a terminator qTD */ +static QH_T *qh_remove_list __attribute__((section(".usbhostlib.qh_remove_list"))); -static uint32_t _PFList_mem[FL_SIZE] __attribute__((aligned(4096))); /* Periodic frame list */ +static uint32_t _PFList_mem[FL_SIZE] __attribute__((section(".usbhostlib._PFList_mem"))) __attribute__((aligned(4096))); /* Periodic frame list */ -static uint32_t *_PFList; +static uint32_t *_PFList __attribute__((section(".usbhostlib._PFList"))); -static QH_T *_Iqh[NUM_IQH]; +static QH_T *_Iqh[NUM_IQH] __attribute__((section(".usbhostlib.QH_T"))) __attribute__((aligned(32)));; static int ehci_quit_iso_xfer(UTR_T *utr, EP_INFO_T *ep); static void scan_isochronous_list(void); @@ -29,24 +29,25 @@ static void scan_isochronous_list(void); static void dump_ehci_regs(void) { USB_debug("Dump HSUSBH(0x%x) registers:\n", ptr_to_u32(&_ehci->EHCVNR)); - USB_debug(" EHCVNR = 0x%x\n", _ehci->EHCVNR); - USB_debug(" EHCSPR = 0x%x\n", _ehci->EHCSPR); - USB_debug(" EHCCPR = 0x%x\n", _ehci->EHCCPR); - USB_debug(" UCMDR = 0x%x\n", _ehci->UCMDR); - USB_debug(" USTSR = 0x%x\n", _ehci->USTSR); - USB_debug(" UIENR = 0x%x\n", _ehci->UIENR); - USB_debug(" UFINDR = 0x%x\n", _ehci->UFINDR); - USB_debug(" UPFLBAR = 0x%x\n", _ehci->UPFLBAR); - USB_debug(" UCALAR = 0x%x\n", _ehci->UCALAR); - USB_debug(" UCFGR = 0x%x\n", _ehci->UCFGR); - USB_debug(" UPSCR0 = 0x%x\n", _ehci->UPSCR); + USB_debug(" EHCVNR = 0x%08x\n", _ehci->EHCVNR); + USB_debug(" EHCSPR = 0x%08x\n", _ehci->EHCSPR); + USB_debug(" EHCCPR = 0x%08x\n", _ehci->EHCCPR); + USB_debug(" UCMDR = 0x%08x\n", _ehci->UCMDR); + USB_debug(" USTSR = 0x%08x\n", _ehci->USTSR); + USB_debug(" UIENR = 0x%08x\n", _ehci->UIENR); + USB_debug(" UFINDR = 0x%08x\n", _ehci->UFINDR); + USB_debug(" UPFLBAR = 0x%08x\n", _ehci->UPFLBAR); + USB_debug(" UCALAR = 0x%08x\n", _ehci->UCALAR); + USB_debug(" UCFGR = 0x%08x\n", _ehci->UCFGR); + USB_debug(" UPSCR0 = 0x%08x\n", _ehci->UPSCR[0]); +// USB_debug(" UPSCR1 = 0x%08x\n", _ehci->UPSCR[1]); // USB_debug(" PHYCTL0 = 0x%x\n", _ehci->USBPCR0); // USB_debug(" PHYCTL1 = 0x%x\n", _ehci->USBPCR1); } static void dump_ehci_ports() { - USB_debug("_ehci port0=0x%x\n", _ehci->UPSCR); + USB_debug("_ehci port0=0x%x, port1=0x%x\n", _ehci->UPSCR[0], _ehci->UPSCR[1]); } static void dump_ehci_qtd(qTD_T *qtd) @@ -150,7 +151,7 @@ static void init_periodic_frame_list() QH_T *qh_p; int i, idx, interval; - _PFList = (uint32_t *)((uint32_t)_PFList_mem | NON_CACHE_MASK); + _PFList = (uint32_t *)((uint32_t)&_PFList_mem[0]); memset(_PFList, 0, sizeof(_PFList_mem)); iso_ep_list = NULL; @@ -281,6 +282,8 @@ static int ehci_init(void) else return USBH_ERR_EHCI_INIT; /* Invalid FL_SIZE setting! */ + _ehci->UPFLBAR = (uint32_t)_PFList; + /*------------------------------------------------------------------------------------*/ /* start run */ /*------------------------------------------------------------------------------------*/ @@ -295,8 +298,8 @@ static int ehci_init(void) init_periodic_frame_list(); - _ehci->UPFLBAR = (uint32_t)_PFList; - usbh_delay_ms(10); /* delay 10 ms */ + //usbh_delay_ms(10); /* delay 10 ms */ + //dump_ehci_regs(); return 0; } @@ -611,6 +614,7 @@ static int ehci_ctrl_xfer(UTR_T *utr) _H_qh->HLink = QH_HLNK_QH(qh); } + //dump_ehci_regs(); /* Start transfer */ _ehci->UCMDR |= HSUSBH_UCMDR_ASEN_Msk; /* start asynchronous transfer */ return 0; @@ -1098,8 +1102,13 @@ void EHCI_IRQHandler(int vector, void *param) USB_error("Transfer error!\n"); } - if (intsts & HSUSBH_USTSR_USBINT_Msk) + if (intsts & (HSUSBH_USTSR_USBINT_Msk | HSUSBH_USTSR_UERRINT_Msk)) { + if (intsts & HSUSBH_USTSR_UERRINT_Msk) + { + USB_error("Transfer error!\n"); + } + /* some transfers completed, travel asynchronous */ /* and periodic lists to find and reclaim them. */ scan_asynchronous_list(); @@ -1140,12 +1149,12 @@ static int ehci_rh_port_reset(int port) _ehci->UPSCR[port] = (_ehci->UPSCR[port] | HSUSBH_UPSCR_PRST_Msk) & ~HSUSBH_UPSCR_PE_Msk; t0 = usbh_get_ticks(); - while (usbh_get_ticks() - t0 < (reset_time) + 1) ; /* wait at least 50 ms */ + while (usbh_get_ticks() - t0 < (reset_time/10) + 1) ; /* wait at least 50 ms */ _ehci->UPSCR[port] &= ~HSUSBH_UPSCR_PRST_Msk; t0 = usbh_get_ticks(); - while (usbh_get_ticks() - t0 < (reset_time) + 1) + while (usbh_get_ticks() - t0 < (reset_time/10) + 1) { if (!(_ehci->UPSCR[port] & HSUSBH_UPSCR_CCS_Msk) || ((_ehci->UPSCR[port] & (HSUSBH_UPSCR_CCS_Msk | HSUSBH_UPSCR_PE_Msk)) == (HSUSBH_UPSCR_CCS_Msk | HSUSBH_UPSCR_PE_Msk))) @@ -1174,7 +1183,7 @@ static int ehci_rh_polling(void) int port; int connect_status, t0, debounce_tick; - for (port = 0; port < EHCI_PORT_CNT; port++) + for (port = 0; port < 1; port++) { if (!(_ehci->UPSCR[port] & HSUSBH_UPSCR_CSC_Msk)) continue; @@ -1197,7 +1206,7 @@ static int ehci_rh_polling(void) /* Port de-bounce */ /*--------------------------------------------------------------------------------*/ t0 = usbh_get_ticks(); - debounce_tick = usbh_tick_from_millisecond(HUB_DEBOUNCE_TIME); + debounce_tick = usbh_tick_from_millisecond(HUB_DEBOUNCE_TIME/10); connect_status = _ehci->UPSCR[port] & HSUSBH_UPSCR_CCS_Msk; while (usbh_get_ticks() - t0 < debounce_tick) { diff --git a/bsp/nuvoton/libraries/ma35/UsbHostLib/src/_ohci.c_ b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/_ohci.c_ index a551648248..6c49d921d7 100644 --- a/bsp/nuvoton/libraries/ma35/UsbHostLib/src/_ohci.c_ +++ b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/_ohci.c_ @@ -17,11 +17,9 @@ #define PORT_CNT (_ohci->HcRhDescriptorA & 0xf) -static uint8_t _hcca_mem[256] __attribute__((aligned(256))); +static HCCA_T _hcca __attribute__((section(".usbhostlib._hcca"))) __attribute__((aligned(256))); -static HCCA_T *_hcca; - -static ED_T *_Ied[6]; +static ED_T * _Ied[6] __attribute__((section(".usbhostlib._Ied"))); static ED_T *ed_remove_list; @@ -97,7 +95,7 @@ static void init_hcca_int_table() ED_T *ed_p; int i, idx, interval; - memset(_hcca->int_table, 0, sizeof(_hcca->int_table)); + memset(_hcca.int_table, 0, sizeof(_hcca.int_table)); for (i = 5; i >= 0; i--) /* interval = i^2 */ { @@ -108,13 +106,13 @@ static void init_hcca_int_table() for (idx = interval - 1; idx < 32; idx += interval) { - if (_hcca->int_table[idx] == 0) /* is empty list, insert directly */ + if (_hcca.int_table[idx] == 0) /* is empty list, insert directly */ { - _hcca->int_table[idx] = (uint32_t)_Ied[i]; + _hcca.int_table[idx] = (uint32_t)_Ied[i]; } else { - ed_p = (ED_T *)_hcca->int_table[idx]; + ed_p = (ED_T *)_hcca.int_table[idx]; while (1) { @@ -133,7 +131,7 @@ static void init_hcca_int_table() } } -static ED_T *get_int_tree_head_node(int interval) +static ED_T * get_int_tree_head_node(int interval) { int i; @@ -166,8 +164,6 @@ static int ohci_init(void) uint32_t fminterval; volatile int i; - _hcca = (HCCA_T *)((uint32_t)_hcca_mem | NON_CACHE_MASK); - if (ohci_reset() < 0) return -1; @@ -180,11 +176,11 @@ static int ohci_init(void) _ohci->HcControlHeadED = 0; /* control ED list head */ _ohci->HcBulkHeadED = 0; /* bulk ED list head */ - _ohci->HcHCCA = (uint32_t)_hcca; /* HCCA area */ + _ohci->HcHCCA = (uint32_t)&_hcca; /* HCCA area */ /* periodic start 90% of frame interval */ fminterval = 0x2edf; /* 11,999 */ - _ohci->HcPeriodicStart = (fminterval * 9) / 10; + _ohci->HcPeriodicStart = (fminterval*9)/10; /* set FSLargestDataPacket, 10,104 for 0x2edf frame interval */ fminterval |= ((((fminterval - 210) * 6) / 7) << 16); @@ -342,7 +338,7 @@ static uint32_t ed_make_info(UDEV_T *udev, EP_INFO_T *ep) static void write_td(TD_T *td, uint32_t info, uint8_t *buff, uint32_t data_len) { uint32_t baddr = ptr_to_u32(buff); - + td->Info = info; td->CBP = (((baddr == 0) || !data_len) ? 0 : baddr); td->BE = (((baddr == 0) || !data_len) ? 0 : baddr + data_len - 1); @@ -661,7 +657,7 @@ static int ohci_int_xfer(UTR_T *utr) info = (TD_CC | TD_R | TD_DP_IN | TD_TYPE_INT); /* Keep data toggle */ - info = (info & ~(1 << 25)) | (td->Info & (1 << 25)); + info = (info & ~(1<<25)) | (td->Info & (1<<25)); /* fill this TD */ write_td(td, info, utr->buff, utr->data_len); @@ -735,7 +731,7 @@ static int ohci_iso_xfer(UTR_T *utr) /* Prepare TDs */ /*------------------------------------------------------------------------------------*/ if (utr->bIsoNewSched) /* Is the starting of isochronous streaming? */ - ed->next_sf = _hcca->frame_no + OHCI_ISO_DELAY; + ed->next_sf = _hcca.frame_no + OHCI_ISO_DELAY; utr->td_cnt = 0; utr->iso_sf = ed->next_sf; @@ -759,7 +755,7 @@ static int ohci_iso_xfer(UTR_T *utr) td->PSW[0] = 0xE000 | (buff_addr & 0xFFF); td->ed = ed; - utr->td_cnt++; /* increase TD count, for recalim counter */ + utr->td_cnt++; /* increase TD count, for reclaim counter */ /* chain to end of TD list */ if (td_list == NULL) @@ -841,7 +837,7 @@ static int ohci_rh_port_reset(int port) _ohci->HcRhPortStatus[port] = USBH_HcRhPortStatus_PRS_Msk; t0 = usbh_get_ticks(); - while (usbh_get_ticks() - t0 < (reset_time) + 1) + while (usbh_get_ticks() - t0 < (reset_time/10) + 1) { /* * If device is disconnected or port enabled, we can stop port reset. @@ -853,7 +849,7 @@ static int ohci_rh_port_reset(int port) reset_time += PORT_RESET_RETRY_INC_MS; } - USB_debug("OHCI port %d - port reset failed!\n", port + 1); + USB_debug("OHCI port %d - port reset failed!\n", port+1); return USBH_ERR_PORT_RESET; port_reset_done: @@ -871,7 +867,7 @@ static int ohci_rh_polling(void) UDEV_T *udev; int ret; - for (i = 0; i < OHCI_PORT_CNT; i++) + for (i = 0; i < 1; i++) { /* clear unwanted port change status */ _ohci->HcRhPortStatus[i] = USBH_HcRhPortStatus_OCIC_Msk | USBH_HcRhPortStatus_PRSC_Msk | @@ -1183,8 +1179,8 @@ void OHCI_IRQHandler(int vector, void *param) /* * reverse done list */ - td = (TD_T *)(_hcca->done_head & TD_ADDR_MASK); - _hcca->done_head = 0; + td = (TD_T *)(_hcca.done_head & TD_ADDR_MASK); + _hcca.done_head = 0; td_prev = NULL; _ohci->HcInterruptStatus = USBH_HcInterruptStatus_WDH_Msk; @@ -1232,7 +1228,7 @@ static void dump_ohci_int_table() { USB_debug("%02d: ", i); - ed = (ED_T *)_hcca->int_table[i]; + ed = (ED_T *)_hcca.int_table[i]; while (ed != NULL) { @@ -1268,12 +1264,14 @@ static void dump_ohci_regs() USB_debug(" HcRhDescriptorB = 0x%x\n", _ohci->HcRhDescriptorB); USB_debug(" HcRhStatus = 0x%x\n", _ohci->HcRhStatus); USB_debug(" HcRhPortStatus0 = 0x%x\n", _ohci->HcRhPortStatus[0]); + USB_debug(" HcRhPortStatus1 = 0x%x\n", _ohci->HcRhPortStatus[1]); USB_debug(" HcPhyControl = 0x%x\n", _ohci->HcPhyControl); + USB_debug(" HcMiscControl = 0x%x\n", _ohci->HcMiscControl); } static void dump_ohci_ports() { - USB_debug("_ohci port0=0x%x\n", _ohci->HcRhPortStatus[0]); + USB_debug("_ohci port0=0x%x, port1=0x%x\n", _ohci->HcRhPortStatus[0], _ohci->HcRhPortStatus[1]); } #endif // ENABLE_DEBUG_MSG diff --git a/bsp/nuvoton/libraries/ma35/UsbHostLib/src/mem_alloc.c b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/mem_alloc.c index 75a7b60e38..9531a959ed 100644 --- a/bsp/nuvoton/libraries/ma35/UsbHostLib/src/mem_alloc.c +++ b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/mem_alloc.c @@ -25,14 +25,7 @@ #define mem_debug(...) #endif -#ifdef __ICCARM__ - #pragma data_alignment=1024 - uint8_t _mem_pool_buff[MEM_POOL_UNIT_NUM][MEM_POOL_UNIT_SIZE]; -#else - uint8_t _mem_pool_buff[MEM_POOL_UNIT_NUM][MEM_POOL_UNIT_SIZE] __attribute__((aligned(1024))); -#endif - -static uint8_t *_mem_pool[MEM_POOL_UNIT_NUM]; +static uint8_t _mem_pool[MEM_POOL_UNIT_NUM][MEM_POOL_UNIT_SIZE] __attribute__((section(".usbhostlib._mem_pool"))) __attribute__((aligned(32))); static uint8_t _unit_used[MEM_POOL_UNIT_NUM]; static volatile int _usbh_mem_used; @@ -42,7 +35,7 @@ static volatile int _mem_pool_used; UDEV_T *g_udev_list; -uint8_t _dev_addr_pool[128]; +uint8_t _dev_addr_pool[128] __attribute__((section(".usbhostlib._dev_addr_pool"))); static volatile int _device_addr; static int _sidx = 0;; @@ -53,8 +46,6 @@ static int _sidx = 0;; void usbh_memory_init(void) { - int i; - if (sizeof(TD_T) > MEM_POOL_UNIT_SIZE) { USB_error("TD_T - MEM_POOL_UNIT_SIZE too small!\n"); @@ -67,15 +58,10 @@ void usbh_memory_init(void) while (1); } - for (i = 0; i < MEM_POOL_UNIT_NUM; i++) - { - _unit_used[i] = 0; - _mem_pool[i] = (uint8_t *)((uint32_t)&_mem_pool_buff[i] | NON_CACHE_MASK); - } - _usbh_mem_used = 0L; _usbh_max_mem_used = 0L; + memset(_unit_used, 0, sizeof(_unit_used)); _mem_pool_used = 0; _sidx = 0; @@ -93,9 +79,13 @@ uint32_t usbh_memory_used(void) return _usbh_mem_used; } -static void memory_counter(int size) +static void memory_counter(int inc, int size) { - _usbh_mem_used += size; + if (inc) + _usbh_mem_used += size; + else + _usbh_mem_used -= size; + if (_usbh_mem_used > _usbh_max_mem_used) _usbh_max_mem_used = _usbh_mem_used; } @@ -104,7 +94,7 @@ void *usbh_alloc_mem(int size) { void *p; - p = USB_malloc(size, 16); + p = USB_malloc(size, 4); if (p == NULL) { USB_error("usbh_alloc_mem failed! %d\n", size); @@ -112,14 +102,14 @@ void *usbh_alloc_mem(int size) } memset(p, 0, size); - memory_counter(size); + memory_counter(1, size); return p; } void usbh_free_mem(void *p, int size) { USB_free(p); - memory_counter(0 - size); + memory_counter(0, size); } @@ -131,15 +121,14 @@ UDEV_T *alloc_device(void) { UDEV_T *udev; - udev = (UDEV_T *)USB_malloc(sizeof(*udev), 16); + udev = (UDEV_T *)USB_malloc(sizeof(*udev), 4); if (udev == NULL) { USB_error("alloc_device failed!\n"); return NULL; } - memset(udev, 0, sizeof(*udev)); - memory_counter(sizeof(*udev)); + memory_counter(1, sizeof(*udev)); udev->cur_conf = -1; /* must! used to identify the first SET CONFIGURATION */ udev->next = g_udev_list; /* chain to global device list */ g_udev_list = udev; @@ -177,7 +166,7 @@ void free_device(UDEV_T *udev) } } USB_free(udev); - memory_counter(-sizeof(*udev)); + memory_counter(0, sizeof(*udev)); } int alloc_dev_address(void) @@ -212,39 +201,19 @@ void free_dev_address(int dev_addr) UTR_T *alloc_utr(UDEV_T *udev) { -#if 0 - UTR_T *utr, *utr_noncache; - - utr = (UTR_T *)USB_malloc(sizeof(*utr), 16); - if (utr == NULL) - { - USB_error("alloc_utr failed!\n"); - return NULL; - } - - utr_noncache = (UTR_T *)((uint32_t)utr | NONCACHEABLE); - - memory_counter(sizeof(*utr)); - memset(utr_noncache, 0, sizeof(*utr)); - utr_noncache->udev = udev; - mem_debug("[ALLOC] [UTR] - 0x%x\n", (int)utr_noncache); - return utr_noncache; -#else UTR_T *utr; - utr = (UTR_T *)USB_malloc(sizeof(*utr), 16); + utr = (UTR_T *)USB_malloc(sizeof(*utr), 4); if (utr == NULL) { USB_error("alloc_utr failed!\n"); return NULL; } - - memory_counter(sizeof(*utr)); + memory_counter(1, sizeof(*utr)); memset(utr, 0, sizeof(*utr)); utr->udev = udev; - mem_debug("[ALLOC] [UTR] - 0x%x\n", (int)utr_noncache); + mem_debug("[ALLOC] [UTR] - 0x%x\n", (int)utr); return utr; -#endif } void free_utr(UTR_T *utr) @@ -253,14 +222,8 @@ void free_utr(UTR_T *utr) return; mem_debug("[FREE] [UTR] - 0x%x\n", (int)utr); - -#if 0 - if ((uint32_t)utr & NONCACHEABLE) - utr = (UTR_T *)((uint32_t)utr & ~NONCACHEABLE); -#endif - USB_free(utr); - memory_counter(0 - (int)sizeof(*utr)); + memory_counter(0, (int)sizeof(*utr)); } /*--------------------------------------------------------------------------*/ @@ -278,7 +241,7 @@ ED_T *alloc_ohci_ED(void) { _unit_used[i] = 1; _mem_pool_used++; - ed = (ED_T *)_mem_pool[i]; + ed = (ED_T *)&_mem_pool[i]; memset(ed, 0, sizeof(*ed)); mem_debug("[ALLOC] [ED] - 0x%x\n", (int)ed); return ed; @@ -294,7 +257,7 @@ void free_ohci_ED(ED_T *ed) for (i = 0; i < MEM_POOL_UNIT_NUM; i++) { - if ((uint32_t)_mem_pool[i] == (uint32_t)ed) + if ((uint32_t)&_mem_pool[i] == (uint32_t)ed) { mem_debug("[FREE] [ED] - 0x%x\n", (int)ed); _unit_used[i] = 0; @@ -319,7 +282,7 @@ TD_T *alloc_ohci_TD(UTR_T *utr) { _unit_used[i] = 1; _mem_pool_used++; - td = (TD_T *)_mem_pool[i]; + td = (TD_T *)&_mem_pool[i]; memset(td, 0, sizeof(*td)); td->utr = utr; @@ -337,7 +300,7 @@ void free_ohci_TD(TD_T *td) for (i = 0; i < MEM_POOL_UNIT_NUM; i++) { - if ((uint32_t)_mem_pool[i] == (uint32_t)td) + if ((uint32_t)&_mem_pool[i] == (uint32_t)td) { mem_debug("[FREE] [TD] - 0x%x\n", (int)td); _unit_used[i] = 0; @@ -363,7 +326,7 @@ QH_T *alloc_ehci_QH(void) _unit_used[i] = 1; _sidx = i; _mem_pool_used++; - qh = (QH_T *)_mem_pool[i]; + qh = (QH_T *)&_mem_pool[i]; memset(qh, 0, sizeof(*qh)); mem_debug("[ALLOC] [QH] - 0x%x\n", (int)qh); break; @@ -387,7 +350,7 @@ void free_ehci_QH(QH_T *qh) for (i = 0; i < MEM_POOL_UNIT_NUM; i++) { - if ((uint32_t)_mem_pool[i] == (uint32_t)qh) + if ((uint32_t)&_mem_pool[i] == (uint32_t)qh) { mem_debug("[FREE] [QH] - 0x%x\n", (int)qh); _unit_used[i] = 0; @@ -413,7 +376,7 @@ qTD_T *alloc_ehci_qTD(UTR_T *utr) _unit_used[i] = 1; _sidx = i; _mem_pool_used++; - qtd = (qTD_T *)_mem_pool[i]; + qtd = (qTD_T *)&_mem_pool[i]; memset(qtd, 0, sizeof(*qtd)); qtd->Next_qTD = QTD_LIST_END; @@ -434,7 +397,7 @@ void free_ehci_qTD(qTD_T *qtd) for (i = 0; i < MEM_POOL_UNIT_NUM; i++) { - if ((uint32_t)_mem_pool[i] == (uint32_t)qtd) + if ((uint32_t)&_mem_pool[i] == (uint32_t)qtd) { mem_debug("[FREE] [qTD] - 0x%x\n", (int)qtd); _unit_used[i] = 0; @@ -463,7 +426,7 @@ iTD_T *alloc_ehci_iTD(void) _unit_used[i] = _unit_used[i + 1] = 1; _sidx = i + 1; _mem_pool_used += 2; - itd = (iTD_T *)_mem_pool[i]; + itd = (iTD_T *)&_mem_pool[i]; memset(itd, 0, sizeof(*itd)); mem_debug("[ALLOC] [iTD] - 0x%x\n", (int)itd); return itd; @@ -479,7 +442,7 @@ void free_ehci_iTD(iTD_T *itd) for (i = 0; i + 1 < MEM_POOL_UNIT_NUM; i++) { - if ((uint32_t)_mem_pool[i] == (uint32_t)itd) + if ((uint32_t)&_mem_pool[i] == (uint32_t)itd) { mem_debug("[FREE] [iTD] - 0x%x\n", (int)itd); _unit_used[i] = _unit_used[i + 1] = 0; @@ -505,7 +468,7 @@ siTD_T *alloc_ehci_siTD(void) _unit_used[i] = 1; _sidx = i; _mem_pool_used ++; - sitd = (siTD_T *)_mem_pool[i]; + sitd = (siTD_T *)&_mem_pool[i]; memset(sitd, 0, sizeof(*sitd)); mem_debug("[ALLOC] [siTD] - 0x%x\n", (int)sitd); return sitd; @@ -521,7 +484,7 @@ void free_ehci_siTD(siTD_T *sitd) for (i = 0; i < MEM_POOL_UNIT_NUM; i++) { - if ((uint32_t)_mem_pool[i] == (uint32_t)sitd) + if ((uint32_t)&_mem_pool[i] == (uint32_t)sitd) { mem_debug("[FREE] [siTD] - 0x%x\n", (int)sitd); _unit_used[i] = 0; diff --git a/bsp/nuvoton/libraries/ma35/UsbHostLib/src/support.c b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/support.c index 7338f41ab7..cd3231fba9 100644 --- a/bsp/nuvoton/libraries/ma35/UsbHostLib/src/support.c +++ b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/support.c @@ -39,8 +39,7 @@ typedef struct USB_mhdr uint32_t reserved; } USB_MHDR_T; -uint8_t _USBMemoryPool[USB_MEMORY_POOL_SIZE] __attribute__((aligned(USB_MEM_BLOCK_SIZE))); - +uint8_t _USBMemoryPool[USB_MEMORY_POOL_SIZE] __attribute__((section(".usbhostlib.USBMemoryPool"))) __attribute__((aligned(USB_MEM_BLOCK_SIZE))); static USB_MHDR_T *_pCurrent; uint32_t *_USB_pCurrent = (uint32_t *) &_pCurrent; @@ -50,7 +49,7 @@ static uint32_t _MemoryPoolBase, _MemoryPoolEnd; void USB_InitializeMemoryPool() { - _MemoryPoolBase = (uint32_t)&_USBMemoryPool[0] | NON_CACHE_MASK; + _MemoryPoolBase = (uint32_t)&_USBMemoryPool[0]; _MemoryPoolEnd = _MemoryPoolBase + USB_MEMORY_POOL_SIZE; _FreeMemorySize = _MemoryPoolEnd - _MemoryPoolBase; _AllocatedMemorySize = 0; diff --git a/bsp/nuvoton/libraries/ma35/UsbHostLib/src/usb_core.c b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/usb_core.c index bd85008f9c..83857a54c7 100644 --- a/bsp/nuvoton/libraries/ma35/UsbHostLib/src/usb_core.c +++ b/bsp/nuvoton/libraries/ma35/UsbHostLib/src/usb_core.c @@ -103,6 +103,7 @@ int usbh_polling_root_hubs(void) int ret, change = 0; #ifdef ENABLE_EHCI0 + //_ehci0->UPSCR[1] = HSUSBH_UPSCR_PP_Msk | HSUSBH_UPSCR_PO_Msk; /* set port 2 owner to OHCI */ do { ret = ehci0_driver.rthub_polling(); @@ -114,6 +115,7 @@ int usbh_polling_root_hubs(void) #endif #ifdef ENABLE_EHCI1 + //_ehci1->UPSCR[1] = HSUSBH_UPSCR_PP_Msk | HSUSBH_UPSCR_PO_Msk; /* set port 2 owner to OHCI */ do { ret = ehci1_driver.rthub_polling(); diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/Kconfig b/bsp/nuvoton/libraries/ma35/rtt_port/Kconfig index 035e80155e..5e830cf9c1 100644 --- a/bsp/nuvoton/libraries/ma35/rtt_port/Kconfig +++ b/bsp/nuvoton/libraries/ma35/rtt_port/Kconfig @@ -5,6 +5,32 @@ select RT_USING_USER_MAIN default y + config BSP_USING_SSPCC + bool + depends on SOC_SERIES_MA35D1 && !USE_MA35D1_SUBM + default y + + config BSP_USING_SSMCC + bool + depends on SOC_SERIES_MA35D1 && !USE_MA35D1_SUBM + default y + + config BSP_USING_UMCTL2 + bool + depends on SOC_SERIES_MA35D1 && !USE_MA35D1_SUBM + default y + + config BSP_USING_RTP + bool + depends on SOC_SERIES_MA35D1 && !USE_MA35D1_SUBM + default y + + if BSP_USING_RTP + config RTP_USING_AT_STARTUP + bool "Enable RTP Executation at startup" + default y + endif + config USE_MA35D1_AARCH32 bool select ARCH_ARM_CORTEX_A @@ -17,6 +43,15 @@ bool select ARCH_ARMV8 + if USE_MA35D1_AARCH64 + config BSP_USING_GIC + bool + default y + config BSP_USING_GICV2 + bool + default y + endif + config USE_MA35D1_SUBM bool select ARCH_ARM_CORTEX_M4 @@ -1098,6 +1133,36 @@ default n endif + config BSP_USING_HWSEM + bool "Enable Hardware semaphore(HWSEM)" + default y + + if BSP_USING_HWSEM + config BSP_USING_HWSEM0 + bool "Enable HWSEM0" + default y + endif + + config BSP_USING_WHC + bool "Enable Wormhole(WHC)" + default y + + if BSP_USING_WHC + config BSP_USING_WHC0 + bool "Enable WHC0" + default y + + config BSP_USING_WHC1 + bool "Enable WHC1" + depends on !USE_MA35D1_SUBM + default n + endif + + config BSP_USING_NFI + bool "Enable Raw NAND flash Interface(NFI)" + depends on !USE_MA35D1_SUBM + default y + config BSP_USING_EBI bool "Enable External Bus Interface(EBI)" default n diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_common.h b/bsp/nuvoton/libraries/ma35/rtt_port/drv_common.h index fc0e3ee187..8eeaea33ef 100644 --- a/bsp/nuvoton/libraries/ma35/rtt_port/drv_common.h +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_common.h @@ -21,7 +21,9 @@ #include "gic.h" #include "mmu.h" -#include "cp15.h" +#if defined(USE_MA35D1_AARCH32) + #include "cp15.h" +#endif #include "gtimer.h" #define __REG32(x) (*((volatile unsigned int*)((rt_ubase_t)x))) @@ -35,21 +37,6 @@ #define DDR_LIMIT_SIZE 0xC0000000u #define UNCACHEABLE 0x40000000u -#define SSPCC_SET_REALM(IP, REALM) \ - do { \ - rt_kprintf("Set %s realm to %s(%d)\n", #IP, #REALM, REALM); \ - SSPCC_SetRealm(IP, REALM); \ - rt_kprintf("Get %s realm is %d ....%s\n", #IP, SSPCC_GetRealm(IP), (SSPCC_GetRealm(IP)==REALM)?"Success":"Failure"); \ - } while(0) - -#define SSPCC_SET_GPIO_REALM(PORT, PIN, REALM) \ - do { \ - rt_kprintf("Set %s%s realm to %s(%d)\n", #PORT, #PIN, #REALM, REALM); \ - SSPCC_SetRealm_GPIO((uint32_t)PORT, PIN, REALM); \ - rt_kprintf("Get %s%s realm is %d ....%s\n", #PORT, #PIN, SSPCC_GetRealm_GPIO((uint32_t)PORT, PIN), (SSPCC_GetRealm_GPIO((uint32_t)PORT, PIN)==REALM)?"Success":"Failure"); \ - } while(0) - - /* the basic constants needed by gic */ rt_inline rt_uint32_t platform_get_gic_dist_base(void) { @@ -72,12 +59,16 @@ rt_inline rt_uint32_t nu_cpu_dcache_line_size(void) return 4 << ((ctr >> 16) & 0xF); } extern void rt_hw_cpu_dcache_clean(void *addr, int size); -extern void rt_hw_cpu_dcache_clean_inv(void *addr, int size); +extern void rt_hw_cpu_dcache_clean_and_invalidate(void *addr, int size); extern void rt_hw_cpu_dcache_invalidate(void *addr, int size); #else #define UNCACHEABLE 0 #endif -void nu_clock_init(void); +#define REGION_ADDR_SRAM0 0x24000000 +#define REGION_ADDR_DDR (0x80020000|UNCACHEABLE) +#define REGION_MAXSIZE_SRAM0 (128*1024) +#define REGION_MAXSIZE_DDR (4*1024*1024-REGION_MAXSIZE_SRAM0) +#define REGION_MAXSIZE_LIMIT (REGION_MAXSIZE_SRAM0+REGION_MAXSIZE_DDR) #endif /* __DRV_COMMON_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_common.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_common_aarch32.c similarity index 51% rename from bsp/nuvoton/libraries/ma35/rtt_port/drv_common.c rename to bsp/nuvoton/libraries/ma35/rtt_port/drv_common_aarch32.c index 644f9d0cd7..16af3a6a5a 100644 --- a/bsp/nuvoton/libraries/ma35/rtt_port/drv_common.c +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_common_aarch32.c @@ -11,21 +11,25 @@ ******************************************************************************/ #include + +#if defined(USE_MA35D1_AARCH32) + #include #include #include "drv_common.h" #include "board.h" #include "drv_uart.h" +#include "drv_sspcc.h" +#include "drv_ssmcc.h" +#include "drv_umctl2.h" #define LOG_TAG "drv.common" -#undef DBG_ENABLE #define DBG_SECTION_NAME LOG_TAG -#define DBG_LEVEL LOG_LVL_DBG +#define DBG_LEVEL LOG_LVL_INFO #define DBG_COLOR #include -#if defined(USE_MA35D1_AARCH32) #define NORMAL_MEM_UNCACHED (SHARED|AP_RW|DOMAIN0|STRONGORDER|DESC_SEC) /* @@ -46,26 +50,23 @@ struct mem_desc platform_mem_desc[] = {0xC0000000, 0xFFFFFFFF, 0x80000000, NORMAL_MEM_UNCACHED} // 1GB DDR, non-cacheable }; const rt_uint32_t platform_mem_desc_size = sizeof(platform_mem_desc) / sizeof(platform_mem_desc[0]); -#endif +/** + * This function will initialize board + */ -static void nu_mmu_initialize(void) -{ -#if defined(USE_MA35D1_AARCH64) - mmu_init(); - /* device memory 0x0000_0000 - 0x3FFF_FFFF */ - armv8_map(0x00000000, 0x00000000, 0x40000000, MEM_ATTR_IO); - /* device memory 0x4000_0000 - 0x7FFF_FFFF */ - armv8_map(0x40000000, 0x40000000, 0x40000000, MEM_ATTR_IO); - /* system memory 0x8000_0000 - 0xFFFF_FFFF */ - armv8_map(0x80000000, 0x80000000, 0x80000000, MEM_ATTR_MEMORY); - mmu_enable(); -#endif -} +rt_mmu_info mmu_info; -#if !defined(USE_MA35D1_SUBM) +extern size_t MMUTable[]; + +extern void nu_clock_dump(void); +extern void nu_clock_raise(void); +extern void nu_clock_init(void); +extern void nu_chipcfg_dump(void); +extern uint32_t nu_chipcfg_ddrsize(void); volatile uint32_t secondary_cpu_entry __attribute__((aligned(32))) = 0; static rt_uint32_t timerStep; + void rt_hw_systick_isr(int vector, void *parameter) { gtimer_set_load_value(timerStep); @@ -83,42 +84,6 @@ int rt_hw_systick_init(void) return 0; } -void nu_sspcc_init(void) -{ - int i, j; - - CLK->APBCLK2 |= CLK_APBCLK2_SSPCCEN_Msk; - /* Set all GPIO security set to TZNS. */ - for (i = 0; i < 16; i++) - { - for (j = 0; j < 14; j++) - { - SSPCC_SetRealm_GPIO(GPIO_BASE + (j * 0x40), i, SSPCC_SSET_TZNS); - } - } -} - -void nu_ssmcc_init(void) -{ - CLK->APBCLK2 |= CLK_APBCLK2_SSMCCEN_Msk; - - /* set region 0 to secure region, non-secure and m4 all can access */ - SSMCC_SetRegion0(SSMCC_SECURE_READ | SSMCC_SECURE_WRITE | SSMCC_NONSECURE_READ | SSMCC_NONSECURE_WRITE | SSMCC_M4NS_READ | SSMCC_M4NS_WRITE); -} - -void nu_ddr_init(void) -{ - UMCTL2->PCTRL_0 = UMCTL2_PCTRL_0_port_en_Msk; //[0x0490] - UMCTL2->PCTRL_1 = UMCTL2_PCTRL_1_port_en_Msk; //[0x0540] - UMCTL2->PCTRL_2 = UMCTL2_PCTRL_2_port_en_Msk; //[0x05f0] - UMCTL2->PCTRL_3 = UMCTL2_PCTRL_3_port_en_Msk; //[0x06a0] - - UMCTL2->PCTRL_4 = UMCTL2_PCTRL_4_port_en_Msk; //[0x0750] - UMCTL2->PCTRL_5 = UMCTL2_PCTRL_5_port_en_Msk; //[0x0800] - UMCTL2->PCTRL_6 = UMCTL2_PCTRL_6_port_en_Msk; //[0x08b0] - UMCTL2->PCTRL_7 = UMCTL2_PCTRL_7_port_en_Msk; //[0x0960] -} - void rt_hw_us_delay(rt_uint32_t us) { rt_uint32_t ticks; @@ -156,154 +121,13 @@ void rt_hw_us_delay(rt_uint32_t us) } } /* rt_hw_us_delay */ -#else - -void SysTick_Handler(void) -{ - /* enter interrupt */ - rt_interrupt_enter(); - - rt_tick_increase(); - - /* leave interrupt */ - rt_interrupt_leave(); -} - -int rt_hw_systick_init(void) -{ - /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */ - SystemCoreClockUpdate(); - - /* Configure SysTick */ - SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND); - - - return 0; -} - -/** - * The time delay function. - * - * @param microseconds. - */ -void rt_hw_us_delay(rt_uint32_t us) -{ - rt_uint32_t ticks; - rt_uint32_t told, tnow, tcnt = 0; - rt_uint32_t reload = SysTick->LOAD; - - ticks = us * reload / (1000000 / RT_TICK_PER_SECOND); - told = SysTick->VAL; - while (1) - { - tnow = SysTick->VAL; - if (tnow != told) - { - if (tnow < told) - { - tcnt += told - tnow; - } - else - { - tcnt += reload - tnow + told; - } - told = tnow; - if (tcnt >= ticks) - { - break; - } - } - } -} - -#endif - - -void devmem(int argc, char *argv[]) -{ - volatile unsigned int u32Addr; - unsigned int value = 0, mode = 0; - - if (argc < 2 || argc > 3) - { - goto exit_devmem; - } - - if (argc == 3) - { - if (sscanf(argv[2], "0x%x", &value) != 1) - goto exit_devmem; - mode = 1; //Write - } - - if (sscanf(argv[1], "0x%x", &u32Addr) != 1) - goto exit_devmem; - else if (u32Addr & (4 - 1)) - goto exit_devmem; - - if (mode) - { - *((volatile uint32_t *)u32Addr) = value; - } - rt_kprintf("0x%08x\n", *((volatile uint32_t *)u32Addr)); - - return; -exit_devmem: - rt_kprintf("Read: devmem \n"); - rt_kprintf("Write: devmem \n"); - return; -} -MSH_CMD_EXPORT(devmem, dump device registers); - -void devmem2(int argc, char *argv[]) -{ - volatile unsigned int u32Addr; - unsigned int value = 0, word_count = 1; - - if (argc < 2 || argc > 3) - { - goto exit_devmem; - } - - if (argc == 3) - { - if (sscanf(argv[2], "%d", &value) != 1) - goto exit_devmem; - word_count = value; - } - - if (sscanf(argv[1], "0x%x", &u32Addr) != 1) - goto exit_devmem; - else if (u32Addr & (4 - 1)) - goto exit_devmem; - - if (word_count > 0) - { - LOG_HEX("devmem", 16, (void *)u32Addr, word_count * sizeof(rt_base_t)); - } - - return; -exit_devmem: - rt_kprintf("devmem2: \n"); - return; -} -MSH_CMD_EXPORT(devmem2, dump device registers); - void idle_wfi(void) { -#if defined(USE_MA35D1_SUBM) - __WFI(); -#else asm volatile("wfi"); -#endif } -extern void nu_clock_dump(void); -extern void nu_clock_raise(void); - rt_weak void nutool_pincfg_init(void) { - } /** @@ -311,10 +135,11 @@ rt_weak void nutool_pincfg_init(void) */ rt_weak void rt_hw_board_init(void) { + uint32_t u32BoardHeapEnd; + /* Unlock protected registers */ SYS_UnlockReg(); -#if !defined(USE_MA35D1_SUBM) /* initialize SSPCC */ nu_sspcc_init(); @@ -322,25 +147,32 @@ rt_weak void rt_hw_board_init(void) nu_ssmcc_init(); /* initialize UMCTL2 */ - nu_ddr_init(); - -#endif + nu_umctl2_init(); /* initialize base clock */ nu_clock_init(); - /* initialize peripheral pin function */ nutool_pincfg_init(); + rt_hw_mmu_map_init(&mmu_info, (void*)0x80000000, 0x10000000, MMUTable, 0); + rt_hw_mmu_ioremap_init(&mmu_info, (void*)0x80000000, 0x10000000); + /* initialize hardware interrupt */ rt_hw_interrupt_init(); - /* initialize MMU */ - nu_mmu_initialize(); - #if defined(RT_USING_HEAP) - rt_system_heap_init((void *)BOARD_HEAP_START, (void *)BOARD_HEAP_END); + if (nu_chipcfg_ddrsize() > 0) + { + /* Get MCP DDR capacity in run-time. */ + u32BoardHeapEnd = 0x80000000 + nu_chipcfg_ddrsize(); + } + else + { + /* Use board.h definition */ + u32BoardHeapEnd = (uint32_t)BOARD_HEAP_END; + } + rt_system_heap_init((void *)BOARD_HEAP_START, (void *)u32BoardHeapEnd); #endif /* initialize uart */ @@ -350,18 +182,7 @@ rt_weak void rt_hw_board_init(void) rt_console_set_device(RT_CONSOLE_DEVICE_NAME); #endif -#if !defined(USE_MA35D1_SUBM) -#if !defined(USE_MA35D1_AARCH64) - //TOFIX nu_clock_raise(); -#endif - nu_clock_dump(); -#endif - -#if defined(RT_USING_HEAP) - /* Dump heap information */ - rt_kprintf("Heap: Begin@%08x, END@%08x, SIZE: %d KiB\n", BOARD_HEAP_START, BOARD_HEAP_END, ((rt_uint32_t)BOARD_HEAP_END - (rt_uint32_t)BOARD_HEAP_START) / 1024); -#endif /* initialize systick */ rt_hw_systick_init(); @@ -371,22 +192,29 @@ rt_weak void rt_hw_board_init(void) rt_components_board_init(); #endif +#if defined(RT_USING_HEAP) + /* Dump heap information */ + LOG_I("Heap: Begin@%08x, END@%08x, SIZE: %d MB", BOARD_HEAP_START, u32BoardHeapEnd, ((rt_uint32_t)u32BoardHeapEnd - (rt_uint32_t)BOARD_HEAP_START) / 1024 / 1024); +#endif + + nu_chipcfg_dump(); + nu_clock_dump(); + #if defined(RT_USING_SMP) /* install IPI handle */ rt_hw_interrupt_set_priority(RT_SCHEDULE_IPI, 16); rt_hw_ipi_handler_install(RT_SCHEDULE_IPI, rt_scheduler_ipi_handler); rt_hw_interrupt_umask(RT_SCHEDULE_IPI); #endif - } #if defined(RT_USING_SMP) -extern void secondary_cpu_start(void); +extern void rt_secondary_cpu_entry(void); void set_secondary_cpu_boot_address(void) { - secondary_cpu_entry = (uint32_t)&secondary_cpu_start; - rt_kprintf("Wake up cpu-1 goto -> 0x%08x\n", secondary_cpu_entry); + secondary_cpu_entry = (uint32_t)&rt_secondary_cpu_entry; + rt_kprintf("Wake up cpu-1 goto -> 0x%08x@0x%08x\n", secondary_cpu_entry, &secondary_cpu_entry); } void rt_hw_secondary_cpu_up(void) @@ -414,7 +242,7 @@ void rt_hw_secondary_cpu_up(void) } } -void secondary_cpu_c_start(void) +void rt_hw_secondary_cpu_bsp_start(void) { rt_kprintf("[%s] cpu-%d\r\n", __func__, rt_hw_cpu_id()); @@ -435,3 +263,5 @@ void rt_hw_secondary_cpu_idle_exec(void) } #endif + +#endif /* #if defined(USE_MA35D1_AARCH32) */ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_common_subm.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_common_subm.c new file mode 100644 index 0000000000..7f3d816bb4 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_common_subm.c @@ -0,0 +1,144 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-07-14 Wayne First version +* +******************************************************************************/ + +#include + +#if defined(USE_MA35D1_SUBM) + +#include +#include + +#include "drv_common.h" +#include "board.h" +#include "drv_uart.h" + +#define LOG_TAG "drv.common" +#undef DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL LOG_LVL_DBG +#define DBG_COLOR +#include + +extern void nu_clock_init(void); + +void SysTick_Handler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + + rt_tick_increase(); + + /* leave interrupt */ + rt_interrupt_leave(); +} + +int rt_hw_systick_init(void) +{ + /* User can use SystemCoreClockUpdate() to calculate SystemCoreClock. */ + SystemCoreClockUpdate(); + + /* Configure SysTick */ + SysTick_Config(SystemCoreClock / RT_TICK_PER_SECOND); + + + return 0; +} + +/** + * The time delay function. + * + * @param microseconds. + */ +void rt_hw_us_delay(rt_uint32_t us) +{ + rt_uint32_t ticks; + rt_uint32_t told, tnow, tcnt = 0; + rt_uint32_t reload = SysTick->LOAD; + + ticks = us * reload / (1000000 / RT_TICK_PER_SECOND); + told = SysTick->VAL; + while (1) + { + tnow = SysTick->VAL; + if (tnow != told) + { + if (tnow < told) + { + tcnt += told - tnow; + } + else + { + tcnt += reload - tnow + told; + } + told = tnow; + if (tcnt >= ticks) + { + break; + } + } + } +} + +void idle_wfi(void) +{ + __WFI(); +} + +rt_weak void nutool_pincfg_init(void) +{ + +} + +/** + * This function will initial board. + */ +rt_weak void rt_hw_board_init(void) +{ + /* Unlock protected registers */ + SYS_UnlockReg(); + + /* initialize base clock */ + nu_clock_init(); + + /* initialize peripheral pin function */ + nutool_pincfg_init(); + + /* initialize hardware interrupt */ + rt_hw_interrupt_init(); + +#if defined(RT_USING_HEAP) + rt_system_heap_init((void *)BOARD_HEAP_START, (void *)BOARD_HEAP_END); +#endif + + /* initialize uart */ + rt_hw_uart_init(); + +#if defined(RT_USING_CONSOLE) + rt_console_set_device(RT_CONSOLE_DEVICE_NAME); +#endif + +#if defined(RT_USING_HEAP) + /* Dump heap information */ + rt_kprintf("Heap: Begin@%08x, END@%08x, SIZE: %d KiB\n", BOARD_HEAP_START, BOARD_HEAP_END, ((rt_uint32_t)BOARD_HEAP_END - (rt_uint32_t)BOARD_HEAP_START) / 1024); +#endif + + /* initialize systick */ + rt_hw_systick_init(); + rt_thread_idle_sethook(idle_wfi); + +#if defined(RT_USING_COMPONENTS_INIT) + rt_components_board_init(); +#endif + +} + +#endif diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_disp.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_disp.c index ef620165cf..8834c0ef55 100644 --- a/bsp/nuvoton/libraries/ma35/rtt_port/drv_disp.c +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_disp.c @@ -53,6 +53,10 @@ typedef struct nu_disp *nu_disp_t; static volatile uint32_t g_u32VSyncBlank = 0; static struct rt_completion vsync_wq; +#if defined(DISP_USING_OVERLAY) +static rt_mutex_t disp_lock; +#endif + static struct nu_disp nu_fbdev[eLayer_Cnt] = { { @@ -69,9 +73,9 @@ static struct nu_disp nu_fbdev[eLayer_Cnt] = #endif }; -rt_weak void nu_lcd_backlight_on(void) { } +RT_WEAK void nu_lcd_backlight_on(void) { } -rt_weak void nu_lcd_backlight_off(void) { } +RT_WEAK void nu_lcd_backlight_off(void) { } static void nu_disp_isr(int vector, void *param) { @@ -88,6 +92,10 @@ static rt_err_t disp_layer_open(rt_device_t dev, rt_uint16_t oflag) nu_disp_t psDisp = (nu_disp_t)dev; RT_ASSERT(psDisp != RT_NULL); +#if defined(DISP_USING_OVERLAY) + rt_mutex_take(disp_lock, RT_WAITING_FOREVER); +#endif + psDisp->ref_count++; #if defined(DISP_USING_OVERLAY) @@ -112,6 +120,10 @@ static rt_err_t disp_layer_open(rt_device_t dev, rt_uint16_t oflag) } #endif +#if defined(DISP_USING_OVERLAY) + rt_mutex_release(disp_lock); +#endif + return RT_EOK; } @@ -120,6 +132,10 @@ static rt_err_t disp_layer_close(rt_device_t dev) nu_disp_t psDisp = (nu_disp_t)dev; RT_ASSERT(psDisp != RT_NULL); +#if defined(DISP_USING_OVERLAY) + rt_mutex_take(disp_lock, RT_WAITING_FOREVER); +#endif + psDisp->ref_count--; #if defined(DISP_USING_OVERLAY) @@ -140,6 +156,10 @@ static rt_err_t disp_layer_close(rt_device_t dev) DISP_Trigger(eLayer_Video, 0); } +#if defined(DISP_USING_OVERLAY) + rt_mutex_release(disp_lock); +#endif + return RT_EOK; } @@ -208,8 +228,6 @@ static rt_err_t disp_layer_control(rt_device_t dev, int cmd, void *args) /* Initial LCD */ DISP_SetFBFmt(psDisp->layer, eFBFmt, psDisp->info.pitch); - - } break; @@ -243,7 +261,7 @@ static rt_err_t disp_layer_control(rt_device_t dev, int cmd, void *args) if (psDisp->last_commit >= g_u32VSyncBlank) { rt_completion_init(&vsync_wq); - rt_completion_wait(&vsync_wq, RT_TICK_PER_SECOND / 60); + rt_completion_wait(&vsync_wq, RT_TICK_PER_SECOND / DISP_LCDTIMING_GetFPS(RT_NULL)); } } break; @@ -331,12 +349,20 @@ int rt_hw_disp_init(void) rt_kprintf("%s's fbdev video memory at 0x%08x.\n", psDisp->name, psDisp->info.framebuffer); } +#if defined(DISP_USING_OVERLAY) + /* Initial display lock */ + disp_lock = rt_mutex_create("displock", RT_IPC_FLAG_FIFO); + RT_ASSERT(disp_lock); +#endif + /* Register ISR */ rt_hw_interrupt_install(DISP_IRQn, nu_disp_isr, RT_NULL, "DISP"); /* Enable interrupt. */ rt_hw_interrupt_umask(DISP_IRQn); + rt_kprintf("LCD panel timing is %d FPS.\n", DISP_LCDTIMING_GetFPS(&psDispLcdInstance->sLcdTiming)); + return (int)ret; } INIT_DEVICE_EXPORT(rt_hw_disp_init); diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_hwsem.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_hwsem.c new file mode 100644 index 0000000000..6aadc342be --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_hwsem.c @@ -0,0 +1,310 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2022-10-5 Wayne First version +* +******************************************************************************/ + +#include + +#if defined(BSP_USING_HWSEM) + +#include +#include "drv_hwsem.h" +#include "drv_sys.h" +#include "drv_common.h" +#include "nu_bitutil.h" + +/* Private define ---------------------------------------------------------------*/ +enum +{ + HWSEM_START = -1, +#if defined(BSP_USING_HWSEM0) + HWSEM0_IDX, +#endif + HWSEM_END +}; + +/* Private typedef --------------------------------------------------------------*/ + +struct nu_mutex_priv +{ + struct nu_mutex parent; + + rt_thread_t owner; + uint8_t key; + uint8_t hold; + struct rt_completion completion; + void *user_data; +}; +typedef struct nu_mutex_priv *nu_mutex_priv_t; + +struct nu_hwsem +{ + struct rt_device dev; + char *name; + HWSEM_T *base; + IRQn_Type irqn; + uint32_t rstidx; + + struct nu_mutex_priv mutex[evHWSEM_CNT]; +}; +typedef struct nu_hwsem *nu_hwsem_t; + +static struct nu_hwsem nu_hwsem_arr [] = +{ +#if defined(BSP_USING_HWSEM0) + { + .name = "hwsem0", + .base = HWSEM0, + .irqn = HWSEM0_IRQn, + .rstidx = HWSEM0_RST, + }, +#endif +}; /* nu_hwsem */ + +/** + * All HWSEM interrupt service routine + */ +static void nu_hwsem_isr(int vector, void *param) +{ + nu_hwsem_t psNuHwSem = (nu_hwsem_t)param; + rt_int32_t irqidx; + + volatile uint32_t vu32Intsts = psNuHwSem->base->INTSTS_CORE; + + while ((irqidx = nu_ctz(vu32Intsts)) < evHWSEM_CNT) + { + nu_mutex_priv_t priv = (nu_mutex_priv_t)&psNuHwSem->mutex[irqidx]; + uint32_t u32IsrBitMask = 1 << irqidx ; + + HWSEM_CLR_INT_FLAG(psNuHwSem->base, irqidx); + + /* Unlocked, Signal waiter. */ + rt_completion_done(&priv->completion); + + /* Clear sent bit */ + vu32Intsts &= ~(u32IsrBitMask); + } +} + +nu_mutex_t nu_mutex_init(struct rt_device *device, E_HWSEM_ID id) +{ + if (id < evHWSEM_CNT) + { + nu_hwsem_t psNuHwSem = (nu_hwsem_t)device->user_data; + nu_mutex_t mutex = (nu_mutex_t)&psNuHwSem->mutex[id]; + nu_mutex_priv_t priv = (nu_mutex_priv_t)mutex; + + if (!priv->owner) + { + priv->owner = rt_thread_self(); + } + else + { + goto exit_nu_mutex_init; + } + + return mutex; + } + +exit_nu_mutex_init: + + return RT_NULL; +} + +void nu_mutex_deinit(struct rt_device *device, E_HWSEM_ID id) +{ + if (id < evHWSEM_CNT) + { + nu_hwsem_t psNuHwSem = (nu_hwsem_t)device->user_data; + nu_mutex_t mutex = (nu_mutex_t)&psNuHwSem->mutex[id]; + nu_mutex_priv_t priv = (nu_mutex_priv_t)mutex; + + if (priv->owner == rt_thread_self()) + { + priv->owner = RT_NULL; + } + + } + +} + +rt_err_t nu_mutex_take(nu_mutex_t mutex, rt_int32_t timeout) +{ + rt_err_t ret = RT_EOK; + nu_mutex_priv_t priv = (nu_mutex_priv_t)mutex; + nu_hwsem_t dev = (nu_hwsem_t)priv->user_data; + + uint8_t u8PrivKey = priv->key; + +#ifdef RT_USING_SMP + u8PrivKey |= (rt_hw_cpu_id() << 6); +#endif /* RT_USING_SMP */ + + if (priv->owner != rt_thread_self()) + { + return -RT_ERROR; + } + + rt_completion_init(&priv->completion); + + while (1) + { + if (HWSEM_IS_LOCKED(dev->base, mutex->id) != HWSEM_NOLOCK) + { + /* LOCKED */ + if (HWSEM_GET_KEY(dev->base, mutex->id) != u8PrivKey) + { + /* Enable interrupt */ + HWSEM_ENABLE_INT(dev->base, mutex->id); + + /* owner is NOT me. */ + if (rt_completion_wait(&priv->completion, timeout) != RT_EOK) + { + ret = -RT_EBUSY; + break; + } + else + { + /* Got notification, do lock. */ + } + } + else + { + /* owner is me. */ + priv->hold++; + break; + } + } + else + { + /* NOLOCK, To lock */ + HWSEM_LOCK(dev->base, mutex->id, u8PrivKey); + if (HWSEM_GET_KEY(dev->base, mutex->id) == u8PrivKey) + { + /* owner is me. */ + priv->hold = 1; + + /* Disable interrupt */ + HWSEM_DISABLE_INT(dev->base, mutex->id); + + break; + } + else + { + /* Failed to lock, owner is not me. wait notification. */ + } + } + + } //while(1) + + return ret; +} +RTM_EXPORT(nu_mutex_take); + +rt_err_t nu_mutex_release(nu_mutex_t mutex) +{ + rt_err_t ret = RT_EOK; + nu_mutex_priv_t priv = (nu_mutex_priv_t)mutex; + nu_hwsem_t dev = (nu_hwsem_t)priv->user_data; + + uint8_t u8PrivKey = priv->key; + + if (priv->owner != rt_thread_self()) + { + return -RT_ERROR; + } + +#ifdef RT_USING_SMP + u8PrivKey |= (rt_hw_cpu_id() << 6); +#endif /* RT_USING_SMP */ + + if (HWSEM_IS_LOCKED(dev->base, mutex->id) != 0 && + HWSEM_GET_KEY(dev->base, mutex->id) == u8PrivKey) + { + priv->hold--; + if (priv->hold == 0) + { + /* Unlocked */ + HWSEM_UNLOCK(dev->base, mutex->id, u8PrivKey); + } + } + else + { + ret = -RT_ERROR; + } + + return ret; +} +RTM_EXPORT(nu_mutex_release); + +static rt_err_t hwsem_register(struct rt_device *device, const char *name, void *user_data) +{ + RT_ASSERT(device); + + device->type = RT_Device_Class_Miscellaneous; + device->rx_indicate = RT_NULL; + device->tx_complete = RT_NULL; + +#ifdef RT_USING_DEVICE_OPS + device->ops = RT_NULL; +#else + device->init = RT_NULL; + device->open = RT_NULL; + device->close = RT_NULL; + device->read = RT_NULL; + device->write = RT_NULL; + device->control = RT_NULL; +#endif + device->user_data = user_data; + + return rt_device_register(device, name, RT_DEVICE_FLAG_RDONLY | RT_DEVICE_FLAG_STANDALONE); +} + +/** + * Hardware Sem Initialization + */ +int rt_hw_hwsem_init(void) +{ + int i, j; + rt_err_t ret = RT_EOK; + + for (i = (HWSEM_START + 1); i < HWSEM_END; i++) + { +#if !defined(USE_MA35D1_SUBM) + /* Reset this module */ + nu_sys_ip_reset(nu_hwsem_arr[i].rstidx); +#endif + for (j = 0; j < evHWSEM_CNT; j++) + { + nu_hwsem_arr[i].mutex[j].parent.id = (E_HWSEM_ID)j; + nu_hwsem_arr[i].mutex[j].user_data = (void *)&nu_hwsem_arr[i]; + nu_hwsem_arr[i].mutex[j].key = (HWSEM_LOCK_BY_OWNER << 4) | j; // CoreID + SemID + nu_hwsem_arr[i].mutex[j].hold = 0; + nu_hwsem_arr[i].mutex[j].owner = RT_NULL; + + if (HWSEM_IS_LOCKED(nu_hwsem_arr[i].base, j) == HWSEM_LOCK_BY_OWNER) + HWSEM_UNLOCK(nu_hwsem_arr[i].base, j, nu_hwsem_arr[i].mutex[j].key); + + /* Disable interrupt */ + HWSEM_DISABLE_INT(nu_hwsem_arr[i].base, j); + } + + rt_hw_interrupt_install(nu_hwsem_arr[i].irqn, nu_hwsem_isr, &nu_hwsem_arr[i], nu_hwsem_arr[i].name); + rt_hw_interrupt_umask(nu_hwsem_arr[i].irqn); + + ret = hwsem_register(&nu_hwsem_arr[i].dev, (const char *)nu_hwsem_arr[i].name, (void *)&nu_hwsem_arr[i]); + RT_ASSERT(ret == RT_EOK); + } + + return 0; +} +INIT_BOARD_EXPORT(rt_hw_hwsem_init); + +#endif //#if defined(BSP_USING_UART) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_hwsem.h b/bsp/nuvoton/libraries/ma35/rtt_port/drv_hwsem.h new file mode 100644 index 0000000000..516b93fcd4 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_hwsem.h @@ -0,0 +1,43 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2022-10-5 Wayne First version +* +******************************************************************************/ + +#ifndef __DRV_HWSEM_H__ +#define __DRV_HWSEM_H__ + +#include + +typedef enum +{ + evHWSEM0 = 0, + evHWSEM1, + evHWSEM2, + evHWSEM3, + evHWSEM4, + evHWSEM5, + evHWSEM6, + evHWSEM7, + evHWSEM_CNT, +} E_HWSEM_ID; + +struct nu_mutex +{ + E_HWSEM_ID id; +}; +typedef struct nu_mutex *nu_mutex_t; + +nu_mutex_t nu_mutex_init(struct rt_device *device, E_HWSEM_ID id); +rt_err_t nu_mutex_take(nu_mutex_t mutex, rt_int32_t timeout); +rt_err_t nu_mutex_release(nu_mutex_t mutex); +void nu_mutex_deinit(struct rt_device *device, E_HWSEM_ID id); + + +#endif /* __DRV_HWSEM_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_pdma.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_pdma.c index 1c015ef704..a46cf355bf 100644 --- a/bsp/nuvoton/libraries/ma35/rtt_port/drv_pdma.c +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_pdma.c @@ -328,22 +328,6 @@ static inline void nu_pdma_channel_reset(int i32ChannID) while ((PDMA->CHCTL & (1 << u32ModChannId))); } -void nu_pdma_channel_terminate(int i32ChannID) -{ - if (nu_pdma_check_is_nonallocated(i32ChannID)) - goto exit_pdma_channel_terminate; - - /* Reset specified channel. */ - nu_pdma_channel_reset(i32ChannID); - - /* Enable specified channel after reset. */ - nu_pdma_channel_enable(i32ChannID); - -exit_pdma_channel_terminate: - - return; -} - static rt_err_t nu_pdma_timeout_set(int i32ChannID, int i32Timeout_us) { rt_err_t ret = RT_EINVAL; @@ -396,6 +380,25 @@ exit_nu_pdma_timeout_set: return -(ret); } +void nu_pdma_channel_terminate(int i32ChannID) +{ + if (nu_pdma_check_is_nonallocated(i32ChannID)) + goto exit_pdma_channel_terminate; + + /* Disable timeout function of specified channel. */ + nu_pdma_timeout_set(i32ChannID, 0); + + /* Reset specified channel. */ + nu_pdma_channel_reset(i32ChannID); + + /* Enable specified channel after reset. */ + nu_pdma_channel_enable(i32ChannID); + +exit_pdma_channel_terminate: + + return; +} + int nu_pdma_channel_allocate(int32_t i32PeripType) { int ChnId, i32PeripCtlIdx, j; @@ -595,6 +598,22 @@ exit_nu_pdma_transferred_byte_get: return -1; } +nu_pdma_desc_t nu_pdma_get_channel_desc(int32_t i32ChannID) +{ + PDMA_T *PDMA; + + if (nu_pdma_check_is_nonallocated(i32ChannID)) + goto exit_nu_pdma_get_srcaddr; + + PDMA = NU_PDMA_GET_BASE(i32ChannID); + + return &PDMA->DSCT[NU_PDMA_GET_MOD_CHIDX(i32ChannID)]; + +exit_nu_pdma_get_srcaddr: + + return RT_NULL; +} + nu_pdma_memctrl_t nu_pdma_channel_memctrl_get(int i32ChannID) { nu_pdma_memctrl_t eMemCtrl = eMemCtl_Undefined; @@ -727,31 +746,31 @@ exit_nu_pdma_desc_setup: rt_err_t nu_pdma_sgtbls_allocate(nu_pdma_desc_t *ppsSgtbls, int num) { int i; - nu_pdma_desc_t psSgTblHead; RT_ASSERT(ppsSgtbls != NULL); RT_ASSERT(num > 0); - psSgTblHead = (nu_pdma_desc_t) rt_malloc_align(RT_ALIGN(sizeof(DSCT_T) * num, 64), 64); - RT_ASSERT(psSgTblHead != RT_NULL); - - rt_memset((void *)psSgTblHead, 0, sizeof(DSCT_T) * num); - for (i = 0; i < num; i++) - ppsSgtbls[i] = &psSgTblHead[i]; + { + ppsSgtbls[i] = (nu_pdma_desc_t) rt_malloc_align(RT_ALIGN(sizeof(DSCT_T), 64), 64); + RT_ASSERT(ppsSgtbls[i] != RT_NULL); + rt_memset((void *)ppsSgtbls[i], 0, RT_ALIGN(sizeof(DSCT_T), 64)); + } return RT_EOK; } void nu_pdma_sgtbls_free(nu_pdma_desc_t *ppsSgtbls, int num) { - nu_pdma_desc_t psSgTblHead; + int i; RT_ASSERT(ppsSgtbls != NULL); - psSgTblHead = *ppsSgtbls; - RT_ASSERT(psSgTblHead != NULL); + RT_ASSERT(num > 0); - rt_free_align(psSgTblHead); + for (i = 0; i < num; i++) + { + rt_free_align(ppsSgtbls[i]); + } } static void _nu_pdma_transfer(int i32ChannID, uint32_t u32Peripheral, nu_pdma_desc_t head, uint32_t u32IdleTimeout_us) @@ -781,18 +800,20 @@ static void _nu_pdma_transfer(int i32ChannID, uint32_t u32Peripheral, nu_pdma_de rt_kprintf("[%s] u32SrcCtl=0x%08x\n", __func__, u32SrcCtl); rt_kprintf("[%s] u32DstCtl=0x%08x\n", __func__, u32DstCtl); rt_kprintf("[%s] u32FlushLen=%d\n", __func__, u32FlushLen); + rt_kprintf("[%s] DA=%08x\n", __func__, next->DA); + rt_kprintf("[%s] SA=%08x\n", __func__, next->SA); #endif /* Flush Src buffer into memory. */ if ((u32SrcCtl == PDMA_SAR_INC)) // for M2P, M2M - rt_hw_cpu_dcache_clean_inv((void *)next->SA, u32FlushLen); + rt_hw_cpu_dcache_clean_and_invalidate((void *)next->SA, u32FlushLen); /* Flush Dst buffer into memory. */ if ((u32DstCtl == PDMA_DAR_INC)) // for P2M, M2M - rt_hw_cpu_dcache_clean_inv((void *)next->DA, u32FlushLen); + rt_hw_cpu_dcache_clean_and_invalidate((void *)next->DA, u32FlushLen); /* Flush descriptor into memory */ - rt_hw_cpu_dcache_clean_inv((void *)next, sizeof(DSCT_T)); + rt_hw_cpu_dcache_clean_and_invalidate((void *)next, sizeof(DSCT_T)); if (bNonCacheAlignedWarning) { @@ -806,7 +827,7 @@ static void _nu_pdma_transfer(int i32ChannID, uint32_t u32Peripheral, nu_pdma_de Source, destination, DMA descriptor address and length should be aligned at len(CACHE_LINE_SIZE) */ bNonCacheAlignedWarning = 0; - rt_kprintf("[PDMA-W]\n"); + //rt_kprintf("[PDMA-W]\n"); } } @@ -817,19 +838,29 @@ static void _nu_pdma_transfer(int i32ChannID, uint32_t u32Peripheral, nu_pdma_de } #endif + nu_pdma_desc_t psDesc = nu_pdma_get_channel_desc(i32ChannID); + PDMA_DisableTimeout(PDMA, 1 << NU_PDMA_GET_MOD_CHIDX(i32ChannID)); - PDMA_EnableInt(PDMA, NU_PDMA_GET_MOD_CHIDX(i32ChannID), PDMA_INT_TRANS_DONE); - - nu_pdma_timeout_set(i32ChannID, u32IdleTimeout_us); - /* Set scatter-gather mode and head */ /* Take care the head structure, you should make sure cache-coherence. */ PDMA_SetTransferMode(PDMA, - NU_PDMA_GET_MOD_CHIDX(i32ChannID), - u32Peripheral, - (head->NEXT != 0) ? 1 : 0, - (uint32_t)head); + NU_PDMA_GET_MOD_CHIDX(i32ChannID), + u32Peripheral, + (head->NEXT != 0) ? 1 : 0, + (uint32_t)head); + + /* PDMA fetchs description on-demand if SG enabled. We check it valid in here. */ + if ( (u32Peripheral != PDMA_MEM) && + (head->NEXT != 0) && + (head->DA != psDesc->DA) ) + { + RT_ASSERT(0); + } + + PDMA_EnableInt(PDMA, NU_PDMA_GET_MOD_CHIDX(i32ChannID), PDMA_INT_TRANS_DONE); + + nu_pdma_timeout_set(i32ChannID, u32IdleTimeout_us); /* If peripheral is M2M, trigger it. */ if (u32Peripheral == PDMA_MEM) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_pdma.h b/bsp/nuvoton/libraries/ma35/rtt_port/drv_pdma.h index 1267dcb9fa..09aafaf77e 100644 --- a/bsp/nuvoton/libraries/ma35/rtt_port/drv_pdma.h +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_pdma.h @@ -73,6 +73,7 @@ rt_err_t nu_pdma_channel_memctrl_set(int i32ChannID, nu_pdma_memctrl_t eMemCtrl) nu_pdma_cb_handler_t nu_pdma_callback_hijack(int i32ChannID, nu_pdma_cbtype_t eCBType, nu_pdma_chn_cb_t psChnCb_Hijack); rt_err_t nu_pdma_filtering_set(int i32ChannID, uint32_t u32EventFilter); uint32_t nu_pdma_filtering_get(int i32ChannID); +nu_pdma_desc_t nu_pdma_get_channel_desc(int32_t i32ChannID); // For scatter-gather DMA rt_err_t nu_pdma_desc_setup(int i32ChannID, nu_pdma_desc_t dma_desc, uint32_t u32DataWidth, uint32_t u32AddrSrc, uint32_t u32AddrDst, int32_t TransferCnt, nu_pdma_desc_t next, uint32_t u32BeSilent); diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_qspi.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_qspi.c index a81632284e..0ae777a6c0 100644 --- a/bsp/nuvoton/libraries/ma35/rtt_port/drv_qspi.c +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_qspi.c @@ -402,7 +402,7 @@ static int rt_hw_qspi_init(void) return 0; } -INIT_DEVICE_EXPORT(rt_hw_qspi_init); +INIT_PREV_EXPORT(rt_hw_qspi_init); rt_err_t nu_qspi_bus_attach_device(const char *bus_name, const char *device_name, rt_uint8_t data_line_width, void (*enter_qspi_mode)(), void (*exit_qspi_mode)()) { diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_rtp.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_rtp.c index 4e4f79e407..09759b2c99 100644 --- a/bsp/nuvoton/libraries/ma35/rtt_port/drv_rtp.c +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_rtp.c @@ -11,12 +11,11 @@ #include -#if !defined(USE_MA35D1_SUBM) +#if defined(BSP_USING_RTP) && defined(RT_USING_DFS) #define LOG_TAG "drv.rtp" -#undef DBG_ENABLE #define DBG_SECTION_NAME LOG_TAG -#define DBG_LEVEL LOG_LVL_DBG +#define DBG_LEVEL LOG_LVL_INFO #define DBG_COLOR #include @@ -28,17 +27,12 @@ #include #include -#define RTP_USING_AT_STARTUP +#include "drv_sspcc.h" /* Link to rtthread.bin in ma35-rtp folder. */ #define PATH_RTP_INCBIN "..//ma35-rtp//rtthread.bin" #define READ_BLOCK_SIZE 128 -#define REGION_ADDR_SRAM0 0x24000000 -#define REGION_ADDR_DDR (0x80020000|UNCACHEABLE) -#define REGION_MAXSIZE_SRAM0 (128*1024) -#define REGION_MAXSIZE_DDR (4*1024*1024-REGION_MAXSIZE_SRAM0) -#define REGION_MAXSIZE_LIMIT (REGION_MAXSIZE_SRAM0+REGION_MAXSIZE_DDR) #if !defined(PATH_RTP_FW_FILE) #define PATH_RTP_FW_FILE "/mnt/sd1p0/rtp.bin" @@ -106,7 +100,7 @@ exit_nu_rtp_load_from_memory: } #endif -rt_weak void nu_rtp_sspcc_setup(void) +RT_WEAK void nu_rtp_sspcc_setup(void) { SSPCC_SET_REALM(SSPCC_UART16, SSPCC_SSET_SUBM); @@ -216,7 +210,7 @@ int nu_rtp_load_run(int argc, char *argv[]) if (!szFilePath || nu_rtp_load_from_file(szFilePath) < 0) return -1; - rt_kprintf("Loaded %s, then run...\n", szFilePath); + LOG_I("Loaded %s, then run...", szFilePath); nu_rtp_start(); @@ -227,11 +221,11 @@ MSH_CMD_EXPORT(nu_rtp_load_run, load rtp code then run); int rt_hw_rtp_init(void) { - int fw_size; - - fw_size = (int)((char *)&incbin_rtp_end - (char *)&incbin_rtp_start); - rt_kprintf("INCBIN RTP Start = %p\n", &incbin_rtp_start); - rt_kprintf("INCBIN RTP Size = %p\n", fw_size); +#if defined(RTP_USING_AT_STARTUP) + int fw_size = (int)((char *)&incbin_rtp_end - (char *)&incbin_rtp_start); + LOG_I("INCBIN RTP Start = %p", &incbin_rtp_start); + LOG_I("INCBIN RTP Size = %p", fw_size); +#endif /* Enable RTP and reset M4 reset */ nu_rtp_init(); @@ -247,4 +241,4 @@ int rt_hw_rtp_init(void) } INIT_BOARD_EXPORT(rt_hw_rtp_init); -#endif //#if defined(USE_MA35D1_SUBM) +#endif //#if defined(BSP_USING_RTP) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_sdio.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_sdio.c index 027ecdc512..3a58433839 100644 --- a/bsp/nuvoton/libraries/ma35/rtt_port/drv_sdio.c +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_sdio.c @@ -59,12 +59,12 @@ typedef struct nu_sdh *nu_sdh_t; /* Private variables ------------------------------------------------------------*/ #if defined(BSP_USING_SDH0) - rt_align(SDH_ALIGN_LEN) + ALIGN(SDH_ALIGN_LEN) static uint8_t g_au8CacheBuf_SDH0[SDH_BUFF_SIZE]; #endif #if defined(BSP_USING_SDH1) - rt_align(SDH_ALIGN_LEN) + ALIGN(SDH_ALIGN_LEN) static uint8_t g_au8CacheBuf_SDH1[SDH_BUFF_SIZE]; #endif @@ -481,7 +481,7 @@ static void nu_sdh_request(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req) } } - rt_hw_cpu_dcache_clean_inv((void *)data.dest, size); + rt_hw_cpu_dcache_clean_and_invalidate((void *)data.dest, size); req->cmd->err = nu_sdh_send_command(sdh->base, &cmd, &data); rt_hw_cpu_dcache_invalidate((void *)data.dest, size); @@ -766,7 +766,7 @@ void nu_sdh_host_initial(nu_sdh_t sdh) nu_sdh_irq_update(host, 1); /* ready to change */ - mmcsd_change(host); + //mmcsd_change(host); } void nu_sd_attach(void) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_ssmcc.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_ssmcc.c new file mode 100644 index 0000000000..db66c5b534 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_ssmcc.c @@ -0,0 +1,29 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2022-10-20 Wayne First version +* +******************************************************************************/ + +#include "rtthread.h" + +#if defined(BSP_USING_SSMCC) + +#include "drv_common.h" + +rt_err_t nu_ssmcc_init(void) +{ + CLK->APBCLK2 |= CLK_APBCLK2_SSMCCEN_Msk; + + /* set region 0 to secure region, non-secure and m4 all can access */ + SSMCC_SetRegion0(SSMCC_SECURE_READ | SSMCC_SECURE_WRITE | SSMCC_NONSECURE_READ | SSMCC_NONSECURE_WRITE | SSMCC_M4NS_READ | SSMCC_M4NS_WRITE); + + return RT_EOK; +} + +#endif //#if defined(BSP_USING_SSMCC) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_ssmcc.h b/bsp/nuvoton/libraries/ma35/rtt_port/drv_ssmcc.h new file mode 100644 index 0000000000..2437d070fd --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_ssmcc.h @@ -0,0 +1,18 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2022-10-20 Wayne First version +* +******************************************************************************/ + +#ifndef __DRV_SSMCC_H__ +#define __DRV_SSMCC_H__ + +rt_err_t nu_ssmcc_init(void); + +#endif /* __DRV_SSMCC_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_sspcc.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_sspcc.c new file mode 100644 index 0000000000..9b4bc52fdb --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_sspcc.c @@ -0,0 +1,41 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2022-10-20 Wayne First version +* +******************************************************************************/ + +#include "rtthread.h" + +#if defined(BSP_USING_SSPCC) + +#include "drv_common.h" + +rt_err_t nu_sspcc_init(void) +{ + int i, j; + + /* Enable SSPCC clock. */ + CLK->APBCLK2 |= CLK_APBCLK2_SSPCCEN_Msk; + + /* Assign all SRAM1 capacity to TZNS. */ + SSPCC->SRAMSB = 0; + + /* Set all GPIO security set to TZNS. */ + for (i = 0; i < 16; i++) + { + for (j = 0; j < 14; j++) + { + SSPCC_SetRealm_GPIO(GPIO_BASE + (j * 0x40), i, SSPCC_SSET_TZNS); + } + } + + return RT_EOK; +} + +#endif //#if defined(BSP_USING_SSPCC) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_sspcc.h b/bsp/nuvoton/libraries/ma35/rtt_port/drv_sspcc.h new file mode 100644 index 0000000000..1d524d68df --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_sspcc.h @@ -0,0 +1,34 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2022-10-20 Wayne First version +* +******************************************************************************/ + +#ifndef __DRV_SSPCC_H__ +#define __DRV_SSPCC_H__ + +#include "rtthread.h" + +#define SSPCC_SET_REALM(IP, REALM) \ + do { \ + rt_kprintf("Set %s realm to %s(%d)\n", #IP, #REALM, REALM); \ + SSPCC_SetRealm(IP, REALM); \ + rt_kprintf("Get %s realm is %d ....%s\n", #IP, SSPCC_GetRealm(IP), (SSPCC_GetRealm(IP)==REALM)?"Success":"Failure"); \ + } while(0) + +#define SSPCC_SET_GPIO_REALM(PORT, PIN, REALM) \ + do { \ + rt_kprintf("Set %s%s realm to %s(%d)\n", #PORT, #PIN, #REALM, REALM); \ + SSPCC_SetRealm_GPIO((uint32_t)PORT, PIN, REALM); \ + rt_kprintf("Get %s%s realm is %d ....%s\n", #PORT, #PIN, SSPCC_GetRealm_GPIO((uint32_t)PORT, PIN), (SSPCC_GetRealm_GPIO((uint32_t)PORT, PIN)==REALM)?"Success":"Failure"); \ + } while(0) + +rt_err_t nu_sspcc_init(void); + +#endif /* __DRV_SSPCC_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_sys.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_sys.c index cbf15c750e..d88df6677e 100644 --- a/bsp/nuvoton/libraries/ma35/rtt_port/drv_sys.c +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_sys.c @@ -15,6 +15,13 @@ #include "drv_sys.h" #include +#define LOG_TAG "drv.sys" +#undef DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL LOG_LVL_DBG +#define DBG_COLOR +#include + #define DEF_RAISING_CPU_FREQUENCY //Dont enable #define DEF_RAISING_CPU_VOLTAGE @@ -80,14 +87,14 @@ void nu_sys_check_register(S_NU_REG *psNuReg) { vu32 vc32RegValue = *((vu32 *)psNuReg->vu32RegAddr); vu32 vc32BMValue = vc32RegValue & psNuReg->vu32BitMask; - rt_kprintf("[%3s] %32s(0x%08x) %24s(0x%08x): 0x%08x(AndBitMask:0x%08x)\n", - (psNuReg->vu32Value == vc32BMValue) ? "Ok" : "!OK", - psNuReg->szVName, - psNuReg->vu32Value, - psNuReg->szRegName, - psNuReg->vu32RegAddr, - vc32RegValue, - vc32BMValue); + LOG_I("[%3s] %32s(0x%08x) %24s(0x%08x): 0x%08x(AndBitMask:0x%08x)\n", + (psNuReg->vu32Value == vc32BMValue) ? "Ok" : "!OK", + psNuReg->szVName, + psNuReg->vu32Value, + psNuReg->szRegName, + psNuReg->vu32RegAddr, + vc32RegValue, + vc32BMValue); psNuReg++; } } @@ -122,7 +129,7 @@ static int nu_tempsen_get_value() count = 0; temp = (double)((SYS->TSENSRFCR & 0x0FFF0000) >> 16) * 274.3531 / 4096.0 - 93.3332; snprintf(sztmp, sizeof(sztmp), "Temperature: %.1f\n", temp); - rt_kprintf("%s", sztmp); + LOG_I("%s", sztmp); } // Clear Valid bit @@ -142,7 +149,7 @@ static int nu_tempsen_go(void) if (err != RT_EOK) { - rt_kprintf("set %s idle hook failed!\n", __func__); + LOG_E("set %s idle hook failed!\n", __func__); return -1; } @@ -153,32 +160,51 @@ static int nu_tempsen_go(void) //INIT_APP_EXPORT(nu_tempsen_go); MSH_CMD_EXPORT(nu_tempsen_go, go tempsen); -void nu_clock_dump(void) +#define REG_SYS_CHIPCFG (SYS_BASE + 0x1F4) + +uint32_t nu_chipcfg_ddrsize(void) { - rt_kprintf("HXT: %d Hz\n", CLK_GetHXTFreq()); - rt_kprintf("LXT: %d Hz\n", CLK_GetLXTFreq()); - rt_kprintf("CAPLL: %d Hz(OpMode=%d)\n", CLK_GetPLLClockFreq(CAPLL), CLK_GetPLLOpMode(CAPLL)); - rt_kprintf("DDRPLL: %d Hz(OpMode=%d)\n", CLK_GetPLLClockFreq(DDRPLL), CLK_GetPLLOpMode(DDRPLL)); - rt_kprintf("APLL: %d Hz(OpMode=%d)\n", CLK_GetPLLClockFreq(APLL), CLK_GetPLLOpMode(APLL)); - rt_kprintf("EPLL: %d Hz(OpMode=%d)\n", CLK_GetPLLClockFreq(EPLL), CLK_GetPLLOpMode(EPLL)); - rt_kprintf("VPLL: %d Hz(OpMode=%d)\n", CLK_GetPLLClockFreq(VPLL), CLK_GetPLLOpMode(VPLL)); + uint32_t u32ChipCfg = *((vu32 *)REG_SYS_CHIPCFG); - rt_kprintf("M4-CPU: %d Hz\n", CLK_GetCPUFreq()); - - rt_kprintf("SYSCLK0: %d Hz\n", CLK_GetSYSCLK0Freq()); - rt_kprintf("SYSCLK1: %d Hz\n", CLK_GetSYSCLK1Freq()); - rt_kprintf("HCLK0: %d Hz\n", CLK_GetHCLK0Freq()); - rt_kprintf("HCLK1: %d Hz\n", CLK_GetHCLK1Freq()); - rt_kprintf("HCLK2: %d Hz\n", CLK_GetHCLK2Freq()); - rt_kprintf("HCLK3: %d Hz\n", CLK_GetHCLK3Freq()); - rt_kprintf("PCLK0: %d Hz\n", CLK_GetPCLK0Freq()); - rt_kprintf("PCLK1: %d Hz\n", CLK_GetPCLK1Freq()); - rt_kprintf("PCLK2: %d Hz\n", CLK_GetPCLK2Freq()); - rt_kprintf("PCLK3: %d Hz\n", CLK_GetPCLK3Freq()); - rt_kprintf("PCLK4: %d Hz\n", CLK_GetPCLK4Freq()); + return ((u32ChipCfg & 0xF0000) != 0) ? (1 << ((u32ChipCfg & 0xF0000) >> 16)) << 20 : 0; } -const char *szClockName [] = +void nu_chipcfg_dump(void) +{ + uint32_t u32ChipCfg = *((vu32 *)REG_SYS_CHIPCFG); + uint32_t u32ChipCfg_DDRSize = ((u32ChipCfg & 0xF0000) != 0) ? 1 << ((u32ChipCfg & 0xF0000) >> 16) : 0; + uint32_t u32ChipCfg_DDRType = ((u32ChipCfg & 0x8000) >> 15); + + LOG_I("CHIPCFG: 0x%08x ", u32ChipCfg); + LOG_I("DDR SDRAM Size: %d MB", u32ChipCfg_DDRSize); + LOG_I("MCP DDR TYPE: %s", u32ChipCfg_DDRSize ? (u32ChipCfg_DDRType ? "DDR2" : "DDR3/3L") : "Unknown"); +} + +void nu_clock_dump(void) +{ + LOG_I("HXT: %d Hz", CLK_GetHXTFreq()); + LOG_I("LXT: %d Hz", CLK_GetLXTFreq()); + LOG_I("CAPLL: %d Hz(OpMode=%d)", CLK_GetPLLClockFreq(CAPLL), CLK_GetPLLOpMode(CAPLL)); + LOG_I("DDRPLL: %d Hz(OpMode=%d)", CLK_GetPLLClockFreq(DDRPLL), CLK_GetPLLOpMode(DDRPLL)); + LOG_I("APLL: %d Hz(OpMode=%d)", CLK_GetPLLClockFreq(APLL), CLK_GetPLLOpMode(APLL)); + LOG_I("EPLL: %d Hz(OpMode=%d)", CLK_GetPLLClockFreq(EPLL), CLK_GetPLLOpMode(EPLL)); + LOG_I("VPLL: %d Hz(OpMode=%d)", CLK_GetPLLClockFreq(VPLL), CLK_GetPLLOpMode(VPLL)); + + LOG_I("M4-CPU: %d Hz", CLK_GetCPUFreq()); + LOG_I("SYSCLK0: %d Hz", CLK_GetSYSCLK0Freq()); + LOG_I("SYSCLK1: %d Hz", CLK_GetSYSCLK1Freq()); + LOG_I("HCLK0: %d Hz", CLK_GetHCLK0Freq()); + LOG_I("HCLK1: %d Hz", CLK_GetHCLK1Freq()); + LOG_I("HCLK2: %d Hz", CLK_GetHCLK2Freq()); + LOG_I("HCLK3: %d Hz", CLK_GetHCLK3Freq()); + LOG_I("PCLK0: %d Hz", CLK_GetPCLK0Freq()); + LOG_I("PCLK1: %d Hz", CLK_GetPCLK1Freq()); + LOG_I("PCLK2: %d Hz", CLK_GetPCLK2Freq()); + LOG_I("PCLK3: %d Hz", CLK_GetPCLK3Freq()); + LOG_I("PCLK4: %d Hz", CLK_GetPCLK4Freq()); +} + +static const char *szClockName [] = { "HXT", "LXT", @@ -202,7 +228,7 @@ void nu_clock_isready(void) { if (i == 5 || i == 7 || i == 2) continue; u32IsReady = CLK_WaitClockReady(1 << i); - rt_kprintf("%s: %s\n", szClockName[i], (u32IsReady == 1) ? "[Stable]" : "[Unstable]"); + LOG_I("%s: %s\n", szClockName[i], (u32IsReady == 1) ? "[Stable]" : "[Unstable]"); } } @@ -230,7 +256,7 @@ void nu_clock_raise(void) } CLK_SetPLLFreq(VPLL, PLL_OPMODE_INTEGER, u32PllRefClk, 102000000ul); - CLK_SetPLLFreq(APLL, PLL_OPMODE_INTEGER, u32PllRefClk, 160000000ul); + CLK_SetPLLFreq(APLL, PLL_OPMODE_INTEGER, u32PllRefClk, 144000000ul); CLK_SetPLLFreq(EPLL, PLL_OPMODE_INTEGER, u32PllRefClk, 500000000ul); /* Waiting clock ready */ @@ -247,7 +273,9 @@ void nu_clock_raise(void) else #endif { +#if defined(DEF_RAISING_CPU_VOLTAGE) ma35d1_set_cpu_voltage(CLK_GetPLLClockFreq(SYSPLL), 0x5F); +#endif CLK_SetPLLFreq(CAPLL, PLL_OPMODE_INTEGER, u32PllRefClk, 800000000ul); } @@ -267,3 +295,74 @@ void nu_clock_raise(void) #endif +void devmem(int argc, char *argv[]) +{ + volatile unsigned int u32Addr; + unsigned int value = 0, mode = 0; + + if (argc < 2 || argc > 3) + { + goto exit_devmem; + } + + if (argc == 3) + { + if (sscanf(argv[2], "0x%x", &value) != 1) + goto exit_devmem; + mode = 1; //Write + } + + if (sscanf(argv[1], "0x%x", &u32Addr) != 1) + goto exit_devmem; + else if (u32Addr & (4 - 1)) + goto exit_devmem; + + if (mode) + { + *((volatile uint32_t *)u32Addr) = value; + } + LOG_I("0x%08x\n", *((volatile uint32_t *)u32Addr)); + + return; +exit_devmem: + rt_kprintf("Read: devmem \n"); + rt_kprintf("Write: devmem \n"); + return; +} +MSH_CMD_EXPORT(devmem, dump device registers); + +void devmem2(int argc, char *argv[]) +{ + volatile unsigned int u32Addr; + unsigned int value = 0, word_count = 1; + + if (argc < 2 || argc > 3) + { + goto exit_devmem; + } + + if (argc == 3) + { + if (sscanf(argv[2], "%d", &value) != 1) + goto exit_devmem; + word_count = value; + } + + if (sscanf(argv[1], "0x%x", &u32Addr) != 1) + goto exit_devmem; + else if (u32Addr & (4 - 1)) + goto exit_devmem; + + if (word_count > 0) + { + LOG_HEX("devmem", 16, (void *)u32Addr, word_count * sizeof(rt_base_t)); + } + + return; + +exit_devmem: + rt_kprintf("devmem2: \n"); + return; +} +MSH_CMD_EXPORT(devmem2, dump device registers); + diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_uart.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_uart.c index ce80525109..9d10050a24 100644 --- a/bsp/nuvoton/libraries/ma35/rtt_port/drv_uart.c +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_uart.c @@ -23,6 +23,13 @@ #include #endif +#define LOG_TAG "drv.uart" +//#undef DBG_ENABLE +#define DBG_SECTION_NAME LOG_TAG +#define DBG_LEVEL LOG_LVL_INFO +#define DBG_COLOR +#include + /* Private define ---------------------------------------------------------------*/ enum { @@ -81,12 +88,21 @@ enum UART_CNT }; +struct nu_rxbuf_ctx +{ + void * pvRxBuf; + uint32_t bufsize; + uint32_t wrote_offset; + uint32_t reserved; +}; +typedef struct nu_rxbuf_ctx *nu_rxbuf_ctx_t; + /* Private typedef --------------------------------------------------------------*/ struct nu_uart { rt_serial_t dev; char *name; - UART_T *uart_base; + UART_T *base; IRQn_Type irqn; uint32_t rstidx; @@ -97,10 +113,11 @@ struct nu_uart int16_t pdma_perp_rx; int8_t pdma_chanid_rx; - int32_t rx_write_offset; - int32_t rxdma_trigger_len; nu_pdma_desc_t pdma_rx_desc; + + struct nu_rxbuf_ctx dmabuf; + struct nu_rxbuf_ctx userbuf; #endif }; @@ -116,12 +133,10 @@ static int nu_uart_receive(struct rt_serial_device *serial); static rt_size_t nu_uart_dma_transmit(struct rt_serial_device *serial, rt_uint8_t *buf, rt_size_t size, int direction); static void nu_pdma_uart_rx_cb(void *pvOwner, uint32_t u32Events); static void nu_pdma_uart_tx_cb(void *pvOwner, uint32_t u32Events); + static uint32_t nu_uart_flush(nu_uart_t psNuUart, uint32_t pdma_new_rxsize); #endif -/* Public functions ------------------------------------------------------------*/ - /* Private variables ------------------------------------------------------------*/ - static const struct rt_uart_ops nu_uart_ops = { .configure = nu_uart_configure, @@ -143,7 +158,7 @@ static struct nu_uart nu_uart_arr [] = #if defined(BSP_USING_UART0) { .name = "uart0", - .uart_base = UART0, + .base = UART0, .irqn = UART0_IRQn, .rstidx = UART0_RST, @@ -155,7 +170,6 @@ static struct nu_uart nu_uart_arr [] = #endif #if defined(BSP_USING_UART0_RX_DMA) .pdma_perp_rx = PDMA_UART0_RX, - .rx_write_offset = 0, #else .pdma_perp_rx = NU_PDMA_UNUSED, #endif @@ -166,7 +180,7 @@ static struct nu_uart nu_uart_arr [] = #if defined(BSP_USING_UART1) { .name = "uart1", - .uart_base = UART1, + .base = UART1, .irqn = UART1_IRQn, .rstidx = UART1_RST, @@ -178,7 +192,6 @@ static struct nu_uart nu_uart_arr [] = #endif #if defined(BSP_USING_UART1_RX_DMA) .pdma_perp_rx = PDMA_UART1_RX, - .rx_write_offset = 0, #else .pdma_perp_rx = NU_PDMA_UNUSED, #endif @@ -189,7 +202,7 @@ static struct nu_uart nu_uart_arr [] = #if defined(BSP_USING_UART2) { .name = "uart2", - .uart_base = UART2, + .base = UART2, .irqn = UART2_IRQn, .rstidx = UART2_RST, @@ -201,7 +214,6 @@ static struct nu_uart nu_uart_arr [] = #endif #if defined(BSP_USING_UART2_RX_DMA) .pdma_perp_rx = PDMA_UART2_RX, - .rx_write_offset = 0, #else .pdma_perp_rx = NU_PDMA_UNUSED, #endif @@ -212,7 +224,7 @@ static struct nu_uart nu_uart_arr [] = #if defined(BSP_USING_UART3) { .name = "uart3", - .uart_base = UART3, + .base = UART3, .irqn = UART3_IRQn, .rstidx = UART3_RST, @@ -224,7 +236,6 @@ static struct nu_uart nu_uart_arr [] = #endif #if defined(BSP_USING_UART3_RX_DMA) .pdma_perp_rx = PDMA_UART3_RX, - .rx_write_offset = 0, #else .pdma_perp_rx = NU_PDMA_UNUSED, #endif @@ -235,7 +246,7 @@ static struct nu_uart nu_uart_arr [] = #if defined(BSP_USING_UART4) { .name = "uart4", - .uart_base = UART4, + .base = UART4, .irqn = UART4_IRQn, .rstidx = UART4_RST, @@ -247,7 +258,6 @@ static struct nu_uart nu_uart_arr [] = #endif #if defined(BSP_USING_UART4_RX_DMA) .pdma_perp_rx = PDMA_UART4_RX, - .rx_write_offset = 0, #else .pdma_perp_rx = NU_PDMA_UNUSED, #endif @@ -258,7 +268,7 @@ static struct nu_uart nu_uart_arr [] = #if defined(BSP_USING_UART5) { .name = "uart5", - .uart_base = UART5, + .base = UART5, .irqn = UART5_IRQn, .rstidx = UART5_RST, @@ -270,7 +280,6 @@ static struct nu_uart nu_uart_arr [] = #endif #if defined(BSP_USING_UART5_RX_DMA) .pdma_perp_rx = PDMA_UART5_RX, - .rx_write_offset = 0, #else .pdma_perp_rx = NU_PDMA_UNUSED, #endif @@ -281,7 +290,7 @@ static struct nu_uart nu_uart_arr [] = #if defined(BSP_USING_UART6) { .name = "uart6", - .uart_base = UART6, + .base = UART6, .irqn = UART6_IRQn, .rstidx = UART6_RST, @@ -293,7 +302,6 @@ static struct nu_uart nu_uart_arr [] = #endif #if defined(BSP_USING_UART6_RX_DMA) .pdma_perp_rx = PDMA_UART6_RX, - .rx_write_offset = 0, #else .pdma_perp_rx = NU_PDMA_UNUSED, #endif @@ -304,7 +312,7 @@ static struct nu_uart nu_uart_arr [] = #if defined(BSP_USING_UART7) { .name = "uart7", - .uart_base = UART7, + .base = UART7, .irqn = UART7_IRQn, .rstidx = UART7_RST, @@ -316,7 +324,6 @@ static struct nu_uart nu_uart_arr [] = #endif #if defined(BSP_USING_UART7_RX_DMA) .pdma_perp_rx = PDMA_UART7_RX, - .rx_write_offset = 0, #else .pdma_perp_rx = NU_PDMA_UNUSED, #endif @@ -327,7 +334,7 @@ static struct nu_uart nu_uart_arr [] = #if defined(BSP_USING_UART8) { .name = "uart8", - .uart_base = UART8, + .base = UART8, .irqn = UART8_IRQn, .rstidx = UART8_RST, @@ -339,7 +346,6 @@ static struct nu_uart nu_uart_arr [] = #endif #if defined(BSP_USING_UART8_RX_DMA) .pdma_perp_rx = PDMA_UART8_RX, - .rx_write_offset = 0, #else .pdma_perp_rx = NU_PDMA_UNUSED, #endif @@ -350,7 +356,7 @@ static struct nu_uart nu_uart_arr [] = #if defined(BSP_USING_UART9) { .name = "uart9", - .uart_base = UART9, + .base = UART9, .irqn = UART9_IRQn, .rstidx = UART9_RST, @@ -362,7 +368,6 @@ static struct nu_uart nu_uart_arr [] = #endif #if defined(BSP_USING_UART9_RX_DMA) .pdma_perp_rx = PDMA_UART9_RX, - .rx_write_offset = 0, #else .pdma_perp_rx = NU_PDMA_UNUSED, #endif @@ -373,7 +378,7 @@ static struct nu_uart nu_uart_arr [] = #if defined(BSP_USING_UART10) { .name = "uart10", - .uart_base = UART10, + .base = UART10, .irqn = UART10_IRQn, .rstidx = UART10_RST, @@ -385,7 +390,6 @@ static struct nu_uart nu_uart_arr [] = #endif #if defined(BSP_USING_UART10_RX_DMA) .pdma_perp_rx = PDMA_UART10_RX, - .rx_write_offset = 0, #else .pdma_perp_rx = NU_PDMA_UNUSED, #endif @@ -396,7 +400,7 @@ static struct nu_uart nu_uart_arr [] = #if defined(BSP_USING_UART11) { .name = "uart11", - .uart_base = UART11, + .base = UART11, .irqn = UART11_IRQn, .rstidx = UART11_RST, @@ -408,7 +412,6 @@ static struct nu_uart nu_uart_arr [] = #endif #if defined(BSP_USING_UART11_RX_DMA) .pdma_perp_rx = PDMA_UART11_RX, - .rx_write_offset = 0, #else .pdma_perp_rx = NU_PDMA_UNUSED, #endif @@ -419,7 +422,7 @@ static struct nu_uart nu_uart_arr [] = #if defined(BSP_USING_UART12) { .name = "uart12", - .uart_base = UART12, + .base = UART12, .irqn = UART12_IRQn, .rstidx = UART12_RST, @@ -431,7 +434,6 @@ static struct nu_uart nu_uart_arr [] = #endif #if defined(BSP_USING_UART12_RX_DMA) .pdma_perp_rx = PDMA_UART12_RX, - .rx_write_offset = 0, #else .pdma_perp_rx = NU_PDMA_UNUSED, #endif @@ -442,7 +444,7 @@ static struct nu_uart nu_uart_arr [] = #if defined(BSP_USING_UART13) { .name = "uart13", - .uart_base = UART13, + .base = UART13, .irqn = UART13_IRQn, .rstidx = UART13_RST, @@ -454,7 +456,6 @@ static struct nu_uart nu_uart_arr [] = #endif #if defined(BSP_USING_UART13_RX_DMA) .pdma_perp_rx = PDMA_UART13_RX, - .rx_write_offset = 0, #else .pdma_perp_rx = NU_PDMA_UNUSED, #endif @@ -465,7 +466,7 @@ static struct nu_uart nu_uart_arr [] = #if defined(BSP_USING_UART14) { .name = "uart14", - .uart_base = UART14, + .base = UART14, .irqn = UART14_IRQn, .rstidx = UART14_RST, @@ -477,7 +478,6 @@ static struct nu_uart nu_uart_arr [] = #endif #if defined(BSP_USING_UART14_RX_DMA) .pdma_perp_rx = PDMA_UART14_RX, - .rx_write_offset = 0, #else .pdma_perp_rx = NU_PDMA_UNUSED, #endif @@ -488,7 +488,7 @@ static struct nu_uart nu_uart_arr [] = #if defined(BSP_USING_UART15) { .name = "uart15", - .uart_base = UART15, + .base = UART15, .irqn = UART15_IRQn, .rstidx = UART15_RST, @@ -500,7 +500,6 @@ static struct nu_uart nu_uart_arr [] = #endif #if defined(BSP_USING_UART15_RX_DMA) .pdma_perp_rx = PDMA_UART15_RX, - .rx_write_offset = 0, #else .pdma_perp_rx = NU_PDMA_UNUSED, #endif @@ -511,7 +510,7 @@ static struct nu_uart nu_uart_arr [] = #if defined(BSP_USING_UART16) { .name = "uart16", - .uart_base = UART16, + .base = UART16, .irqn = UART16_IRQn, .rstidx = UART16_RST, @@ -523,7 +522,6 @@ static struct nu_uart nu_uart_arr [] = #endif #if defined(BSP_USING_UART16_RX_DMA) .pdma_perp_rx = PDMA_UART16_RX, - .rx_write_offset = 0, #else .pdma_perp_rx = NU_PDMA_UNUSED, #endif @@ -539,19 +537,25 @@ static struct nu_uart nu_uart_arr [] = static void nu_uart_isr(int vector, void *param) { /* Get base address of uart register */ - nu_uart_t serial = (nu_uart_t)param; - UART_T *uart_base = serial->uart_base; + nu_uart_t psNuUart = (nu_uart_t)param; + UART_T *base = psNuUart->base; /* Get interrupt event */ - uint32_t u32IntSts = uart_base->INTSTS; - uint32_t u32FIFOSts = uart_base->FIFOSTS; + uint32_t u32IntSts = base->INTSTS; + uint32_t u32FIFOSts = base->FIFOSTS; #if defined(RT_SERIAL_USING_DMA) if (u32IntSts & UART_INTSTS_PRLSIF_Msk) { /* Drain RX FIFO to remove remain FEF frames in FIFO. */ - uart_base->FIFO |= UART_FIFO_RXRST_Msk; - uart_base->FIFOSTS |= (UART_FIFOSTS_BIF_Msk | UART_FIFOSTS_FEF_Msk | UART_FIFOSTS_PEF_Msk); + base->FIFO |= UART_FIFO_RXRST_Msk; + base->FIFOSTS |= (UART_FIFOSTS_BIF_Msk | UART_FIFOSTS_FEF_Msk | UART_FIFOSTS_PEF_Msk); + return; + } + + if (u32IntSts & UART_INTSTS_PTOIF_Msk) + { + nu_uart_flush(psNuUart, 0); return; } #endif @@ -559,10 +563,10 @@ static void nu_uart_isr(int vector, void *param) /* Handle RX event */ if (u32IntSts & (UART_INTSTS_RDAINT_Msk | UART_INTSTS_RXTOINT_Msk)) { - rt_hw_serial_isr(&serial->dev, RT_SERIAL_EVENT_RX_IND); + rt_hw_serial_isr(&psNuUart->dev, RT_SERIAL_EVENT_RX_IND); } - uart_base->INTSTS = u32IntSts; - uart_base->FIFOSTS = u32FIFOSts; + base->INTSTS = u32IntSts; + base->FIFOSTS = u32FIFOSts; } /** @@ -570,27 +574,28 @@ static void nu_uart_isr(int vector, void *param) */ void nu_uart_set_rs485aud(struct rt_serial_device *serial, rt_bool_t bRTSActiveLowLevel) { - UART_T *uart_base; + nu_uart_t psNuUart = (nu_uart_t)serial; + UART_T *base; RT_ASSERT(serial); /* Get base address of uart register */ - uart_base = ((nu_uart_t)serial)->uart_base; + base = ((nu_uart_t)serial)->base; /* Set RTS as RS-485 phy direction controlling ping. */ - UART_SelectRS485Mode(uart_base, UART_ALTCTL_RS485AUD_Msk, 0); + UART_SelectRS485Mode(base, UART_ALTCTL_RS485AUD_Msk, 0); if (bRTSActiveLowLevel) { /* Set direction pin as active-low. */ - uart_base->MODEM |= UART_MODEM_RTSACTLV_Msk; + base->MODEM |= UART_MODEM_RTSACTLV_Msk; } else { /* Set direction pin as active-high. */ - uart_base->MODEM &= ~UART_MODEM_RTSACTLV_Msk; + base->MODEM &= ~UART_MODEM_RTSACTLV_Msk; } - rt_kprintf("Set %s to RS-485 AUD function mode. ActiveLowLevel-%s\n", ((nu_uart_t)serial)->name, bRTSActiveLowLevel ? "YES" : "NO"); + LOG_I("Set %s to RS-485 AUD function mode. ActiveLowLevel-%s", psNuUart->name, bRTSActiveLowLevel ? "YES" : "NO"); } /** @@ -598,10 +603,9 @@ void nu_uart_set_rs485aud(struct rt_serial_device *serial, rt_bool_t bRTSActiveL */ static rt_err_t nu_uart_configure(struct rt_serial_device *serial, struct serial_configure *cfg) { + nu_uart_t psNuUart = (nu_uart_t)serial; rt_err_t ret = RT_EOK; - uint32_t uart_word_len = 0; - uint32_t uart_stop_bit = 0; - uint32_t uart_parity = 0; + uint32_t uart_word_len, uart_stop_bit, uart_parity; RT_ASSERT(serial); RT_ASSERT(cfg); @@ -609,8 +613,10 @@ static rt_err_t nu_uart_configure(struct rt_serial_device *serial, struct serial /* Check baudrate */ RT_ASSERT(cfg->baud_rate != 0); + uart_word_len = uart_stop_bit = uart_parity = 0; + /* Get base address of uart register */ - UART_T *uart_base = ((nu_uart_t)serial)->uart_base; + UART_T *base = psNuUart->base; /* Check word len */ switch (cfg->data_bits) @@ -632,7 +638,7 @@ static rt_err_t nu_uart_configure(struct rt_serial_device *serial, struct serial break; default: - rt_kprintf("Unsupported data length\n"); + LOG_E("Unsupported data length."); ret = RT_EINVAL; goto exit_nu_uart_configure; } @@ -649,7 +655,7 @@ static rt_err_t nu_uart_configure(struct rt_serial_device *serial, struct serial break; default: - rt_kprintf("Unsupported stop bit\n"); + LOG_E("Unsupported stop bit."); ret = RT_EINVAL; goto exit_nu_uart_configure; } @@ -670,45 +676,170 @@ static rt_err_t nu_uart_configure(struct rt_serial_device *serial, struct serial break; default: - rt_kprintf("Unsupported parity\n"); + LOG_E("Unsupported parity."); ret = RT_EINVAL; goto exit_nu_uart_configure; } /* Reset this module */ - nu_sys_ip_reset(((nu_uart_t)serial)->rstidx); + nu_sys_ip_reset(psNuUart->rstidx); /* Open Uart and set UART Baudrate */ - UART_Open(uart_base, cfg->baud_rate); + UART_Open(base, cfg->baud_rate); /* Set line configuration. */ - UART_SetLineConfig(uart_base, 0, uart_word_len, uart_parity, uart_stop_bit); + UART_SetLineConfig(base, 0, uart_word_len, uart_parity, uart_stop_bit); /* Enable interrupt. */ - rt_hw_interrupt_umask(((nu_uart_t)serial)->irqn); + rt_hw_interrupt_umask(psNuUart->irqn); exit_nu_uart_configure: if (ret != RT_EOK) - UART_Close(uart_base); + UART_Close(base); return -(ret); } #if defined(RT_SERIAL_USING_DMA) -static rt_err_t nu_pdma_uart_rx_config(struct rt_serial_device *serial, uint8_t *pu8Buf, int32_t i32TriggerLen) + +static uint32_t nu_uart_flush_sync( + uint8_t *dst_buf_start, + uint8_t *dst_buf_put, + uint8_t *src_buf_start, + uint8_t *src_buf_put, + uint32_t bufsize, + uint32_t sync_len) +{ + uint32_t count = 0; + + /* Copy bytes in Source's ring-buffer to Destination's ring-buffer. */ + while ( count < sync_len ) + { + if ( dst_buf_put >= (dst_buf_start + bufsize) ) + { + dst_buf_put = dst_buf_start; + } + + if ( src_buf_put >= (src_buf_start + bufsize) ) + { + src_buf_put = src_buf_start; + } + + *dst_buf_put = *src_buf_put; + + src_buf_put++; + dst_buf_put++; + + count++; + } + + return count; +} + +static uint32_t nu_uart_flush(nu_uart_t psNuUart, uint32_t pdma_new_rxsize) +{ + uint32_t recv_len; + UART_T *base = psNuUart->base; + uint8_t tempbuf[64]; + + /* Disable Receive Line interrupt first. */ + UART_DISABLE_INT(base, UART_INTEN_RXPDMAEN_Msk); + + /* Pick up RX bytes in PDMA RX BUFFER. */ + if ( pdma_new_rxsize > 0 ) + { + nu_pdma_desc_t psDesc = nu_pdma_get_channel_desc(psNuUart->pdma_chanid_rx); + #if !defined(USE_MA35D1_SUBM) + uint8_t *pu8DmaBuf_noncache = (uint8_t *)(psDesc->DA + UNCACHEABLE); + #else + uint8_t *pu8DmaBuf_noncache = (uint8_t *)(psDesc->DA); + #endif + + /* Update wrote offset of user buffer. */ + psNuUart->userbuf.wrote_offset += nu_uart_flush_sync( psNuUart->userbuf.pvRxBuf, + (uint8_t *)psNuUart->userbuf.pvRxBuf + psNuUart->userbuf.wrote_offset, + pu8DmaBuf_noncache, + pu8DmaBuf_noncache + psNuUart->dmabuf.wrote_offset, + psNuUart->userbuf.bufsize, + pdma_new_rxsize ); + psNuUart->userbuf.wrote_offset %= psNuUart->userbuf.bufsize; + } + + /* Pick up RX bytes in UART FIFO. */ + recv_len = 0; + while (!UART_GET_RX_EMPTY(base)) + { + tempbuf[recv_len] = UART_READ(base); + recv_len++; + RT_ASSERT( recv_len < sizeof(tempbuf) ); + } + if ( recv_len > 0 ) + { + /* Update wrote offset of user buffer. */ + psNuUart->userbuf.wrote_offset += nu_uart_flush_sync( psNuUart->userbuf.pvRxBuf, + psNuUart->userbuf.pvRxBuf + psNuUart->userbuf.wrote_offset, + tempbuf, + tempbuf, + psNuUart->userbuf.bufsize, + recv_len ); + psNuUart->userbuf.wrote_offset %= psNuUart->userbuf.bufsize; + } + + /* Report received bytes = UART_FIFO_RXSIZE + PDMA_NEW_RXSIZE */ + recv_len += pdma_new_rxsize; + if (recv_len > 0) + { + LOG_D("%d(Received) = %d(PDMA) + %d(FIFO)", + recv_len - pdma_new_rxsize, + pdma_new_rxsize, + recv_len); + + LOG_D("User: [%08x] bufsize=%d, wrote_offset=%d", + psNuUart->userbuf.pvRxBuf, + psNuUart->userbuf.bufsize, + psNuUart->userbuf.wrote_offset); + + LOG_D("DMA: [%08x] bufsize=%d, put=%d", + psNuUart->dmabuf.pvRxBuf, + psNuUart->dmabuf.bufsize, + psNuUart->dmabuf.wrote_offset); + + rt_hw_serial_isr(&psNuUart->dev, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8)); + } + + /* Enable Receive Line interrupt first. */ + UART_ENABLE_INT(base, UART_INTEN_RXPDMAEN_Msk); + + return recv_len; +} + +static void nu_pdma_uart_rxbuf_free(nu_uart_t psNuUart) +{ + psNuUart->userbuf.pvRxBuf = RT_NULL; + psNuUart->userbuf.bufsize = 0; + psNuUart->userbuf.wrote_offset = 0; + + if (psNuUart->dmabuf.pvRxBuf) + rt_free_align(psNuUart->dmabuf.pvRxBuf); + + psNuUart->dmabuf.pvRxBuf = RT_NULL; + psNuUart->dmabuf.bufsize = 0; + psNuUart->dmabuf.wrote_offset = 0; +} + +static rt_err_t nu_pdma_uart_rx_config(nu_uart_t psNuUart, uint8_t *pu8Buf, int32_t i32TriggerLen) { rt_err_t result = RT_EOK; struct nu_pdma_chn_cb sChnCB; - nu_uart_t psNuUart = (nu_uart_t)serial; /* Get base address of uart register */ - UART_T *uart_base = psNuUart->uart_base; + UART_T *base = psNuUart->base; /* Register ISR callback function */ sChnCB.m_eCBType = eCBType_Event; sChnCB.m_pfnCBHandler = nu_pdma_uart_rx_cb; - sChnCB.m_pvUserData = (void *)serial; + sChnCB.m_pvUserData = (void *)psNuUart; nu_pdma_filtering_set(psNuUart->pdma_chanid_rx, NU_PDMA_EVENT_TRANSFER_DONE | NU_PDMA_EVENT_TIMEOUT); result = nu_pdma_callback_register(psNuUart->pdma_chanid_rx, &sChnCB); @@ -718,48 +849,49 @@ static rt_err_t nu_pdma_uart_rx_config(struct rt_serial_device *serial, uint8_t goto exit_nu_pdma_uart_rx_config; } - if (serial->config.bufsz == 0) - { - result = nu_pdma_transfer(((nu_uart_t)serial)->pdma_chanid_rx, - 8, - (uint32_t)uart_base, - (uint32_t)pu8Buf, - i32TriggerLen, - 1000); //Idle-timeout, 1ms - if (result != RT_EOK) - { - goto exit_nu_pdma_uart_rx_config; - } - } - else - { - /* For Serial RX FIFO - Single buffer recycle SG trigger */ - /* Link to next */ - nu_pdma_desc_t next = psNuUart->pdma_rx_desc; + /* Store user buffer context */ + psNuUart->userbuf.pvRxBuf = pu8Buf; + psNuUart->userbuf.bufsize = i32TriggerLen; + psNuUart->userbuf.wrote_offset = 0; - result = nu_pdma_desc_setup(psNuUart->pdma_chanid_rx, - psNuUart->pdma_rx_desc, - 8, - (uint32_t)uart_base, - (uint32_t)pu8Buf, - i32TriggerLen, - next, - 0); - if (result != RT_EOK) - { - goto exit_nu_pdma_uart_rx_config; - } - - /* Assign head descriptor & go */ - result = nu_pdma_sg_transfer(psNuUart->pdma_chanid_rx, psNuUart->pdma_rx_desc, 1000); - if (result != RT_EOK) - { - goto exit_nu_pdma_uart_rx_config; - } + psNuUart->dmabuf.pvRxBuf = rt_malloc_align(i32TriggerLen, 64); + psNuUart->dmabuf.bufsize = 0; + if (psNuUart->dmabuf.pvRxBuf == RT_NULL) + { + LOG_E("Failed to allocate dma memory %d.", i32TriggerLen); + goto exit_nu_pdma_uart_rx_config; } + psNuUart->dmabuf.bufsize = i32TriggerLen; + psNuUart->dmabuf.wrote_offset = 0; + + /* Disable Receive Line interrupt & Start DMA RX transfer. */ + UART_DISABLE_INT(base, UART_INTEN_RLSIEN_Msk | UART_INTEN_RXPDMAEN_Msk | UART_INTEN_RXTOIEN_Msk); + + /* For Serial RX FIFO - Single buffer recycle SG trigger */ + result = nu_pdma_desc_setup(psNuUart->pdma_chanid_rx, + psNuUart->pdma_rx_desc, + 8, + (uint32_t)base, + (uint32_t)psNuUart->dmabuf.pvRxBuf, + psNuUart->dmabuf.bufsize, + psNuUart->pdma_rx_desc, + 0); + if (result != RT_EOK) + { + goto exit_nu_pdma_uart_rx_config; + } + + /* Assign head descriptor & go */ + result = nu_pdma_sg_transfer(psNuUart->pdma_chanid_rx, psNuUart->pdma_rx_desc, 500); + if (result != RT_EOK) + { + goto exit_nu_pdma_uart_rx_config; + } + + UART_SetTimeoutCnt(base, 255); /* Enable Receive Line interrupt & Start DMA RX transfer. */ - UART_ENABLE_INT(uart_base, UART_INTEN_RLSIEN_Msk | UART_INTEN_RXPDMAEN_Msk); + UART_ENABLE_INT(base, UART_INTEN_RLSIEN_Msk | UART_INTEN_RXPDMAEN_Msk | UART_INTEN_RXTOIEN_Msk); exit_nu_pdma_uart_rx_config: @@ -768,75 +900,53 @@ exit_nu_pdma_uart_rx_config: static void nu_pdma_uart_rx_cb(void *pvOwner, uint32_t u32Events) { - rt_size_t recv_len = 0; - rt_size_t transferred_rxbyte = 0; - struct rt_serial_device *serial = (struct rt_serial_device *)pvOwner; - nu_uart_t puart = (nu_uart_t)serial; - RT_ASSERT(serial); + nu_uart_t psNuUart = (nu_uart_t)pvOwner; + RT_ASSERT(psNuUart); - /* Get base address of uart register */ - UART_T *uart_base = puart->uart_base; - - transferred_rxbyte = nu_pdma_transferred_byte_get(puart->pdma_chanid_rx, puart->rxdma_trigger_len); if (u32Events & (NU_PDMA_EVENT_TRANSFER_DONE | NU_PDMA_EVENT_TIMEOUT)) { + rt_size_t pdma_rxsize = 0; + if (u32Events & NU_PDMA_EVENT_TRANSFER_DONE) { - transferred_rxbyte = puart->rxdma_trigger_len; + pdma_rxsize = psNuUart->dmabuf.bufsize; } - else if ((u32Events & NU_PDMA_EVENT_TIMEOUT) && !UART_GET_RX_EMPTY(uart_base)) + else { - return; + pdma_rxsize = nu_pdma_transferred_byte_get(psNuUart->pdma_chanid_rx, psNuUart->dmabuf.bufsize); } - recv_len = transferred_rxbyte - puart->rx_write_offset; + nu_uart_flush(psNuUart, pdma_rxsize - psNuUart->dmabuf.wrote_offset); - if (recv_len > 0) - { -#if !defined(USE_MA35D1_SUBM) - struct rt_serial_rx_fifo *rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx; - rt_hw_cpu_dcache_invalidate((void *)&rx_fifo->buffer[puart->rx_write_offset], recv_len); -#endif - puart->rx_write_offset = transferred_rxbyte % puart->rxdma_trigger_len; - } - } - - if ((serial->config.bufsz == 0) && (u32Events & NU_PDMA_EVENT_TRANSFER_DONE)) - { - recv_len = puart->rxdma_trigger_len; - } - - if (recv_len > 0) - { - rt_hw_serial_isr(&puart->dev, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8)); + /* Update rxdma buffer wrote index */ + psNuUart->dmabuf.wrote_offset = (psNuUart->dmabuf.wrote_offset + pdma_rxsize) % psNuUart->dmabuf.bufsize; } } -static rt_err_t nu_pdma_uart_tx_config(struct rt_serial_device *serial) +static rt_err_t nu_pdma_uart_tx_config(nu_uart_t psNuUart) { struct nu_pdma_chn_cb sChnCB; - RT_ASSERT(serial); + RT_ASSERT(psNuUart); /* Register ISR callback function */ sChnCB.m_eCBType = eCBType_Event; sChnCB.m_pfnCBHandler = nu_pdma_uart_tx_cb; - sChnCB.m_pvUserData = (void *)serial; + sChnCB.m_pvUserData = (void *)psNuUart; - nu_pdma_filtering_set(((nu_uart_t)serial)->pdma_chanid_tx, NU_PDMA_EVENT_TRANSFER_DONE); - return nu_pdma_callback_register(((nu_uart_t)serial)->pdma_chanid_tx, &sChnCB); + nu_pdma_filtering_set(psNuUart->pdma_chanid_tx, NU_PDMA_EVENT_TRANSFER_DONE); + return nu_pdma_callback_register(psNuUart->pdma_chanid_tx, &sChnCB); } static void nu_pdma_uart_tx_cb(void *pvOwner, uint32_t u32Events) { - nu_uart_t puart = (nu_uart_t)pvOwner; + nu_uart_t psNuUart = (nu_uart_t)pvOwner; + RT_ASSERT(psNuUart); - RT_ASSERT(puart); - - UART_DISABLE_INT(puart->uart_base, UART_INTEN_TXPDMAEN_Msk);// Stop DMA TX transfer + UART_DISABLE_INT(psNuUart->base, UART_INTEN_TXPDMAEN_Msk);// Stop DMA TX transfer if (u32Events & NU_PDMA_EVENT_TRANSFER_DONE) { - rt_hw_serial_isr(&puart->dev, RT_SERIAL_EVENT_TX_DMADONE); + rt_hw_serial_isr(&psNuUart->dev, RT_SERIAL_EVENT_TX_DMADONE); } } @@ -852,26 +962,44 @@ static rt_size_t nu_uart_dma_transmit(struct rt_serial_device *serial, rt_uint8_ RT_ASSERT(buf); /* Get base address of uart register */ - UART_T *uart_base = psNuUart->uart_base; + UART_T *base = psNuUart->base; if (direction == RT_SERIAL_DMA_TX) { - result = nu_pdma_transfer(psNuUart->pdma_chanid_tx, + UART_DISABLE_INT(base, UART_INTEN_TXPDMAEN_Msk); + /* <16 PDMA TX case. */ + if (size < 16) + { + int i = 0; + UART_T *base = psNuUart->base; + + while (i < size) + { + /* Waiting if TX-FIFO is full. */ + while (UART_IS_TX_FULL(base)); + /* Put char into TX-FIFO */ + UART_WRITE(base, buf[i]); + i++; + } + rt_hw_serial_isr(&psNuUart->dev, RT_SERIAL_EVENT_TX_DMADONE); + } + else + { + result = nu_pdma_transfer(psNuUart->pdma_chanid_tx, 8, (uint32_t)buf, - (uint32_t)uart_base, + (uint32_t)base, size, 0); // wait-forever - // Start DMA TX transfer - UART_ENABLE_INT(uart_base, UART_INTEN_TXPDMAEN_Msk); + // Start DMA TX transfer + UART_ENABLE_INT(base, UART_INTEN_TXPDMAEN_Msk); + } } else if (direction == RT_SERIAL_DMA_RX) { - UART_DISABLE_INT(uart_base, UART_INTEN_RLSIEN_Msk | UART_INTEN_RXPDMAEN_Msk); + UART_DISABLE_INT(base, UART_INTEN_RLSIEN_Msk | UART_INTEN_RXPDMAEN_Msk | UART_INTEN_TOCNTEN_Msk); // If config.bufsz = 0, serial will trigger once. - psNuUart->rxdma_trigger_len = size; - psNuUart->rx_write_offset = 0; - result = nu_pdma_uart_rx_config(serial, buf, size); + result = nu_pdma_uart_rx_config(psNuUart, buf, size); } else { @@ -881,29 +1009,29 @@ static rt_size_t nu_uart_dma_transmit(struct rt_serial_device *serial, rt_uint8_ return result; } -static int nu_hw_uart_dma_allocate(nu_uart_t pusrt) +static int nu_hw_uart_dma_allocate(nu_uart_t psNuUart) { - RT_ASSERT(pusrt); + RT_ASSERT(psNuUart); /* Allocate UART_TX nu_dma channel */ - if (pusrt->pdma_perp_tx != NU_PDMA_UNUSED) + if (psNuUart->pdma_perp_tx != NU_PDMA_UNUSED) { - pusrt->pdma_chanid_tx = nu_pdma_channel_allocate(pusrt->pdma_perp_tx); - if (pusrt->pdma_chanid_tx >= 0) + psNuUart->pdma_chanid_tx = nu_pdma_channel_allocate(psNuUart->pdma_perp_tx); + if (psNuUart->pdma_chanid_tx >= 0) { - pusrt->dma_flag |= RT_DEVICE_FLAG_DMA_TX; + psNuUart->dma_flag |= RT_DEVICE_FLAG_DMA_TX; } } /* Allocate UART_RX nu_dma channel */ - if (pusrt->pdma_perp_rx != NU_PDMA_UNUSED) + if (psNuUart->pdma_perp_rx != NU_PDMA_UNUSED) { - pusrt->pdma_chanid_rx = nu_pdma_channel_allocate(pusrt->pdma_perp_rx); - if (pusrt->pdma_chanid_rx >= 0) + psNuUart->pdma_chanid_rx = nu_pdma_channel_allocate(psNuUart->pdma_perp_rx); + if (psNuUart->pdma_chanid_rx >= 0) { rt_err_t ret = RT_EOK; - pusrt->dma_flag |= RT_DEVICE_FLAG_DMA_RX; - ret = nu_pdma_sgtbls_allocate(&pusrt->pdma_rx_desc, 1); + psNuUart->dma_flag |= RT_DEVICE_FLAG_DMA_RX; + ret = nu_pdma_sgtbls_allocate(&psNuUart->pdma_rx_desc, 1); RT_ASSERT(ret == RT_EOK); } } @@ -924,14 +1052,14 @@ static rt_err_t nu_uart_control(struct rt_serial_device *serial, int cmd, void * RT_ASSERT(serial); /* Get base address of uart register */ - UART_T *uart_base = psNuUart->uart_base; + UART_T *base = psNuUart->base; switch (cmd) { case RT_DEVICE_CTRL_CLR_INT: if (ctrl_arg == RT_DEVICE_FLAG_INT_RX) /* Disable INT-RX */ { - UART_DISABLE_INT(uart_base, UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk | UART_INTEN_TOCNTEN_Msk); + UART_DISABLE_INT(base, UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk | UART_INTEN_TOCNTEN_Msk); } else if (ctrl_arg == RT_DEVICE_FLAG_DMA_RX) /* Disable DMA-RX */ { @@ -940,8 +1068,9 @@ static rt_err_t nu_uart_control(struct rt_serial_device *serial, int cmd, void * if (psNuUart->dma_flag & RT_DEVICE_FLAG_DMA_RX) { nu_pdma_channel_terminate(psNuUart->pdma_chanid_rx); + nu_pdma_uart_rxbuf_free(psNuUart); } - UART_DISABLE_INT(uart_base, UART_INTEN_RLSIEN_Msk | UART_INTEN_RXPDMAEN_Msk); + UART_DISABLE_INT(base, UART_INTEN_RLSIEN_Msk | UART_INTEN_RXPDMAEN_Msk | UART_INTEN_TOCNTEN_Msk); #endif } break; @@ -949,7 +1078,7 @@ static rt_err_t nu_uart_control(struct rt_serial_device *serial, int cmd, void * case RT_DEVICE_CTRL_SET_INT: if (ctrl_arg == RT_DEVICE_FLAG_INT_RX) /* Enable INT-RX */ { - UART_ENABLE_INT(uart_base, UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk | UART_INTEN_TOCNTEN_Msk); + UART_ENABLE_INT(base, UART_INTEN_RDAIEN_Msk | UART_INTEN_RXTOIEN_Msk); } break; @@ -958,14 +1087,11 @@ static rt_err_t nu_uart_control(struct rt_serial_device *serial, int cmd, void * if (ctrl_arg == RT_DEVICE_FLAG_DMA_RX) /* Configure and trigger DMA-RX */ { struct rt_serial_rx_fifo *rx_fifo = (struct rt_serial_rx_fifo *)serial->serial_rx; - psNuUart->rxdma_trigger_len = serial->config.bufsz; - psNuUart->rx_write_offset = 0; - - result = nu_pdma_uart_rx_config(serial, &rx_fifo->buffer[0], psNuUart->rxdma_trigger_len); // Config & trigger + result = nu_pdma_uart_rx_config(psNuUart, &rx_fifo->buffer[0], serial->config.bufsz); // Config & trigger } else if (ctrl_arg == RT_DEVICE_FLAG_DMA_TX) /* Configure DMA-TX */ { - result = nu_pdma_uart_tx_config(serial); + result = nu_pdma_uart_tx_config(psNuUart); } break; #endif @@ -975,18 +1101,19 @@ static rt_err_t nu_uart_control(struct rt_serial_device *serial, int cmd, void * rt_hw_interrupt_mask(psNuUart->irqn); #if defined(RT_SERIAL_USING_DMA) - UART_DISABLE_INT(uart_base, UART_INTEN_RLSIEN_Msk | UART_INTEN_RXPDMAEN_Msk); - UART_DISABLE_INT(uart_base, UART_INTEN_TXPDMAEN_Msk); + UART_DISABLE_INT(base, UART_INTEN_RLSIEN_Msk | UART_INTEN_RXPDMAEN_Msk | UART_INTEN_TOCNTEN_Msk); + UART_DISABLE_INT(base, UART_INTEN_TXPDMAEN_Msk); if (psNuUart->dma_flag != 0) { nu_pdma_channel_terminate(psNuUart->pdma_chanid_tx); nu_pdma_channel_terminate(psNuUart->pdma_chanid_rx); + nu_pdma_uart_rxbuf_free(psNuUart); } #endif /* Close UART port */ - UART_Close(uart_base); + UART_Close(base); break; @@ -1003,16 +1130,18 @@ static rt_err_t nu_uart_control(struct rt_serial_device *serial, int cmd, void * */ static int nu_uart_send(struct rt_serial_device *serial, char c) { + nu_uart_t psNuUart = (nu_uart_t)serial; + RT_ASSERT(serial); /* Get base address of uart register */ - UART_T *uart_base = ((nu_uart_t)serial)->uart_base; + UART_T *base = psNuUart->base; /* Waiting if TX-FIFO is full. */ - while (UART_IS_TX_FULL(uart_base)); + while (UART_IS_TX_FULL(base)); /* Put char into TX-FIFO */ - UART_WRITE(uart_base, c); + UART_WRITE(base, c); return 1; } @@ -1022,19 +1151,33 @@ static int nu_uart_send(struct rt_serial_device *serial, char c) */ static int nu_uart_receive(struct rt_serial_device *serial) { + nu_uart_t psNuUart = (nu_uart_t)serial; + RT_ASSERT(serial); /* Get base address of uart register */ - UART_T *uart_base = ((nu_uart_t)serial)->uart_base; + UART_T *base = psNuUart->base; /* Return failure if RX-FIFO is empty. */ - if (UART_GET_RX_EMPTY(uart_base)) + if (UART_GET_RX_EMPTY(base)) { return -1; } /* Get char from RX-FIFO */ - return UART_READ(uart_base); + return UART_READ(base); +} + +void nu_uart_set_loopback(struct rt_serial_device *serial, rt_bool_t bOn) +{ + nu_uart_t psNuUart = (nu_uart_t)serial; + + RT_ASSERT(serial); + + /* Get base address of uart register */ + UART_T *base = psNuUart->base; + + bOn ? (base->MODEM |= 0x10) : (base->MODEM &= ~0x10); } /** diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_umctl2.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_umctl2.c new file mode 100644 index 0000000000..e17d7b2aca --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_umctl2.c @@ -0,0 +1,34 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2022-10-20 Wayne First version +* +******************************************************************************/ + +#include "rtthread.h" + +#if defined(BSP_USING_UMCTL2) + +#include "drv_common.h" + +rt_err_t nu_umctl2_init(void) +{ + UMCTL2->PCTRL_0 = UMCTL2_PCTRL_0_port_en_Msk; //[0x0490] + UMCTL2->PCTRL_1 = UMCTL2_PCTRL_1_port_en_Msk; //[0x0540] + UMCTL2->PCTRL_2 = UMCTL2_PCTRL_2_port_en_Msk; //[0x05f0] + UMCTL2->PCTRL_3 = UMCTL2_PCTRL_3_port_en_Msk; //[0x06a0] + + UMCTL2->PCTRL_4 = UMCTL2_PCTRL_4_port_en_Msk; //[0x0750] + UMCTL2->PCTRL_5 = UMCTL2_PCTRL_5_port_en_Msk; //[0x0800] + UMCTL2->PCTRL_6 = UMCTL2_PCTRL_6_port_en_Msk; //[0x08b0] + UMCTL2->PCTRL_7 = UMCTL2_PCTRL_7_port_en_Msk; //[0x0960] + + return RT_EOK; +} + +#endif //#if defined(BSP_USING_UMCTL2) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_umctl2.h b/bsp/nuvoton/libraries/ma35/rtt_port/drv_umctl2.h new file mode 100644 index 0000000000..e5d539f035 --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_umctl2.h @@ -0,0 +1,18 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2022-10-20 Wayne First version +* +******************************************************************************/ + +#ifndef __DRV_UMCTL2_H__ +#define __DRV_UMCTL2_H__ + +rt_err_t nu_umctl2_init(void); + +#endif /* __DRV_UMCTL2_H__*/ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_usbhost.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_usbhost.c index 2707f1c4dc..cc0642c9c8 100644 --- a/bsp/nuvoton/libraries/ma35/rtt_port/drv_usbhost.c +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_usbhost.c @@ -517,7 +517,7 @@ static int nu_pipe_xfer(upipe_t pipe, rt_uint8_t token, void *buffer, int nbytes if ((pipe->ep.bEndpointAddress & USB_DIR_MASK) == USB_DIR_OUT) { rt_memcpy(buffer_nonch, buffer, nbytes); - rt_hw_cpu_dcache_clean_inv((void *)buffer_nonch, nbytes); + rt_hw_cpu_dcache_clean_and_invalidate((void *)buffer_nonch, nbytes); } } diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_whc.c b/bsp/nuvoton/libraries/ma35/rtt_port/drv_whc.c new file mode 100644 index 0000000000..b8b5899f8e --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_whc.c @@ -0,0 +1,268 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2022-10-5 Wayne First version +* +******************************************************************************/ + +#include + +#if defined(BSP_USING_WHC) + +#include +#include "drv_whc.h" +#include "drv_sys.h" +#include "nu_bitutil.h" + +/* Private define ---------------------------------------------------------------*/ +enum +{ + WHC_START = -1, +#if defined(BSP_USING_WHC0) + WHC0_IDX, +#endif +#if defined(BSP_USING_WHC1) + WHC1_IDX, +#endif + WHC_CNT +}; + +/* Private typedef --------------------------------------------------------------*/ +struct nu_whc_priv +{ + char *name; + WHC_T *base; + IRQn_Type irqn; + uint32_t rstidx; + + rt_device_t psChDev[WHC_CH]; +}; +typedef struct nu_whc_priv *nu_whc_priv_t; + +struct nu_whc +{ + struct rt_device dev; + nu_whc_priv_t psPriv; + uint32_t u32WhcChNum; + void *pvTxBuf; +}; +typedef struct nu_whc *nu_whc_t; + +static struct nu_whc_priv nu_whc_priv_arr [] = +{ +#if defined(BSP_USING_WHC0) + { + .name = "whc0", + .base = WHC0, + .irqn = WHC0_IRQn, + .rstidx = WHC0_RST, + }, +#endif +#if defined(BSP_USING_WHC1) + { + .name = "whc1", + .base = WHC1, + .irqn = WHC1_IRQn, + .rstidx = WHC1_RST, + }, +#endif +}; /* nu_whc_priv */ + +/** + * All WHC interrupt service routine + */ +static void nu_whc_isr(int vector, void *param) +{ + nu_whc_priv_t psNuWhcPriv = (nu_whc_priv_t)param; + + volatile uint32_t vu32Intsts = psNuWhcPriv->base->INTSTS; + uint32_t irqidx; + + while ((irqidx = nu_ctz(vu32Intsts)) != 32) + { + uint32_t u32IsrBitMask = 1 << irqidx ; + + switch (irqidx) + { + /* Process TX-complete interrupt event */ + case WHC_INTSTS_TX0IF_Pos: + case WHC_INTSTS_TX1IF_Pos: + case WHC_INTSTS_TX2IF_Pos: + case WHC_INTSTS_TX3IF_Pos: + { + uint32_t u32ChNum = irqidx - WHC_INTSTS_TX0IF_Pos; + rt_device_t device = psNuWhcPriv->psChDev[u32ChNum]; + nu_whc_t psWhc = (nu_whc_t)device; + + if (device->tx_complete && psWhc->pvTxBuf) + { + device->tx_complete(device, psWhc->pvTxBuf); + psWhc->pvTxBuf = RT_NULL; + } + } + break; + + /* Process RX-indicate interrupt event */ + case WHC_INTSTS_RX0IF_Pos: + case WHC_INTSTS_RX1IF_Pos: + case WHC_INTSTS_RX2IF_Pos: + case WHC_INTSTS_RX3IF_Pos: + { + uint32_t u32ChNum = irqidx - WHC_INTSTS_RX0IF_Pos; + rt_device_t device = psNuWhcPriv->psChDev[u32ChNum]; + + if (device->rx_indicate) + { + device->rx_indicate(device, 1); + } + } + break; + + default: + break; + } + + /* Clear interrupt bit. */ + WHC_CLR_INT_FLAG(psNuWhcPriv->base, u32IsrBitMask); + + /* Clear served bit */ + vu32Intsts &= ~(u32IsrBitMask); + } +} + +rt_err_t nu_whc_init(rt_device_t dev) +{ + return RT_EOK; +} + +rt_err_t nu_whc_open(rt_device_t dev, rt_uint16_t oflag) +{ + nu_whc_t psWhc = (nu_whc_t)dev; + nu_whc_priv_t psWhcPriv = psWhc->psPriv; + + WHC_ENABLE_INT(psWhcPriv->base, WHC_INTEN_TX0IEN_Msk << psWhc->u32WhcChNum | + WHC_INTEN_RX0IEN_Msk << psWhc->u32WhcChNum); + + return RT_EOK; +} + +rt_err_t nu_whc_close(rt_device_t dev) +{ + nu_whc_t psWhc = (nu_whc_t)dev; + nu_whc_priv_t psWhcPriv = psWhc->psPriv; + + WHC_DISABLE_INT(psWhcPriv->base, WHC_INTEN_TX0IEN_Msk << psWhc->u32WhcChNum | + WHC_INTEN_RX0IEN_Msk << psWhc->u32WhcChNum); + + return RT_EOK; +} + +rt_size_t nu_whc_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) +{ + nu_whc_t psWhc = (nu_whc_t)dev; + nu_whc_priv_t psWhcPriv = psWhc->psPriv; + + if ((sizeof(nu_whc_msg) != size) || ((uint32_t)buffer & 0x3)) + goto exit_nu_whc_read; + + if (WHC_Recv(psWhcPriv->base, psWhc->u32WhcChNum, (uint32_t *)buffer) < 0) + goto exit_nu_whc_read; + + return size; + +exit_nu_whc_read: + + return 0; +} + +rt_size_t nu_whc_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) +{ + nu_whc_t psWhc = (nu_whc_t)dev; + nu_whc_priv_t psWhcPriv = psWhc->psPriv; + + if ((sizeof(nu_whc_msg) != size) || ((uint32_t)buffer & 0x3)) + goto exit_nu_whc_write; + + psWhc->pvTxBuf = (void *)buffer; + if (WHC_Send(psWhcPriv->base, psWhc->u32WhcChNum, (uint32_t *)buffer) < 0) + goto exit_nu_whc_write; + + return size; + +exit_nu_whc_write: + + return 0; +} + +rt_err_t nu_whc_control(rt_device_t dev, int cmd, void *args) +{ + return RT_EOK; +} + +static rt_err_t whc_register(nu_whc_priv_t psWhcPriv) +{ + int i; + char szDevName[16]; + + for (i = 0; i < WHC_CH; i++) + { + nu_whc_t psWhc; + rt_device_t device = rt_device_create(RT_Device_Class_Miscellaneous, sizeof(struct nu_whc) - sizeof(struct rt_device)); + RT_ASSERT(device); + + psWhcPriv->psChDev[i] = device; + psWhc = (nu_whc_t)device; + psWhc->psPriv = psWhcPriv; + psWhc->u32WhcChNum = i; + + device->type = RT_Device_Class_Miscellaneous; + device->rx_indicate = RT_NULL; + device->tx_complete = RT_NULL; + +#ifdef RT_USING_DEVICE_OPS + device->ops = RT_NULL; +#else + device->init = nu_whc_init; + device->open = nu_whc_open; + device->close = nu_whc_close; + device->read = nu_whc_read; + device->write = nu_whc_write; + device->control = nu_whc_control; +#endif + device->user_data = (void *)psWhcPriv; + + rt_snprintf(szDevName, sizeof(szDevName), "%s-%d", psWhcPriv->name, psWhc->u32WhcChNum); + + RT_ASSERT(rt_device_register(device, szDevName, RT_DEVICE_FLAG_STANDALONE) == RT_EOK); + } + + return RT_EOK; +} + +/** + * Hardware Sem Initialization + */ +int rt_hw_whc_init(void) +{ + int i; + + for (i = (WHC_START + 1); i < WHC_CNT; i++) + { + nu_whc_priv_t psNuWhcPriv = &nu_whc_priv_arr[i]; + + whc_register(psNuWhcPriv); + + rt_hw_interrupt_install(psNuWhcPriv->irqn, nu_whc_isr, psNuWhcPriv, psNuWhcPriv->name); + rt_hw_interrupt_umask(nu_whc_priv_arr[i].irqn); + } + + return 0; +} +INIT_BOARD_EXPORT(rt_hw_whc_init); + +#endif //#if defined(BSP_USING_WHC) diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/drv_whc.h b/bsp/nuvoton/libraries/ma35/rtt_port/drv_whc.h new file mode 100644 index 0000000000..02b7546aab --- /dev/null +++ b/bsp/nuvoton/libraries/ma35/rtt_port/drv_whc.h @@ -0,0 +1,24 @@ +/**************************************************************************//** +* +* @copyright (C) 2020 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2022-10-5 Wayne First version +* +******************************************************************************/ + +#ifndef __DRV_WHC_H__ +#define __DRV_WHC_H__ + +#include "drv_common.h" + +typedef struct +{ + uint32_t content[WHC_BUFFER_LEN]; +} nu_whc_msg; +typedef nu_whc_msg *nu_whc_msg_t; + +#endif /* __DRV_WHC_H__ */ diff --git a/bsp/nuvoton/libraries/ma35/rtt_port/nu_clock_init.c b/bsp/nuvoton/libraries/ma35/rtt_port/nu_clock_init.c index 228a704f7b..53a95e9837 100644 --- a/bsp/nuvoton/libraries/ma35/rtt_port/nu_clock_init.c +++ b/bsp/nuvoton/libraries/ma35/rtt_port/nu_clock_init.c @@ -191,11 +191,11 @@ static void nu_clock_i2s_init(void) { #if defined(BSP_USING_I2S0) CLK_EnableModuleClock(I2S0_MODULE); - CLK_SetModuleClock(I2S0_MODULE, CLK_CLKSEL4_I2S0SEL_SYSCLK1_DIV2, MODULE_NoMsk); + CLK_SetModuleClock(I2S0_MODULE, CLK_CLKSEL4_I2S0SEL_APLL, MODULE_NoMsk); #endif #if defined(BSP_USING_I2S1) CLK_EnableModuleClock(I2S1_MODULE); - CLK_SetModuleClock(I2S1_MODULE, CLK_CLKSEL4_I2S1SEL_SYSCLK1_DIV2, MODULE_NoMsk); + CLK_SetModuleClock(I2S1_MODULE, CLK_CLKSEL4_I2S1SEL_APLL, MODULE_NoMsk); #endif } @@ -365,6 +365,23 @@ void nu_clock_base_init(void) } #endif +static void nu_clock_hwsem_init(void) +{ +#if defined(BSP_USING_HWSEM0) + CLK_EnableModuleClock(HWSEM0_MODULE); +#endif +} + +static void nu_clock_whc_init(void) +{ +#if defined(BSP_USING_WHC0) + CLK_EnableModuleClock(WHC0_MODULE); +#endif +#if defined(BSP_USING_WHC1) + CLK_EnableModuleClock(WHC1_MODULE); +#endif +} + void nu_clock_init(void) { #if !defined(USE_MA35D1_SUBM) @@ -377,6 +394,8 @@ void nu_clock_init(void) nu_clock_disp_init(); #endif + nu_clock_whc_init(); + nu_clock_hwsem_init(); nu_clock_pdma_init(); nu_clock_gpio_init(); nu_clock_uart_init(); diff --git a/bsp/nuvoton/libraries/n9h30/rtt_port/Kconfig b/bsp/nuvoton/libraries/n9h30/rtt_port/Kconfig index 5739233cb5..ba9697f256 100644 --- a/bsp/nuvoton/libraries/n9h30/rtt_port/Kconfig +++ b/bsp/nuvoton/libraries/n9h30/rtt_port/Kconfig @@ -12,6 +12,7 @@ config SOC_SERIES_N9H30 config BSP_USING_MMU bool "Enable MMU" + select ARCH_ARM_MMU default y config BSP_USING_GPIO diff --git a/bsp/nuvoton/libraries/nu_packages/AudioCodec/acodec_nau8822.c b/bsp/nuvoton/libraries/nu_packages/AudioCodec/acodec_nau8822.c index b553d3e970..443a4aaef2 100644 --- a/bsp/nuvoton/libraries/nu_packages/AudioCodec/acodec_nau8822.c +++ b/bsp/nuvoton/libraries/nu_packages/AudioCodec/acodec_nau8822.c @@ -370,9 +370,13 @@ static rt_err_t nau8822_mixer_control(rt_uint32_t ui32Units, rt_uint32_t ui32Val break; case AUDIO_MIXER_VOLUME: { - uint8_t u8DACGAIN = 256 * ui32Value / 100; - I2C_WriteNAU8822(11, u8DACGAIN); - I2C_WriteNAU8822(12, u8DACGAIN); + uint8_t u8GAIN = 256 * ui32Value / 100; + I2C_WriteNAU8822(11, 0x100 | u8GAIN); + I2C_WriteNAU8822(12, 0x100 | u8GAIN); + + u8GAIN = 0x3F * ui32Value / 100; + I2C_WriteNAU8822(54, 0x100 | u8GAIN); + I2C_WriteNAU8822(55, 0x100 | u8GAIN); } break; case AUDIO_MIXER_QUERY: diff --git a/bsp/nuvoton/libraries/nu_packages/BMX055/libraries/BMG160_driver/bmg160.h b/bsp/nuvoton/libraries/nu_packages/BMX055/libraries/BMG160_driver/bmg160.h index d10b39bbb6..7041b49df3 100644 --- a/bsp/nuvoton/libraries/nu_packages/BMX055/libraries/BMG160_driver/bmg160.h +++ b/bsp/nuvoton/libraries/nu_packages/BMX055/libraries/BMG160_driver/bmg160.h @@ -1570,7 +1570,7 @@ FOR THE AUTO OFFSET INTERRUPT */ /***********************************************/ /**\name NUMERIC DEFINITIONS*/ /**********************************************/ -#define BMG160_INIT_VALUE ((u8)0) +#define BMG160_INIT_VALUE (0) #define BMG160_GEN_READ_WRITE_DATA_LENGTH ((u8)1) #define BMG160_X_DATA_LENGTH ((u8)2) #define BMG160_Y_DATA_LENGTH ((u8)2) diff --git a/bsp/nuvoton/libraries/nu_packages/BMX055/libraries/BMM050_driver/bmm050.h b/bsp/nuvoton/libraries/nu_packages/BMX055/libraries/BMM050_driver/bmm050.h index cf93270e01..8b9bfa8936 100644 --- a/bsp/nuvoton/libraries/nu_packages/BMX055/libraries/BMM050_driver/bmm050.h +++ b/bsp/nuvoton/libraries/nu_packages/BMX055/libraries/BMM050_driver/bmm050.h @@ -709,7 +709,7 @@ delay_func(delay_in_msec) #define E_BMM050_NULL_PTR ((s8)-127) #define ERROR ((s8)-1) #define E_BMM050_OUT_OF_RANGE ((s8)-2) -#define BMM050_NULL ((u8)0) +#define BMM050_NULL (0) #define E_BMM050_UNDEFINED_MODE (0) /********************************************/ diff --git a/bsp/nuvoton/libraries/nu_packages/BMX055/sensor_bmx055.c b/bsp/nuvoton/libraries/nu_packages/BMX055/sensor_bmx055.c index d2d946119c..cf1ada0410 100644 --- a/bsp/nuvoton/libraries/nu_packages/BMX055/sensor_bmx055.c +++ b/bsp/nuvoton/libraries/nu_packages/BMX055/sensor_bmx055.c @@ -248,14 +248,15 @@ static double get_mdps_value(int32_t i32AccelVal) return 0.0f; } -static rt_size_t bmx055_fetch_data(rt_sensor_t sensor, void *buf, rt_size_t len) +static rt_ssize_t bmx055_fetch_data(rt_sensor_t sensor, rt_sensor_data_t data, rt_size_t len) { - struct rt_sensor_data *data = (struct rt_sensor_data *)buf; + RT_ASSERT(data); + switch (sensor->info.type) { - case RT_SENSOR_CLASS_ACCE: + case RT_SENSOR_TYPE_ACCE: bma2x2_read_accel_xyzt(&g_sbmx055.accel_xyzt); - data->type = RT_SENSOR_CLASS_ACCE; + data->type = RT_SENSOR_TYPE_ACCE; /* Report mg */ data->data.acce.x = (int32_t)get_mg_value(g_sbmx055.accel_xyzt.x); @@ -263,9 +264,9 @@ static rt_size_t bmx055_fetch_data(rt_sensor_t sensor, void *buf, rt_size_t len) data->data.acce.z = (int32_t)get_mg_value(g_sbmx055.accel_xyzt.z); break; - case RT_SENSOR_CLASS_GYRO: + case RT_SENSOR_TYPE_GYRO: bmg160_get_data_XYZI(&g_sbmx055.gyro_xyzi); - data->type = RT_SENSOR_CLASS_GYRO; + data->type = RT_SENSOR_TYPE_GYRO; /* Report mdps */ data->data.gyro.x = (int32_t)get_mdps_value(g_sbmx055.gyro_xyzi.datax); @@ -273,9 +274,9 @@ static rt_size_t bmx055_fetch_data(rt_sensor_t sensor, void *buf, rt_size_t len) data->data.gyro.z = (int32_t)get_mdps_value(g_sbmx055.gyro_xyzi.dataz); break; - case RT_SENSOR_CLASS_MAG: + case RT_SENSOR_TYPE_MAG: bmm050_read_mag_data_XYZ(&g_sbmx055.mag_data); - data->type = RT_SENSOR_CLASS_MAG; + data->type = RT_SENSOR_TYPE_MAG; /* Report mquass */ data->data.mag.x = g_sbmx055.mag_data.datax; @@ -307,15 +308,15 @@ static rt_err_t bmx055_getid(rt_sensor_t sensor, rt_uint8_t *pu8) { switch (sensor->info.type) { - case RT_SENSOR_CLASS_ACCE: + case RT_SENSOR_TYPE_ACCE: *pu8 = g_sbmx055.accel.chip_id; break; - case RT_SENSOR_CLASS_GYRO: + case RT_SENSOR_TYPE_GYRO: *pu8 = g_sbmx055.gyro.chip_id; break; - case RT_SENSOR_CLASS_MAG: + case RT_SENSOR_TYPE_MAG: *pu8 = g_sbmx055.mag.company_id; break; } @@ -329,19 +330,19 @@ static rt_err_t bmx055_set_power(rt_sensor_t sensor, rt_uint8_t power_mode) switch (sensor->info.type) { - case RT_SENSOR_CLASS_ACCE: + case RT_SENSOR_TYPE_ACCE: { switch (power_mode) { - case RT_SENSOR_POWER_DOWN: + case RT_SENSOR_MODE_POWER_DOWN: power_ctr = BMA2x2_MODE_STANDBY; break; - case RT_SENSOR_POWER_NORMAL: + case RT_SENSOR_MODE_POWER_MEDIUM: power_ctr = BMA2x2_MODE_NORMAL; break; - case RT_SENSOR_POWER_LOW: + case RT_SENSOR_MODE_POWER_LOW: power_ctr = BMA2x2_MODE_LOWPOWER1; break; @@ -355,15 +356,15 @@ static rt_err_t bmx055_set_power(rt_sensor_t sensor, rt_uint8_t power_mode) } break; - case RT_SENSOR_CLASS_GYRO: + case RT_SENSOR_TYPE_GYRO: { switch (power_mode) { - case RT_SENSOR_POWER_DOWN: + case RT_SENSOR_MODE_POWER_DOWN: power_ctr = BMG160_MODE_DEEPSUSPEND; break; - case RT_SENSOR_POWER_NORMAL: + case RT_SENSOR_MODE_POWER_MEDIUM: power_ctr = BMG160_MODE_NORMAL; break; @@ -377,15 +378,15 @@ static rt_err_t bmx055_set_power(rt_sensor_t sensor, rt_uint8_t power_mode) } break; - case RT_SENSOR_CLASS_MAG: + case RT_SENSOR_TYPE_MAG: { switch (power_mode) { - case RT_SENSOR_POWER_DOWN: + case RT_SENSOR_MODE_POWER_DOWN: power_ctr = 0; break; - case RT_SENSOR_POWER_NORMAL: + case RT_SENSOR_MODE_POWER_MEDIUM: power_ctr = 1; break; @@ -412,7 +413,7 @@ static rt_err_t bmx055_set_range(rt_sensor_t sensor, rt_uint16_t range) switch (sensor->info.type) { - case RT_SENSOR_CLASS_ACCE: + case RT_SENSOR_TYPE_ACCE: { idx = find_param_index(range, accel_ranges, sizeof(accel_ranges)); if (bma2x2_set_range(accel_ranges[idx].reg) != 0) @@ -422,7 +423,7 @@ static rt_err_t bmx055_set_range(rt_sensor_t sensor, rt_uint16_t range) } break; - case RT_SENSOR_CLASS_GYRO: + case RT_SENSOR_TYPE_GYRO: { idx = find_param_index(range, gyro_ranges, sizeof(gyro_ranges)); if (bmg160_set_range_reg(gyro_ranges[idx].reg) != 0) @@ -446,7 +447,7 @@ static rt_err_t bmx055_set_odr(rt_sensor_t sensor, rt_uint16_t odr_hz) int idx; switch (sensor->info.type) { - case RT_SENSOR_CLASS_ACCE: + case RT_SENSOR_TYPE_ACCE: { idx = find_param_index(odr_hz, accel_odr, sizeof(accel_odr)); if (bma2x2_set_bw(accel_odr[idx].reg) != 0) @@ -454,7 +455,7 @@ static rt_err_t bmx055_set_odr(rt_sensor_t sensor, rt_uint16_t odr_hz) } break; - case RT_SENSOR_CLASS_GYRO: + case RT_SENSOR_TYPE_GYRO: { idx = find_param_index(odr_hz, gyro_odr, sizeof(gyro_odr)); if (bmg160_set_bw(gyro_odr[idx].reg) != 0) @@ -462,7 +463,7 @@ static rt_err_t bmx055_set_odr(rt_sensor_t sensor, rt_uint16_t odr_hz) } break; - case RT_SENSOR_CLASS_MAG: + case RT_SENSOR_TYPE_MAG: { idx = find_param_index(odr_hz, mag_odr, sizeof(mag_odr)); if (bmm050_set_data_rate(mag_odr[idx].reg) != 0) @@ -483,8 +484,8 @@ exit_bmx055_set_power: static rt_err_t bmx055_control(rt_sensor_t sensor, int cmd, void *args) { - RT_ASSERT(sensor != RT_NULL); - RT_ASSERT(args != RT_NULL); + RT_ASSERT(sensor); + RT_ASSERT(args); switch (cmd) { @@ -496,7 +497,7 @@ static rt_err_t bmx055_control(rt_sensor_t sensor, int cmd, void *args) case RT_SENSOR_CTRL_SET_RANGE: return bmx055_set_range(sensor, (rt_uint32_t)args); - case RT_SENSOR_CTRL_SET_POWER: + case RT_SENSOR_CTRL_SET_POWER_MODE: return bmx055_set_power(sensor, ((rt_uint32_t)args & 0xff)); case RT_SENSOR_CTRL_SET_ODR: @@ -521,14 +522,14 @@ static int rt_hw_bmx055_accel_init(const char *name, struct rt_sensor_config *cf if (sensor == RT_NULL) return -(RT_ENOMEM); - sensor->info.type = RT_SENSOR_CLASS_ACCE; - sensor->info.vendor = RT_SENSOR_VENDOR_BOSCH; - sensor->info.model = "bmx055_acce"; - sensor->info.unit = RT_SENSOR_UNIT_MG; - sensor->info.intf_type = RT_SENSOR_INTF_I2C; - sensor->info.range_max = 16000; - sensor->info.range_min = 2000; - sensor->info.period_min = 100; + sensor->info.type = RT_SENSOR_TYPE_ACCE; + sensor->info.vendor = RT_SENSOR_VENDOR_BOSCH; + sensor->info.name = "bmx055_acce"; + sensor->info.unit = RT_SENSOR_UNIT_MG; + sensor->info.intf_type = RT_SENSOR_INTF_I2C; + sensor->info.scale.range_max = 16000; + sensor->info.scale.range_min = 2000; + sensor->info.acquire_min = 100; rt_memcpy(&sensor->config, cfg, sizeof(struct rt_sensor_config)); sensor->ops = &sensor_ops; @@ -552,14 +553,14 @@ static int rt_hw_bmx055_gyro_init(const char *name, struct rt_sensor_config *cfg if (sensor == RT_NULL) return -(RT_ENOMEM); - sensor->info.type = RT_SENSOR_CLASS_GYRO; - sensor->info.vendor = RT_SENSOR_VENDOR_BOSCH; - sensor->info.model = "bmx055_gyro"; - sensor->info.unit = RT_SENSOR_UNIT_MDPS; - sensor->info.intf_type = RT_SENSOR_INTF_I2C; - sensor->info.range_max = 2000; - sensor->info.range_min = 125; - sensor->info.period_min = 100; + sensor->info.type = RT_SENSOR_TYPE_GYRO; + sensor->info.vendor = RT_SENSOR_VENDOR_BOSCH; + sensor->info.name = "bmx055_gyro"; + sensor->info.unit = RT_SENSOR_UNIT_MDPS; + sensor->info.intf_type = RT_SENSOR_INTF_I2C; + sensor->info.scale.range_max = 2000; + sensor->info.scale.range_min = 125; + sensor->info.acquire_min = 100; rt_memcpy(&sensor->config, cfg, sizeof(struct rt_sensor_config)); sensor->ops = &sensor_ops; @@ -583,14 +584,14 @@ static int rt_hw_bmx055_mag_init(const char *name, struct rt_sensor_config *cfg) if (sensor == RT_NULL) return -(RT_ENOMEM); - sensor->info.type = RT_SENSOR_CLASS_MAG; - sensor->info.vendor = RT_SENSOR_VENDOR_BOSCH; - sensor->info.model = "bmx055_mag"; - sensor->info.unit = RT_SENSOR_UNIT_MGAUSS; - sensor->info.intf_type = RT_SENSOR_INTF_I2C; - sensor->info.range_max = 25000; // 1uT = 10*mGauss, X/Y: 1300uT=13000mGauss, Z: 2500uT=25000mG - sensor->info.range_min = 0; - sensor->info.period_min = 100; + sensor->info.type = RT_SENSOR_TYPE_MAG; + sensor->info.vendor = RT_SENSOR_VENDOR_BOSCH; + sensor->info.name = "bmx055_mag"; + sensor->info.unit = RT_SENSOR_UNIT_MGAUSS; + sensor->info.intf_type = RT_SENSOR_INTF_I2C; + sensor->info.scale.range_max = 25000; // 1uT = 10*mGauss, X/Y: 1300uT=13000mGauss, Z: 2500uT=25000mG + sensor->info.scale.range_min = 0; + sensor->info.acquire_min = 100; rt_memcpy(&sensor->config, cfg, sizeof(struct rt_sensor_config)); sensor->ops = &sensor_ops; diff --git a/bsp/nuvoton/libraries/nu_packages/BMX055/sensor_bmx055.h b/bsp/nuvoton/libraries/nu_packages/BMX055/sensor_bmx055.h index 39dbb6a29e..d1c3494ee3 100644 --- a/bsp/nuvoton/libraries/nu_packages/BMX055/sensor_bmx055.h +++ b/bsp/nuvoton/libraries/nu_packages/BMX055/sensor_bmx055.h @@ -13,7 +13,8 @@ #ifndef __SENSOR_BMX055_H__ #define __SENSOR_BMX055_H__ -#include "sensor.h" +#include "rtdevice.h" + #include "bma2x2.h" #include "bmm050.h" #include "bmg160.h" diff --git a/bsp/nuvoton/libraries/nu_packages/Demo/SConscript b/bsp/nuvoton/libraries/nu_packages/Demo/SConscript index beabf4e3c6..fa31056d8f 100644 --- a/bsp/nuvoton/libraries/nu_packages/Demo/SConscript +++ b/bsp/nuvoton/libraries/nu_packages/Demo/SConscript @@ -1,13 +1,9 @@ Import('RTT_ROOT') from building import * + cwd = GetCurrentDir() +src = Glob('*.c') + Glob('*.cpp') CPPPATH = [cwd] -src = Split(""" - usbd_hid_dance_mouse.c - slcd_show_tick.c - usbd_cdc_vcom_echo.c - atdev_utils.c - """) group = DefineGroup('nu_pkgs_demo', src, depend = ['NU_PKG_USING_DEMO'], CPPPATH = CPPPATH) Return('group') diff --git a/bsp/nuvoton/libraries/nu_packages/CCAP_Sensors/ccap_demo.c b/bsp/nuvoton/libraries/nu_packages/Demo/ccap_demo.c similarity index 99% rename from bsp/nuvoton/libraries/nu_packages/CCAP_Sensors/ccap_demo.c rename to bsp/nuvoton/libraries/nu_packages/Demo/ccap_demo.c index 41426d2f8f..dcc3606f77 100644 --- a/bsp/nuvoton/libraries/nu_packages/CCAP_Sensors/ccap_demo.c +++ b/bsp/nuvoton/libraries/nu_packages/Demo/ccap_demo.c @@ -12,6 +12,8 @@ #include +#if defined(BSP_USING_CCAP) + #include "drv_ccap.h" #include @@ -504,7 +506,9 @@ static void ccap_grabber(void *parameter) exit_ccap_grabber: ccap_sensor_fini(rt_device_find(psGrabberParam->devname_ccap), rt_device_find(psGrabberParam->devname_sensor)); - rt_device_close(psDevLcd); + + if (psDevLcd != RT_NULL) + rt_device_close(psDevLcd); return; } @@ -539,4 +543,5 @@ int ccap_demo(void) return 0; } MSH_CMD_EXPORT(ccap_demo, camera capture demo); -//INIT_APP_EXPORT(ccap_demo); +//INIT_ENV_EXPORT(ccap_demo); +#endif diff --git a/bsp/nuvoton/libraries/nu_packages/Demo/ccap_saver.c b/bsp/nuvoton/libraries/nu_packages/Demo/ccap_saver.c new file mode 100644 index 0000000000..3004711de4 --- /dev/null +++ b/bsp/nuvoton/libraries/nu_packages/Demo/ccap_saver.c @@ -0,0 +1,409 @@ +/**************************************************************************//** +* +* @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2022-8-16 Wayne First version +* +******************************************************************************/ + +#include + +#if defined(BSP_USING_CCAP) + +#include "drv_ccap.h" +#include + +#define DBG_ENABLE +#define DBG_LEVEL DBG_LOG +#define DBG_SECTION_NAME "ccap.saver" +#define DBG_COLOR +#include + +#define THREAD_PRIORITY 5 +#define THREAD_STACK_SIZE 4096 +#define THREAD_TIMESLICE 5 + +#define DEF_FRAME_WIDTH 640 +#define DEF_FRAME_HEIGHT 480 + +typedef struct +{ + char *thread_name; + char *devname_ccap; + char *devname_sensor; +} ccap_grabber_param; +typedef ccap_grabber_param *ccap_grabber_param_t; + +typedef struct +{ + ccap_config sCcapConfig; + uint32_t u32CurFBPointer; + uint32_t u32FrameEnd; + rt_sem_t semFrameEnd; +} ccap_grabber_context; +typedef ccap_grabber_context *ccap_grabber_context_t; + +static void nu_ccap_event_hook(void *pvData, uint32_t u32EvtMask) +{ + ccap_grabber_context_t psGrabberContext = (ccap_grabber_context_t)pvData; + + if (u32EvtMask & NU_CCAP_FRAME_END) + { + rt_sem_release(psGrabberContext->semFrameEnd); + } + + if (u32EvtMask & NU_CCAP_ADDRESS_MATCH) + { + LOG_I("Address matched"); + } + + if (u32EvtMask & NU_CCAP_MEMORY_ERROR) + { + LOG_E("Access memory error"); + } +} + +static rt_device_t ccap_sensor_init(ccap_grabber_context_t psGrabberContext, ccap_grabber_param_t psGrabberParam) +{ + rt_err_t ret; + ccap_view_info_t psViewInfo; + sensor_mode_info *psSensorModeInfo; + rt_device_t psDevSensor = RT_NULL; + rt_device_t psDevCcap = RT_NULL; + ccap_config_t psCcapConfig = &psGrabberContext->sCcapConfig; + + psDevCcap = rt_device_find(psGrabberParam->devname_ccap); + if (psDevCcap == RT_NULL) + { + LOG_E("Can't find %s", psGrabberParam->devname_ccap); + goto exit_ccap_sensor_init; + } + + psDevSensor = rt_device_find(psGrabberParam->devname_sensor); + if (psDevSensor == RT_NULL) + { + LOG_E("Can't find %s", psGrabberParam->devname_sensor); + goto exit_ccap_sensor_init; + } + + /* Packet pipe for preview */ + psCcapConfig->sPipeInfo_Packet.u32Width = DEF_FRAME_WIDTH; + psCcapConfig->sPipeInfo_Packet.u32Height = DEF_FRAME_HEIGHT; + psCcapConfig->sPipeInfo_Packet.pu8FarmAddr = rt_malloc_align(psCcapConfig->sPipeInfo_Packet.u32Height * psCcapConfig->sPipeInfo_Packet.u32Width * 2, 32); + if (psCcapConfig->sPipeInfo_Packet.pu8FarmAddr == RT_NULL) + { + LOG_E("Can't malloc"); + goto exit_ccap_sensor_init; + } + + psCcapConfig->sPipeInfo_Packet.u32PixFmt = CCAP_PAR_OUTFMT_RGB565; + psCcapConfig->u32Stride_Packet = psCcapConfig->sPipeInfo_Packet.u32Width; + + /* Planar pipe for encoding */ + psCcapConfig->sPipeInfo_Planar.u32Width = psCcapConfig->sPipeInfo_Packet.u32Width; + psCcapConfig->sPipeInfo_Planar.u32Height = psCcapConfig->sPipeInfo_Packet.u32Height; + psCcapConfig->sPipeInfo_Planar.pu8FarmAddr = rt_malloc_align(psCcapConfig->sPipeInfo_Planar.u32Height * psCcapConfig->sPipeInfo_Planar.u32Width * 2, 32); + if (psCcapConfig->sPipeInfo_Planar.pu8FarmAddr == RT_NULL) + { + LOG_E("Can't malloc"); + goto exit_ccap_sensor_init; + } + + psCcapConfig->sPipeInfo_Planar.u32PixFmt = CCAP_PAR_PLNFMT_YUV422; + psCcapConfig->u32Stride_Planar = psCcapConfig->sPipeInfo_Planar.u32Width; + + LOG_I("Packet.FarmAddr@0x%08X", psCcapConfig->sPipeInfo_Packet.pu8FarmAddr); + LOG_I("Packet.FarmWidth: %d", psCcapConfig->sPipeInfo_Packet.u32Width); + LOG_I("Packet.FarmHeight: %d", psCcapConfig->sPipeInfo_Packet.u32Height); + + LOG_I("Planar.FarmAddr@0x%08X", psCcapConfig->sPipeInfo_Planar.pu8FarmAddr); + LOG_I("Planar.FarmWidth: %d", psCcapConfig->sPipeInfo_Planar.u32Width); + LOG_I("Planar.FarmHeight: %d", psCcapConfig->sPipeInfo_Planar.u32Height); + + /* open CCAP */ + ret = rt_device_open(psDevCcap, 0); + if (ret != RT_EOK) + { + LOG_E("Can't open %s", psGrabberParam->devname_ccap); + goto exit_ccap_sensor_init; + } + + /* Find suit mode for packet pipe */ + if (psCcapConfig->sPipeInfo_Packet.pu8FarmAddr != RT_NULL) + { + /* Check view window of packet pipe */ + psViewInfo = &psCcapConfig->sPipeInfo_Packet; + + if ((rt_device_control(psDevSensor, CCAP_SENSOR_CMD_GET_SUIT_MODE, (void *)&psViewInfo) != RT_EOK) + || (psViewInfo == RT_NULL)) + { + LOG_E("Can't get suit mode for packet."); + goto fail_ccap_init; + } + } + + /* Find suit mode for planner pipe */ + if (psCcapConfig->sPipeInfo_Planar.pu8FarmAddr != RT_NULL) + { + int recheck = 1; + + if (psViewInfo != RT_NULL) + { + if ((psCcapConfig->sPipeInfo_Planar.u32Width <= psViewInfo->u32Width) || + (psCcapConfig->sPipeInfo_Planar.u32Height <= psViewInfo->u32Height)) + recheck = 0; + } + + if (recheck) + { + /* Check view window of planner pipe */ + psViewInfo = &psCcapConfig->sPipeInfo_Planar; + + /* Find suit mode */ + if ((rt_device_control(psDevSensor, CCAP_SENSOR_CMD_GET_SUIT_MODE, (void *)&psViewInfo) != RT_EOK) + || (psViewInfo == RT_NULL)) + { + LOG_E("Can't get suit mode for planner."); + goto exit_ccap_sensor_init; + } + } + } + + /* Set cropping rectangle */ + psCcapConfig->sRectCropping.x = 0; + psCcapConfig->sRectCropping.y = 0; + psCcapConfig->sRectCropping.width = psViewInfo->u32Width; + psCcapConfig->sRectCropping.height = psViewInfo->u32Height; + + /* ISR Hook */ + psCcapConfig->pfnEvHndler = nu_ccap_event_hook; + psCcapConfig->pvData = (void *)psGrabberContext; + + /* Get Suitable mode. */ + psSensorModeInfo = (sensor_mode_info *)psViewInfo; + + /* Feed CCAP configuration */ + ret = rt_device_control(psDevCcap, CCAP_CMD_CONFIG, (void *)psCcapConfig); + if (ret != RT_EOK) + { + LOG_E("Can't feed configuration %s", psGrabberParam->devname_ccap); + goto fail_ccap_init; + } + + { + int i32SenClk = psSensorModeInfo->u32SenClk; + + /* speed up pixel clock */ + if (rt_device_control(psDevCcap, CCAP_CMD_SET_SENCLK, (void *)&i32SenClk) != RT_EOK) + { + LOG_E("Can't feed setting."); + goto fail_ccap_init; + } + } + + /* Initial CCAP sensor */ + if (rt_device_open(psDevSensor, 0) != RT_EOK) + { + LOG_E("Can't open sensor."); + goto fail_sensor_init; + } + + /* Feed settings to sensor */ + if (rt_device_control(psDevSensor, CCAP_SENSOR_CMD_SET_MODE, (void *)psSensorModeInfo) != RT_EOK) + { + LOG_E("Can't feed setting."); + goto fail_sensor_init; + } + + ret = rt_device_control(psDevCcap, CCAP_CMD_SET_PIPES, (void *)psViewInfo); + if (ret != RT_EOK) + { + LOG_E("Can't set pipes %s", psGrabberParam->devname_ccap); + goto fail_ccap_init; + } + + return psDevCcap; + +fail_sensor_init: + + if (psDevSensor) + rt_device_close(psDevSensor); + +fail_ccap_init: + + if (psDevCcap) + rt_device_close(psDevCcap); + +exit_ccap_sensor_init: + + psDevCcap = psDevSensor = RT_NULL; + + return psDevCcap; +} + +static void ccap_sensor_fini(rt_device_t psDevCcap, rt_device_t psDevSensor) +{ + if (psDevSensor) + rt_device_close(psDevSensor); + + if (psDevCcap) + rt_device_close(psDevCcap); +} + +static int ccap_save_frame(char *szFilename, const void *data, size_t size) +{ + int fd; + int wrote_size = 0; + + fd = open(szFilename, O_WRONLY | O_CREAT); + if (fd < 0) + { + LOG_E("Could not open %s for writing.", szFilename); + goto exit_ccap_save_planar_frame; + } + + if ((wrote_size = write(fd, data, size)) != size) + { + LOG_E("Could not write to %s (%d != %d).", szFilename, wrote_size, size); + goto exit_ccap_save_planar_frame; + } + + wrote_size = size; + + LOG_I("Output %s", szFilename); + +exit_ccap_save_planar_frame: + + if (fd >= 0) + close(fd); + + return wrote_size; +} + +static void ccap_grabber(void *parameter) +{ + ccap_grabber_param_t psGrabberParam = (ccap_grabber_param_t)parameter; + ccap_grabber_context sGrabberContext; + + rt_device_t psDevCcap = RT_NULL; + + rt_memset((void *)&sGrabberContext, 0, sizeof(ccap_grabber_context)); + + sGrabberContext.semFrameEnd = rt_sem_create(psGrabberParam->devname_ccap, 0, RT_IPC_FLAG_FIFO); + if (sGrabberContext.semFrameEnd == RT_NULL) + { + LOG_E("Can't allocate sem resource %s", psGrabberParam->devname_ccap); + goto exit_ccap_grabber; + } + + /* initial ccap & sensor*/ + psDevCcap = ccap_sensor_init(&sGrabberContext, psGrabberParam); + if (psDevCcap == RT_NULL) + { + LOG_E("Can't init %s and %s", psGrabberParam->devname_ccap, psGrabberParam->devname_sensor); + goto exit_ccap_grabber; + } + + /* Start to capture */ + if (rt_device_control(psDevCcap, CCAP_CMD_START_CAPTURE, RT_NULL) != RT_EOK) + { + LOG_E("Can't start %s", psGrabberParam->devname_ccap); + goto exit_ccap_grabber; + } + + while (1) + { + if (sGrabberContext.semFrameEnd) + { + rt_sem_take(sGrabberContext.semFrameEnd, RT_WAITING_FOREVER); + } + + sGrabberContext.u32FrameEnd++; + LOG_I("%s Grabbed %d", psGrabberParam->devname_ccap, sGrabberContext.u32FrameEnd); + + if (sGrabberContext.u32FrameEnd == 30) + { + char szFilename[64]; + uint32_t u32Factor = 0; + + LOG_I("%s Capturing %d", psGrabberParam->devname_ccap, sGrabberContext.u32FrameEnd); + + if (sGrabberContext.sCcapConfig.sPipeInfo_Planar.u32PixFmt == CCAP_PAR_PLNFMT_YUV420) + { + u32Factor = 3; + rt_snprintf(szFilename, sizeof(szFilename), "/%08d_%dx%d.yuv420p", + rt_tick_get(), + sGrabberContext.sCcapConfig.sPipeInfo_Planar.u32Width, + sGrabberContext.sCcapConfig.sPipeInfo_Planar.u32Height); + } + else if (sGrabberContext.sCcapConfig.sPipeInfo_Planar.u32PixFmt == CCAP_PAR_PLNFMT_YUV422) + { + u32Factor = 4; + rt_snprintf(szFilename, sizeof(szFilename), "/%08d_%s_%dx%d.yuv422p", + rt_tick_get(), + psGrabberParam->devname_ccap, + sGrabberContext.sCcapConfig.sPipeInfo_Planar.u32Width, + sGrabberContext.sCcapConfig.sPipeInfo_Planar.u32Height); + } + + if (u32Factor > 0) + { + /* Save YUV422 or YUV420 frame from packet pipe*/ + ccap_save_frame(szFilename, (const void *)sGrabberContext.sCcapConfig.sPipeInfo_Planar.pu8FarmAddr, sGrabberContext.sCcapConfig.sPipeInfo_Planar.u32Width * sGrabberContext.sCcapConfig.sPipeInfo_Planar.u32Height * u32Factor / 2); + } + + /* Save RGB565 frame from packet pipe*/ + rt_snprintf(szFilename, sizeof(szFilename), "/%08d_%s_%dx%d.rgb565", + rt_tick_get(), + psGrabberParam->devname_ccap, + sGrabberContext.sCcapConfig.sPipeInfo_Packet.u32Width, + sGrabberContext.sCcapConfig.sPipeInfo_Packet.u32Height); + + ccap_save_frame(szFilename, (const void *)sGrabberContext.sCcapConfig.sPipeInfo_Packet.pu8FarmAddr, sGrabberContext.sCcapConfig.sPipeInfo_Packet.u32Width * sGrabberContext.sCcapConfig.sPipeInfo_Packet.u32Height * 2); + + break; + } + } + +exit_ccap_grabber: + + ccap_sensor_fini(rt_device_find(psGrabberParam->devname_ccap), rt_device_find(psGrabberParam->devname_sensor)); + + return; +} + +static void ccap_grabber_create(ccap_grabber_param_t psGrabberParam) +{ + rt_thread_t ccap_thread = rt_thread_find(psGrabberParam->thread_name); + if (ccap_thread == RT_NULL) + { + ccap_thread = rt_thread_create(psGrabberParam->thread_name, + ccap_grabber, + psGrabberParam, + THREAD_STACK_SIZE, + THREAD_PRIORITY, + THREAD_TIMESLICE); + + if (ccap_thread != RT_NULL) + rt_thread_startup(ccap_thread); + } +} + +int ccap_saver(void) +{ +#if defined(BSP_USING_CCAP0) + static ccap_grabber_param ccap0_grabber_param = {"grab0", "ccap0", "sensor0"}; + ccap_grabber_create(&ccap0_grabber_param); +#endif +#if defined(BSP_USING_CCAP1) + static ccap_grabber_param ccap1_grabber_param = {"grab1", "ccap1", "sensor1"}; + ccap_grabber_create(&ccap1_grabber_param); +#endif + return 0; +} +MSH_CMD_EXPORT(ccap_saver, camera saver demo); +#endif diff --git a/bsp/nuvoton/libraries/nu_packages/Demo/hwsem_counter.c b/bsp/nuvoton/libraries/nu_packages/Demo/hwsem_counter.c new file mode 100644 index 0000000000..b07e69ba41 --- /dev/null +++ b/bsp/nuvoton/libraries/nu_packages/Demo/hwsem_counter.c @@ -0,0 +1,93 @@ +/**************************************************************************//** +* +* @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2022-10-5 Wayne First version +* +******************************************************************************/ + +#include + +#if defined(BSP_USING_HWSEM) + +#include "drv_common.h" +#include "drv_hwsem.h" + +#define DEF_COUNTER_ADDR_RTP (3*1024*1024) +#define DEF_COUNTER_ADDR_A35 ((0x80000000+DEF_COUNTER_ADDR_RTP)|UNCACHEABLE) + +#if defined(USE_MA35D1_SUBM) + #define DEF_COUNTER_ADDR DEF_COUNTER_ADDR_RTP +#else + #define DEF_COUNTER_ADDR DEF_COUNTER_ADDR_A35 +#endif + +static void hwsem_counter_go(void *parameter) +{ + rt_err_t ret; + rt_device_t psNuHwSem = (rt_device_t)parameter; + uint32_t *pu32Counter = (uint32_t *)DEF_COUNTER_ADDR; + + nu_mutex_t psNuMutex = nu_mutex_init(psNuHwSem, evHWSEM0); + if (psNuMutex == RT_NULL) + return; + + *pu32Counter = 0; + while (1) + { + ret = nu_mutex_take(psNuMutex, RT_WAITING_FOREVER); + if (ret != RT_EOK) + continue; + + if (*pu32Counter >= 10) + { + nu_mutex_release(psNuMutex); + break; + } + else + *pu32Counter = *pu32Counter + 1; + +#ifdef RT_USING_SMP + rt_kprintf("[%08x@CPU-%d] ->Inc %d@%08x\n", rt_thread_self(), rt_hw_cpu_id(), *pu32Counter, DEF_COUNTER_ADDR); +#else + rt_kprintf("[%08x]-> Inc %d@%08x\n", rt_thread_self(), *pu32Counter, DEF_COUNTER_ADDR); +#endif /* RT_USING_SMP */ + + nu_mutex_release(psNuMutex); + + /* Relax, fair to get the mutex. */ + rt_thread_mdelay(500); + } + + nu_mutex_deinit(psNuHwSem, evHWSEM0); +} + +static int hwsem_counter_app(void) +{ + rt_err_t result = 0; + rt_thread_t thread; + rt_device_t psNuHwSem = rt_device_find("hwsem0"); + if (psNuHwSem == RT_NULL) + return -1; + + thread = rt_thread_create("hwsa35", hwsem_counter_go, (void *)psNuHwSem, 2048, 25, 20); + if (thread != RT_NULL) + { +#ifdef RT_USING_SMP + rt_thread_control(thread, RT_THREAD_CTRL_BIND_CPU, (void *)0); +#endif + result = rt_thread_startup(thread); + RT_ASSERT(result == RT_EOK); + } + + return 0; +} +INIT_APP_EXPORT(hwsem_counter_app); +MSH_CMD_EXPORT(hwsem_counter_app, demo hwsem); + +#endif /* #if defined(BSP_USING_HWSEM)*/ + diff --git a/bsp/nuvoton/libraries/nu_packages/Demo/smp_demo.c b/bsp/nuvoton/libraries/nu_packages/Demo/smp_demo.c new file mode 100644 index 0000000000..a3f8309521 --- /dev/null +++ b/bsp/nuvoton/libraries/nu_packages/Demo/smp_demo.c @@ -0,0 +1,177 @@ +/**************************************************************************//** +* +* @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2022-8-16 Wayne First version +* +******************************************************************************/ + +#include + +#if defined(RT_USING_SMP) +#include "drv_common.h" + + +#define DEF_COUNTER_ADDR_RTP (3*1024*1024) +#define DEF_COUNTER_ADDR_A35 ((0x80000000+DEF_COUNTER_ADDR_RTP)|UNCACHEABLE) + +#if defined(USE_MA35D1_SUBM) + #define DEF_COUNTER_ADDR DEF_COUNTER_ADDR_RTP +#else + #define DEF_COUNTER_ADDR DEF_COUNTER_ADDR_A35 +#endif + +void happy_counter(void *pdata) +{ + uint32_t counter = 0; + while (1) + { + rt_kprintf("cpu-%d %d\r\n", rt_hw_cpu_id(), counter++); + rt_thread_mdelay(1000); + } +} + +void go_happy_counter(void) +{ + rt_thread_t tid = rt_thread_create("cpu-1", happy_counter, RT_NULL, 2048, 10, 20); + RT_ASSERT(tid != RT_NULL); + + rt_thread_control(tid, RT_THREAD_CTRL_BIND_CPU, (void *)1); + + rt_thread_startup(tid); +} +MSH_CMD_EXPORT(go_happy_counter, go happy counter); + +void happy_memcpy(void *pdata) +{ + volatile uint32_t counter = 0; + void *srcbuf, *dstbuf; + rt_tick_t last, now; + +#define DEF_BUF_SIZE 4096 +#define DEF_TIMES 500000 + srcbuf = rt_malloc_align(DEF_BUF_SIZE, nu_cpu_dcache_line_size()); + dstbuf = rt_malloc_align(DEF_BUF_SIZE, nu_cpu_dcache_line_size()); + + now = rt_tick_get(); + while (counter < DEF_TIMES) + { + rt_memcpy(dstbuf, srcbuf, DEF_BUF_SIZE); + counter++; + } + last = rt_tick_get(); + + if (rt_hw_cpu_id() == 1) + rt_thread_mdelay(1000); + + rt_kprintf("%d Bytes copied by cpu-%d in %d ms\n", DEF_TIMES * DEF_BUF_SIZE, rt_hw_cpu_id(), last - now); + + rt_free_align(srcbuf); + rt_free_align(dstbuf); +} + +void go_happy_memcpy_0_1(void) +{ + rt_thread_t tid0, tid1; + + tid0 = rt_thread_create("cpu-0", happy_memcpy, RT_NULL, 2048, 10, 20); + RT_ASSERT(tid0 != RT_NULL); + rt_thread_control(tid0, RT_THREAD_CTRL_BIND_CPU, (void *)0); + + tid1 = rt_thread_create("cpu-1", happy_memcpy, RT_NULL, 2048, 10, 20); + RT_ASSERT(tid1 != RT_NULL); + rt_thread_control(tid1, RT_THREAD_CTRL_BIND_CPU, (void *)1); + + rt_thread_startup(tid0); + rt_thread_startup(tid1); +} +MSH_CMD_EXPORT(go_happy_memcpy_0_1, go happy memcpy on dual - core); + +void go_happy_memcpy_0(void) +{ + rt_thread_t tid0; + + tid0 = rt_thread_create("cpu-0", happy_memcpy, RT_NULL, 2048, 10, 20); + RT_ASSERT(tid0 != RT_NULL); + rt_thread_control(tid0, RT_THREAD_CTRL_BIND_CPU, (void *)0); + + rt_thread_startup(tid0); +} +MSH_CMD_EXPORT(go_happy_memcpy_0, go happy memcpy on core0); + +void go_happy_memcpy_1(void) +{ + rt_thread_t tid1; + + tid1 = rt_thread_create("cpu-1", happy_memcpy, RT_NULL, 2048, 10, 20); + RT_ASSERT(tid1 != RT_NULL); + rt_thread_control(tid1, RT_THREAD_CTRL_BIND_CPU, (void *)1); + + rt_thread_startup(tid1); +} +MSH_CMD_EXPORT(go_happy_memcpy_1, go happy memcpy on core1); + +static void happy_mutex(void *parameter) +{ + rt_err_t ret; + rt_mutex_t psMutex = (rt_mutex_t)parameter; + uint32_t *pu32Counter = (uint32_t *)DEF_COUNTER_ADDR; + + *pu32Counter = 0; + while (1) + { + ret = rt_mutex_take(psMutex, RT_WAITING_FOREVER); + if (ret != RT_EOK) + continue; + + if (*pu32Counter >= 1000) + { + rt_mutex_release(psMutex); + break; + } + else + *pu32Counter = *pu32Counter + 1; + +#ifdef RT_USING_SMP + rt_kprintf("[%08x@CPU-%d] ->Inc %d@%08x\n", rt_thread_self(), rt_hw_cpu_id(), *pu32Counter, DEF_COUNTER_ADDR); +#else + rt_kprintf("[%08x]-> Inc %d@%08x\n", rt_thread_self(), *pu32Counter, DEF_COUNTER_ADDR); +#endif /* RT_USING_SMP */ + + rt_mutex_release(psMutex); + } +} + +static int go_happy_mutex(void) +{ + rt_thread_t thread; + rt_mutex_t sem = rt_mutex_create("mutexsem", RT_IPC_FLAG_PRIO); + + thread = rt_thread_create("mutex0", happy_mutex, (void *)sem, 2048, 25, 20); + if (thread != RT_NULL) + { +#ifdef RT_USING_SMP + rt_thread_control(thread, RT_THREAD_CTRL_BIND_CPU, (void *)0); +#endif + rt_thread_startup(thread); + } + + thread = rt_thread_create("mutex1", happy_mutex, (void *)sem, 2048, 25, 20); + if (thread != RT_NULL) + { +#ifdef RT_USING_SMP + rt_thread_control(thread, RT_THREAD_CTRL_BIND_CPU, (void *)1); +#endif + rt_thread_startup(thread); + } + + return 0; +} +MSH_CMD_EXPORT(go_happy_mutex, demo mutex); + + +#endif diff --git a/bsp/nuvoton/libraries/nu_packages/Demo/wormhole_demo.c b/bsp/nuvoton/libraries/nu_packages/Demo/wormhole_demo.c new file mode 100644 index 0000000000..bf2b8d7ad7 --- /dev/null +++ b/bsp/nuvoton/libraries/nu_packages/Demo/wormhole_demo.c @@ -0,0 +1,325 @@ +/**************************************************************************//** +* +* @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2022-10-10 Wayne First version +* +******************************************************************************/ + +#include + +#if defined(BSP_USING_WHC) + +#include "drv_whc.h" +#include + +#define DBG_ENABLE +#define DBG_LEVEL DBG_LOG +#define DBG_SECTION_NAME "whc.demo" +#define DBG_COLOR +#include + +#define USE_WORMHOLE_CHNAME "whc0-0" + +typedef enum +{ + evCMD_MEM_ALLOCATE, + evCMD_MEM_FREE, + evCMD_MEM_COPY, + evCMD_DEVMEM_WRITE, + evCMD_DEVMEM_READ, + evCMD_MEM_SET +} nu_whc_cmd; + +typedef enum +{ + evCMD_REQ, + evCMD_RESP, +} nu_whc_cmd_type; + +#define CMD_TYPE_Pos 16 +#define CMD_TYPE_Msk (3<>CMD_TYPE_Pos)==evCMD_REQ) +#define CMD_IS_RESP(m) (((m.u32Cmd&CMD_TYPE_Msk)>>CMD_TYPE_Pos)==evCMD_RESP) + +typedef struct +{ + union + { + nu_whc_msg sMsgBuf; + struct + { + uint32_t u32Cmd; + uint32_t u32Addr0; //Dst, free, allocate, set + uint32_t u32Addr1; //Src, value + uint32_t u32Size; + } msg; + }; +} whc_mem; +typedef whc_mem *whc_mem_t; + +static struct rt_semaphore tx_sem; +static struct rt_semaphore rx_sem; +static rt_device_t device = RT_NULL; + +static rt_err_t whc_tx_complete(rt_device_t dev, void *buffer) +{ + return rt_sem_release(&tx_sem); +} + +static rt_err_t whc_rx_indicate(rt_device_t dev, rt_size_t size) +{ + return rt_sem_release(&rx_sem); +} + +static rt_err_t proc_msg(whc_mem_t req, whc_mem_t resp) +{ + switch ((nu_whc_cmd)req->msg.u32Cmd) + { + case evCMD_MEM_ALLOCATE: + resp->msg.u32Addr0 = (uint32_t)rt_malloc(req->msg.u32Size); + resp->msg.u32Size = req->msg.u32Size; + resp->msg.u32Cmd = PACK_MSG_CMD(evCMD_RESP, evCMD_MEM_ALLOCATE); + break; + + case evCMD_MEM_FREE: + rt_free((void *)req->msg.u32Addr0); + resp->msg.u32Addr0 = (uint32_t)req->msg.u32Addr0; + resp->msg.u32Cmd = PACK_MSG_CMD(evCMD_RESP, evCMD_MEM_FREE); + resp->msg.u32Size = 0; + break; + + case evCMD_MEM_COPY: + rt_memcpy((void *)req->msg.u32Addr0, (void *)req->msg.u32Addr1, req->msg.u32Size); + resp->msg.u32Cmd = PACK_MSG_CMD(evCMD_RESP, evCMD_MEM_COPY); + resp->msg.u32Addr0 = (uint32_t)req->msg.u32Addr0; + resp->msg.u32Addr1 = (uint32_t)req->msg.u32Addr1; + resp->msg.u32Size = req->msg.u32Size; + break; + + case evCMD_MEM_SET: + rt_memset((void *)req->msg.u32Addr0, (req->msg.u32Addr1 & 0xff), req->msg.u32Size); + resp->msg.u32Cmd = PACK_MSG_CMD(evCMD_RESP, evCMD_MEM_SET); + resp->msg.u32Addr0 = (uint32_t)req->msg.u32Addr0; + resp->msg.u32Addr1 = (uint32_t)(req->msg.u32Addr1 & 0xff); + resp->msg.u32Size = req->msg.u32Size; + break; + + case evCMD_DEVMEM_WRITE: + *((vu32 *)req->msg.u32Addr0) = req->msg.u32Addr1; + + resp->msg.u32Cmd = PACK_MSG_CMD(evCMD_RESP, evCMD_DEVMEM_WRITE); + resp->msg.u32Addr0 = 0; + resp->msg.u32Addr1 = 0; + resp->msg.u32Size = sizeof(uint32_t); + break; + + case evCMD_DEVMEM_READ: + resp->msg.u32Cmd = PACK_MSG_CMD(evCMD_RESP, evCMD_DEVMEM_READ); + resp->msg.u32Addr0 = *((vu32 *)req->msg.u32Addr0); + resp->msg.u32Addr1 = 0; + resp->msg.u32Size = sizeof(uint32_t); + break; + + default: + return -RT_ERROR; + } + + return -RT_ERROR; +} + +static rt_err_t send_msg(whc_mem_t req) +{ + if (device) + { + if (sizeof(nu_whc_msg) != rt_device_write(device, 0, req, sizeof(nu_whc_msg))) + { + LOG_E("Failed to send msg."); + return -RT_ERROR; + } + + if (-RT_ETIMEOUT == rt_sem_take(&tx_sem, 100)) + LOG_E("Timeout cant get ACK."); + } + + return RT_EOK; +} + + +static void whc_daemon(void *parameter) +{ + rt_err_t ret; + + device = rt_device_find(USE_WORMHOLE_CHNAME); + RT_ASSERT(device); + + /* Init semaphores */ + ret = rt_sem_init(&tx_sem, "whc_tx", 0, RT_IPC_FLAG_PRIO); + RT_ASSERT(ret == RT_EOK); + + ret = rt_sem_init(&rx_sem, "whc_rx", 0, RT_IPC_FLAG_PRIO); + RT_ASSERT(ret == RT_EOK); + + /* Set tx complete function */ + ret = rt_device_set_tx_complete(device, whc_tx_complete); + RT_ASSERT(ret == RT_EOK); + + /* Set rx indicate function */ + ret = rt_device_set_rx_indicate(device, whc_rx_indicate); + RT_ASSERT(ret == RT_EOK); + + ret = rt_device_open(device, 0); + if (!device) + { + LOG_E("Failed to open %s", USE_WORMHOLE_CHNAME); + return; + } + + while (1) + { + if (rt_sem_take(&rx_sem, RT_WAITING_FOREVER) == RT_EOK) + { + nu_whc_msg sNuWhcMsg; + whc_mem_t psWhcMem = (whc_mem_t)&sNuWhcMsg; + + if (sizeof(nu_whc_msg) != rt_device_read(device, 0, psWhcMem, sizeof(nu_whc_msg))) + continue; + + if (CMD_IS_REQ(psWhcMem->msg)) + { + nu_whc_msg sNuWhcMsg_Resp; + + proc_msg((whc_mem_t)&sNuWhcMsg, (whc_mem_t)&sNuWhcMsg_Resp); + send_msg((whc_mem_t)&sNuWhcMsg_Resp); + } + else if (CMD_IS_RESP(psWhcMem->msg)) + { + LOG_I("Get Resp. 0x%08x 0x%08x 0x%08x %d", + psWhcMem->msg.u32Cmd, + psWhcMem->msg.u32Addr0, + psWhcMem->msg.u32Addr1, + psWhcMem->msg.u32Size); + } + + } //if + + } //while +} + +static int wormhole_app(void) +{ + rt_err_t result = 0; + rt_thread_t thread; + + thread = rt_thread_create("whcD", whc_daemon, RT_NULL, 2048, 25, 20); + if (thread != RT_NULL) + { + result = rt_thread_startup(thread); + RT_ASSERT(result == RT_EOK); + } + + return 0; +} +INIT_COMPONENT_EXPORT(wormhole_app); + +void *whc_malloc(uint32_t u32Size) +{ + whc_mem sWhcMem; + + sWhcMem.msg.u32Cmd = PACK_MSG_CMD(evCMD_REQ, evCMD_MEM_ALLOCATE); + sWhcMem.msg.u32Size = (uint32_t)u32Size; + + send_msg(&sWhcMem); + + return 0; +} +RTM_EXPORT(whc_malloc); + +void *whc_memcpy(void *pvDst, void *pvSrc, uint32_t u32Size) +{ + whc_mem sWhcMem; + + sWhcMem.msg.u32Cmd = PACK_MSG_CMD(evCMD_REQ, evCMD_MEM_COPY); + sWhcMem.msg.u32Addr0 = (uint32_t)pvDst; + sWhcMem.msg.u32Addr1 = (uint32_t)pvSrc; + sWhcMem.msg.u32Size = (uint32_t)u32Size; + + send_msg(&sWhcMem); + + return 0; +} +RTM_EXPORT(whc_memcpy); + + +uint32_t whc_devmem_write(void *pvaddr, uint32_t u32value) +{ + whc_mem sWhcMem; + + sWhcMem.msg.u32Cmd = PACK_MSG_CMD(evCMD_REQ, evCMD_DEVMEM_WRITE); + sWhcMem.msg.u32Addr0 = (uint32_t)pvaddr; + sWhcMem.msg.u32Addr1 = u32value; + sWhcMem.msg.u32Size = sizeof(uint32_t); + + send_msg(&sWhcMem); + + return 0; +} +RTM_EXPORT(whc_devmem_write); + +uint32_t whc_devmem_read(void *pvaddr) +{ + whc_mem sWhcMem; + + sWhcMem.msg.u32Cmd = PACK_MSG_CMD(evCMD_REQ, evCMD_DEVMEM_READ); + sWhcMem.msg.u32Addr0 = (uint32_t)pvaddr; + sWhcMem.msg.u32Addr1 = 0; + sWhcMem.msg.u32Size = sizeof(uint32_t); + + send_msg(&sWhcMem); + + return 0; +} +RTM_EXPORT(whc_devmem_read); + +void whc_devmem(int argc, char *argv[]) +{ + volatile unsigned int u32Addr; + unsigned int value = 0, mode = 0; + + if (argc < 2 || argc > 3) + { + goto exit_devmem; + } + + if (argc == 3) + { + if (sscanf(argv[2], "0x%x", &value) != 1) + goto exit_devmem; + mode = 1; //Write + } + + if (sscanf(argv[1], "0x%x", &u32Addr) != 1) + goto exit_devmem; + else if (u32Addr & (4 - 1)) + goto exit_devmem; + + if (mode) + { + whc_devmem_write((void *) u32Addr, value); + } + rt_kprintf("0x%08x\n", whc_devmem_read((void *)u32Addr)); + + return; +exit_devmem: + rt_kprintf("Read: whc_devmem \n"); + rt_kprintf("Write: whc_devmem \n"); + return; +} +MSH_CMD_EXPORT(whc_devmem, dump device registers); + +#endif /* #if defined(BSP_USING_HWSEM)*/ diff --git a/bsp/nuvoton/libraries/nu_packages/Kconfig b/bsp/nuvoton/libraries/nu_packages/Kconfig index bd09927c61..c6f978f247 100644 --- a/bsp/nuvoton/libraries/nu_packages/Kconfig +++ b/bsp/nuvoton/libraries/nu_packages/Kconfig @@ -7,10 +7,6 @@ menu "Nuvoton Packages Config" bool "Enable demos" default y - config NU_PKG_USING_LVGL - bool "Enable LVGL demos" - default n - config NU_PKG_USING_BMX055 bool "BMX055 9-axis sensor." select RT_USING_I2C diff --git a/bsp/nuvoton/libraries/nu_packages/MAX31875/sensor_max31875.c b/bsp/nuvoton/libraries/nu_packages/MAX31875/sensor_max31875.c index c82909d4d0..6331592ee9 100644 --- a/bsp/nuvoton/libraries/nu_packages/MAX31875/sensor_max31875.c +++ b/bsp/nuvoton/libraries/nu_packages/MAX31875/sensor_max31875.c @@ -15,8 +15,7 @@ #if defined(NU_PKG_USING_MAX31875) #include -#include "sensor.h" -#include "max31875_c.h" +#include "sensor_max31875.h" #define DBG_ENABLE #define DBG_LEVEL DBG_LOG @@ -65,9 +64,9 @@ static int max31875_i2c_read_reg(int address, const char *reg, int reg_length, c return RT_EOK; } -static rt_size_t max31875_fetch_data(struct rt_sensor_device *sensor, void *buf, rt_size_t len) +static rt_ssize_t max31875_fetch_data(rt_sensor_t sensor, rt_sensor_data_t data, rt_size_t len) { - struct rt_sensor_data *data = (struct rt_sensor_data *)buf; + RT_ASSERT(data); if (sensor->info.type == RT_SENSOR_CLASS_TEMP) { diff --git a/bsp/nuvoton/libraries/nu_packages/MAX31875/sensor_max31875.h b/bsp/nuvoton/libraries/nu_packages/MAX31875/sensor_max31875.h index ac1c976bfa..1e04351cd7 100644 --- a/bsp/nuvoton/libraries/nu_packages/MAX31875/sensor_max31875.h +++ b/bsp/nuvoton/libraries/nu_packages/MAX31875/sensor_max31875.h @@ -13,7 +13,8 @@ #ifndef __SENSOR_MAX31875_H__ #define __SENSOR_MAX31875_H__ -#include "sensor.h" +#include "rtdevice.h" + #include "max31875_c.h" int rt_hw_max31875_init(const char *name, struct rt_sensor_config *cfg); diff --git a/bsp/nuvoton/libraries/nu_packages/NCT7717U/sensor_nct7717u.c b/bsp/nuvoton/libraries/nu_packages/NCT7717U/sensor_nct7717u.c index dac9d3ebd6..94c5c03682 100644 --- a/bsp/nuvoton/libraries/nu_packages/NCT7717U/sensor_nct7717u.c +++ b/bsp/nuvoton/libraries/nu_packages/NCT7717U/sensor_nct7717u.c @@ -13,7 +13,6 @@ #include #include -#include "sensor.h" #include "sensor_nct7717u.h" #define DBG_ENABLE @@ -116,19 +115,19 @@ static rt_err_t nct7717u_ldt_readout(struct rt_i2c_bus_device *i2c_bus_dev, uint return nct7717u_i2c_read_reg(i2c_bus_dev, (const char *)&u8Reg, sizeof(u8Reg), (char *)u8Temp, sizeof(uint8_t)); } -static rt_size_t nct7717u_fetch_data(struct rt_sensor_device *sensor, void *buf, rt_size_t len) +static rt_ssize_t nct7717u_fetch_data(rt_sensor_t sensor, rt_sensor_data_t data, rt_size_t len) { - struct rt_sensor_data *data = (struct rt_sensor_data *)buf; + RT_ASSERT(data); - if (sensor->info.type == RT_SENSOR_CLASS_TEMP) + if (sensor->info.type == RT_SENSOR_TYPE_TEMP) { rt_int8_t i8Temp; - struct rt_i2c_bus_device *i2c_bus_dev = sensor->config.intf.user_data; + struct rt_i2c_bus_device *i2c_bus_dev = sensor->config.intf.arg; if (nct7717u_ldt_readout(i2c_bus_dev, (uint8_t *)&i8Temp) == RT_EOK) { rt_int32_t i32TempValue = i8Temp; - data->type = RT_SENSOR_CLASS_TEMP; + data->type = RT_SENSOR_TYPE_TEMP; data->data.temp = i32TempValue * 10; data->timestamp = rt_sensor_get_ts(); return 1; @@ -143,7 +142,7 @@ static rt_err_t nct7717u_control(struct rt_sensor_device *sensor, int cmd, void { case RT_SENSOR_CTRL_GET_ID: { - struct rt_i2c_bus_device *i2c_bus_dev = sensor->config.intf.user_data; + struct rt_i2c_bus_device *i2c_bus_dev = sensor->config.intf.arg; uint8_t u8Did; RT_ASSERT(args); @@ -174,14 +173,14 @@ int rt_hw_nct7717u_temp_init(const char *name, struct rt_sensor_config *cfg) if (sensor == RT_NULL) return -(RT_ENOMEM); - sensor->info.type = RT_SENSOR_CLASS_TEMP; - sensor->info.vendor = RT_SENSOR_VENDOR_UNKNOWN; - sensor->info.model = "nct7717u_temp"; - sensor->info.unit = RT_SENSOR_UNIT_DCELSIUS; - sensor->info.intf_type = RT_SENSOR_INTF_I2C; - sensor->info.range_max = 127; - sensor->info.range_min = -128; - sensor->info.period_min = 100; //100ms + sensor->info.type = RT_SENSOR_TYPE_TEMP; + sensor->info.vendor = RT_SENSOR_VENDOR_UNKNOWN; + sensor->info.name = "nct7717u_temp"; + sensor->info.unit = RT_SENSOR_UNIT_CELSIUS; + sensor->info.intf_type = RT_SENSOR_INTF_I2C; + sensor->info.scale.range_max = 127; + sensor->info.scale.range_min = -128; + sensor->info.acquire_min = 100; //100ms rt_memcpy(&sensor->config, cfg, sizeof(struct rt_sensor_config)); sensor->ops = &sensor_ops; @@ -213,7 +212,7 @@ int rt_hw_nct7717u_init(const char *name, struct rt_sensor_config *cfg) { goto exit_rt_hw_nct7717u_init; } - intf->user_data = i2c_bus_dev; + intf->arg = i2c_bus_dev; if (nct7717u_probe(i2c_bus_dev) != RT_EOK) goto exit_rt_hw_nct7717u_init; diff --git a/bsp/nuvoton/libraries/nu_packages/NCT7717U/sensor_nct7717u.h b/bsp/nuvoton/libraries/nu_packages/NCT7717U/sensor_nct7717u.h index a3b4a14b40..c1d1fe45e8 100644 --- a/bsp/nuvoton/libraries/nu_packages/NCT7717U/sensor_nct7717u.h +++ b/bsp/nuvoton/libraries/nu_packages/NCT7717U/sensor_nct7717u.h @@ -13,7 +13,7 @@ #ifndef __SENSOR_NCT7717U_H__ #define __SENSOR_NCT7717U_H__ -#include "sensor.h" +#include "rtdevice.h" int rt_hw_nct7717u_init(const char *name, struct rt_sensor_config *cfg); diff --git a/bsp/nuvoton/libraries/nu_packages/SPINAND/drv_spinand.c b/bsp/nuvoton/libraries/nu_packages/SPINAND/drv_spinand.c index 6968595221..caad7f40be 100644 --- a/bsp/nuvoton/libraries/nu_packages/SPINAND/drv_spinand.c +++ b/bsp/nuvoton/libraries/nu_packages/SPINAND/drv_spinand.c @@ -864,14 +864,14 @@ static int nid(int argc, char **argv) */ #include "drv_spi.h" -static int find_valid_window(const char* pcDevName) +static int find_valid_window(const char *pcDevName) { rt_device_t psRtDev; nu_spi_t psNuSpiBus; int i, j, k; psRtDev = rt_device_find(pcDevName); - if (!psRtDev || (psRtDev->type != RT_Device_Class_SPIDevice) ) + if (!psRtDev || (psRtDev->type != RT_Device_Class_SPIDevice)) { LOG_E("Usage %s: %s .\n", __func__, __func__); return -1; @@ -887,21 +887,21 @@ static int find_valid_window(const char* pcDevName) LOG_I("Probe JEDEC[%08X] on %s bus.", u32JedecId, psNuSpiBus->name); rt_kprintf(" "); - for (i=0; i<8; i++) // Pin driving + for (i = 0; i < 8; i++) // Pin driving rt_kprintf("%d ", i); rt_kprintf("\n"); - for (j=0; j<0xC; j++) // Master RX delay cycle + for (j = 0; j < 0xC; j++) // Master RX delay cycle { rt_kprintf("%X: ", j); - for (i=0; i<8; i++) // Pin driving + for (i = 0; i < 8; i++) // Pin driving { SPI_SET_MRXPHASE(psNuSpiBus->spi_base, j); - GPIO_SetDrivingCtl(PD, (BIT0|BIT1|BIT2|BIT3|BIT4|BIT5), i); + GPIO_SetDrivingCtl(PD, (BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5), i); spinand_jedecid_get((struct rt_qspi_device *)psRtDev, &id); - if ( id==u32JedecId ) + if (id == u32JedecId) { rt_kprintf("O "); } @@ -934,9 +934,9 @@ static int nprobe(int argc, char **argv) static int nprobe_auto(int argc, char **argv) { - int count=0; + int count = 0; - while( count++ < 100 ) + while (count++ < 100) find_valid_window("qspi01"); return 0; diff --git a/bsp/nuvoton/libraries/nu_packages/TPC/ft5446.c b/bsp/nuvoton/libraries/nu_packages/TPC/ft5446.c index 4fe7be6641..e65e412a74 100644 --- a/bsp/nuvoton/libraries/nu_packages/TPC/ft5446.c +++ b/bsp/nuvoton/libraries/nu_packages/TPC/ft5446.c @@ -318,11 +318,11 @@ int rt_hw_ft5446_init(const char *name, struct rt_touch_config *cfg) ft5446_init(&ft5446_client); - rt_memset(&pre_x[0], 0xff, FT_MAX_TOUCH * sizeof(int16_t)); - rt_memset(&pre_y[0], 0xff, FT_MAX_TOUCH * sizeof(int16_t)); - rt_memset(&pre_w[0], 0xff, FT_MAX_TOUCH * sizeof(int16_t)); - rt_memset(&s_tp_dowm[0], 0, FT_MAX_TOUCH * sizeof(int16_t)); - rt_memset(&pre_id[0], 0xff, FT_MAX_TOUCH * sizeof(int8_t)); + rt_memset(&pre_x[0], 0xff, FT_MAX_TOUCH * sizeof(rt_int16_t)); + rt_memset(&pre_y[0], 0xff, FT_MAX_TOUCH * sizeof(rt_int16_t)); + rt_memset(&pre_w[0], 0xff, FT_MAX_TOUCH * sizeof(rt_int16_t)); + rt_memset(&s_tp_dowm[0], 0, FT_MAX_TOUCH * sizeof(rt_int8_t)); + rt_memset(&pre_id[0], 0xff, FT_MAX_TOUCH * sizeof(rt_int8_t)); /* register touch device */ touch_device->info.type = RT_TOUCH_TYPE_CAPACITANCE; diff --git a/bsp/nuvoton/libraries/nu_packages/TPC/gt911.c b/bsp/nuvoton/libraries/nu_packages/TPC/gt911.c index 2bc5e126b3..4958d1713a 100644 --- a/bsp/nuvoton/libraries/nu_packages/TPC/gt911.c +++ b/bsp/nuvoton/libraries/nu_packages/TPC/gt911.c @@ -471,7 +471,7 @@ int rt_hw_gt911_init(const char *name, struct rt_touch_config *cfg) rt_memset(&pre_x[0], 0xff, GT911_MAX_TOUCH * sizeof(rt_int16_t)); rt_memset(&pre_y[0], 0xff, GT911_MAX_TOUCH * sizeof(rt_int16_t)); rt_memset(&pre_w[0], 0xff, GT911_MAX_TOUCH * sizeof(rt_int16_t)); - rt_memset(&s_tp_dowm[0], 0, GT911_MAX_TOUCH * sizeof(rt_int16_t)); + rt_memset(&s_tp_dowm[0], 0, GT911_MAX_TOUCH * sizeof(rt_int8_t)); rt_memset(&pre_id[0], 0xff, GT911_MAX_TOUCH * sizeof(rt_uint8_t)); /* register touch device */ diff --git a/bsp/nuvoton/libraries/nu_packages/TPC/ili.c b/bsp/nuvoton/libraries/nu_packages/TPC/ili.c index a5db143c45..af2d0ca12c 100644 --- a/bsp/nuvoton/libraries/nu_packages/TPC/ili.c +++ b/bsp/nuvoton/libraries/nu_packages/TPC/ili.c @@ -615,11 +615,11 @@ int rt_hw_ili_tpc_init(const char *name, struct rt_touch_config *cfg) goto exit_rt_hw_ili_tpc_init; } - rt_memset(&pre_x[0], 0xff, ILI_MAX_TOUCH * sizeof(int16_t)); - rt_memset(&pre_y[0], 0xff, ILI_MAX_TOUCH * sizeof(int16_t)); - rt_memset(&pre_w[0], 0xff, ILI_MAX_TOUCH * sizeof(int16_t)); - rt_memset(&s_tp_dowm[0], 0, ILI_MAX_TOUCH * sizeof(int16_t)); - rt_memset(&pre_id[0], 0xff, ILI_MAX_TOUCH * sizeof(int8_t)); + rt_memset(&pre_x[0], 0xff, ILI_MAX_TOUCH * sizeof(rt_int16_t)); + rt_memset(&pre_y[0], 0xff, ILI_MAX_TOUCH * sizeof(rt_int16_t)); + rt_memset(&pre_w[0], 0xff, ILI_MAX_TOUCH * sizeof(rt_int16_t)); + rt_memset(&s_tp_dowm[0], 0, ILI_MAX_TOUCH * sizeof(rt_uint8_t)); + rt_memset(&pre_id[0], 0xff, ILI_MAX_TOUCH * sizeof(rt_uint8_t)); /* register touch device */ rt_memcpy(&touch_device->config, cfg, sizeof(struct rt_touch_config)); diff --git a/bsp/nuvoton/libraries/nu_packages/TPC/st1663i.c b/bsp/nuvoton/libraries/nu_packages/TPC/st1663i.c index 9cbb277af7..a2349e8f52 100644 --- a/bsp/nuvoton/libraries/nu_packages/TPC/st1663i.c +++ b/bsp/nuvoton/libraries/nu_packages/TPC/st1663i.c @@ -313,11 +313,11 @@ int rt_hw_st1663i_init(const char *name, struct rt_touch_config *cfg) st1663i_init(&st1663i_client); - rt_memset(&pre_x[0], 0xff, ST_MAX_TOUCH * sizeof(int16_t)); - rt_memset(&pre_y[0], 0xff, ST_MAX_TOUCH * sizeof(int16_t)); - rt_memset(&pre_w[0], 0xff, ST_MAX_TOUCH * sizeof(int16_t)); - rt_memset(&s_tp_dowm[0], 0, ST_MAX_TOUCH * sizeof(int16_t)); - rt_memset(&pre_id[0], 0xff, ST_MAX_TOUCH * sizeof(int8_t)); + rt_memset(&pre_x[0], 0xff, ST_MAX_TOUCH * sizeof(rt_int16_t)); + rt_memset(&pre_y[0], 0xff, ST_MAX_TOUCH * sizeof(rt_int16_t)); + rt_memset(&pre_w[0], 0xff, ST_MAX_TOUCH * sizeof(rt_int16_t)); + rt_memset(&s_tp_dowm[0], 0, ST_MAX_TOUCH * sizeof(rt_int8_t)); + rt_memset(&pre_id[0], 0xff, ST_MAX_TOUCH * sizeof(rt_int8_t)); /* register touch device */ touch_device->info.type = RT_TOUCH_TYPE_CAPACITANCE; diff --git a/bsp/nuvoton/libraries/nuc980/Driver/Source/nu_rtc.c b/bsp/nuvoton/libraries/nuc980/Driver/Source/nu_rtc.c index 1dab4c7a13..1ace109924 100644 --- a/bsp/nuvoton/libraries/nuc980/Driver/Source/nu_rtc.c +++ b/bsp/nuvoton/libraries/nuc980/Driver/Source/nu_rtc.c @@ -349,7 +349,7 @@ void RTC_SetDateAndTime(S_RTC_TIME_DATA_T *sPt) { uint32_t u32RegCAL, u32RegTIME; - if (sPt == 0ul) + if (sPt == NULL) { } else diff --git a/bsp/nuvoton/libraries/nuc980/rtt_port/Kconfig b/bsp/nuvoton/libraries/nuc980/rtt_port/Kconfig index 697685116c..fb92e3a931 100644 --- a/bsp/nuvoton/libraries/nuc980/rtt_port/Kconfig +++ b/bsp/nuvoton/libraries/nuc980/rtt_port/Kconfig @@ -12,6 +12,7 @@ config SOC_SERIES_NUC980 config BSP_USING_MMU bool "Enable MMU" + select ARCH_ARM_MMU default y menuconfig BSP_USING_PDMA diff --git a/bsp/nuvoton/ma35-rtp/.config b/bsp/nuvoton/ma35-rtp/.config index 24c4519665..9f457e3e10 100644 --- a/bsp/nuvoton/ma35-rtp/.config +++ b/bsp/nuvoton/ma35-rtp/.config @@ -9,6 +9,7 @@ CONFIG_USE_MA35D1_SUBM=y # CONFIG_RT_NAME_MAX=8 # CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_SMART is not set # CONFIG_RT_USING_SMP is not set CONFIG_RT_ALIGN_SIZE=4 # CONFIG_RT_THREAD_PRIORITY_8 is not set @@ -77,16 +78,19 @@ CONFIG_RT_USING_HEAP=y # CONFIG_RT_USING_DEVICE=y # CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_DM is not set # CONFIG_RT_USING_INTERRUPT_INFO is not set CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=256 CONFIG_RT_CONSOLE_DEVICE_NAME="uart16" CONFIG_RT_VER_NUM=0x50000 -CONFIG_ARCH_ARM=y +# CONFIG_RT_USING_CACHE is not set +# CONFIG_ARCH_ARM_BOOTWITH_FLUSH_CACHE is not set +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set CONFIG_RT_USING_CPU_FFS=y +CONFIG_ARCH_ARM=y CONFIG_ARCH_ARM_CORTEX_M=y CONFIG_ARCH_ARM_CORTEX_M4=y -# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set # # RT-Thread Components @@ -113,12 +117,12 @@ CONFIG_FINSH_USING_DESCRIPTION=y CONFIG_FINSH_ARG_MAX=10 # CONFIG_RT_USING_DFS is not set # CONFIG_RT_USING_FAL is not set -# CONFIG_RT_USING_LWP is not set # # Device Drivers # CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 # CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set CONFIG_RT_USING_SERIAL=y CONFIG_RT_USING_SERIAL_V1=y @@ -133,10 +137,14 @@ CONFIG_RT_SERIAL_RB_BUFSZ=256 CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_ADC is not set # CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set # CONFIG_RT_USING_PWM is not set # CONFIG_RT_USING_MTD_NOR is not set # CONFIG_RT_USING_MTD_NAND is not set # CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_FDT is not set # CONFIG_RT_USING_RTC is not set # CONFIG_RT_USING_SDIO is not set # CONFIG_RT_USING_SPI is not set @@ -144,10 +152,13 @@ CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_AUDIO is not set # CONFIG_RT_USING_SENSOR is not set # CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_LCD is not set # CONFIG_RT_USING_HWCRYPTO is not set # CONFIG_RT_USING_PULSE_ENCODER is not set # CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_DEV_BUS is not set # CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_VIRTIO is not set # # Using USB @@ -353,6 +364,7 @@ CONFIG_UTEST_SMALL_MEM_TC=y # CONFIG_PKG_USING_AGILE_FTP is not set # CONFIG_PKG_USING_EMBEDDEDPROTO is not set # CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_RYANMQTT is not set # CONFIG_PKG_USING_LORA_PKT_FWD is not set # CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set # CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set @@ -360,6 +372,7 @@ CONFIG_UTEST_SMALL_MEM_TC=y # CONFIG_PKG_USING_SMALL_MODBUS is not set # CONFIG_PKG_USING_NET_SERVER is not set # CONFIG_PKG_USING_ZFTP is not set +# CONFIG_PKG_USING_WOL is not set # # security packages @@ -451,7 +464,6 @@ CONFIG_UTEST_SMALL_MEM_TC=y # CONFIG_PKG_USING_SEGGER_RTT is not set # CONFIG_PKG_USING_RDB is not set # CONFIG_PKG_USING_ULOG_EASYFLASH is not set -# CONFIG_PKG_USING_ULOG_FILE is not set # CONFIG_PKG_USING_LOGMGR is not set # CONFIG_PKG_USING_ADBD is not set # CONFIG_PKG_USING_COREMARK is not set @@ -485,8 +497,8 @@ CONFIG_UTEST_SMALL_MEM_TC=y # CONFIG_PKG_USING_CBOX is not set # CONFIG_PKG_USING_SNOWFLAKE is not set # CONFIG_PKG_USING_HASH_MATCH is not set -# CONFIG_PKG_USING_FIRE_PID_CURVE is not set # CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set # # system packages @@ -522,7 +534,6 @@ CONFIG_UTEST_SMALL_MEM_TC=y # CONFIG_PKG_USING_UC_CLK is not set # CONFIG_PKG_USING_UC_COMMON is not set # CONFIG_PKG_USING_UC_MODBUS is not set -# CONFIG_PKG_USING_RTDUINO is not set # CONFIG_PKG_USING_FREERTOS_WRAPPER is not set # CONFIG_PKG_USING_CAIRO is not set # CONFIG_PKG_USING_PIXMAN is not set @@ -557,19 +568,93 @@ CONFIG_UTEST_SMALL_MEM_TC=y # CONFIG_PKG_USING_KMULTI_RTIMER is not set # CONFIG_PKG_USING_TFDB is not set # CONFIG_PKG_USING_QPC is not set +# CONFIG_PKG_USING_AGILE_UPGRADE is not set # # peripheral libraries and drivers # -# CONFIG_PKG_USING_SENSORS_DRIVERS is not set -# CONFIG_PKG_USING_REALTEK_AMEBA is not set + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_TMP1075 is not set +# CONFIG_PKG_USING_SR04 is not set +# CONFIG_PKG_USING_CCS811 is not set +# CONFIG_PKG_USING_PMSXX is not set +# CONFIG_PKG_USING_RT3020 is not set +# CONFIG_PKG_USING_MLX90632 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set # CONFIG_PKG_USING_SHT2X is not set # CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_AD7746 is not set # CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set # CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set # CONFIG_PKG_USING_STM32_SDIO is not set # CONFIG_PKG_USING_ESP_IDF is not set -# CONFIG_PKG_USING_ICM20608 is not set # CONFIG_PKG_USING_BUTTON is not set # CONFIG_PKG_USING_PCF8574 is not set # CONFIG_PKG_USING_SX12XX is not set @@ -592,12 +677,9 @@ CONFIG_UTEST_SMALL_MEM_TC=y # CONFIG_PKG_USING_AGILE_LED is not set # CONFIG_PKG_USING_AT24CXX is not set # CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set -# CONFIG_PKG_USING_AD7746 is not set # CONFIG_PKG_USING_PCA9685 is not set # CONFIG_PKG_USING_I2C_TOOLS is not set # CONFIG_PKG_USING_NRF24L01 is not set -# CONFIG_PKG_USING_TOUCH_DRIVERS is not set -# CONFIG_PKG_USING_MAX17048 is not set # CONFIG_PKG_USING_RPLIDAR is not set # CONFIG_PKG_USING_AS608 is not set # CONFIG_PKG_USING_RC522 is not set @@ -612,7 +694,6 @@ CONFIG_UTEST_SMALL_MEM_TC=y # CONFIG_PKG_USING_CAN_YMODEM is not set # CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set # CONFIG_PKG_USING_QLED is not set -# CONFIG_PKG_USING_PAJ7620 is not set # CONFIG_PKG_USING_AGILE_CONSOLE is not set # CONFIG_PKG_USING_LD3320 is not set # CONFIG_PKG_USING_WK2124 is not set @@ -643,10 +724,11 @@ CONFIG_UTEST_SMALL_MEM_TC=y # CONFIG_PKG_USING_BL_MCU_SDK is not set # CONFIG_PKG_USING_SOFT_SERIAL is not set # CONFIG_PKG_USING_MB85RS16 is not set -# CONFIG_PKG_USING_CW2015 is not set # CONFIG_PKG_USING_RFM300 is not set # CONFIG_PKG_USING_IO_INPUT_FILTER is not set # CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_FINGERPRINT is not set # # AI packages @@ -661,6 +743,12 @@ CONFIG_UTEST_SMALL_MEM_TC=y # CONFIG_PKG_USING_QUEST is not set # CONFIG_PKG_USING_NAXOS is not set +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_UKAL is not set + # # miscellaneous packages # @@ -712,7 +800,6 @@ CONFIG_UTEST_SMALL_MEM_TC=y # CONFIG_PKG_USING_VI is not set # CONFIG_PKG_USING_KI is not set # CONFIG_PKG_USING_ARMv7M_DWT is not set -# CONFIG_PKG_USING_UKAL is not set # CONFIG_PKG_USING_CRCLIB is not set # CONFIG_PKG_USING_LWGPS is not set # CONFIG_PKG_USING_STATE_MACHINE is not set @@ -722,6 +809,213 @@ CONFIG_UTEST_SMALL_MEM_TC=y # CONFIG_PKG_USING_MFBD is not set # CONFIG_PKG_USING_SLCAN2RTT is not set # CONFIG_PKG_USING_SOEM is not set +# CONFIG_PKG_USING_QPARAM is not set +# CONFIG_PKG_USING_CorevMCU_CLI is not set + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects +# +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_ADAFRUIT_MAX31855 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set +# CONFIG_PKG_USING_ADAFRUIT_MSA301 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set +# CONFIG_PKG_USING_SEEED_ITG3200 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set +# CONFIG_PKG_USING_SEEED_MP503 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set + +# +# Other +# + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set + +# +# Uncategorized +# # # Hardware Drivers Config @@ -768,6 +1062,10 @@ CONFIG_BSP_USING_UART16=y # CONFIG_BSP_USING_QEI is not set # CONFIG_BSP_USING_SOFT_I2C is not set # CONFIG_BSP_USING_WDT is not set +CONFIG_BSP_USING_HWSEM=y +CONFIG_BSP_USING_HWSEM0=y +CONFIG_BSP_USING_WHC=y +CONFIG_BSP_USING_WHC0=y # CONFIG_BSP_USING_EBI is not set # @@ -783,8 +1081,7 @@ CONFIG_BSP_USING_NULINKME=y # Nuvoton Packages Config # CONFIG_NU_PKG_USING_UTILS=y -# CONFIG_NU_PKG_USING_DEMO is not set -# CONFIG_NU_PKG_USING_LVGL is not set +CONFIG_NU_PKG_USING_DEMO=y # CONFIG_NU_PKG_USING_BMX055 is not set # CONFIG_NU_PKG_USING_MAX31875 is not set # CONFIG_NU_PKG_USING_NCT7717U is not set @@ -797,5 +1094,3 @@ CONFIG_NU_PKG_USING_UTILS=y # CONFIG_NU_PKG_USING_TPC is not set # CONFIG_NU_PKG_USING_ADC_TOUCH is not set # CONFIG_NU_PKG_USING_SPINAND is not set -CONFIG_UTEST_CMD_PREFIX="bsp.nuvoton.utest." -CONFIG_BOARD_USE_UTEST=y diff --git a/bsp/nuvoton/ma35-rtp/rtthread.bin b/bsp/nuvoton/ma35-rtp/rtthread.bin index 4c25ef079b90d6f05927fe8f32c57d83a0b675d6..71f81136b51f734cf1569f34d448028a9cf01054 100644 GIT binary patch literal 107036 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 z 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

yl~x*@omG%(DNtN+#^FT^{D-k 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 diff --git a/bsp/nuvoton/nk-980iot/.config b/bsp/nuvoton/nk-980iot/.config index 31c70a95d1..b1ffd16111 100644 --- a/bsp/nuvoton/nk-980iot/.config +++ b/bsp/nuvoton/nk-980iot/.config @@ -8,6 +8,7 @@ # CONFIG_RT_NAME_MAX=16 # CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_SMART is not set # CONFIG_RT_USING_SMP is not set CONFIG_RT_ALIGN_SIZE=4 # CONFIG_RT_THREAD_PRIORITY_8 is not set @@ -61,7 +62,7 @@ CONFIG_RT_USING_SMALL_MEM=y # CONFIG_RT_USING_SLAB is not set CONFIG_RT_USING_MEMHEAP=y CONFIG_RT_MEMHEAP_FAST_MODE=y -# CONFIG_RT_MEMHEAP_BSET_MODE is not set +# CONFIG_RT_MEMHEAP_BEST_MODE is not set CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y # CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set # CONFIG_RT_USING_SLAB_AS_HEAP is not set @@ -76,15 +77,20 @@ CONFIG_RT_USING_HEAP=y # CONFIG_RT_USING_DEVICE=y # CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_DM is not set # CONFIG_RT_USING_INTERRUPT_INFO is not set CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=256 CONFIG_RT_CONSOLE_DEVICE_NAME="uart0" CONFIG_RT_VER_NUM=0x50000 -CONFIG_ARCH_ARM=y -# CONFIG_RT_USING_CPU_FFS is not set -CONFIG_ARCH_ARM_ARM9=y +CONFIG_RT_USING_CACHE=y +# CONFIG_ARCH_ARM_BOOTWITH_FLUSH_CACHE is not set # CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set +# CONFIG_RT_USING_CPU_FFS is not set +CONFIG_ARCH_MM_MMU=y +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_MMU=y +CONFIG_ARCH_ARM_ARM9=y # # RT-Thread Components @@ -141,15 +147,17 @@ CONFIG_RT_DFS_ELM_REENTRANT=y CONFIG_RT_DFS_ELM_MUTEX_TIMEOUT=3000 CONFIG_RT_USING_DFS_DEVFS=y # CONFIG_RT_USING_DFS_ROMFS is not set +# CONFIG_RT_USING_DFS_CROMFS is not set # CONFIG_RT_USING_DFS_RAMFS is not set +# CONFIG_RT_USING_DFS_TMPFS is not set # CONFIG_RT_USING_DFS_NFS is not set # CONFIG_RT_USING_FAL is not set -# CONFIG_RT_USING_LWP is not set # # Device Drivers # CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 CONFIG_RT_USING_SYSTEM_WORKQUEUE=y CONFIG_RT_SYSTEM_WORKQUEUE_STACKSIZE=2048 CONFIG_RT_SYSTEM_WORKQUEUE_PRIORITY=23 @@ -171,11 +179,15 @@ CONFIG_RT_USING_I2C_BITOPS=y CONFIG_RT_USING_PIN=y CONFIG_RT_USING_ADC=y # CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set CONFIG_RT_USING_PWM=y # CONFIG_RT_USING_MTD_NOR is not set CONFIG_RT_USING_MTD_NAND=y CONFIG_RT_MTD_NAND_DEBUG=y # CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_FDT is not set CONFIG_RT_USING_RTC=y CONFIG_RT_USING_ALARM=y # CONFIG_RT_USING_SOFT_RTC is not set @@ -194,6 +206,7 @@ CONFIG_RT_AUDIO_REPLAY_MP_BLOCK_COUNT=2 CONFIG_RT_AUDIO_RECORD_PIPE_SIZE=2048 # CONFIG_RT_USING_SENSOR is not set # CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_LCD is not set CONFIG_RT_USING_HWCRYPTO=y CONFIG_RT_HWCRYPTO_DEFAULT_NAME="hwcryto" CONFIG_RT_HWCRYPTO_IV_MAX_SIZE=16 @@ -220,7 +233,9 @@ CONFIG_RT_HWCRYPTO_USING_RNG=y # CONFIG_RT_HWCRYPTO_USING_BIGNUM is not set # CONFIG_RT_USING_PULSE_ENCODER is not set # CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_DEV_BUS is not set # CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_VIRTIO is not set # # Using USB @@ -424,7 +439,6 @@ CONFIG_UTEST_THR_PRIORITY=20 # CONFIG_PKG_USING_COAP is not set # CONFIG_PKG_USING_NOPOLL is not set # CONFIG_PKG_USING_NETUTILS is not set -# CONFIG_PKG_USING_NETUTILS_LATEST_VERSION is not set # CONFIG_PKG_USING_CMUX is not set # CONFIG_PKG_USING_PPP_DEVICE is not set # CONFIG_PKG_USING_AT_DEVICE is not set @@ -472,6 +486,7 @@ CONFIG_UTEST_THR_PRIORITY=20 # CONFIG_PKG_USING_AGILE_FTP is not set # CONFIG_PKG_USING_EMBEDDEDPROTO is not set # CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_RYANMQTT is not set # CONFIG_PKG_USING_LORA_PKT_FWD is not set # CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set # CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set @@ -479,6 +494,7 @@ CONFIG_UTEST_THR_PRIORITY=20 # CONFIG_PKG_USING_SMALL_MODBUS is not set # CONFIG_PKG_USING_NET_SERVER is not set # CONFIG_PKG_USING_ZFTP is not set +# CONFIG_PKG_USING_WOL is not set # # security packages @@ -578,7 +594,6 @@ CONFIG_PKG_WAVPLAYER_VER="latest" # CONFIG_PKG_USING_SEGGER_RTT is not set # CONFIG_PKG_USING_RDB is not set # CONFIG_PKG_USING_ULOG_EASYFLASH is not set -# CONFIG_PKG_USING_ULOG_FILE is not set # CONFIG_PKG_USING_LOGMGR is not set # CONFIG_PKG_USING_ADBD is not set # CONFIG_PKG_USING_COREMARK is not set @@ -612,8 +627,8 @@ CONFIG_PKG_WAVPLAYER_VER="latest" # CONFIG_PKG_USING_CBOX is not set # CONFIG_PKG_USING_SNOWFLAKE is not set # CONFIG_PKG_USING_HASH_MATCH is not set -# CONFIG_PKG_USING_FIRE_PID_CURVE is not set # CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set # # system packages @@ -649,7 +664,6 @@ CONFIG_PKG_WAVPLAYER_VER="latest" # CONFIG_PKG_USING_UC_CLK is not set # CONFIG_PKG_USING_UC_COMMON is not set # CONFIG_PKG_USING_UC_MODBUS is not set -# CONFIG_PKG_USING_RTDUINO is not set # CONFIG_PKG_USING_FREERTOS_WRAPPER is not set # CONFIG_PKG_USING_CAIRO is not set # CONFIG_PKG_USING_PIXMAN is not set @@ -661,16 +675,7 @@ CONFIG_PKG_WAVPLAYER_VER="latest" # CONFIG_PKG_USING_DFS_YAFFS is not set # CONFIG_PKG_USING_LITTLEFS is not set # CONFIG_PKG_USING_DFS_JFFS2 is not set -CONFIG_PKG_USING_DFS_UFFS=y -CONFIG_PKG_UFFS_PATH="/packages/system/uffs" -CONFIG_RT_USING_DFS_UFFS=y -# CONFIG_RT_UFFS_ECC_MODE_0 is not set -# CONFIG_RT_UFFS_ECC_MODE_1 is not set -# CONFIG_RT_UFFS_ECC_MODE_2 is not set -CONFIG_RT_UFFS_ECC_MODE_3=y -CONFIG_RT_UFFS_ECC_MODE=3 -CONFIG_PKG_USING_DFS_UFFS_LATEST_VERSION=y -CONFIG_PKG_UFFS_VER="latest" +# CONFIG_PKG_USING_DFS_UFFS is not set # CONFIG_PKG_USING_LWEXT4 is not set # CONFIG_PKG_USING_THREAD_POOL is not set # CONFIG_PKG_USING_ROBOTS is not set @@ -697,19 +702,93 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_KMULTI_RTIMER is not set # CONFIG_PKG_USING_TFDB is not set # CONFIG_PKG_USING_QPC is not set +# CONFIG_PKG_USING_AGILE_UPGRADE is not set # # peripheral libraries and drivers # -# CONFIG_PKG_USING_SENSORS_DRIVERS is not set -# CONFIG_PKG_USING_REALTEK_AMEBA is not set + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_TMP1075 is not set +# CONFIG_PKG_USING_SR04 is not set +# CONFIG_PKG_USING_CCS811 is not set +# CONFIG_PKG_USING_PMSXX is not set +# CONFIG_PKG_USING_RT3020 is not set +# CONFIG_PKG_USING_MLX90632 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set # CONFIG_PKG_USING_SHT2X is not set # CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_AD7746 is not set # CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set # CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set # CONFIG_PKG_USING_STM32_SDIO is not set # CONFIG_PKG_USING_ESP_IDF is not set -# CONFIG_PKG_USING_ICM20608 is not set # CONFIG_PKG_USING_BUTTON is not set # CONFIG_PKG_USING_PCF8574 is not set # CONFIG_PKG_USING_SX12XX is not set @@ -732,12 +811,9 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_AGILE_LED is not set # CONFIG_PKG_USING_AT24CXX is not set # CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set -# CONFIG_PKG_USING_AD7746 is not set # CONFIG_PKG_USING_PCA9685 is not set # CONFIG_PKG_USING_I2C_TOOLS is not set # CONFIG_PKG_USING_NRF24L01 is not set -# CONFIG_PKG_USING_TOUCH_DRIVERS is not set -# CONFIG_PKG_USING_MAX17048 is not set # CONFIG_PKG_USING_RPLIDAR is not set # CONFIG_PKG_USING_AS608 is not set # CONFIG_PKG_USING_RC522 is not set @@ -752,7 +828,6 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_CAN_YMODEM is not set # CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set # CONFIG_PKG_USING_QLED is not set -# CONFIG_PKG_USING_PAJ7620 is not set # CONFIG_PKG_USING_AGILE_CONSOLE is not set # CONFIG_PKG_USING_LD3320 is not set # CONFIG_PKG_USING_WK2124 is not set @@ -783,10 +858,11 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_BL_MCU_SDK is not set # CONFIG_PKG_USING_SOFT_SERIAL is not set # CONFIG_PKG_USING_MB85RS16 is not set -# CONFIG_PKG_USING_CW2015 is not set # CONFIG_PKG_USING_RFM300 is not set # CONFIG_PKG_USING_IO_INPUT_FILTER is not set # CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_FINGERPRINT is not set # # AI packages @@ -801,6 +877,12 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_QUEST is not set # CONFIG_PKG_USING_NAXOS is not set +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_UKAL is not set + # # miscellaneous packages # @@ -856,7 +938,6 @@ CONFIG_PKG_OPTPARSE_VER="latest" # CONFIG_PKG_USING_VI is not set # CONFIG_PKG_USING_KI is not set # CONFIG_PKG_USING_ARMv7M_DWT is not set -# CONFIG_PKG_USING_UKAL is not set # CONFIG_PKG_USING_CRCLIB is not set # CONFIG_PKG_USING_LWGPS is not set # CONFIG_PKG_USING_STATE_MACHINE is not set @@ -866,6 +947,213 @@ CONFIG_PKG_OPTPARSE_VER="latest" # CONFIG_PKG_USING_MFBD is not set # CONFIG_PKG_USING_SLCAN2RTT is not set # CONFIG_PKG_USING_SOEM is not set +# CONFIG_PKG_USING_QPARAM is not set +# CONFIG_PKG_USING_CorevMCU_CLI is not set + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects +# +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_ADAFRUIT_MAX31855 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set +# CONFIG_PKG_USING_ADAFRUIT_MSA301 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set +# CONFIG_PKG_USING_SEEED_ITG3200 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set +# CONFIG_PKG_USING_SEEED_MP503 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set + +# +# Other +# + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set + +# +# Uncategorized +# # # Hardware Drivers Config @@ -982,7 +1270,6 @@ CONFIG_BOARD_USING_USB1_HOST=y # CONFIG_NU_PKG_USING_UTILS=y CONFIG_NU_PKG_USING_DEMO=y -# CONFIG_NU_PKG_USING_LVGL is not set # CONFIG_NU_PKG_USING_BMX055 is not set # CONFIG_NU_PKG_USING_MAX31875 is not set # CONFIG_NU_PKG_USING_NCT7717U is not set @@ -995,5 +1282,3 @@ CONFIG_NU_PKG_USING_NAU8822=y # CONFIG_NU_PKG_USING_TPC is not set # CONFIG_NU_PKG_USING_ADC_TOUCH is not set CONFIG_NU_PKG_USING_SPINAND=y -CONFIG_UTEST_CMD_PREFIX="bsp.nuvoton.utest." -CONFIG_BOARD_USE_UTEST=y diff --git a/bsp/nuvoton/nk-980iot/applications/lvgl/lv_demo.c b/bsp/nuvoton/nk-980iot/applications/lvgl/lv_demo.c index 7a04e1804a..ebfbba2273 100644 --- a/bsp/nuvoton/nk-980iot/applications/lvgl/lv_demo.c +++ b/bsp/nuvoton/nk-980iot/applications/lvgl/lv_demo.c @@ -17,16 +17,15 @@ void lv_user_gui_init(void) #if LV_USE_DEMO_BENCHMARK extern void lv_demo_benchmark(void); lv_demo_benchmark(); -#endif -#if LV_USE_DEMO_WIDGETS +#elif LV_USE_DEMO_WIDGETS extern void lv_demo_widgets(void); lv_demo_widgets(); -#endif -#if LV_USE_DEMO_MUSIC || LV_USE_DEMO_RTT_MUSIC +#elif (LV_USE_DEMO_MUSIC || LV_USE_DEMO_RTT_MUSIC) extern void lv_demo_music(void); lv_demo_music(); + #endif } diff --git a/bsp/nuvoton/nk-980iot/applications/lvgl/lv_port_disp.c b/bsp/nuvoton/nk-980iot/applications/lvgl/lv_port_disp.c index a86452c5d5..445c4993e1 100644 --- a/bsp/nuvoton/nk-980iot/applications/lvgl/lv_port_disp.c +++ b/bsp/nuvoton/nk-980iot/applications/lvgl/lv_port_disp.c @@ -16,6 +16,10 @@ #define DBG_COLOR #include +#if !defined(NU_PKG_LVGL_RENDERING_LAYER) + #define NU_PKG_LVGL_RENDERING_LAYER "lcd" +#endif + /*A static or global variable to store the buffers*/ static lv_disp_draw_buf_t disp_buf; static lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ @@ -47,7 +51,7 @@ void lv_port_disp_init(void) rt_err_t result; void *buf1 = RT_NULL; - lcd_device = rt_device_find("lcd"); + lcd_device = rt_device_find(NU_PKG_LVGL_RENDERING_LAYER); if (lcd_device == 0) { LOG_E("error!"); diff --git a/bsp/nuvoton/nk-980iot/applications/lvgl/lv_port_disp.h b/bsp/nuvoton/nk-980iot/applications/lvgl/lv_port_disp.h deleted file mode 100644 index b11ce3c5b6..0000000000 --- a/bsp/nuvoton/nk-980iot/applications/lvgl/lv_port_disp.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2021-10-18 Meco Man The first version - */ -#ifndef LV_PORT_DISP_H -#define LV_PORT_DISP_H - -#ifdef __cplusplus -extern "C" { -#endif - -void lv_port_disp_init(void); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/bsp/nuvoton/nk-980iot/applications/lvgl/lv_port_indev.h b/bsp/nuvoton/nk-980iot/applications/lvgl/lv_port_indev.h deleted file mode 100644 index bde7176807..0000000000 --- a/bsp/nuvoton/nk-980iot/applications/lvgl/lv_port_indev.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2021-10-18 Meco Man The first version - */ -#ifndef LV_PORT_INDEV_H -#define LV_PORT_INDEV_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -extern lv_indev_t *button_indev; - -void lv_port_indev_init(void); -void lv_port_indev_input(rt_int16_t x, rt_int16_t y, lv_indev_state_t state); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/bsp/nuvoton/nk-980iot/project.uvproj b/bsp/nuvoton/nk-980iot/project.uvproj deleted file mode 100644 index af99c1fcb5..0000000000 --- a/bsp/nuvoton/nk-980iot/project.uvproj +++ /dev/null @@ -1,2133 +0,0 @@ - - - 1.1 -

### uVision Project, (C) Keil Software
- - - rtthread - 0x4 - ARM-ADS - 0 - - - Nuvoton_ARM9_Series - Nuvoton - IRAM(0x0-0x0) CLOCK(000000000) CPUTYPE(ARM926EJ-S) - - - - 0 - - - - - - - - - - - - 0 - 0 - - - - Atmel\SAM9260\ - Atmel\SAM9260\ - - 0 - 0 - 0 - 0 - 1 - - .\build\keil4\ - rtthread - 1 - 0 - 0 - 1 - 1 - .\Listings\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf.exe --bin --output "$L@L.bin" "$L@L.axf" - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARM.DLL - -cAT91SAM9 - DARMATS9.DLL - -p91SAM9260 - SARM.DLL - - TARMATS9.DLL - -p91SAM9260 - - - - 1 - 0 - 0 - 0 - 16 - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - - - 1 - 0 - 0 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - - 0 - 18 - - - - - - - - - - - - - ..\libraries\nuc980\Script\NUC980xx61.ini - Segger\JLTAgdi.dll - - - - - 1 - 0 - 0 - 0 - 1 - 4098 - - 0 - Segger\JLTAgdi.dll - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - ARM926EJ-S - - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x1 - - - 1 - 0x100000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x1 - - - 0 - 0x0 - 0x0 - - - - - - 1 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 0 - 0 - 0 - - --c99 - RT_USING_LIBC, __RTTHREAD__, __STDC_LIMIT_MACROS, RT_USING_ARM_LIBC, __CLK_TCK=RT_TICK_PER_SECOND - - applications;.;board;..\..\..\components\libc\compilers\common\include;..\..\..\components\libc\compilers\common\extension;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\arm926;..\..\..\components\drivers\audio;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\hwcrypto;.;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\spi;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\libraries\nuc980\rtt_port;..\..\..\components\dfs\include;..\..\..\components\dfs\filesystems\devfs;..\..\..\components\dfs\filesystems\elmfat;..\..\..\components\finsh;.;..\..\..\include;..\libraries\nuc980\Driver\Include;..\..\..\components\net\lwip\lwip-2.1.2\src\include;..\..\..\components\net\lwip\lwip-2.1.2\src\include\netif;..\..\..\components\net\lwip\port;packages\netutils-latest\ntp;packages\netutils-latest\tftp;.;..\libraries\nu_packages\Demo;..\libraries\nu_packages\AudioCodec;..\libraries\nu_packages\SPINAND;..\libraries\nu_packages\TPC;..\libraries\nuc980\UsbHostLib\inc;..\libraries\nu_packages\NuUtils\inc;packages\optparse-latest;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\posix\io\stdio;..\..\..\components\libc\posix\ipc;packages\ramdisk-latest\inc;..\..\..\components\drivers\usb\usbdevice;..\..\..\components\drivers\usb\usbhost;..\..\..\components\drivers\usb\usbhost\class;..\..\..\components\drivers\usb\usbhost\core;..\..\..\components\drivers\usb\usbhost\include;..\..\..\components\drivers\include;..\..\..\components\net\netdev\include;..\..\..\components\net\sal\include;..\..\..\components\net\sal\include\socket;..\..\..\components\net\sal\impl;..\..\..\components\net\sal\include\dfs_net;..\..\..\components\net\sal\include\socket\sys_socket;packages\uffs-latest;packages\uffs-latest\src\inc;..\..\..\components\utilities\utest;packages\wavplayer-latest;packages\wavplayer-latest\inc - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x20000000 - 0x20800000 - - .\linking_scripts\nuc980.sct - - - - - - - - - - - Applications - - - main.c - 1 - applications\main.c - - - - - mnt.c - 1 - applications\mnt.c - - - - - board - - - board_dev.c - 1 - board\board_dev.c - - - - - nu_pin_init.c - 1 - board\nu_pin_init.c - - - - - Compiler - - - syscall_mem.c - 1 - ..\..\..\components\libc\compilers\armlibc\syscall_mem.c - - - - - syscalls.c - 1 - ..\..\..\components\libc\compilers\armlibc\syscalls.c - - - - - cctype.c - 1 - ..\..\..\components\libc\compilers\common\cctype.c - - - - - cstdio.c - 1 - ..\..\..\components\libc\compilers\common\cstdio.c - - - - - cstdlib.c - 1 - ..\..\..\components\libc\compilers\common\cstdlib.c - - - - - cstring.c - 1 - ..\..\..\components\libc\compilers\common\cstring.c - - - - - ctime.c - 1 - ..\..\..\components\libc\compilers\common\ctime.c - - - - - cwchar.c - 1 - ..\..\..\components\libc\compilers\common\cwchar.c - - - - - CPU - - - context_rvds.S - 2 - ..\..\..\libcpu\arm\arm926\context_rvds.S - - - - - cpuport.c - 1 - ..\..\..\libcpu\arm\arm926\cpuport.c - - - - - machine.c - 1 - ..\..\..\libcpu\arm\arm926\machine.c - - - - - mmu.c - 1 - ..\..\..\libcpu\arm\arm926\mmu.c - - - - - stack.c - 1 - ..\..\..\libcpu\arm\arm926\stack.c - - - - - start_rvds.S - 2 - ..\..\..\libcpu\arm\arm926\start_rvds.S - - - - - trap.c - 1 - ..\..\..\libcpu\arm\arm926\trap.c - - - - - backtrace.c - 1 - ..\..\..\libcpu\arm\common\backtrace.c - - - - - div0.c - 1 - ..\..\..\libcpu\arm\common\div0.c - - - - - showmem.c - 1 - ..\..\..\libcpu\arm\common\showmem.c - - - - - DeviceDrivers - - - audio.c - 1 - ..\..\..\components\drivers\audio\audio.c - - - - - audio_pipe.c - 1 - ..\..\..\components\drivers\audio\audio_pipe.c - - - - - can.c - 1 - ..\..\..\components\drivers\can\can.c - - - - - cputime.c - 1 - ..\..\..\components\drivers\cputime\cputime.c - - - - - hw_hash.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_hash.c - - - - - hw_rng.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_rng.c - - - - - hw_symmetric.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_symmetric.c - - - - - hwcrypto.c - 1 - ..\..\..\components\drivers\hwcrypto\hwcrypto.c - - - - - hwtimer.c - 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c - - - - - i2c-bit-ops.c - 1 - ..\..\..\components\drivers\i2c\i2c-bit-ops.c - - - - - i2c_core.c - 1 - ..\..\..\components\drivers\i2c\i2c_core.c - - - - - i2c_dev.c - 1 - ..\..\..\components\drivers\i2c\i2c_dev.c - - - - - completion.c - 1 - ..\..\..\components\drivers\ipc\completion.c - - - - - dataqueue.c - 1 - ..\..\..\components\drivers\ipc\dataqueue.c - - - - - pipe.c - 1 - ..\..\..\components\drivers\ipc\pipe.c - - - - - ringblk_buf.c - 1 - ..\..\..\components\drivers\ipc\ringblk_buf.c - - - - - ringbuffer.c - 1 - ..\..\..\components\drivers\ipc\ringbuffer.c - - - - - waitqueue.c - 1 - ..\..\..\components\drivers\ipc\waitqueue.c - - - - - workqueue.c - 1 - ..\..\..\components\drivers\ipc\workqueue.c - - - - - adc.c - 1 - ..\..\..\components\drivers\misc\adc.c - - - - - pin.c - 1 - ..\..\..\components\drivers\misc\pin.c - - - - - rt_drv_pwm.c - 1 - ..\..\..\components\drivers\misc\rt_drv_pwm.c - - - - - mtd_nand.c - 1 - ..\..\..\components\drivers\mtd\mtd_nand.c - - - - - alarm.c - 1 - ..\..\..\components\drivers\rtc\alarm.c - - - - - rtc.c - 1 - ..\..\..\components\drivers\rtc\rtc.c - - - - - serial.c - 1 - ..\..\..\components\drivers\serial\serial.c - - - - - qspi_core.c - 1 - ..\..\..\components\drivers\spi\qspi_core.c - - - - - spi_core.c - 1 - ..\..\..\components\drivers\spi\spi_core.c - - - - - spi_dev.c - 1 - ..\..\..\components\drivers\spi\spi_dev.c - - - - - watchdog.c - 1 - ..\..\..\components\drivers\watchdog\watchdog.c - - - - - Drivers - - - drv_sys.c - 1 - ..\libraries\nuc980\rtt_port\drv_sys.c - - - - - drv_softi2c.c - 1 - ..\libraries\nuc980\rtt_port\drv_softi2c.c - - - - - drv_emac.c - 1 - ..\libraries\nuc980\rtt_port\drv_emac.c - - - - - drv_scuart.c - 1 - ..\libraries\nuc980\rtt_port\drv_scuart.c - - - - - drv_gpio.c - 1 - ..\libraries\nuc980\rtt_port\drv_gpio.c - - - - - drv_common.c - 1 - ..\libraries\nuc980\rtt_port\drv_common.c - - - - - drv_can.c - 1 - ..\libraries\nuc980\rtt_port\drv_can.c - - - - - drv_crypto.c - 1 - ..\libraries\nuc980\rtt_port\drv_crypto.c - - - - - drv_usbhost.c - 1 - ..\libraries\nuc980\rtt_port\drv_usbhost.c - - - - - drv_systick.c - 1 - ..\libraries\nuc980\rtt_port\drv_systick.c - - - - - drv_spi.c - 1 - ..\libraries\nuc980\rtt_port\drv_spi.c - - - - - drv_i2c.c - 1 - ..\libraries\nuc980\rtt_port\drv_i2c.c - - - - - drv_uart.c - 1 - ..\libraries\nuc980\rtt_port\drv_uart.c - - - - - drv_ebi.c - 1 - ..\libraries\nuc980\rtt_port\drv_ebi.c - - - - - drv_etimer_capture.c - 1 - ..\libraries\nuc980\rtt_port\drv_etimer_capture.c - - - - - drv_qspi.c - 1 - ..\libraries\nuc980\rtt_port\drv_qspi.c - - - - - drv_pdma.c - 1 - ..\libraries\nuc980\rtt_port\drv_pdma.c - - - - - drv_rtc.c - 1 - ..\libraries\nuc980\rtt_port\drv_rtc.c - - - - - drv_adc.c - 1 - ..\libraries\nuc980\rtt_port\drv_adc.c - - - - - drv_sdh.c - 1 - ..\libraries\nuc980\rtt_port\drv_sdh.c - - - - - drv_i2s.c - 1 - ..\libraries\nuc980\rtt_port\drv_i2s.c - - - - - drv_wdt.c - 1 - ..\libraries\nuc980\rtt_port\drv_wdt.c - - - - - drv_pwm.c - 1 - ..\libraries\nuc980\rtt_port\drv_pwm.c - - - - - drv_etimer.c - 1 - ..\libraries\nuc980\rtt_port\drv_etimer.c - - - - - drv_usbd.c - 1 - ..\libraries\nuc980\rtt_port\drv_usbd.c - - - - - Filesystem - - - devfs.c - 1 - ..\..\..\components\dfs\filesystems\devfs\devfs.c - - - - - dfs_elm.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\dfs_elm.c - - - - - ff.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\ff.c - - - - - ffunicode.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\ffunicode.c - - - - - dfs.c - 1 - ..\..\..\components\dfs\src\dfs.c - - - - - dfs_file.c - 1 - ..\..\..\components\dfs\src\dfs_file.c - - - - - dfs_fs.c - 1 - ..\..\..\components\dfs\src\dfs_fs.c - - - - - dfs_posix.c - 1 - ..\..\..\components\dfs\src\dfs_posix.c - - - - - Finsh - - - shell.c - 1 - ..\..\..\components\finsh\shell.c - - - - - msh.c - 1 - ..\..\..\components\finsh\msh.c - - - - - msh_parse.c - 1 - ..\..\..\components\finsh\msh_parse.c - - - - - cmd.c - 1 - ..\..\..\components\finsh\cmd.c - - - - - msh_file.c - 1 - ..\..\..\components\finsh\msh_file.c - - - - - Kernel - - - clock.c - 1 - ..\..\..\src\clock.c - - - - - components.c - 1 - ..\..\..\src\components.c - - - - - device.c - 1 - ..\..\..\src\device.c - - - - - idle.c - 1 - ..\..\..\src\idle.c - - - - - ipc.c - 1 - ..\..\..\src\ipc.c - - - - - irq.c - 1 - ..\..\..\src\irq.c - - - - - kservice.c - 1 - ..\..\..\src\kservice.c - - - - - mem.c - 1 - ..\..\..\src\mem.c - - - - - memheap.c - 1 - ..\..\..\src\memheap.c - - - - - mempool.c - 1 - ..\..\..\src\mempool.c - - - - - object.c - 1 - ..\..\..\src\object.c - - - - - scheduler.c - 1 - ..\..\..\src\scheduler.c - - - - - signal.c - 1 - ..\..\..\src\signal.c - - - - - thread.c - 1 - ..\..\..\src\thread.c - - - - - timer.c - 1 - ..\..\..\src\timer.c - - - - - Libraries - - - nu_crypto.c - 1 - ..\libraries\nuc980\Driver\Source\nu_crypto.c - - - - - nu_qspi.c - 1 - ..\libraries\nuc980\Driver\Source\nu_qspi.c - - - - - nu_pdma.c - 1 - ..\libraries\nuc980\Driver\Source\nu_pdma.c - - - - - nu_sdh.c - 1 - ..\libraries\nuc980\Driver\Source\nu_sdh.c - - - - - nu_scuart.c - 1 - ..\libraries\nuc980\Driver\Source\nu_scuart.c - - - - - nu_can.c - 1 - ..\libraries\nuc980\Driver\Source\nu_can.c - - - - - nu_wwdt.c - 1 - ..\libraries\nuc980\Driver\Source\nu_wwdt.c - - - - - nu_uart.c - 1 - ..\libraries\nuc980\Driver\Source\nu_uart.c - - - - - nu_i2s.c - 1 - ..\libraries\nuc980\Driver\Source\nu_i2s.c - - - - - nu_wdt.c - 1 - ..\libraries\nuc980\Driver\Source\nu_wdt.c - - - - - nu_usbd.c - 1 - ..\libraries\nuc980\Driver\Source\nu_usbd.c - - - - - nu_spi.c - 1 - ..\libraries\nuc980\Driver\Source\nu_spi.c - - - - - nu_ebi.c - 1 - ..\libraries\nuc980\Driver\Source\nu_ebi.c - - - - - nu_etimer.c - 1 - ..\libraries\nuc980\Driver\Source\nu_etimer.c - - - - - nu_sys.c - 1 - ..\libraries\nuc980\Driver\Source\nu_sys.c - - - - - nu_emac.c - 1 - ..\libraries\nuc980\Driver\Source\nu_emac.c - - - - - nu_gpio.c - 1 - ..\libraries\nuc980\Driver\Source\nu_gpio.c - - - - - nu_rtc.c - 1 - ..\libraries\nuc980\Driver\Source\nu_rtc.c - - - - - nu_cap.c - 1 - ..\libraries\nuc980\Driver\Source\nu_cap.c - - - - - nu_i2c.c - 1 - ..\libraries\nuc980\Driver\Source\nu_i2c.c - - - - - lwIP - - - api_lib.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\api\api_lib.c - - - - - api_msg.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\api\api_msg.c - - - - - err.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\api\err.c - - - - - if_api.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\api\if_api.c - - - - - netbuf.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\api\netbuf.c - - - - - netdb.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\api\netdb.c - - - - - netifapi.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\api\netifapi.c - - - - - sockets.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\api\sockets.c - - - - - tcpip.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\api\tcpip.c - - - - - ping.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\apps\ping\ping.c - - - - - altcp.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\altcp.c - - - - - altcp_alloc.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\altcp_alloc.c - - - - - altcp_tcp.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\altcp_tcp.c - - - - - def.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\def.c - - - - - dns.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\dns.c - - - - - inet_chksum.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\inet_chksum.c - - - - - init.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\init.c - - - - - ip.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\ip.c - - - - - autoip.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\ipv4\autoip.c - - - - - dhcp.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\ipv4\dhcp.c - - - - - etharp.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\ipv4\etharp.c - - - - - icmp.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\ipv4\icmp.c - - - - - igmp.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\ipv4\igmp.c - - - - - ip4.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\ipv4\ip4.c - - - - - ip4_addr.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\ipv4\ip4_addr.c - - - - - ip4_frag.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\ipv4\ip4_frag.c - - - - - memp.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\memp.c - - - - - netif.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\netif.c - - - - - pbuf.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\pbuf.c - - - - - raw.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\raw.c - - - - - stats.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\stats.c - - - - - sys.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\sys.c - - - - - tcp.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\tcp.c - - - - - tcp_in.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\tcp_in.c - - - - - tcp_out.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\tcp_out.c - - - - - timeouts.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\timeouts.c - - - - - udp.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\udp.c - - - - - ethernet.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\netif\ethernet.c - - - - - lowpan6.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\netif\lowpan6.c - - - - - ethernetif.c - 1 - ..\..\..\components\net\lwip\port\ethernetif.c - - - - - sys_arch.c - 1 - ..\..\..\components\net\lwip\port\sys_arch.c - - - - - NetUtils - - - iperf.c - 1 - packages\netutils-latest\iperf\iperf.c - - - - - ntp.c - 1 - packages\netutils-latest\ntp\ntp.c - - - - - tftp_client.c - 1 - packages\netutils-latest\tftp\tftp_client.c - - - - - tftp_port.c - 1 - packages\netutils-latest\tftp\tftp_port.c - - - - - tftp_server.c - 1 - packages\netutils-latest\tftp\tftp_server.c - - - - - tftp_xfer.c - 1 - packages\netutils-latest\tftp\tftp_xfer.c - - - - - nu_pkgs_demo - - - usbd_cdc_vcom_echo.c - 1 - ..\libraries\nu_packages\Demo\usbd_cdc_vcom_echo.c - - - - - slcd_show_tick.c - 1 - ..\libraries\nu_packages\Demo\slcd_show_tick.c - - - - - usbd_hid_dance_mouse.c - 1 - ..\libraries\nu_packages\Demo\usbd_hid_dance_mouse.c - - - - - nu_pkgs_nau8822 - - - audio_test.c - 1 - ..\libraries\nu_packages\AudioCodec\audio_test.c - - - - - acodec_nau8822.c - 1 - ..\libraries\nu_packages\AudioCodec\acodec_nau8822.c - - - - - nu_pkgs_spinand - - - drv_spinand.c - 1 - ..\libraries\nu_packages\SPINAND\drv_spinand.c - - - - - spinand.c - 1 - ..\libraries\nu_packages\SPINAND\spinand.c - - - - - nuc980_usbhostlib - - - support.c - 1 - ..\libraries\nuc980\UsbHostLib\src\support.c - - - - - mem_alloc.c - 1 - ..\libraries\nuc980\UsbHostLib\src\mem_alloc.c - - - - - ehci_iso.c - 1 - ..\libraries\nuc980\UsbHostLib\src\ehci_iso.c - - - - - usb_core.c - 1 - ..\libraries\nuc980\UsbHostLib\src\usb_core.c - - - - - ohci.c - 1 - ..\libraries\nuc980\UsbHostLib\src\ohci.c - - - - - ehci.c - 1 - ..\libraries\nuc980\UsbHostLib\src\ehci.c - - - - - optparse - - - optparse.c - 1 - packages\optparse-latest\optparse.c - - - - - POSIX - - - poll.c - 1 - ..\..\..\components\libc\posix\io\poll\poll.c - - - - - select.c - 1 - ..\..\..\components\libc\posix\io\poll\select.c - - - - - ramdisk - - - drv_ramdisk.c - 1 - packages\ramdisk-latest\src\drv_ramdisk.c - - - - - rt_usbd - - - usbdevice_core.c - 1 - ..\..\..\components\drivers\usb\usbdevice\core\usbdevice_core.c - - - - - mstorage.c - 1 - ..\..\..\components\drivers\usb\usbdevice\class\mstorage.c - - - - - usbdevice.c - 1 - ..\..\..\components\drivers\usb\usbdevice\core\usbdevice.c - - - - - cdc_vcom.c - 1 - ..\..\..\components\drivers\usb\usbdevice\class\cdc_vcom.c - - - - - rt_usbh - - - hub.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\hub.c - - - - - usbhost.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\usbhost.c - - - - - usbhost_core.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\usbhost_core.c - - - - - mass.c - 1 - ..\..\..\components\drivers\usb\usbhost\class\mass.c - - - - - udisk.c - 1 - ..\..\..\components\drivers\usb\usbhost\class\udisk.c - - - - - driver.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\driver.c - - - - - SAL - - - netdev.c - 1 - ..\..\..\components\net\netdev\src\netdev.c - - - - - netdev_ipaddr.c - 1 - ..\..\..\components\net\netdev\src\netdev_ipaddr.c - - - - - dfs_net.c - 1 - ..\..\..\components\net\sal\dfs_net\dfs_net.c - - - - - af_inet_lwip.c - 1 - ..\..\..\components\net\sal\impl\af_inet_lwip.c - - - - - net_netdb.c - 1 - ..\..\..\components\net\sal\socket\net_netdb.c - - - - - net_sockets.c - 1 - ..\..\..\components\net\sal\socket\net_sockets.c - - - - - sal_socket.c - 1 - ..\..\..\components\net\sal\src\sal_socket.c - - - - - uffs - - - uffs_mem.c - 1 - packages\uffs-latest\src\uffs\uffs_mem.c - - - - - uffs_init.c - 1 - packages\uffs-latest\src\uffs\uffs_init.c - - - - - dfs_uffs.c - 1 - packages\uffs-latest\dfs_uffs.c - - - - - uffs_mtb.c - 1 - packages\uffs-latest\src\uffs\uffs_mtb.c - - - - - uffs_crc.c - 1 - packages\uffs-latest\src\uffs\uffs_crc.c - - - - - uffs_tree.c - 1 - packages\uffs-latest\src\uffs\uffs_tree.c - - - - - uffs_flash.c - 1 - packages\uffs-latest\src\uffs\uffs_flash.c - - - - - uffs_version.c - 1 - packages\uffs-latest\src\uffs\uffs_version.c - - - - - uffs_debug.c - 1 - packages\uffs-latest\src\uffs\uffs_debug.c - - - - - uffs_blockinfo.c - 1 - packages\uffs-latest\src\uffs\uffs_blockinfo.c - - - - - uffs_public.c - 1 - packages\uffs-latest\src\uffs\uffs_public.c - - - - - uffs_find.c - 1 - packages\uffs-latest\src\uffs\uffs_find.c - - - - - uffs_buf.c - 1 - packages\uffs-latest\src\uffs\uffs_buf.c - - - - - uffs_pool.c - 1 - packages\uffs-latest\src\uffs\uffs_pool.c - - - - - uffs_rtthread.c - 1 - packages\uffs-latest\uffs_rtthread.c - - - - - uffs_device.c - 1 - packages\uffs-latest\src\uffs\uffs_device.c - - - - - uffs_fd.c - 1 - packages\uffs-latest\src\uffs\uffs_fd.c - - - - - uffs_utils.c - 1 - packages\uffs-latest\src\uffs\uffs_utils.c - - - - - uffs_ecc.c - 1 - packages\uffs-latest\src\uffs\uffs_ecc.c - - - - - uffs_badblock.c - 1 - packages\uffs-latest\src\uffs\uffs_badblock.c - - - - - uffs_nandif.c - 1 - packages\uffs-latest\uffs_nandif.c - - - - - uffs_fs.c - 1 - packages\uffs-latest\src\uffs\uffs_fs.c - - - - - UTest - - - utest.c - 1 - ..\..\..\components\utilities\utest\utest.c - - - - - wavplayer - - - wavplayer.c - 1 - packages\wavplayer-latest\src\wavplayer.c - - - - - wavplayer_cmd.c - 1 - packages\wavplayer-latest\src\wavplayer_cmd.c - - - - - wavrecorder.c - 1 - packages\wavplayer-latest\src\wavrecorder.c - - - - - wavhdr.c - 1 - packages\wavplayer-latest\src\wavhdr.c - - - - - wavrecorder_cmd.c - 1 - packages\wavplayer-latest\src\wavrecorder_cmd.c - - - - - - - diff --git a/bsp/nuvoton/nk-980iot/rtconfig.h b/bsp/nuvoton/nk-980iot/rtconfig.h deleted file mode 100644 index 347920f600..0000000000 --- a/bsp/nuvoton/nk-980iot/rtconfig.h +++ /dev/null @@ -1,442 +0,0 @@ -#ifndef RT_CONFIG_H__ -#define RT_CONFIG_H__ - -/* Automatically generated file; DO NOT EDIT. */ -/* RT-Thread Configuration */ - -/* RT-Thread Kernel */ - -#define RT_NAME_MAX 16 -#define RT_ALIGN_SIZE 4 -#define RT_THREAD_PRIORITY_32 -#define RT_THREAD_PRIORITY_MAX 32 -#define RT_TICK_PER_SECOND 1000 -#define RT_USING_OVERFLOW_CHECK -#define RT_USING_HOOK -#define RT_HOOK_USING_FUNC_PTR -#define RT_USING_IDLE_HOOK -#define RT_IDLE_HOOK_LIST_SIZE 4 -#define IDLE_THREAD_STACK_SIZE 2048 - -/* kservice optimization */ - -#define RT_DEBUG -#define RT_DEBUG_COLOR - -/* Inter-Thread communication */ - -#define RT_USING_SEMAPHORE -#define RT_USING_MUTEX -#define RT_USING_EVENT -#define RT_USING_MAILBOX -#define RT_USING_MESSAGEQUEUE -#define RT_USING_SIGNALS - -/* Memory Management */ - -#define RT_USING_MEMPOOL -#define RT_USING_SMALL_MEM -#define RT_USING_MEMHEAP -#define RT_MEMHEAP_FAST_MODE -#define RT_USING_SMALL_MEM_AS_HEAP -#define RT_USING_MEMTRACE -#define RT_USING_HEAP - -/* Kernel Device Object */ - -#define RT_USING_DEVICE -#define RT_USING_CONSOLE -#define RT_CONSOLEBUF_SIZE 256 -#define RT_CONSOLE_DEVICE_NAME "uart0" -#define RT_VER_NUM 0x40101 -#define ARCH_ARM -#define ARCH_ARM_ARM9 - -/* RT-Thread Components */ - -#define RT_USING_COMPONENTS_INIT -#define RT_USING_USER_MAIN -#define RT_MAIN_THREAD_STACK_SIZE 2048 -#define RT_MAIN_THREAD_PRIORITY 10 -#define RT_USING_MSH -#define RT_USING_FINSH -#define FINSH_USING_MSH -#define FINSH_THREAD_NAME "tshell" -#define FINSH_THREAD_PRIORITY 20 -#define FINSH_THREAD_STACK_SIZE 4096 -#define FINSH_USING_HISTORY -#define FINSH_HISTORY_LINES 5 -#define FINSH_USING_SYMTAB -#define FINSH_CMD_SIZE 80 -#define MSH_USING_BUILT_IN_COMMANDS -#define FINSH_USING_DESCRIPTION -#define FINSH_ARG_MAX 10 -#define RT_USING_DFS -#define DFS_USING_POSIX -#define DFS_USING_WORKDIR -#define DFS_FILESYSTEMS_MAX 16 -#define DFS_FILESYSTEM_TYPES_MAX 16 -#define DFS_FD_MAX 64 -#define RT_USING_DFS_MNTTABLE -#define RT_USING_DFS_ELMFAT - -/* elm-chan's FatFs, Generic FAT Filesystem Module */ - -#define RT_DFS_ELM_CODE_PAGE 437 -#define RT_DFS_ELM_WORD_ACCESS -#define RT_DFS_ELM_USE_LFN_3 -#define RT_DFS_ELM_USE_LFN 3 -#define RT_DFS_ELM_LFN_UNICODE_0 -#define RT_DFS_ELM_LFN_UNICODE 0 -#define RT_DFS_ELM_MAX_LFN 255 -#define RT_DFS_ELM_DRIVES 8 -#define RT_DFS_ELM_MAX_SECTOR_SIZE 4096 -#define RT_DFS_ELM_REENTRANT -#define RT_DFS_ELM_MUTEX_TIMEOUT 3000 -#define RT_USING_DFS_DEVFS - -/* Device Drivers */ - -#define RT_USING_DEVICE_IPC -#define RT_USING_SYSTEM_WORKQUEUE -#define RT_SYSTEM_WORKQUEUE_STACKSIZE 2048 -#define RT_SYSTEM_WORKQUEUE_PRIORITY 23 -#define RT_USING_SERIAL -#define RT_USING_SERIAL_V1 -#define RT_SERIAL_USING_DMA -#define RT_SERIAL_RB_BUFSZ 2048 -#define RT_USING_CAN -#define RT_CAN_USING_HDR -#define RT_USING_HWTIMER -#define RT_USING_CPUTIME -#define RT_USING_I2C -#define RT_USING_I2C_BITOPS -#define RT_USING_PIN -#define RT_USING_ADC -#define RT_USING_PWM -#define RT_USING_MTD_NAND -#define RT_MTD_NAND_DEBUG -#define RT_USING_RTC -#define RT_USING_ALARM -#define RT_USING_SPI -#define RT_USING_QSPI -#define RT_USING_WDT -#define RT_USING_AUDIO -#define RT_AUDIO_REPLAY_MP_BLOCK_SIZE 4096 -#define RT_AUDIO_REPLAY_MP_BLOCK_COUNT 2 -#define RT_AUDIO_RECORD_PIPE_SIZE 2048 -#define RT_USING_HWCRYPTO -#define RT_HWCRYPTO_DEFAULT_NAME "hwcryto" -#define RT_HWCRYPTO_IV_MAX_SIZE 16 -#define RT_HWCRYPTO_KEYBIT_MAX_SIZE 256 -#define RT_HWCRYPTO_USING_AES -#define RT_HWCRYPTO_USING_AES_ECB -#define RT_HWCRYPTO_USING_AES_CBC -#define RT_HWCRYPTO_USING_AES_CFB -#define RT_HWCRYPTO_USING_AES_CTR -#define RT_HWCRYPTO_USING_AES_OFB -#define RT_HWCRYPTO_USING_SHA1 -#define RT_HWCRYPTO_USING_SHA2 -#define RT_HWCRYPTO_USING_SHA2_224 -#define RT_HWCRYPTO_USING_SHA2_256 -#define RT_HWCRYPTO_USING_SHA2_384 -#define RT_HWCRYPTO_USING_SHA2_512 -#define RT_HWCRYPTO_USING_RNG - -/* Using USB */ - -#define RT_USING_USB -#define RT_USING_USB_HOST -#define RT_USBH_MSTORAGE -#define UDISK_MOUNTPOINT "/mnt/udisk" -#define RT_USING_USB_DEVICE -#define RT_USBD_THREAD_STACK_SZ 4096 -#define USB_VENDOR_ID 0x0FFE -#define USB_PRODUCT_ID 0x0001 -#define RT_USB_DEVICE_COMPOSITE -#define RT_USB_DEVICE_CDC -#define RT_USB_DEVICE_NONE -#define RT_USB_DEVICE_MSTORAGE -#define RT_VCOM_TASK_STK_SIZE 2048 -#define RT_CDC_RX_BUFSIZE 128 -#define RT_VCOM_SERNO "32021919830108" -#define RT_VCOM_SER_LEN 14 -#define RT_VCOM_TX_TIMEOUT 1000 -#define RT_USB_MSTORAGE_DISK_NAME "ramdisk1" - -/* C/C++ and POSIX layer */ - -#define RT_LIBC_DEFAULT_TIMEZONE 8 - -/* POSIX (Portable Operating System Interface) layer */ - -#define RT_USING_POSIX_FS -#define RT_USING_POSIX_POLL -#define RT_USING_POSIX_SELECT -#define RT_USING_POSIX_SOCKET - -/* Interprocess Communication (IPC) */ - - -/* Socket is in the 'Network' category */ - - -/* Network */ - -#define RT_USING_SAL - -/* Docking with protocol stacks */ - -#define SAL_USING_LWIP -#define SAL_USING_POSIX -#define RT_USING_NETDEV -#define NETDEV_USING_IFCONFIG -#define NETDEV_USING_PING -#define NETDEV_USING_NETSTAT -#define NETDEV_USING_AUTO_DEFAULT -#define NETDEV_IPV4 1 -#define NETDEV_IPV6 0 -#define RT_USING_LWIP -#define RT_USING_LWIP212 -#define RT_USING_LWIP_VER_NUM 0x20102 -#define RT_LWIP_MEM_ALIGNMENT 4 -#define RT_LWIP_IGMP -#define RT_LWIP_ICMP -#define RT_LWIP_DNS -#define RT_LWIP_DHCP -#define IP_SOF_BROADCAST 1 -#define IP_SOF_BROADCAST_RECV 1 - -/* Static IPv4 Address */ - -#define RT_LWIP_IPADDR "192.168.31.55" -#define RT_LWIP_GWADDR "192.168.31.1" -#define RT_LWIP_MSKADDR "255.255.255.0" -#define RT_LWIP_UDP -#define RT_LWIP_TCP -#define RT_LWIP_RAW -#define RT_MEMP_NUM_NETCONN 16 -#define RT_LWIP_PBUF_NUM 256 -#define RT_LWIP_RAW_PCB_NUM 16 -#define RT_LWIP_UDP_PCB_NUM 16 -#define RT_LWIP_TCP_PCB_NUM 16 -#define RT_LWIP_TCP_SEG_NUM 64 -#define RT_LWIP_TCP_SND_BUF 16384 -#define RT_LWIP_TCP_WND 65535 -#define RT_LWIP_TCPTHREAD_PRIORITY 10 -#define RT_LWIP_TCPTHREAD_MBOX_SIZE 256 -#define RT_LWIP_TCPTHREAD_STACKSIZE 4096 -#define RT_LWIP_ETHTHREAD_PRIORITY 12 -#define RT_LWIP_ETHTHREAD_STACKSIZE 4096 -#define RT_LWIP_ETHTHREAD_MBOX_SIZE 256 -#define RT_LWIP_REASSEMBLY_FRAG -#define LWIP_NETIF_STATUS_CALLBACK 1 -#define LWIP_NETIF_LINK_CALLBACK 1 -#define SO_REUSE 1 -#define LWIP_SO_RCVTIMEO 1 -#define LWIP_SO_SNDTIMEO 1 -#define LWIP_SO_RCVBUF 1 -#define LWIP_SO_LINGER 0 -#define RT_LWIP_NETIF_LOOPBACK -#define LWIP_NETIF_LOOPBACK 1 -#define RT_LWIP_STATS -#define RT_LWIP_USING_PING - -/* Utilities */ - -#define RT_USING_UTEST -#define UTEST_THR_STACK_SIZE 4096 -#define UTEST_THR_PRIORITY 20 - -/* RT-Thread Utestcases */ - - -/* RT-Thread online packages */ - -/* IoT - internet of things */ - - -/* Wi-Fi */ - -/* Marvell WiFi */ - - -/* Wiced WiFi */ - -#define PKG_USING_NETUTILS -#define PKG_NETUTILS_TFTP -#define PKG_NETUTILS_IPERF -#define PKG_NETUTILS_NTP -#define NTP_USING_AUTO_SYNC -#define NTP_AUTO_SYNC_FIRST_DELAY 30 -#define NTP_AUTO_SYNC_PERIOD 3600 -#define NETUTILS_NTP_HOSTNAME "0.tw.pool.ntp.org" -#define NETUTILS_NTP_HOSTNAME2 "1.tw.pool.ntp.org" -#define NETUTILS_NTP_HOSTNAME3 "2.tw.pool.ntp.org" -#define PKG_USING_NETUTILS_LATEST_VERSION -#define PKG_NETUTILS_VER_NUM 0x99999 - -/* IoT Cloud */ - - -/* security packages */ - - -/* language packages */ - -/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ - - -/* XML: Extensible Markup Language */ - - -/* multimedia packages */ - -/* LVGL: powerful and easy-to-use embedded GUI library */ - - -/* u8g2: a monochrome graphic library */ - -#define PKG_USING_WAVPLAYER -#define PKG_WP_USING_PLAY -#define PKG_WP_PLAY_DEVICE "sound0" -#define PKG_WP_USING_RECORD -#define PKG_WP_RECORD_DEVICE "sound0" -#define PKG_USING_WAVPLAYER_LATEST_VERSION - -/* PainterEngine: A cross-platform graphics application framework written in C language */ - - -/* tools packages */ - - -/* system packages */ - -/* enhanced kernel services */ - - -/* acceleration: Assembly language or algorithmic acceleration packages */ - - -/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ - - -/* Micrium: Micrium software products porting for RT-Thread */ - -#define PKG_USING_DFS_UFFS -#define RT_USING_DFS_UFFS -#define RT_UFFS_ECC_MODE_3 -#define RT_UFFS_ECC_MODE 3 -#define PKG_USING_DFS_UFFS_LATEST_VERSION -#define PKG_USING_RAMDISK -#define PKG_USING_RAMDISK_LATEST_VERSION - -/* peripheral libraries and drivers */ - - -/* Kendryte SDK */ - - -/* AI packages */ - - -/* miscellaneous packages */ - -/* project laboratory */ - -/* samples: kernel and components samples */ - - -/* entertainment: terminal games and other interesting software packages */ - -#define PKG_USING_OPTPARSE -#define PKG_USING_OPTPARSE_LATEST_VERSION - -/* Privated Packages of RealThread */ - - -/* Network Utilities */ - - -/* RT-Thread Smart */ - - -/* Hardware Drivers Config */ - -/* On-chip Peripheral Drivers */ - -#define SOC_SERIES_NUC980 -#define BSP_USE_STDDRIVER_SOURCE -#define BSP_USING_MMU -#define BSP_USING_PDMA -#define NU_PDMA_MEMFUN_ACTOR_MAX 2 -#define BSP_USING_GPIO -#define BSP_USING_EMAC -#define BSP_USING_EMAC0 -#define BSP_USING_RTC -#define NU_RTC_SUPPORT_IO_RW -#define NU_RTC_SUPPORT_MSH_CMD -#define BSP_USING_ADC -#define BSP_USING_TMR -#define BSP_USING_TIMER -#define BSP_USING_TMR0 -#define BSP_USING_TIMER0 -#define BSP_USING_TMR1 -#define BSP_USING_TIMER1 -#define BSP_USING_TMR2 -#define BSP_USING_TIMER2 -#define BSP_USING_TMR3 -#define BSP_USING_TIMER3 -#define BSP_USING_TMR4 -#define BSP_USING_TIMER4 -#define BSP_USING_UART -#define BSP_USING_UART0 -#define BSP_USING_UART1 -#define BSP_USING_UART1_TX_DMA -#define BSP_USING_UART1_RX_DMA -#define BSP_USING_I2C -#define BSP_USING_I2C0 -#define BSP_USING_I2C2 -#define BSP_USING_SDH -#define BSP_USING_SDH1 -#define NU_SDH_USING_PDMA -#define NU_SDH_HOTPLUG -#define BSP_USING_PWM -#define BSP_USING_PWM0 -#define BSP_USING_SPI -#define BSP_USING_SPI_PDMA -#define BSP_USING_SPI0 -#define BSP_USING_SPI0_PDMA -#define BSP_USING_SPI1_NONE -#define BSP_USING_I2S -#define NU_I2S_DMA_FIFO_SIZE 4096 -#define BSP_USING_QSPI -#define BSP_USING_QSPI_PDMA -#define BSP_USING_QSPI0 -#define BSP_USING_QSPI0_PDMA -#define BSP_USING_CRYPTO -#define BSP_USING_WDT -#define BSP_USING_USBD -#define BSP_USING_USBH - -/* On-board Peripheral Drivers */ - -#define BSP_USING_CONSOLE -#define BOARD_USING_IP101GR -#define BOARD_USING_NAU8822 -#define BOARD_USING_STORAGE_SDCARD -#define BOARD_USING_STORAGE_SPINAND -#define BOARD_USING_USB0_DEVICE_HOST -#define BOARD_USING_USB1_HOST - -/* Board extended module drivers */ - - -/* Nuvoton Packages Config */ - -#define NU_PKG_USING_UTILS -#define NU_PKG_USING_DEMO -#define NU_PKG_USING_NAU8822 -#define NU_PKG_USING_SPINAND - -#endif diff --git a/bsp/nuvoton/nk-n9h30/.config b/bsp/nuvoton/nk-n9h30/.config index a8fdd9106b..dab92a6914 100644 --- a/bsp/nuvoton/nk-n9h30/.config +++ b/bsp/nuvoton/nk-n9h30/.config @@ -8,6 +8,7 @@ # CONFIG_RT_NAME_MAX=16 # CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_SMART is not set # CONFIG_RT_USING_SMP is not set CONFIG_RT_ALIGN_SIZE=4 # CONFIG_RT_THREAD_PRIORITY_8 is not set @@ -61,7 +62,7 @@ CONFIG_RT_USING_SMALL_MEM=y # CONFIG_RT_USING_SLAB is not set CONFIG_RT_USING_MEMHEAP=y CONFIG_RT_MEMHEAP_FAST_MODE=y -# CONFIG_RT_MEMHEAP_BSET_MODE is not set +# CONFIG_RT_MEMHEAP_BEST_MODE is not set CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y # CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set # CONFIG_RT_USING_SLAB_AS_HEAP is not set @@ -76,15 +77,20 @@ CONFIG_RT_USING_HEAP=y # CONFIG_RT_USING_DEVICE=y # CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_DM is not set CONFIG_RT_USING_INTERRUPT_INFO=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=256 CONFIG_RT_CONSOLE_DEVICE_NAME="uart0" -CONFIG_RT_VER_NUM=0x40101 -CONFIG_ARCH_ARM=y -# CONFIG_RT_USING_CPU_FFS is not set -CONFIG_ARCH_ARM_ARM9=y +CONFIG_RT_VER_NUM=0x50000 +CONFIG_RT_USING_CACHE=y +# CONFIG_ARCH_ARM_BOOTWITH_FLUSH_CACHE is not set # CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set +# CONFIG_RT_USING_CPU_FFS is not set +CONFIG_ARCH_MM_MMU=y +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_MMU=y +CONFIG_ARCH_ARM_ARM9=y # # RT-Thread Components @@ -141,7 +147,9 @@ CONFIG_RT_DFS_ELM_REENTRANT=y CONFIG_RT_DFS_ELM_MUTEX_TIMEOUT=3000 CONFIG_RT_USING_DFS_DEVFS=y # CONFIG_RT_USING_DFS_ROMFS is not set +# CONFIG_RT_USING_DFS_CROMFS is not set # CONFIG_RT_USING_DFS_RAMFS is not set +# CONFIG_RT_USING_DFS_TMPFS is not set # CONFIG_RT_USING_DFS_NFS is not set CONFIG_RT_USING_FAL=y CONFIG_FAL_DEBUG_CONFIG=y @@ -149,12 +157,12 @@ CONFIG_FAL_DEBUG=1 CONFIG_FAL_PART_HAS_TABLE_CFG=y CONFIG_FAL_USING_SFUD_PORT=y CONFIG_FAL_USING_NOR_FLASH_DEV_NAME="norflash0" -# CONFIG_RT_USING_LWP is not set # # Device Drivers # CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 CONFIG_RT_USING_SYSTEM_WORKQUEUE=y CONFIG_RT_SYSTEM_WORKQUEUE_STACKSIZE=2048 CONFIG_RT_SYSTEM_WORKQUEUE_PRIORITY=23 @@ -165,6 +173,7 @@ CONFIG_RT_USING_SERIAL_V1=y CONFIG_RT_SERIAL_RB_BUFSZ=2048 CONFIG_RT_USING_CAN=y # CONFIG_RT_CAN_USING_HDR is not set +# CONFIG_RT_CAN_USING_CANFD is not set CONFIG_RT_USING_HWTIMER=y # CONFIG_RT_USING_CPUTIME is not set CONFIG_RT_USING_I2C=y @@ -175,11 +184,15 @@ CONFIG_RT_USING_I2C_BITOPS=y CONFIG_RT_USING_PIN=y CONFIG_RT_USING_ADC=y # CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set CONFIG_RT_USING_PWM=y # CONFIG_RT_USING_MTD_NOR is not set CONFIG_RT_USING_MTD_NAND=y # CONFIG_RT_MTD_NAND_DEBUG is not set # CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_FDT is not set CONFIG_RT_USING_RTC=y CONFIG_RT_USING_ALARM=y # CONFIG_RT_USING_SOFT_RTC is not set @@ -204,11 +217,14 @@ CONFIG_RT_AUDIO_RECORD_PIPE_SIZE=2048 # CONFIG_RT_USING_SENSOR is not set CONFIG_RT_USING_TOUCH=y # CONFIG_RT_TOUCH_PIN_IRQ is not set +# CONFIG_RT_USING_LCD is not set # CONFIG_RT_USING_HWCRYPTO is not set # CONFIG_RT_USING_PULSE_ENCODER is not set CONFIG_RT_USING_INPUT_CAPTURE=y CONFIG_RT_INPUT_CAPTURE_RB_SIZE=100 +# CONFIG_RT_USING_DEV_BUS is not set # CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_VIRTIO is not set # # Using USB @@ -459,6 +475,7 @@ CONFIG_UTEST_THR_PRIORITY=20 # CONFIG_PKG_USING_AGILE_FTP is not set # CONFIG_PKG_USING_EMBEDDEDPROTO is not set # CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_RYANMQTT is not set # CONFIG_PKG_USING_LORA_PKT_FWD is not set # CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set # CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set @@ -466,6 +483,7 @@ CONFIG_UTEST_THR_PRIORITY=20 # CONFIG_PKG_USING_SMALL_MODBUS is not set # CONFIG_PKG_USING_NET_SERVER is not set # CONFIG_PKG_USING_ZFTP is not set +# CONFIG_PKG_USING_WOL is not set # # security packages @@ -490,6 +508,7 @@ CONFIG_UTEST_THR_PRIORITY=20 # CONFIG_PKG_USING_RAPIDJSON is not set # CONFIG_PKG_USING_JSMN is not set # CONFIG_PKG_USING_AGILE_JSMN is not set +# CONFIG_PKG_USING_PARSON is not set # # XML: Extensible Markup Language @@ -515,10 +534,19 @@ CONFIG_PKG_LVGL_PATH="/packages/multimedia/LVGL/LVGL" CONFIG_PKG_LVGL_THREAD_PRIO=20 CONFIG_PKG_LVGL_THREAD_STACK_SIZE=4096 CONFIG_PKG_LVGL_DISP_REFR_PERIOD=30 +# CONFIG_PKG_USING_LVGL_SQUARELINE is not set # CONFIG_PKG_LVGL_USING_EXAMPLES is not set CONFIG_PKG_LVGL_USING_DEMOS=y -CONFIG_PKG_LVGL_VER_NUM=0x99999 -CONFIG_PKG_LVGL_VER="latest" +CONFIG_PKG_LVGL_USING_V08034=y +# CONFIG_PKG_LVGL_USING_V08033 is not set +# CONFIG_PKG_LVGL_USING_V08032 is not set +# CONFIG_PKG_LVGL_USING_V08031 is not set +# CONFIG_PKG_LVGL_USING_V08030 is not set +# CONFIG_PKG_LVGL_USING_V08020 is not set +# CONFIG_PKG_LVGL_USING_V8_3_LATEST_VERSION is not set +# CONFIG_PKG_LVGL_USING_LATEST_VERSION is not set +CONFIG_PKG_LVGL_VER_NUM=0x08034 +CONFIG_PKG_LVGL_VER="v8.3.4" # CONFIG_PKG_USING_LITTLEVGL2RTT is not set # CONFIG_PKG_USING_LV_MUSIC_DEMO is not set # CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set @@ -564,7 +592,6 @@ CONFIG_PKG_LVGL_VER="latest" # CONFIG_PKG_USING_SEGGER_RTT is not set # CONFIG_PKG_USING_RDB is not set # CONFIG_PKG_USING_ULOG_EASYFLASH is not set -# CONFIG_PKG_USING_ULOG_FILE is not set # CONFIG_PKG_USING_LOGMGR is not set # CONFIG_PKG_USING_ADBD is not set # CONFIG_PKG_USING_COREMARK is not set @@ -598,7 +625,8 @@ CONFIG_PKG_LVGL_VER="latest" # CONFIG_PKG_USING_CBOX is not set # CONFIG_PKG_USING_SNOWFLAKE is not set # CONFIG_PKG_USING_HASH_MATCH is not set -# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set # # system packages @@ -611,14 +639,6 @@ CONFIG_PKG_LVGL_VER="latest" # CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set # CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set -# -# POSIX extension functions -# -# CONFIG_PKG_USING_POSIX_GETLINE is not set -# CONFIG_PKG_USING_POSIX_WCWIDTH is not set -# CONFIG_PKG_USING_POSIX_ITOA is not set -# CONFIG_PKG_USING_POSIX_STRINGS is not set - # # acceleration: Assembly language or algorithmic acceleration packages # @@ -642,10 +662,11 @@ CONFIG_PKG_LVGL_VER="latest" # CONFIG_PKG_USING_UC_CLK is not set # CONFIG_PKG_USING_UC_COMMON is not set # CONFIG_PKG_USING_UC_MODBUS is not set -# CONFIG_PKG_USING_RTDUINO is not set +# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set # CONFIG_PKG_USING_CAIRO is not set # CONFIG_PKG_USING_PIXMAN is not set # CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_PERF_COUNTER is not set # CONFIG_PKG_USING_FLASHDB is not set # CONFIG_PKG_USING_SQLITE is not set # CONFIG_PKG_USING_RTI is not set @@ -679,17 +700,93 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_KMULTI_RTIMER is not set # CONFIG_PKG_USING_TFDB is not set # CONFIG_PKG_USING_QPC is not set +# CONFIG_PKG_USING_AGILE_UPGRADE is not set # # peripheral libraries and drivers # -# CONFIG_PKG_USING_SENSORS_DRIVERS is not set -# CONFIG_PKG_USING_REALTEK_AMEBA is not set + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_TMP1075 is not set +# CONFIG_PKG_USING_SR04 is not set +# CONFIG_PKG_USING_CCS811 is not set +# CONFIG_PKG_USING_PMSXX is not set +# CONFIG_PKG_USING_RT3020 is not set +# CONFIG_PKG_USING_MLX90632 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set # CONFIG_PKG_USING_SHT2X is not set # CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set # CONFIG_PKG_USING_AS7341 is not set -# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_CW2015 is not set # CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ESP_IDF is not set # CONFIG_PKG_USING_BUTTON is not set # CONFIG_PKG_USING_PCF8574 is not set # CONFIG_PKG_USING_SX12XX is not set @@ -700,6 +797,11 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_NRF5X_SDK is not set # CONFIG_PKG_USING_NRFX is not set # CONFIG_PKG_USING_WM_LIBRARIES is not set + +# +# Kendryte SDK +# +# CONFIG_PKG_USING_K210_SDK is not set # CONFIG_PKG_USING_KENDRYTE_SDK is not set # CONFIG_PKG_USING_INFRARED is not set # CONFIG_PKG_USING_MULTI_INFRARED is not set @@ -707,12 +809,9 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_AGILE_LED is not set # CONFIG_PKG_USING_AT24CXX is not set # CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set -# CONFIG_PKG_USING_AD7746 is not set # CONFIG_PKG_USING_PCA9685 is not set # CONFIG_PKG_USING_I2C_TOOLS is not set # CONFIG_PKG_USING_NRF24L01 is not set -# CONFIG_PKG_USING_TOUCH_DRIVERS is not set -# CONFIG_PKG_USING_MAX17048 is not set # CONFIG_PKG_USING_RPLIDAR is not set # CONFIG_PKG_USING_AS608 is not set # CONFIG_PKG_USING_RC522 is not set @@ -727,7 +826,6 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_CAN_YMODEM is not set # CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set # CONFIG_PKG_USING_QLED is not set -# CONFIG_PKG_USING_PAJ7620 is not set # CONFIG_PKG_USING_AGILE_CONSOLE is not set # CONFIG_PKG_USING_LD3320 is not set # CONFIG_PKG_USING_WK2124 is not set @@ -758,8 +856,11 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_BL_MCU_SDK is not set # CONFIG_PKG_USING_SOFT_SERIAL is not set # CONFIG_PKG_USING_MB85RS16 is not set -# CONFIG_PKG_USING_CW2015 is not set # CONFIG_PKG_USING_RFM300 is not set +# CONFIG_PKG_USING_IO_INPUT_FILTER is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_FINGERPRINT is not set # # AI packages @@ -774,6 +875,12 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_QUEST is not set # CONFIG_PKG_USING_NAXOS is not set +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_UKAL is not set + # # miscellaneous packages # @@ -825,7 +932,6 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_VI is not set # CONFIG_PKG_USING_KI is not set # CONFIG_PKG_USING_ARMv7M_DWT is not set -# CONFIG_PKG_USING_UKAL is not set # CONFIG_PKG_USING_CRCLIB is not set # CONFIG_PKG_USING_LWGPS is not set # CONFIG_PKG_USING_STATE_MACHINE is not set @@ -835,6 +941,213 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_MFBD is not set # CONFIG_PKG_USING_SLCAN2RTT is not set # CONFIG_PKG_USING_SOEM is not set +# CONFIG_PKG_USING_QPARAM is not set +# CONFIG_PKG_USING_CorevMCU_CLI is not set + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects +# +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_ADAFRUIT_MAX31855 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set +# CONFIG_PKG_USING_ADAFRUIT_MSA301 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set +# CONFIG_PKG_USING_SEEED_ITG3200 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set +# CONFIG_PKG_USING_SEEED_MP503 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set + +# +# Other +# + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set + +# +# Uncategorized +# # # Hardware Drivers Config @@ -958,9 +1271,9 @@ CONFIG_BOARD_USING_ADCTOUCH=y # CONFIG_NU_PKG_USING_UTILS=y # CONFIG_NU_PKG_USING_DEMO is not set -# CONFIG_NU_PKG_USING_LVGL is not set # CONFIG_NU_PKG_USING_BMX055 is not set # CONFIG_NU_PKG_USING_MAX31875 is not set +# CONFIG_NU_PKG_USING_NCT7717U is not set # CONFIG_NU_PKG_USING_NAU88L25 is not set CONFIG_NU_PKG_USING_NAU8822=y # CONFIG_NU_PKG_USING_DA9062 is not set @@ -971,5 +1284,3 @@ CONFIG_NU_PKG_USING_NAU8822=y CONFIG_NU_PKG_USING_ADC_TOUCH=y # CONFIG_NU_PKG_USING_ADC_TOUCH_SW is not set # CONFIG_NU_PKG_USING_SPINAND is not set -CONFIG_UTEST_CMD_PREFIX="bsp.nuvoton.utest." -CONFIG_BOARD_USE_UTEST=y diff --git a/bsp/nuvoton/nk-n9h30/applications/SConscript b/bsp/nuvoton/nk-n9h30/applications/SConscript index 9bb9abae89..a3ccbe0469 100644 --- a/bsp/nuvoton/nk-n9h30/applications/SConscript +++ b/bsp/nuvoton/nk-n9h30/applications/SConscript @@ -1,15 +1,11 @@ from building import * import os - cwd = GetCurrentDir() src = Glob('*.c') CPPPATH = [cwd] - group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) - list = os.listdir(cwd) for item in list: if os.path.isfile(os.path.join(cwd, item, 'SConscript')): group = group + SConscript(os.path.join(item, 'SConscript')) - Return('group') diff --git a/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_conf.h b/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_conf.h index 1587d341ac..52438622fa 100644 --- a/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_conf.h +++ b/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_conf.h @@ -14,9 +14,8 @@ #include "rtconfig.h" #if defined(SOC_SERIES_N9H30) - #define LV_USE_GPU_N9H30_GE2D 1 //#define LV_USE_ANTI_TEARING 1 - //#define LV_DISP_DEF_REFR_PERIOD 16 + //#define LV_DISP_DEF_REFR_PERIOD 30 #ifndef BIT31 #define BIT31 (0x80000000) ///< Bit 31 mask of an 32 bit integer @@ -25,8 +24,6 @@ #define IS_CACHEABLE_VRAM(addr) !((uint32_t)addr & BIT31) #endif -#define LV_VERSION_EQUAL(x,y,z) (x == LVGL_VERSION_MAJOR && y==LVGL_VERSION_MINOR && z==LVGL_VERSION_PATCH ) - #define LV_COLOR_DEPTH BSP_LCD_BPP #define LV_HOR_RES_MAX BSP_LCD_WIDTH #define LV_VER_RES_MAX BSP_LCD_HEIGHT @@ -36,7 +33,7 @@ #define LV_USE_PERF_MONITOR 1 //#define CONFIG_LV_LOG_LEVEL LV_LOG_LEVEL_TRACE -//#define LV_USE_DEMO_RTT_MUSIC 1 +#define LV_USE_DEMO_RTT_MUSIC 1 #if LV_USE_DEMO_RTT_MUSIC #define LV_COLOR_SCREEN_TRANSP 1 #define LV_DEMO_RTT_MUSIC_AUTO_PLAY 1 @@ -46,7 +43,7 @@ #endif /* Please comment LV_USE_DEMO_RTT_MUSIC declaration before un-comment below */ -#define LV_USE_DEMO_WIDGETS 1 +//#define LV_USE_DEMO_WIDGETS 1 //#define LV_USE_DEMO_BENCHMARK 1 #endif diff --git a/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_demo.c b/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_demo.c index 7a04e1804a..ebfbba2273 100644 --- a/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_demo.c +++ b/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_demo.c @@ -17,16 +17,15 @@ void lv_user_gui_init(void) #if LV_USE_DEMO_BENCHMARK extern void lv_demo_benchmark(void); lv_demo_benchmark(); -#endif -#if LV_USE_DEMO_WIDGETS +#elif LV_USE_DEMO_WIDGETS extern void lv_demo_widgets(void); lv_demo_widgets(); -#endif -#if LV_USE_DEMO_MUSIC || LV_USE_DEMO_RTT_MUSIC +#elif (LV_USE_DEMO_MUSIC || LV_USE_DEMO_RTT_MUSIC) extern void lv_demo_music(void); lv_demo_music(); + #endif } diff --git a/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_gpu_n9h30_ge2d.c b/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_gpu_n9h30_ge2d.c index e0dca96f55..e13f2d16a2 100644 --- a/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_gpu_n9h30_ge2d.c +++ b/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_gpu_n9h30_ge2d.c @@ -17,8 +17,6 @@ *********************/ #include -#if LV_USE_GPU_N9H30_GE2D && LV_VERSION_CHECK(8, 2, 0) - #include "lv_gpu_n9h30_ge2d.h" #include "nu_2d.h" #include "mmu.h" @@ -119,7 +117,10 @@ void lv_draw_n9h30_ge2d_blend(lv_draw_ctx_t *draw_ctx, const lv_draw_sw_blend_ds } } - if (!done) lv_draw_sw_blend_basic(draw_ctx, dsc); + if (!done) + { + lv_draw_sw_blend_basic(draw_ctx, dsc); + } } static void lv_draw_n9h30_ge2d_blend_fill(lv_color_t *dest_buf, lv_coord_t dest_stride, const lv_area_t *fill_area, @@ -130,7 +131,7 @@ static void lv_draw_n9h30_ge2d_blend_fill(lv_color_t *dest_buf, lv_coord_t dest_ lv_color_t *start_buf = dest_buf - (fill_area->y1 * dest_stride) - fill_area->x1; - //rt_kprintf("[blend_fill %d %08x] %dx%d %d %d\n", lv_area_get_size(fill_area), dest_buf, fill_area_w, fill_area_h, fill_area->x1, fill_area->y1 ); +// rt_kprintf("[blend_fill %d %08x] %dx%d %d %d\n", lv_area_get_size(fill_area), dest_buf, fill_area_w, fill_area_h, fill_area->x1, fill_area->y1 ); if (IS_CACHEABLE_VRAM(dest_buf)) mmu_clean_invalidated_dcache((uint32_t)dest_buf, sizeof(lv_color_t) * (dest_stride * fill_area_h + fill_area_w)); @@ -153,34 +154,51 @@ static void lv_draw_n9h30_ge2d_blend_fill(lv_color_t *dest_buf, lv_coord_t dest_ static void lv_draw_n9h30_ge2d_blend_map(lv_color_t *dest_buf, const lv_area_t *dest_area, lv_coord_t dest_stride, const lv_color_t *src_buf, lv_coord_t src_stride, lv_opa_t opa) { - /*Simple copy*/ - int32_t dest_x = dest_area->x1; - int32_t dest_y = dest_area->y1; int32_t dest_w = lv_area_get_width(dest_area); int32_t dest_h = lv_area_get_height(dest_area); - const lv_color_t *dest_start_buf = dest_buf - (dest_area->y1 * dest_stride) - dest_area->x1; - //rt_kprintf("[blend_map %d %08x -> %08x] (x:%d y:%d, %dx%d) \n", lv_area_get_size(dest_area), src_buf, dest_buf, dest_x, dest_y, dest_w, dest_h, src_stride, dest_stride); - // Enter GE2D -> - ge2dInit(sizeof(lv_color_t) * 8, dest_stride, dest_area->y2, (void *)dest_start_buf); - - if (opa >= LV_OPA_MAX) + if (!IS_CACHEABLE_VRAM(dest_buf)) { - ge2dBitblt_SetAlphaMode(0, 0, 0); - ge2dBitblt_SetDrawMode(0, 0, 0); + const lv_color_t *dest_start_buf = dest_buf - (dest_area->y1 * dest_stride) - dest_area->x1; + int32_t dest_x = dest_area->x1; + int32_t dest_y = dest_area->y1; + + // Enter GE2D -> + ge2dInit(sizeof(lv_color_t) * 8, dest_stride, dest_area->y2, (void *)dest_start_buf); + + if (opa >= LV_OPA_MAX) + { + ge2dBitblt_SetAlphaMode(0, 0, 0); + ge2dBitblt_SetDrawMode(0, 0, 0); + } + else + { + ge2dBitblt_SetAlphaMode(1, opa, opa); + } + + if (IS_CACHEABLE_VRAM(src_buf)) + mmu_clean_dcache((uint32_t)src_buf, sizeof(lv_color_t) * (src_stride * dest_h + dest_w)); + + ge2dSpriteBlt_Screen(dest_x, dest_y, dest_w, dest_h, (void *)src_buf); + // -> Leave GE2D } else { - ge2dBitblt_SetAlphaMode(1, opa, opa); + int32_t x, y; + + /*Simple copy*/ + for (y = 0; y < dest_h; y++) + { + for (x = 0; x < dest_w; x++) + { + dest_buf[x] = src_buf[x]; + } + dest_buf += dest_stride; + src_buf += src_stride; + } } - - // flush - mmu_clean_dcache((uint32_t)src_buf, sizeof(lv_color_t) * (src_stride * dest_h + dest_w)); - - ge2dSpriteBlt_Screen(dest_x, dest_y, dest_w, dest_h, (void *)src_buf); - // -> Leave GE2D } void lv_gpu_n9h30_ge2d_wait_cb(lv_draw_ctx_t *draw_ctx) @@ -191,5 +209,3 @@ void lv_gpu_n9h30_ge2d_wait_cb(lv_draw_ctx_t *draw_ctx) /********************** * STATIC FUNCTIONS **********************/ - -#endif // #if (LV_USE_GPU_N9H30_GE2D && LV_VERSION_CHECK(8, 2, 0)) diff --git a/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_gpu_n9h30_ge2d.h b/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_gpu_n9h30_ge2d.h index 0852168ebd..343d590ff8 100644 --- a/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_gpu_n9h30_ge2d.h +++ b/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_gpu_n9h30_ge2d.h @@ -21,8 +21,6 @@ extern "C" { #include "../../hal/lv_hal_disp.h" #include "../sw/lv_draw_sw.h" -#if LV_USE_GPU_N9H30_GE2D && LV_VERSION_CHECK(8, 2, 0) - /********************* * DEFINES *********************/ @@ -54,8 +52,6 @@ void lv_gpu_n9h30_ge2d_wait_cb(lv_draw_ctx_t *draw_ctx); * MACROS **********************/ -#endif /*#if LV_USE_GPU_N9H30_GE2D && LV_VERSION_CHECK(8, 2, 0)*/ - #ifdef __cplusplus } /*extern "C"*/ #endif diff --git a/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_port_disp.c b/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_port_disp.c index c36a6635ee..97dc36a6c6 100644 --- a/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_port_disp.c +++ b/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_port_disp.c @@ -8,20 +8,20 @@ * 2021-12-17 Wayne The first version */ #include -#include "nu_2d.h" #include "mmu.h" - -#if (LV_USE_GPU_N9H30_GE2D && LV_VERSION_CHECK(8, 2, 0)) - #include "lv_gpu_n9h30_ge2d.h" -#endif +#include "lv_gpu_n9h30_ge2d.h" #define LOG_TAG "lvgl.disp" #define DBG_ENABLE #define DBG_SECTION_NAME LOG_TAG -#define DBG_LEVEL DBG_ERROR +#define DBG_LEVEL DBG_INFO #define DBG_COLOR #include +#if !defined(NU_PKG_LVGL_RENDERING_LAYER) + #define NU_PKG_LVGL_RENDERING_LAYER "lcd" +#endif + /*A static or global variable to store the buffers*/ static lv_disp_draw_buf_t disp_buf; static rt_device_t lcd_device = 0; @@ -32,6 +32,8 @@ static void *buf3_next = RT_NULL; static uint32_t u32FirstFlush = 0; +static uint32_t LV_USE_GPU_N9H30_GE2D = 1; + static void nu_antitearing(lv_disp_draw_buf_t *draw_buf, lv_color_t *color_p) { if (buf3_next) @@ -74,11 +76,15 @@ static void nu_flush_full_refresh(lv_disp_drv_t *disp_drv, const lv_area_t *area static void nu_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) { -#if (LV_USE_GPU_N9H30_GE2D==1) + int32_t area_w = lv_area_get_width(area); + int32_t area_h = lv_area_get_height(area); + lv_draw_sw_blend_dsc_t blend_flush = {0}; lv_draw_ctx_t draw_flush = {0}; lv_area_t flush_area = {0, 0, info.width - 1, info.height - 1 }; + //rt_kprintf("[nu_flush %d %08x] %dx%d %d %d\n", lv_area_get_size(area), color_p, area_w, area_h, area->x1, area->y1 ); + blend_flush.blend_area = area; blend_flush.src_buf = color_p; blend_flush.mask_buf = NULL; @@ -91,23 +97,6 @@ static void nu_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t lv_draw_n9h30_ge2d_blend(&draw_flush, (const lv_draw_sw_blend_dsc_t *)&blend_flush); -#else - int32_t flush_area_w = lv_area_get_width(area); - int32_t flush_area_h = lv_area_get_height(area); - - //if ( flush_area_w&0x3 != 0 ) - // rt_kprintf("[%s %08x] %dx%d %d %d\n", __func__, color_p, flush_area_w, flush_area_h, area->x1, area->y1 ); - - /* Update dirty region. */ - // Enter GE2D -> - ge2dInit(sizeof(lv_color_t) * 8, info.width, info.height, (void *)info.framebuffer); - ge2dBitblt_SetAlphaMode(-1, 0, 0); - ge2dBitblt_SetDrawMode(-1, 0, 0); - - ge2dSpriteBlt_Screen(area->x1, area->y1, flush_area_w, flush_area_h, (void *)color_p); - // -> Leave GE2D -#endif - if (!u32FirstFlush) { /* Enable backlight at first flushing. */ @@ -118,52 +107,9 @@ static void nu_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t lv_disp_flush_ready(disp_drv); } -#if LV_VERSION_EQUAL(8, 1, 0) -static void nu_fill_cb(struct _lv_disp_drv_t *disp_drv, lv_color_t *dest_buf, lv_coord_t dest_width, - const lv_area_t *fill_area, lv_color_t color) -{ - int32_t fill_area_w = lv_area_get_width(fill_area); - int32_t fill_area_h = lv_area_get_height(fill_area); - - - if (lv_area_get_size(fill_area) < 3600) - { - /*Software filling*/ - int y; - lv_color_t *disp_buf_first = dest_buf + dest_width * fill_area->y1 + fill_area->x1; - for (y = 0; y < fill_area_h; y++) - { - lv_color_fill(disp_buf_first, color, fill_area_w); - disp_buf_first += dest_width; - } - } - else - { - //rt_kprintf("[blend_fill %d %08x] %dx%d %d %d\n", lv_area_get_size(fill_area), dest_buf, fill_area_w, fill_area_h, fill_area->x1, fill_area->y1 ); - - if (IS_CACHEABLE_VRAM(dest_buf)) - mmu_clean_invalidated_dcache((uint32_t)dest_buf, sizeof(lv_color_t) * (dest_width * fill_area_h + fill_area_w)); - - /*Hardware filling*/ - // Enter GE2D -> - ge2dInit(sizeof(lv_color_t) * 8, fill_area_w, fill_area_h, (void *)dest_buf); - - ge2dClip_SetClip(fill_area->x1, fill_area->y1, fill_area->x2, fill_area->y2); - - if (sizeof(lv_color_t) == 4) - ge2dFill_Solid(fill_area->x1, fill_area->y1, fill_area_w, fill_area_h, color.full); - else if (sizeof(lv_color_t) == 2) - ge2dFill_Solid_RGB565(fill_area->x1, fill_area->y1, fill_area_w, fill_area_h, color.full); - - ge2dClip_SetClip(-1, 0, 0, 0); - // -> Leave GE2D - } -} -#endif - void nu_perf_monitor(struct _lv_disp_drv_t *disp_drv, uint32_t time, uint32_t px) { - rt_kprintf("Elapsed: %dms, Pixel: %d, Bytes:%d, %d%\n", time, px, px * sizeof(lv_color_t), px * 100 / disp_drv->draw_buf->size); + LOG_I("Elapsed: %dms, Pixel: %d, Bytes:%d, %d%\n", time, px, px * sizeof(lv_color_t), px * 100 / disp_drv->draw_buf->size); } void lv_port_disp_init(void) @@ -173,13 +119,19 @@ void lv_port_disp_init(void) void *buf2 = RT_NULL; uint32_t u32FBSize; - lcd_device = rt_device_find("lcd"); - if (lcd_device == 0) + lcd_device = rt_device_find(NU_PKG_LVGL_RENDERING_LAYER); + if (lcd_device == RT_NULL) { LOG_E("error!"); return; } + if (!LV_VERSION_CHECK(8, 3, 0)) + { + LV_USE_GPU_N9H30_GE2D = 0; + } + LOG_I("LVGL: %s drawing using 2DGE", LV_USE_GPU_N9H30_GE2D ? "Enabled" : "Disabled"); + /* get framebuffer address */ result = rt_device_control(lcd_device, RTGRAPHIC_CTRL_GET_INFO, &info); if (result != RT_EOK) @@ -205,25 +157,22 @@ void lv_port_disp_init(void) #if (LV_USE_ANTI_TEARING==1) disp_drv.full_refresh = 1; #endif + LOG_I("LVGL: %s anti-tearing", disp_drv.full_refresh ? "Enabled" : "Disabled"); if (disp_drv.full_refresh) { -#if (LV_USE_GPU_N9H30_GE2D==1) - buf1 = (void *)info.framebuffer; // Use Non-cacheable VRAM -#else buf1 = (void *)((uint32_t)info.framebuffer & ~BIT31); // Use Cacheable VRAM -#endif buf2 = (void *)((uint32_t)buf1 + u32FBSize); buf3_next = (void *)((uint32_t)buf2 + u32FBSize); - rt_kprintf("LVGL: Use triple screen-sized buffers(full_refresh) - buf1@%08x, buf2@%08x, buf3_next@%08x\n", buf1, buf2, buf3_next); + LOG_I("LVGL: Use triple screen-sized buffers(full_refresh) - buf1@%08x, buf2@%08x, buf3_next@%08x", buf1, buf2, buf3_next); disp_drv.flush_cb = nu_flush_full_refresh; } else { - buf1 = (void *)(((uint32_t)info.framebuffer) + u32FBSize); + buf1 = (void *)(((uint32_t)info.framebuffer & ~BIT31) + u32FBSize); // Use Cacheable VRAM buf2 = (void *)((uint32_t)buf1 + u32FBSize); - rt_kprintf("LVGL: Use two screen-sized buffers - buf1@%08x, buf2@%08x\n", buf1, buf2); + LOG_I("LVGL: Use two screen-sized buffers - buf1@%08x, buf2@%08x", buf1, buf2); rt_device_control(lcd_device, RTGRAPHIC_CTRL_PAN_DISPLAY, info.framebuffer); disp_drv.flush_cb = nu_flush; @@ -242,16 +191,12 @@ void lv_port_disp_init(void) /*Set a display buffer*/ disp_drv.draw_buf = &disp_buf; -#if LV_VERSION_EQUAL(8, 1, 0) - /*Fill a memory with a color (GPU only)*/ - disp_drv.gpu_fill_cb = nu_fill_cb; -#endif - -#if (LV_USE_GPU_N9H30_GE2D && LV_VERSION_CHECK(8, 2, 0)) - disp_drv.draw_ctx_init = lv_draw_n9h30_ge2d_ctx_init; - disp_drv.draw_ctx_deinit = lv_draw_n9h30_ge2d_ctx_init; - disp_drv.draw_ctx_size = sizeof(lv_draw_n9h30_ge2d_ctx_t); -#endif + if (LV_USE_GPU_N9H30_GE2D) + { + disp_drv.draw_ctx_init = lv_draw_n9h30_ge2d_ctx_init; + disp_drv.draw_ctx_deinit = lv_draw_n9h30_ge2d_ctx_init; + disp_drv.draw_ctx_size = sizeof(lv_draw_n9h30_ge2d_ctx_t); + } /*Called after every refresh cycle to tell the rendering and flushing time + the number of flushed pixels*/ //disp_drv.monitor_cb = nu_perf_monitor; diff --git a/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_port_disp.h b/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_port_disp.h deleted file mode 100644 index b11ce3c5b6..0000000000 --- a/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_port_disp.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2021-10-18 Meco Man The first version - */ -#ifndef LV_PORT_DISP_H -#define LV_PORT_DISP_H - -#ifdef __cplusplus -extern "C" { -#endif - -void lv_port_disp_init(void); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_port_indev.h b/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_port_indev.h deleted file mode 100644 index bde7176807..0000000000 --- a/bsp/nuvoton/nk-n9h30/applications/lvgl/lv_port_indev.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2021-10-18 Meco Man The first version - */ -#ifndef LV_PORT_INDEV_H -#define LV_PORT_INDEV_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -extern lv_indev_t *button_indev; - -void lv_port_indev_init(void); -void lv_port_indev_input(rt_int16_t x, rt_int16_t y, lv_indev_state_t state); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/bsp/nuvoton/nk-n9h30/applications/mnt.c b/bsp/nuvoton/nk-n9h30/applications/mnt.c index 96b4788ab2..f69566c3a4 100644 --- a/bsp/nuvoton/nk-n9h30/applications/mnt.c +++ b/bsp/nuvoton/nk-n9h30/applications/mnt.c @@ -12,6 +12,8 @@ #include +#if defined(RT_USING_DFS) + #define LOG_TAG "mnt" #define DBG_ENABLE #define DBG_SECTION_NAME "mnt" @@ -160,9 +162,10 @@ exit_mkdir_p: #if defined(PKG_USING_DFS_YAFFS) && defined(RT_USING_DFS_MNTTABLE) #include "yaffs_guts.h" -void yaffs_dev_init(void) +int yaffs_dev_init(void) { int i; + for (i = 0; i < sizeof(mount_table) / sizeof(struct dfs_mount_tbl); i++) { if (mount_table[i].filesystemtype && !rt_strcmp(mount_table[i].filesystemtype, "yaffs")) @@ -170,11 +173,26 @@ void yaffs_dev_init(void) struct rt_mtd_nand_device *psMtdNandDev = RT_MTD_NAND_DEVICE(rt_device_find(mount_table[i].device_name)); if (psMtdNandDev) { + LOG_I("yaffs start [%s].", mount_table[i].device_name); + yaffs_start_up(psMtdNandDev, (const char *)mount_table[i].path); + + LOG_I("dfs mount [%s].", mount_table[i].device_name); + if (dfs_mount(mount_table[i].device_name, + mount_table[i].path, + mount_table[i].filesystemtype, + mount_table[i].rwflag, + mount_table[i].data) != 0) + { + LOG_E("mount fs[%s] on %s failed.", mount_table[i].filesystemtype, mount_table[i].path); + } } } } + + return 0; } +INIT_APP_EXPORT(yaffs_dev_init); #endif /* Initialize the filesystem */ @@ -246,13 +264,10 @@ int filesystem_init(void) } #endif -#if defined(PKG_USING_DFS_YAFFS) && defined(RT_USING_DFS_MNTTABLE) - yaffs_dev_init(); -#endif - exit_filesystem_init: return -result; } INIT_ENV_EXPORT(filesystem_init); #endif +#endif diff --git a/bsp/nuvoton/nk-n9h30/linking_scripts/n9h30.ld b/bsp/nuvoton/nk-n9h30/linking_scripts/n9h30.ld index bdecf1da02..ef5d634823 100644 --- a/bsp/nuvoton/nk-n9h30/linking_scripts/n9h30.ld +++ b/bsp/nuvoton/nk-n9h30/linking_scripts/n9h30.ld @@ -53,6 +53,11 @@ SECTIONS . = ALIGN(4); } + . = ALIGN(4); + __exidx_start = .; + .ARM.exidx : { *(.ARM.exidx* .gnu.linkonce.armexidx.*) } + __exidx_end = .; + . = ALIGN(4); .rodata : { *(.rodata) *(.rodata.*) *(.gnu.linkonce.r*) *(.eh_frame) } diff --git a/bsp/nuvoton/nk-n9h30/project.uvproj b/bsp/nuvoton/nk-n9h30/project.uvproj deleted file mode 100644 index c2f79d0530..0000000000 --- a/bsp/nuvoton/nk-n9h30/project.uvproj +++ /dev/null @@ -1,6990 +0,0 @@ - - - 1.1 -
### uVision Project, (C) Keil Software
- - - rtthread - 0x4 - ARM-ADS - 5060750::V5.06 update 6 (build 750)::ARMCC - 0 - - - Nuvoton_ARM9_Series - Nuvoton - IRAM(0x0-0x0) CLOCK(000000000) CPUTYPE(ARM926EJ-S) - - - - 0 - - - - - - - - - - - - 0 - 0 - - - - Atmel\SAM9260\ - Atmel\SAM9260\ - - 0 - 0 - 0 - 0 - 1 - - .\build\keil4\ - rtthread - 1 - 0 - 0 - 1 - 1 - .\Listings\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf.exe --bin --output "$L@L.bin" "$L@L.axf" - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARM.DLL - -cAT91SAM9 - DARMATS9.DLL - -p91SAM9260 - SARM.DLL - - TARMATS9.DLL - -p91SAM9260 - - - - 1 - 0 - 0 - 0 - 16 - - - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - - - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - - 0 - 18 - - - - - - - - - - - - - ..\libraries\n9h30\Script\InitDDR2.ini - Segger\JLTAgdi.dll - - - - - 1 - 0 - 0 - 0 - 1 - 4098 - - 0 - Segger\JLTAgdi.dll - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - ARM926EJ-S - - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x1 - - - 1 - 0x100000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x1 - - - 0 - 0x0 - 0x0 - - - - - - 1 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 0 - 0 - 0 - - --c99 - RT_USING_LIBC, __RTTHREAD__, __STDC_LIMIT_MACROS, RT_USING_ARM_LIBC, __CLK_TCK=RT_TICK_PER_SECOND - - applications;.;board;..\..\..\components\libc\compilers\common\include;..\..\..\components\libc\compilers\common\extension;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\arm926;..\..\..\components\drivers\audio;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\spi;..\..\..\components\drivers\include;..\..\..\components\drivers\spi\sfud\inc;..\..\..\components\drivers\touch;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\libraries\n9h30\rtt_port;..\..\..\components\fal\inc;..\..\..\components\dfs\include;..\..\..\components\dfs\filesystems\devfs;..\..\..\components\dfs\filesystems\elmfat;..\..\..\components\finsh;.;..\..\..\include;..\libraries\n9h30\Driver\Include;packages\LVGL-v8.3.1\src;packages\LVGL-v8.3.1\src\core;packages\LVGL-v8.3.1\src\draw;packages\LVGL-v8.3.1\src\extra;packages\LVGL-v8.3.1\src\font;packages\LVGL-v8.3.1\src\hal;packages\LVGL-v8.3.1\src\misc;packages\LVGL-v8.3.1\src\widgets;packages\LVGL-v8.3.1\src\draw\arm2d;packages\LVGL-v8.3.1\src\draw\nxp;packages\LVGL-v8.3.1\src\draw\sdl;packages\LVGL-v8.3.1\src\draw\stm32_dma2d;packages\LVGL-v8.3.1\src\draw\sw;packages\LVGL-v8.3.1\src\draw\swm341_dma2d;packages\LVGL-v8.3.1\src\draw\nxp\pxp;packages\LVGL-v8.3.1\src\draw\nxp\vglite;packages\LVGL-v8.3.1\src\extra\layouts;packages\LVGL-v8.3.1\src\extra\libs;packages\LVGL-v8.3.1\src\extra\others;packages\LVGL-v8.3.1\src\extra\themes;packages\LVGL-v8.3.1\src\extra\widgets;packages\LVGL-v8.3.1\src\extra\layouts\flex;packages\LVGL-v8.3.1\src\extra\layouts\grid;packages\LVGL-v8.3.1\src\extra\libs\bmp;packages\LVGL-v8.3.1\src\extra\libs\ffmpeg;packages\LVGL-v8.3.1\src\extra\libs\freetype;packages\LVGL-v8.3.1\src\extra\libs\fsdrv;packages\LVGL-v8.3.1\src\extra\libs\gif;packages\LVGL-v8.3.1\src\extra\libs\png;packages\LVGL-v8.3.1\src\extra\libs\qrcode;packages\LVGL-v8.3.1\src\extra\libs\rlottie;packages\LVGL-v8.3.1\src\extra\libs\sjpg;packages\LVGL-v8.3.1\src\extra\others\fragment;packages\LVGL-v8.3.1\src\extra\others\gridnav;packages\LVGL-v8.3.1\src\extra\others\ime;packages\LVGL-v8.3.1\src\extra\others\imgfont;packages\LVGL-v8.3.1\src\extra\others\monkey;packages\LVGL-v8.3.1\src\extra\others\msg;packages\LVGL-v8.3.1\src\extra\others\snapshot;packages\LVGL-v8.3.1\src\extra\themes\basic;packages\LVGL-v8.3.1\src\extra\themes\default;packages\LVGL-v8.3.1\src\extra\themes\mono;packages\LVGL-v8.3.1\src\extra\widgets\animimg;packages\LVGL-v8.3.1\src\extra\widgets\calendar;packages\LVGL-v8.3.1\src\extra\widgets\chart;packages\LVGL-v8.3.1\src\extra\widgets\colorwheel;packages\LVGL-v8.3.1\src\extra\widgets\imgbtn;packages\LVGL-v8.3.1\src\extra\widgets\keyboard;packages\LVGL-v8.3.1\src\extra\widgets\led;packages\LVGL-v8.3.1\src\extra\widgets\list;packages\LVGL-v8.3.1\src\extra\widgets\menu;packages\LVGL-v8.3.1\src\extra\widgets\meter;packages\LVGL-v8.3.1\src\extra\widgets\msgbox;packages\LVGL-v8.3.1\src\extra\widgets\span;packages\LVGL-v8.3.1\src\extra\widgets\spinbox;packages\LVGL-v8.3.1\src\extra\widgets\spinner;packages\LVGL-v8.3.1\src\extra\widgets\tabview;packages\LVGL-v8.3.1\src\extra\widgets\tileview;packages\LVGL-v8.3.1\src\extra\widgets\win;packages\LVGL-v8.3.1\demos;packages\LVGL-v8.3.1\demos\benchmark;packages\LVGL-v8.3.1\demos\keypad_encoder;packages\LVGL-v8.3.1\demos\music;packages\LVGL-v8.3.1\demos\stress;packages\LVGL-v8.3.1\demos\widgets;packages\LVGL-v8.3.1\demos\music\assets;applications\lvgl;packages\LVGL-v8.3.1\env_support\rt-thread;..\..\..\components\net\lwip\lwip-2.0.3\src\include;..\..\..\components\net\lwip\lwip-2.0.3\src\include\ipv4;..\..\..\components\net\lwip\lwip-2.0.3\src\include\netif;..\..\..\components\net\lwip\port;..\libraries\n9h30\UsbHostLib\inc;..\libraries\nu_packages\ADC_TOUCH;..\libraries\nu_packages\AudioCodec;..\libraries\nu_packages\TPC;..\libraries\nu_packages\NuUtils\inc;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\posix\io\stdio;..\..\..\components\libc\posix\ipc;packages\ramdisk-latest\inc;..\..\..\components\drivers\usb\usbdevice;..\..\..\components\drivers\usb\usbhost;..\..\..\components\drivers\usb\usbhost\class;..\..\..\components\drivers\usb\usbhost\core;..\..\..\components\drivers\usb\usbhost\include;..\..\..\components\drivers\include;..\..\..\components\net\netdev\include;..\..\..\components\net\sal\include;..\..\..\components\net\sal\include\socket;..\..\..\components\net\sal\impl;..\..\..\components\net\sal\include\dfs_net;..\..\..\components\net\sal\include\socket\sys_socket;..\..\..\components\utilities\utest - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x20000000 - 0x20800000 - - .\linking_scripts\n9h30.sct - - - - - - - - - - - Applications - - - main.c - 1 - applications\main.c - - - - - mnt.c - 1 - applications\mnt.c - - - - - board - - - nu_pin_init.c - 1 - board\nu_pin_init.c - - - - - board_dev.c - 1 - board\board_dev.c - - - - - Compiler - - - syscall_mem.c - 1 - ..\..\..\components\libc\compilers\armlibc\syscall_mem.c - - - - - syscalls.c - 1 - ..\..\..\components\libc\compilers\armlibc\syscalls.c - - - - - cctype.c - 1 - ..\..\..\components\libc\compilers\common\cctype.c - - - - - cstdio.c - 1 - ..\..\..\components\libc\compilers\common\cstdio.c - - - - - cstdlib.c - 1 - ..\..\..\components\libc\compilers\common\cstdlib.c - - - - - cstring.c - 1 - ..\..\..\components\libc\compilers\common\cstring.c - - - - - ctime.c - 1 - ..\..\..\components\libc\compilers\common\ctime.c - - - - - cwchar.c - 1 - ..\..\..\components\libc\compilers\common\cwchar.c - - - - - CPU - - - context_rvds.S - 2 - ..\..\..\libcpu\arm\arm926\context_rvds.S - - - - - cpuport.c - 1 - ..\..\..\libcpu\arm\arm926\cpuport.c - - - - - machine.c - 1 - ..\..\..\libcpu\arm\arm926\machine.c - - - - - mmu.c - 1 - ..\..\..\libcpu\arm\arm926\mmu.c - - - - - stack.c - 1 - ..\..\..\libcpu\arm\arm926\stack.c - - - - - start_rvds.S - 2 - ..\..\..\libcpu\arm\arm926\start_rvds.S - - - - - trap.c - 1 - ..\..\..\libcpu\arm\arm926\trap.c - - - - - backtrace.c - 1 - ..\..\..\libcpu\arm\common\backtrace.c - - - - - div0.c - 1 - ..\..\..\libcpu\arm\common\div0.c - - - - - showmem.c - 1 - ..\..\..\libcpu\arm\common\showmem.c - - - - - DeviceDrivers - - - audio.c - 1 - ..\..\..\components\drivers\audio\audio.c - - - - - --c99 - - - - - - - - - - - - audio_pipe.c - 1 - ..\..\..\components\drivers\audio\audio_pipe.c - - - - - --c99 - - - - - - - - - - - - can.c - 1 - ..\..\..\components\drivers\can\can.c - - - - - --c99 - - - - - - - - - - - - hwtimer.c - 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c - - - - - --c99 - - - - - - - - - - - - i2c-bit-ops.c - 1 - ..\..\..\components\drivers\i2c\i2c-bit-ops.c - - - - - --c99 - - - - - - - - - - - - i2c_core.c - 1 - ..\..\..\components\drivers\i2c\i2c_core.c - - - - - --c99 - - - - - - - - - - - - i2c_dev.c - 1 - ..\..\..\components\drivers\i2c\i2c_dev.c - - - - - --c99 - - - - - - - - - - - - completion.c - 1 - ..\..\..\components\drivers\ipc\completion.c - - - - - --c99 - - - - - - - - - - - - dataqueue.c - 1 - ..\..\..\components\drivers\ipc\dataqueue.c - - - - - --c99 - - - - - - - - - - - - pipe.c - 1 - ..\..\..\components\drivers\ipc\pipe.c - - - - - --c99 - - - - - - - - - - - - ringblk_buf.c - 1 - ..\..\..\components\drivers\ipc\ringblk_buf.c - - - - - --c99 - - - - - - - - - - - - ringbuffer.c - 1 - ..\..\..\components\drivers\ipc\ringbuffer.c - - - - - --c99 - - - - - - - - - - - - waitqueue.c - 1 - ..\..\..\components\drivers\ipc\waitqueue.c - - - - - --c99 - - - - - - - - - - - - workqueue.c - 1 - ..\..\..\components\drivers\ipc\workqueue.c - - - - - --c99 - - - - - - - - - - - - adc.c - 1 - ..\..\..\components\drivers\misc\adc.c - - - - - --c99 - - - - - - - - - - - - pin.c - 1 - ..\..\..\components\drivers\misc\pin.c - - - - - --c99 - - - - - - - - - - - - rt_drv_pwm.c - 1 - ..\..\..\components\drivers\misc\rt_drv_pwm.c - - - - - --c99 - - - - - - - - - - - - rt_inputcapture.c - 1 - ..\..\..\components\drivers\misc\rt_inputcapture.c - - - - - --c99 - - - - - - - - - - - - mtd_nand.c - 1 - ..\..\..\components\drivers\mtd\mtd_nand.c - - - - - --c99 - - - - - - - - - - - - alarm.c - 1 - ..\..\..\components\drivers\rtc\alarm.c - - - - - --c99 - - - - - - - - - - - - rtc.c - 1 - ..\..\..\components\drivers\rtc\rtc.c - - - - - --c99 - - - - - - - - - - - - serial.c - 1 - ..\..\..\components\drivers\serial\serial.c - - - - - --c99 - - - - - - - - - - - - qspi_core.c - 1 - ..\..\..\components\drivers\spi\qspi_core.c - - - - - --c99 - - - - - - - - - - - - sfud.c - 1 - ..\..\..\components\drivers\spi\sfud\src\sfud.c - - - - - --c99 - - - - - - - - - - - - sfud_sfdp.c - 1 - ..\..\..\components\drivers\spi\sfud\src\sfud_sfdp.c - - - - - --c99 - - - - - - - - - - - - spi_core.c - 1 - ..\..\..\components\drivers\spi\spi_core.c - - - - - --c99 - - - - - - - - - - - - spi_dev.c - 1 - ..\..\..\components\drivers\spi\spi_dev.c - - - - - --c99 - - - - - - - - - - - - spi_flash_sfud.c - 1 - ..\..\..\components\drivers\spi\spi_flash_sfud.c - - - - - --c99 - - - - - - - - - - - - touch.c - 1 - ..\..\..\components\drivers\touch\touch.c - - - - - --c99 - - - - - - - - - - - - watchdog.c - 1 - ..\..\..\components\drivers\watchdog\watchdog.c - - - - - --c99 - - - - - - - - - - - - Drivers - - - drv_etimer_capture.c - 1 - ..\libraries\n9h30\rtt_port\drv_etimer_capture.c - - - - - drv_adc.c - 1 - ..\libraries\n9h30\rtt_port\drv_adc.c - - - - - drv_usbd.c - 1 - ..\libraries\n9h30\rtt_port\drv_usbd.c - - - - - drv_scuart.c - 1 - ..\libraries\n9h30\rtt_port\drv_scuart.c - - - - - drv_wdt.c - 1 - ..\libraries\n9h30\rtt_port\drv_wdt.c - - - - - drv_softi2c.c - 1 - ..\libraries\n9h30\rtt_port\drv_softi2c.c - - - - - drv_common.c - 1 - ..\libraries\n9h30\rtt_port\drv_common.c - - - - - drv_pwm.c - 1 - ..\libraries\n9h30\rtt_port\drv_pwm.c - - - - - drv_rtc.c - 1 - ..\libraries\n9h30\rtt_port\drv_rtc.c - - - - - drv_i2c.c - 1 - ..\libraries\n9h30\rtt_port\drv_i2c.c - - - - - drv_sdh.c - 1 - ..\libraries\n9h30\rtt_port\drv_sdh.c - - - - - drv_emac.c - 1 - ..\libraries\n9h30\rtt_port\drv_emac.c - - - - - drv_usbhost.c - 1 - ..\libraries\n9h30\rtt_port\drv_usbhost.c - - - - - drv_vpost.c - 1 - ..\libraries\n9h30\rtt_port\drv_vpost.c - - - - - drv_crypto.c - 1 - ..\libraries\n9h30\rtt_port\drv_crypto.c - - - - - drv_ge2d.c - 1 - ..\libraries\n9h30\rtt_port\drv_ge2d.c - - - - - drv_gpio.c - 1 - ..\libraries\n9h30\rtt_port\drv_gpio.c - - - - - drv_qspi.c - 1 - ..\libraries\n9h30\rtt_port\drv_qspi.c - - - - - drv_sys.c - 1 - ..\libraries\n9h30\rtt_port\drv_sys.c - - - - - drv_timer.c - 1 - ..\libraries\n9h30\rtt_port\drv_timer.c - - - - - drv_jpegcodec.c - 1 - ..\libraries\n9h30\rtt_port\drv_jpegcodec.c - - - - - drv_i2s.c - 1 - ..\libraries\n9h30\rtt_port\drv_i2s.c - - - - - drv_uart.c - 1 - ..\libraries\n9h30\rtt_port\drv_uart.c - - - - - drv_systick.c - 1 - ..\libraries\n9h30\rtt_port\drv_systick.c - - - - - drv_can.c - 1 - ..\libraries\n9h30\rtt_port\drv_can.c - - - - - drv_etimer.c - 1 - ..\libraries\n9h30\rtt_port\drv_etimer.c - - - - - Fal - - - fal_rtt.c - 1 - ..\..\..\components\fal\src\fal_rtt.c - - - - - fal_flash.c - 1 - ..\..\..\components\fal\src\fal_flash.c - - - - - fal_flash_sfud_port.c - 1 - ..\..\..\components\fal\samples\porting\fal_flash_sfud_port.c - - - - - fal_partition.c - 1 - ..\..\..\components\fal\src\fal_partition.c - - - - - fal.c - 1 - ..\..\..\components\fal\src\fal.c - - - - - Filesystem - - - devfs.c - 1 - ..\..\..\components\dfs\filesystems\devfs\devfs.c - - - - - dfs_elm.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\dfs_elm.c - - - - - ff.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\ff.c - - - - - ffunicode.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\ffunicode.c - - - - - dfs.c - 1 - ..\..\..\components\dfs\src\dfs.c - - - - - dfs_file.c - 1 - ..\..\..\components\dfs\src\dfs_file.c - - - - - dfs_fs.c - 1 - ..\..\..\components\dfs\src\dfs_fs.c - - - - - dfs_posix.c - 1 - ..\..\..\components\dfs\src\dfs_posix.c - - - - - Finsh - - - shell.c - 1 - ..\..\..\components\finsh\shell.c - - - - - msh.c - 1 - ..\..\..\components\finsh\msh.c - - - - - msh_parse.c - 1 - ..\..\..\components\finsh\msh_parse.c - - - - - cmd.c - 1 - ..\..\..\components\finsh\cmd.c - - - - - msh_file.c - 1 - ..\..\..\components\finsh\msh_file.c - - - - - Kernel - - - clock.c - 1 - ..\..\..\src\clock.c - - - - - components.c - 1 - ..\..\..\src\components.c - - - - - device.c - 1 - ..\..\..\src\device.c - - - - - idle.c - 1 - ..\..\..\src\idle.c - - - - - ipc.c - 1 - ..\..\..\src\ipc.c - - - - - irq.c - 1 - ..\..\..\src\irq.c - - - - - kservice.c - 1 - ..\..\..\src\kservice.c - - - - - mem.c - 1 - ..\..\..\src\mem.c - - - - - memheap.c - 1 - ..\..\..\src\memheap.c - - - - - mempool.c - 1 - ..\..\..\src\mempool.c - - - - - object.c - 1 - ..\..\..\src\object.c - - - - - scheduler.c - 1 - ..\..\..\src\scheduler.c - - - - - signal.c - 1 - ..\..\..\src\signal.c - - - - - thread.c - 1 - ..\..\..\src\thread.c - - - - - timer.c - 1 - ..\..\..\src\timer.c - - - - - Libraries - - - nu_lcd.c - 1 - ..\libraries\n9h30\Driver\Source\nu_lcd.c - - - - - nu_i2s.c - 1 - ..\libraries\n9h30\Driver\Source\nu_i2s.c - - - - - nu_etimer.c - 1 - ..\libraries\n9h30\Driver\Source\nu_etimer.c - - - - - nu_wwdt.c - 1 - ..\libraries\n9h30\Driver\Source\nu_wwdt.c - - - - - nu_gpio.c - 1 - ..\libraries\n9h30\Driver\Source\nu_gpio.c - - - - - nu_spi.c - 1 - ..\libraries\n9h30\Driver\Source\nu_spi.c - - - - - nu_pwm.c - 1 - ..\libraries\n9h30\Driver\Source\nu_pwm.c - - - - - nu_sys.c - 1 - ..\libraries\n9h30\Driver\Source\nu_sys.c - - - - - nu_can.c - 1 - ..\libraries\n9h30\Driver\Source\nu_can.c - - - - - nu_cap.c - 1 - ..\libraries\n9h30\Driver\Source\nu_cap.c - - - - - nu_usbd.c - 1 - ..\libraries\n9h30\Driver\Source\nu_usbd.c - - - - - nu_crypto.c - 1 - ..\libraries\n9h30\Driver\Source\nu_crypto.c - - - - - nu_rtc.c - 1 - ..\libraries\n9h30\Driver\Source\nu_rtc.c - - - - - nu_sdh.c - 1 - ..\libraries\n9h30\Driver\Source\nu_sdh.c - - - - - nu_timer.c - 1 - ..\libraries\n9h30\Driver\Source\nu_timer.c - - - - - nu_wdt.c - 1 - ..\libraries\n9h30\Driver\Source\nu_wdt.c - - - - - nu_emac.c - 1 - ..\libraries\n9h30\Driver\Source\nu_emac.c - - - - - nu_scuart.c - 1 - ..\libraries\n9h30\Driver\Source\nu_scuart.c - - - - - nu_uart.c - 1 - ..\libraries\n9h30\Driver\Source\nu_uart.c - - - - - nu_fmi.c - 1 - ..\libraries\n9h30\Driver\Source\nu_fmi.c - - - - - LVGL - - - lv_txt.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_txt.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_img.c - 1 - packages\LVGL-v8.3.1\src\widgets\lv_img.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sdl_arc.c - 1 - packages\LVGL-v8.3.1\src\draw\sdl\lv_draw_sdl_arc.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_corner_left.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_corner_left.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_rect.c - 1 - packages\LVGL-v8.3.1\src\draw\lv_draw_rect.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_14.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_14.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_area.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_area.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sw_transform.c - 1 - packages\LVGL-v8.3.1\src\draw\sw\lv_draw_sw_transform.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sdl_label.c - 1 - packages\LVGL-v8.3.1\src\draw\sdl\lv_draw_sdl_label.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_fragment_manager.c - 1 - packages\LVGL-v8.3.1\src\extra\others\fragment\lv_fragment_manager.c - - - - - --c99 --gnu - - - - - - - - - - - - lodepng.c - 1 - packages\LVGL-v8.3.1\src\extra\libs\png\lodepng.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_slider_knob.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_slider_knob.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_keyboard.c - 1 - packages\LVGL-v8.3.1\src\extra\widgets\keyboard\lv_keyboard.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_bar.c - 1 - packages\LVGL-v8.3.1\src\widgets\lv_bar.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_24.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_24.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_unscii_16.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_unscii_16.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_led.c - 1 - packages\LVGL-v8.3.1\src\extra\widgets\led\lv_led.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_bechmark_montserrat_16_compr_az.c.c - 1 - packages\LVGL-v8.3.1\demos\benchmark\assets\lv_font_bechmark_montserrat_16_compr_az.c.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_gif.c - 1 - packages\LVGL-v8.3.1\src\extra\libs\gif\lv_gif.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_png.c - 1 - packages\LVGL-v8.3.1\src\extra\libs\png\lv_png.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_corner_right.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_corner_right.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_img_cache.c - 1 - packages\LVGL-v8.3.1\src\draw\lv_img_cache.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_38.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_38.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_bidi.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_bidi.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_colorwheel.c - 1 - packages\LVGL-v8.3.1\src\extra\widgets\colorwheel\lv_colorwheel.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sw_polygon.c - 1 - packages\LVGL-v8.3.1\src\draw\sw\lv_draw_sw_polygon.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_pxp_blend.c - 1 - packages\LVGL-v8.3.1\src\draw\nxp\pxp\lv_draw_pxp_blend.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_btn_corner_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_btn_corner_large.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_btn_list_pause_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_btn_list_pause_large.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_gpu_nxp.c - 1 - packages\LVGL-v8.3.1\src\draw\nxp\lv_gpu_nxp.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sdl_texture_cache.c - 1 - packages\LVGL-v8.3.1\src\draw\sdl\lv_draw_sdl_texture_cache.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sdl_stack_blur.c - 1 - packages\LVGL-v8.3.1\src\draw\sdl\lv_draw_sdl_stack_blur.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_cover_2_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_cover_2_large.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_btn.c - 1 - packages\LVGL-v8.3.1\src\widgets\lv_btn.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_obj_draw.c - 1 - packages\LVGL-v8.3.1\src\core\lv_obj_draw.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_fmt_txt.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_fmt_txt.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_unscii_8.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_unscii_8.c - - - - - --c99 --gnu - - - - - - - - - - - - tjpgd.c - 1 - packages\LVGL-v8.3.1\src\extra\libs\sjpg\tjpgd.c - - - - - --c99 --gnu - - - - - - - - - - - - qrcodegen.c - 1 - packages\LVGL-v8.3.1\src\extra\libs\qrcode\qrcodegen.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_indev.c - 1 - packages\LVGL-v8.3.1\src\core\lv_indev.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_indev_scroll.c - 1 - packages\LVGL-v8.3.1\src\core\lv_indev_scroll.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_40.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_40.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_8.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_8.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_btn_next_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_btn_next_large.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_fs_posix.c - 1 - packages\LVGL-v8.3.1\src\extra\libs\fsdrv\lv_fs_posix.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_bechmark_montserrat_28_compr_az.c.c - 1 - packages\LVGL-v8.3.1\demos\benchmark\assets\lv_font_bechmark_montserrat_28_compr_az.c.c - - - - - --c99 --gnu - - - - - - - - - - - - img_benchmark_cogwheel_rgb.c - 1 - packages\LVGL-v8.3.1\demos\benchmark\assets\img_benchmark_cogwheel_rgb.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_imgfont.c - 1 - packages\LVGL-v8.3.1\src\extra\others\imgfont\lv_imgfont.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_btn_play.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_btn_play.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_msgbox.c - 1 - packages\LVGL-v8.3.1\src\extra\widgets\msgbox\lv_msgbox.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_canvas.c - 1 - packages\LVGL-v8.3.1\src\widgets\lv_canvas.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_obj_style.c - 1 - packages\LVGL-v8.3.1\src\core\lv_obj_style.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_dejavu_16_persian_hebrew.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_dejavu_16_persian_hebrew.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_color.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_color.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_logo.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_logo.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_slider_knob_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_slider_knob_large.c - - - - - --c99 --gnu - - - - - - - - - - - - img_benchmark_cogwheel_chroma_keyed.c - 1 - packages\LVGL-v8.3.1\demos\benchmark\assets\img_benchmark_cogwheel_chroma_keyed.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_slider.c - 1 - packages\LVGL-v8.3.1\src\widgets\lv_slider.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sdl_layer.c - 1 - packages\LVGL-v8.3.1\src\draw\sdl\lv_draw_sdl_layer.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_switch.c - 1 - packages\LVGL-v8.3.1\src\widgets\lv_switch.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_btn_prev.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_btn_prev.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_obj_class.c - 1 - packages\LVGL-v8.3.1\src\core\lv_obj_class.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_timer.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_timer.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_hal_indev.c - 1 - packages\LVGL-v8.3.1\src\hal\lv_hal_indev.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_gpu_nxp_vglite.c - 1 - packages\LVGL-v8.3.1\src\draw\nxp\vglite\lv_gpu_nxp_vglite.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_list_border_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_list_border_large.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sw_letter.c - 1 - packages\LVGL-v8.3.1\src\draw\sw\lv_draw_sw_letter.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_bechmark_montserrat_12_compr_az.c.c - 1 - packages\LVGL-v8.3.1\demos\benchmark\assets\lv_font_bechmark_montserrat_12_compr_az.c.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_ffmpeg.c - 1 - packages\LVGL-v8.3.1\src\extra\libs\ffmpeg\lv_ffmpeg.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sdl_composite.c - 1 - packages\LVGL-v8.3.1\src\draw\sdl\lv_draw_sdl_composite.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_wave_top_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_wave_top_large.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_menu.c - 1 - packages\LVGL-v8.3.1\src\extra\widgets\menu\lv_menu.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_table.c - 1 - packages\LVGL-v8.3.1\src\widgets\lv_table.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_layer.c - 1 - packages\LVGL-v8.3.1\src\draw\lv_draw_layer.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_20.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_20.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_hal_disp.c - 1 - packages\LVGL-v8.3.1\src\hal\lv_hal_disp.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_demo_music.c - 1 - packages\LVGL-v8.3.1\demos\music\lv_demo_music.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_qrcode.c - 1 - packages\LVGL-v8.3.1\src\extra\libs\qrcode\lv_qrcode.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_gridnav.c - 1 - packages\LVGL-v8.3.1\src\extra\others\gridnav\lv_gridnav.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_wave_top.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_wave_top.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_demo_widgets.c - 1 - packages\LVGL-v8.3.1\demos\widgets\lv_demo_widgets.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_10.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_10.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_lru.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_lru.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_list.c - 1 - packages\LVGL-v8.3.1\src\extra\widgets\list\lv_list.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_cover_1.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_cover_1.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_dropdown.c - 1 - packages\LVGL-v8.3.1\src\widgets\lv_dropdown.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_theme_default.c - 1 - packages\LVGL-v8.3.1\src\extra\themes\default\lv_theme_default.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_label.c - 1 - packages\LVGL-v8.3.1\src\widgets\lv_label.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_btn_rnd_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_btn_rnd_large.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sdl_line.c - 1 - packages\LVGL-v8.3.1\src\draw\sdl\lv_draw_sdl_line.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_checkbox.c - 1 - packages\LVGL-v8.3.1\src\widgets\lv_checkbox.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_theme.c - 1 - packages\LVGL-v8.3.1\src\core\lv_theme.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_28.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_28.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_gc.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_gc.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_gpu_nxp_pxp.c - 1 - packages\LVGL-v8.3.1\src\draw\nxp\pxp\lv_gpu_nxp_pxp.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_grid.c - 1 - packages\LVGL-v8.3.1\src\extra\layouts\grid\lv_grid.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_btn_prev_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_btn_prev_large.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_fs_stdio.c - 1 - packages\LVGL-v8.3.1\src\extra\libs\fsdrv\lv_fs_stdio.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_calendar.c - 1 - packages\LVGL-v8.3.1\src\extra\widgets\calendar\lv_calendar.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_arc.c - 1 - packages\LVGL-v8.3.1\src\draw\lv_draw_arc.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_44.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_44.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_math.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_math.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sw_line.c - 1 - packages\LVGL-v8.3.1\src\draw\sw\lv_draw_sw_line.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_icon_2.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_icon_2.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_monkey.c - 1 - packages\LVGL-v8.3.1\src\extra\others\monkey\lv_monkey.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_theme_mono.c - 1 - packages\LVGL-v8.3.1\src\extra\themes\mono\lv_theme_mono.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_theme_basic.c - 1 - packages\LVGL-v8.3.1\src\extra\themes\basic\lv_theme_basic.c - - - - - --c99 --gnu - - - - - - - - - - - - img_demo_widgets_avatar.c - 1 - packages\LVGL-v8.3.1\demos\widgets\assets\img_demo_widgets_avatar.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_tileview.c - 1 - packages\LVGL-v8.3.1\src\extra\widgets\tileview\lv_tileview.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_btn_list_pause.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_btn_list_pause.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_gpu_stm32_dma2d.c - 1 - packages\LVGL-v8.3.1\src\draw\stm32_dma2d\lv_gpu_stm32_dma2d.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sw_layer.c - 1 - packages\LVGL-v8.3.1\src\draw\sw\lv_draw_sw_layer.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_meter.c - 1 - packages\LVGL-v8.3.1\src\extra\widgets\meter\lv_meter.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_disp.c - 1 - packages\LVGL-v8.3.1\src\core\lv_disp.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_demo_music_list.c - 1 - packages\LVGL-v8.3.1\demos\music\lv_demo_music_list.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_arc.c - 1 - packages\LVGL-v8.3.1\src\widgets\lv_arc.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sdl.c - 1 - packages\LVGL-v8.3.1\src\draw\sdl\lv_draw_sdl.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_42.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_42.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sdl_img.c - 1 - packages\LVGL-v8.3.1\src\draw\sdl\lv_draw_sdl_img.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_btn_pause.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_btn_pause.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_label.c - 1 - packages\LVGL-v8.3.1\src\draw\lv_draw_label.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_extra.c - 1 - packages\LVGL-v8.3.1\src\extra\lv_extra.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_simsun_16_cjk.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_simsun_16_cjk.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_flex.c - 1 - packages\LVGL-v8.3.1\src\extra\layouts\flex\lv_flex.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_freetype.c - 1 - packages\LVGL-v8.3.1\src\extra\libs\freetype\lv_freetype.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lvgl_logo.c - 1 - packages\LVGL-v8.3.1\demos\widgets\assets\img_lvgl_logo.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_obj_tree.c - 1 - packages\LVGL-v8.3.1\src\core\lv_obj_tree.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_28_compressed.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_28_compressed.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_anim_timeline.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_anim_timeline.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_gpu_swm341_dma2d.c - 1 - packages\LVGL-v8.3.1\src\draw\swm341_dma2d\lv_gpu_swm341_dma2d.c - - - - - --c99 --gnu - - - - - - - - - - - - img_benchmark_cogwheel_rgb565a8.c - 1 - packages\LVGL-v8.3.1\demos\benchmark\assets\img_benchmark_cogwheel_rgb565a8.c - - - - - --c99 --gnu - - - - - - - - - - - - img_benchmark_cogwheel_alpha16.c - 1 - packages\LVGL-v8.3.1\demos\benchmark\assets\img_benchmark_cogwheel_alpha16.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_calendar_header_arrow.c - 1 - packages\LVGL-v8.3.1\src\extra\widgets\calendar\lv_calendar_header_arrow.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_cover_3_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_cover_3_large.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_transform.c - 1 - packages\LVGL-v8.3.1\src\draw\lv_draw_transform.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_12.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_12.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sw_arc.c - 1 - packages\LVGL-v8.3.1\src\draw\sw\lv_draw_sw_arc.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_btn_pause_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_btn_pause_large.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_icon_1_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_icon_1_large.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_demo_stress.c - 1 - packages\LVGL-v8.3.1\demos\stress\lv_demo_stress.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_demo_keypad_encoder.c - 1 - packages\LVGL-v8.3.1\demos\keypad_encoder\lv_demo_keypad_encoder.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sdl_rect.c - 1 - packages\LVGL-v8.3.1\src\draw\sdl\lv_draw_sdl_rect.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_line.c - 1 - packages\LVGL-v8.3.1\src\widgets\lv_line.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_icon_3_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_icon_3_large.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_line.c - 1 - packages\LVGL-v8.3.1\src\draw\lv_draw_line.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_26.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_26.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_async.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_async.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_btn_loop_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_btn_loop_large.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sw_gradient.c - 1 - packages\LVGL-v8.3.1\src\draw\sw\lv_draw_sw_gradient.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_calendar_header_dropdown.c - 1 - packages\LVGL-v8.3.1\src\extra\widgets\calendar\lv_calendar_header_dropdown.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_cover_1_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_cover_1_large.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_sjpg.c - 1 - packages\LVGL-v8.3.1\src\extra\libs\sjpg\lv_sjpg.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_wave_bottom_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_wave_bottom_large.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_triangle.c - 1 - packages\LVGL-v8.3.1\src\draw\lv_draw_triangle.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_18.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_18.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_mem.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_mem.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_wave_bottom.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_wave_bottom.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_win.c - 1 - packages\LVGL-v8.3.1\src\extra\widgets\win\lv_win.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_animimg.c - 1 - packages\LVGL-v8.3.1\src\extra\widgets\animimg\lv_animimg.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_event.c - 1 - packages\LVGL-v8.3.1\src\core\lv_event.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_obj.c - 1 - packages\LVGL-v8.3.1\src\core\lv_obj.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_34.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_34.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_48.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_48.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sdl_utils.c - 1 - packages\LVGL-v8.3.1\src\draw\sdl\lv_draw_sdl_utils.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_vglite_arc.c - 1 - packages\LVGL-v8.3.1\src\draw\nxp\vglite\lv_draw_vglite_arc.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_demo_music_main.c - 1 - packages\LVGL-v8.3.1\demos\music\lv_demo_music_main.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_corner_right_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_corner_right_large.c - - - - - --c99 --gnu - - - - - - - - - - - - img_benchmark_cogwheel_indexed16.c - 1 - packages\LVGL-v8.3.1\demos\benchmark\assets\img_benchmark_cogwheel_indexed16.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_gpu_arm2d.c - 1 - packages\LVGL-v8.3.1\src\draw\arm2d\lv_gpu_arm2d.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sdl_mask.c - 1 - packages\LVGL-v8.3.1\src\draw\sdl\lv_draw_sdl_mask.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_corner_left_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_corner_left_large.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_textarea.c - 1 - packages\LVGL-v8.3.1\src\widgets\lv_textarea.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_img_decoder.c - 1 - packages\LVGL-v8.3.1\src\draw\lv_img_decoder.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_22.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_22.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_log.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_log.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sw_rect.c - 1 - packages\LVGL-v8.3.1\src\draw\sw\lv_draw_sw_rect.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_msg.c - 1 - packages\LVGL-v8.3.1\src\extra\others\msg\lv_msg.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_icon_4_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_icon_4_large.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_group.c - 1 - packages\LVGL-v8.3.1\src\core\lv_group.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_img.c - 1 - packages\LVGL-v8.3.1\src\draw\lv_draw_img.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_36.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_36.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_hal_tick.c - 1 - packages\LVGL-v8.3.1\src\hal\lv_hal_tick.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sw_blend.c - 1 - packages\LVGL-v8.3.1\src\draw\sw\lv_draw_sw_blend.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_snapshot.c - 1 - packages\LVGL-v8.3.1\src\extra\others\snapshot\lv_snapshot.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_spinner.c - 1 - packages\LVGL-v8.3.1\src\extra\widgets\spinner\lv_spinner.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_bmp.c - 1 - packages\LVGL-v8.3.1\src\extra\libs\bmp\lv_bmp.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_txt_ap.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_txt_ap.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_obj_scroll.c - 1 - packages\LVGL-v8.3.1\src\core\lv_obj_scroll.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_printf.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_printf.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_btn_loop.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_btn_loop.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_icon_1.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_icon_1.c - - - - - --c99 --gnu - - - - - - - - - - - - img_benchmark_cogwheel_argb.c - 1 - packages\LVGL-v8.3.1\demos\benchmark\assets\img_benchmark_cogwheel_argb.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_objx_templ.c - 1 - packages\LVGL-v8.3.1\src\widgets\lv_objx_templ.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_fs_win32.c - 1 - packages\LVGL-v8.3.1\src\extra\libs\fsdrv\lv_fs_win32.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_roller.c - 1 - packages\LVGL-v8.3.1\src\widgets\lv_roller.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_btn_list_play.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_btn_list_play.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_mask.c - 1 - packages\LVGL-v8.3.1\src\draw\lv_draw_mask.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_16.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_16.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_ll.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_ll.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sdl_polygon.c - 1 - packages\LVGL-v8.3.1\src\draw\sdl\lv_draw_sdl_polygon.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sw_img.c - 1 - packages\LVGL-v8.3.1\src\draw\sw\lv_draw_sw_img.c - - - - - --c99 --gnu - - - - - - - - - - - - gifdec.c - 1 - packages\LVGL-v8.3.1\src\extra\libs\gif\gifdec.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_icon_3.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_icon_3.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_templ.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_templ.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_obj_style_gen.c - 1 - packages\LVGL-v8.3.1\src\core\lv_obj_style_gen.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_30.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_30.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_fs.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_fs.c - - - - - --c99 --gnu - - - - - - - - - - - - img_clothes.c - 1 - packages\LVGL-v8.3.1\demos\widgets\assets\img_clothes.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_rlottie.c - 1 - packages\LVGL-v8.3.1\src\extra\libs\rlottie\lv_rlottie.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_spinbox.c - 1 - packages\LVGL-v8.3.1\src\extra\widgets\spinbox\lv_spinbox.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_cover_3.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_cover_3.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_img_buf.c - 1 - packages\LVGL-v8.3.1\src\draw\lv_img_buf.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_32.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_32.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sw_dither.c - 1 - packages\LVGL-v8.3.1\src\draw\sw\lv_draw_sw_dither.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_vglite_blend.c - 1 - packages\LVGL-v8.3.1\src\draw\nxp\vglite\lv_draw_vglite_blend.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_span.c - 1 - packages\LVGL-v8.3.1\src\extra\widgets\span\lv_span.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_cover_2.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_cover_2.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_btn_rnd.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_btn_rnd.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_btnmatrix.c - 1 - packages\LVGL-v8.3.1\src\widgets\lv_btnmatrix.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sw.c - 1 - packages\LVGL-v8.3.1\src\draw\sw\lv_draw_sw.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_utils.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_utils.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_btn_list_play_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_btn_list_play_large.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_style_gen.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_style_gen.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_obj_pos.c - 1 - packages\LVGL-v8.3.1\src\core\lv_obj_pos.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_style.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_style.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_icon_2_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_icon_2_large.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_gpu_nxp_pxp_osa.c - 1 - packages\LVGL-v8.3.1\src\draw\nxp\pxp\lv_gpu_nxp_pxp_osa.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_fragment.c - 1 - packages\LVGL-v8.3.1\src\extra\others\fragment\lv_fragment.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_ime_pinyin.c - 1 - packages\LVGL-v8.3.1\src\extra\others\ime\lv_ime_pinyin.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_icon_4.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_icon_4.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw.c - 1 - packages\LVGL-v8.3.1\src\draw\lv_draw.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_loader.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_loader.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_anim.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_anim.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_vglite_rect.c - 1 - packages\LVGL-v8.3.1\src\draw\nxp\vglite\lv_draw_vglite_rect.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_tabview.c - 1 - packages\LVGL-v8.3.1\src\extra\widgets\tabview\lv_tabview.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_draw_sdl_bg.c - 1 - packages\LVGL-v8.3.1\src\draw\sdl\lv_draw_sdl_bg.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_demo_benchmark.c - 1 - packages\LVGL-v8.3.1\demos\benchmark\lv_demo_benchmark.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_fs_fatfs.c - 1 - packages\LVGL-v8.3.1\src\extra\libs\fsdrv\lv_fs_fatfs.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_chart.c - 1 - packages\LVGL-v8.3.1\src\extra\widgets\chart\lv_chart.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_btn_next.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_btn_next.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_imgbtn.c - 1 - packages\LVGL-v8.3.1\src\extra\widgets\imgbtn\lv_imgbtn.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_tlsf.c - 1 - packages\LVGL-v8.3.1\src\misc\lv_tlsf.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_refr.c - 1 - packages\LVGL-v8.3.1\src\core\lv_refr.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_12_subpx.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_12_subpx.c - - - - - --c99 --gnu - - - - - - - - - - - - lv_font_montserrat_46.c - 1 - packages\LVGL-v8.3.1\src\font\lv_font_montserrat_46.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_btn_play_large.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_btn_play_large.c - - - - - --c99 --gnu - - - - - - - - - - - - img_lv_demo_music_list_border.c - 1 - packages\LVGL-v8.3.1\demos\music\assets\img_lv_demo_music_list_border.c - - - - - --c99 --gnu - - - - - - - - - - - - LVGL-port - - - lv_demo.c - 1 - applications\lvgl\lv_demo.c - - - - - lv_gpu_n9h30_ge2d.c - 1 - applications\lvgl\lv_gpu_n9h30_ge2d.c - - - - - lv_port_disp.c - 1 - applications\lvgl\lv_port_disp.c - - - - - lv_port_indev.c - 1 - applications\lvgl\lv_port_indev.c - - - - - lv_rt_thread_port.c - 1 - packages\LVGL-v8.3.1\env_support\rt-thread\lv_rt_thread_port.c - - - - - lwIP - - - api_lib.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\api_lib.c - - - - - api_msg.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\api_msg.c - - - - - err.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\err.c - - - - - netbuf.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\netbuf.c - - - - - netdb.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\netdb.c - - - - - netifapi.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\netifapi.c - - - - - sockets.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\sockets.c - - - - - tcpip.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\tcpip.c - - - - - ping.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\apps\ping\ping.c - - - - - def.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\def.c - - - - - dns.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\dns.c - - - - - inet_chksum.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\inet_chksum.c - - - - - init.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\init.c - - - - - ip.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ip.c - - - - - autoip.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\autoip.c - - - - - dhcp.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\dhcp.c - - - - - etharp.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\etharp.c - - - - - icmp.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\icmp.c - - - - - igmp.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\igmp.c - - - - - ip4.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\ip4.c - - - - - ip4_addr.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\ip4_addr.c - - - - - ip4_frag.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\ip4_frag.c - - - - - memp.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\memp.c - - - - - netif.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\netif.c - - - - - pbuf.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\pbuf.c - - - - - raw.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\raw.c - - - - - stats.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\stats.c - - - - - sys.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\sys.c - - - - - tcp.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\tcp.c - - - - - tcp_in.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\tcp_in.c - - - - - tcp_out.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\tcp_out.c - - - - - timeouts.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\timeouts.c - - - - - udp.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\udp.c - - - - - ethernet.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\netif\ethernet.c - - - - - lowpan6.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\netif\lowpan6.c - - - - - ethernetif.c - 1 - ..\..\..\components\net\lwip\port\ethernetif.c - - - - - sys_arch.c - 1 - ..\..\..\components\net\lwip\port\sys_arch.c - - - - - n9h30_usbhostlib - - - ehci.c - 1 - ..\libraries\n9h30\UsbHostLib\src\ehci.c - - - - - ehci_iso.c - 1 - ..\libraries\n9h30\UsbHostLib\src\ehci_iso.c - - - - - usb_core.c - 1 - ..\libraries\n9h30\UsbHostLib\src\usb_core.c - - - - - mem_alloc.c - 1 - ..\libraries\n9h30\UsbHostLib\src\mem_alloc.c - - - - - ohci.c - 1 - ..\libraries\n9h30\UsbHostLib\src\ohci.c - - - - - support.c - 1 - ..\libraries\n9h30\UsbHostLib\src\support.c - - - - - nu_pkgs_adc_touch - - - touch_sw.c - 1 - ..\libraries\nu_packages\ADC_TOUCH\touch_sw.c - - - - - adc_touch.c - 1 - ..\libraries\nu_packages\ADC_TOUCH\adc_touch.c - - - - - nu_pkgs_nau8822 - - - audio_test.c - 1 - ..\libraries\nu_packages\AudioCodec\audio_test.c - - - - - acodec_nau8822.c - 1 - ..\libraries\nu_packages\AudioCodec\acodec_nau8822.c - - - - - POSIX - - - poll.c - 1 - ..\..\..\components\libc\posix\io\poll\poll.c - - - - - select.c - 1 - ..\..\..\components\libc\posix\io\poll\select.c - - - - - ramdisk - - - drv_ramdisk.c - 1 - packages\ramdisk-latest\src\drv_ramdisk.c - - - - - rt_usbd - - - cdc_vcom.c - 1 - ..\..\..\components\drivers\usb\usbdevice\class\cdc_vcom.c - - - - - usbdevice_core.c - 1 - ..\..\..\components\drivers\usb\usbdevice\core\usbdevice_core.c - - - - - mstorage.c - 1 - ..\..\..\components\drivers\usb\usbdevice\class\mstorage.c - - - - - usbdevice.c - 1 - ..\..\..\components\drivers\usb\usbdevice\core\usbdevice.c - - - - - rt_usbh - - - hub.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\hub.c - - - - - usbhost.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\usbhost.c - - - - - usbhost_core.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\usbhost_core.c - - - - - udisk.c - 1 - ..\..\..\components\drivers\usb\usbhost\class\udisk.c - - - - - mass.c - 1 - ..\..\..\components\drivers\usb\usbhost\class\mass.c - - - - - driver.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\driver.c - - - - - SAL - - - netdev.c - 1 - ..\..\..\components\net\netdev\src\netdev.c - - - - - netdev_ipaddr.c - 1 - ..\..\..\components\net\netdev\src\netdev_ipaddr.c - - - - - dfs_net.c - 1 - ..\..\..\components\net\sal\dfs_net\dfs_net.c - - - - - af_inet_lwip.c - 1 - ..\..\..\components\net\sal\impl\af_inet_lwip.c - - - - - net_netdb.c - 1 - ..\..\..\components\net\sal\socket\net_netdb.c - - - - - net_sockets.c - 1 - ..\..\..\components\net\sal\socket\net_sockets.c - - - - - sal_socket.c - 1 - ..\..\..\components\net\sal\src\sal_socket.c - - - - - UTest - - - utest.c - 1 - ..\..\..\components\utilities\utest\utest.c - - - - - - -
diff --git a/bsp/nuvoton/nk-n9h30/rtconfig.h b/bsp/nuvoton/nk-n9h30/rtconfig.h deleted file mode 100644 index 438987fc07..0000000000 --- a/bsp/nuvoton/nk-n9h30/rtconfig.h +++ /dev/null @@ -1,422 +0,0 @@ -#ifndef RT_CONFIG_H__ -#define RT_CONFIG_H__ - -/* Automatically generated file; DO NOT EDIT. */ -/* RT-Thread Configuration */ - -/* RT-Thread Kernel */ - -#define RT_NAME_MAX 16 -#define RT_ALIGN_SIZE 4 -#define RT_THREAD_PRIORITY_32 -#define RT_THREAD_PRIORITY_MAX 32 -#define RT_TICK_PER_SECOND 1000 -#define RT_USING_OVERFLOW_CHECK -#define RT_USING_HOOK -#define RT_HOOK_USING_FUNC_PTR -#define RT_USING_IDLE_HOOK -#define RT_IDLE_HOOK_LIST_SIZE 4 -#define IDLE_THREAD_STACK_SIZE 2048 - -/* kservice optimization */ - -#define RT_DEBUG -#define RT_DEBUG_COLOR - -/* Inter-Thread communication */ - -#define RT_USING_SEMAPHORE -#define RT_USING_MUTEX -#define RT_USING_EVENT -#define RT_USING_MAILBOX -#define RT_USING_MESSAGEQUEUE -#define RT_USING_SIGNALS - -/* Memory Management */ - -#define RT_USING_MEMPOOL -#define RT_USING_SMALL_MEM -#define RT_USING_MEMHEAP -#define RT_MEMHEAP_FAST_MODE -#define RT_USING_SMALL_MEM_AS_HEAP -#define RT_USING_MEMTRACE -#define RT_USING_HEAP - -/* Kernel Device Object */ - -#define RT_USING_DEVICE -#define RT_USING_INTERRUPT_INFO -#define RT_USING_CONSOLE -#define RT_CONSOLEBUF_SIZE 256 -#define RT_CONSOLE_DEVICE_NAME "uart0" -#define RT_VER_NUM 0x40101 -#define ARCH_ARM -#define ARCH_ARM_ARM9 - -/* RT-Thread Components */ - -#define RT_USING_COMPONENTS_INIT -#define RT_USING_USER_MAIN -#define RT_MAIN_THREAD_STACK_SIZE 2048 -#define RT_MAIN_THREAD_PRIORITY 10 -#define RT_USING_MSH -#define RT_USING_FINSH -#define FINSH_USING_MSH -#define FINSH_THREAD_NAME "tshell" -#define FINSH_THREAD_PRIORITY 20 -#define FINSH_THREAD_STACK_SIZE 4096 -#define FINSH_USING_HISTORY -#define FINSH_HISTORY_LINES 5 -#define FINSH_USING_SYMTAB -#define FINSH_CMD_SIZE 80 -#define MSH_USING_BUILT_IN_COMMANDS -#define FINSH_USING_DESCRIPTION -#define FINSH_ARG_MAX 10 -#define RT_USING_DFS -#define DFS_USING_POSIX -#define DFS_USING_WORKDIR -#define DFS_FILESYSTEMS_MAX 16 -#define DFS_FILESYSTEM_TYPES_MAX 16 -#define DFS_FD_MAX 64 -#define RT_USING_DFS_MNTTABLE -#define RT_USING_DFS_ELMFAT - -/* elm-chan's FatFs, Generic FAT Filesystem Module */ - -#define RT_DFS_ELM_CODE_PAGE 437 -#define RT_DFS_ELM_WORD_ACCESS -#define RT_DFS_ELM_USE_LFN_3 -#define RT_DFS_ELM_USE_LFN 3 -#define RT_DFS_ELM_LFN_UNICODE_0 -#define RT_DFS_ELM_LFN_UNICODE 0 -#define RT_DFS_ELM_MAX_LFN 255 -#define RT_DFS_ELM_DRIVES 8 -#define RT_DFS_ELM_MAX_SECTOR_SIZE 4096 -#define RT_DFS_ELM_REENTRANT -#define RT_DFS_ELM_MUTEX_TIMEOUT 3000 -#define RT_USING_DFS_DEVFS -#define RT_USING_FAL -#define FAL_DEBUG_CONFIG -#define FAL_DEBUG 1 -#define FAL_PART_HAS_TABLE_CFG -#define FAL_USING_SFUD_PORT -#define FAL_USING_NOR_FLASH_DEV_NAME "norflash0" - -/* Device Drivers */ - -#define RT_USING_DEVICE_IPC -#define RT_USING_SYSTEM_WORKQUEUE -#define RT_SYSTEM_WORKQUEUE_STACKSIZE 2048 -#define RT_SYSTEM_WORKQUEUE_PRIORITY 23 -#define RT_USING_SERIAL -#define RT_USING_SERIAL_V1 -#define RT_SERIAL_RB_BUFSZ 2048 -#define RT_USING_CAN -#define RT_USING_HWTIMER -#define RT_USING_I2C -#define RT_USING_I2C_BITOPS -#define RT_USING_PIN -#define RT_USING_ADC -#define RT_USING_PWM -#define RT_USING_MTD_NAND -#define RT_USING_RTC -#define RT_USING_ALARM -#define RT_USING_SPI -#define RT_USING_QSPI -#define RT_USING_SFUD -#define RT_SFUD_USING_SFDP -#define RT_SFUD_USING_FLASH_INFO_TABLE -#define RT_SFUD_USING_QSPI -#define RT_SFUD_SPI_MAX_HZ 50000000 -#define RT_USING_WDT -#define RT_USING_AUDIO -#define RT_AUDIO_REPLAY_MP_BLOCK_SIZE 4096 -#define RT_AUDIO_REPLAY_MP_BLOCK_COUNT 2 -#define RT_AUDIO_RECORD_PIPE_SIZE 2048 -#define RT_USING_TOUCH -#define RT_USING_INPUT_CAPTURE -#define RT_INPUT_CAPTURE_RB_SIZE 100 - -/* Using USB */ - -#define RT_USING_USB -#define RT_USING_USB_HOST -#define RT_USBH_MSTORAGE -#define UDISK_MOUNTPOINT "/mnt/udisk" -#define RT_USING_USB_DEVICE -#define RT_USBD_THREAD_STACK_SZ 4096 -#define USB_VENDOR_ID 0x0FFE -#define USB_PRODUCT_ID 0x0001 -#define RT_USB_DEVICE_COMPOSITE -#define RT_USB_DEVICE_CDC -#define RT_USB_DEVICE_NONE -#define RT_USB_DEVICE_MSTORAGE -#define RT_VCOM_TASK_STK_SIZE 512 -#define RT_CDC_RX_BUFSIZE 128 -#define RT_VCOM_SERNO "32021919830108" -#define RT_VCOM_SER_LEN 14 -#define RT_VCOM_TX_TIMEOUT 1000 -#define RT_USB_MSTORAGE_DISK_NAME "ramdisk1" - -/* C/C++ and POSIX layer */ - -#define RT_LIBC_DEFAULT_TIMEZONE 8 - -/* POSIX (Portable Operating System Interface) layer */ - -#define RT_USING_POSIX_FS -#define RT_USING_POSIX_DEVIO -#define RT_USING_POSIX_POLL -#define RT_USING_POSIX_SELECT - -/* Interprocess Communication (IPC) */ - - -/* Socket is in the 'Network' category */ - - -/* Network */ - -#define RT_USING_SAL -#define SAL_INTERNET_CHECK - -/* Docking with protocol stacks */ - -#define SAL_USING_LWIP -#define SAL_USING_POSIX -#define RT_USING_NETDEV -#define NETDEV_USING_IFCONFIG -#define NETDEV_USING_PING -#define NETDEV_USING_NETSTAT -#define NETDEV_USING_AUTO_DEFAULT -#define NETDEV_IPV4 1 -#define NETDEV_IPV6 0 -#define RT_USING_LWIP -#define RT_USING_LWIP203 -#define RT_USING_LWIP_VER_NUM 0x20003 -#define RT_LWIP_MEM_ALIGNMENT 4 -#define RT_LWIP_IGMP -#define RT_LWIP_ICMP -#define RT_LWIP_DNS -#define RT_LWIP_DHCP -#define IP_SOF_BROADCAST 1 -#define IP_SOF_BROADCAST_RECV 1 - -/* Static IPv4 Address */ - -#define RT_LWIP_IPADDR "192.168.1.30" -#define RT_LWIP_GWADDR "192.168.1.1" -#define RT_LWIP_MSKADDR "255.255.255.0" -#define RT_LWIP_UDP -#define RT_LWIP_TCP -#define RT_LWIP_RAW -#define RT_MEMP_NUM_NETCONN 32 -#define RT_LWIP_PBUF_NUM 256 -#define RT_LWIP_RAW_PCB_NUM 32 -#define RT_LWIP_UDP_PCB_NUM 32 -#define RT_LWIP_TCP_PCB_NUM 32 -#define RT_LWIP_TCP_SEG_NUM 256 -#define RT_LWIP_TCP_SND_BUF 32768 -#define RT_LWIP_TCP_WND 10240 -#define RT_LWIP_TCPTHREAD_PRIORITY 10 -#define RT_LWIP_TCPTHREAD_MBOX_SIZE 32 -#define RT_LWIP_TCPTHREAD_STACKSIZE 4096 -#define RT_LWIP_ETHTHREAD_PRIORITY 12 -#define RT_LWIP_ETHTHREAD_STACKSIZE 1024 -#define RT_LWIP_ETHTHREAD_MBOX_SIZE 32 -#define LWIP_NETIF_STATUS_CALLBACK 1 -#define LWIP_NETIF_LINK_CALLBACK 1 -#define SO_REUSE 1 -#define LWIP_SO_RCVTIMEO 1 -#define LWIP_SO_SNDTIMEO 1 -#define LWIP_SO_RCVBUF 1 -#define LWIP_SO_LINGER 0 -#define RT_LWIP_NETIF_LOOPBACK -#define LWIP_NETIF_LOOPBACK 1 -#define RT_LWIP_STATS -#define RT_LWIP_USING_PING - -/* Utilities */ - -#define RT_USING_UTEST -#define UTEST_THR_STACK_SIZE 4096 -#define UTEST_THR_PRIORITY 20 - -/* RT-Thread Utestcases */ - - -/* RT-Thread online packages */ - -/* IoT - internet of things */ - - -/* Wi-Fi */ - -/* Marvell WiFi */ - - -/* Wiced WiFi */ - - -/* IoT Cloud */ - - -/* security packages */ - - -/* language packages */ - -/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ - - -/* XML: Extensible Markup Language */ - - -/* multimedia packages */ - -/* LVGL: powerful and easy-to-use embedded GUI library */ - -#define PKG_USING_LVGL -#define PKG_LVGL_THREAD_PRIO 20 -#define PKG_LVGL_THREAD_STACK_SIZE 4096 -#define PKG_LVGL_DISP_REFR_PERIOD 30 -#define PKG_LVGL_USING_DEMOS -#define PKG_LVGL_USING_V08031 -#define PKG_LVGL_VER_NUM 0x08031 - -/* u8g2: a monochrome graphic library */ - - -/* PainterEngine: A cross-platform graphics application framework written in C language */ - - -/* tools packages */ - - -/* system packages */ - -/* enhanced kernel services */ - - -/* acceleration: Assembly language or algorithmic acceleration packages */ - - -/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ - - -/* Micrium: Micrium software products porting for RT-Thread */ - -#define PKG_USING_RAMDISK -#define PKG_USING_RAMDISK_LATEST_VERSION - -/* peripheral libraries and drivers */ - - -/* Kendryte SDK */ - - -/* AI packages */ - - -/* miscellaneous packages */ - -/* project laboratory */ - -/* samples: kernel and components samples */ - - -/* entertainment: terminal games and other interesting software packages */ - - -/* Privated Packages of RealThread */ - - -/* Network Utilities */ - - -/* RT-Thread Smart */ - - -/* Hardware Drivers Config */ - -/* On-chip Peripheral Drivers */ - -#define SOC_SERIES_N9H30 -#define BSP_USING_MMU -#define BSP_USING_GPIO -#define BSP_USING_EMAC -#define BSP_USING_EMAC0 -#define BSP_USING_EMAC1 -#define BSP_USING_RTC -#define BSP_USING_ADC -#define BSP_USING_ADC_TOUCH -#define BSP_USING_ETMR -#define BSP_USING_ETIMER -#define BSP_USING_ETIMER_CAPTURE -#define BSP_USING_ETMR0 -#define BSP_USING_ETIMER0 -#define BSP_USING_ETMR1 -#define BSP_USING_ETIMER1 -#define BSP_USING_ETMR2 -#define BSP_USING_ETIMER2_CAPTURE -#define BSP_USING_ETMR3 -#define BSP_USING_ETIMER3_CAPTURE -#define BSP_USING_TMR -#define BSP_USING_TIMER -#define BSP_USING_TIMER0 -#define BSP_USING_TIMER1 -#define BSP_USING_TIMER2 -#define BSP_USING_TIMER3 -#define BSP_USING_UART -#define BSP_USING_UART0 -#define BSP_USING_I2C -#define BSP_USING_I2C0 -#define BSP_USING_SDH -#define BSP_USING_SDH0 -#define BSP_USING_SDH1 -#define NU_SDH_HOTPLUG -#define BSP_USING_CAN -#define BSP_USING_CAN0 -#define BSP_USING_PWM -#define BSP_USING_PWM0 -#define BSP_USING_QSPI -#define BSP_USING_QSPI0 -#define BSP_USING_QSPI1_NONE -#define BSP_USING_I2S -#define NU_I2S_DMA_FIFO_SIZE 2048 -#define BSP_USING_WDT -#define BSP_USING_EBI -#define BSP_USING_VPOST -#define LCM_USING_FW070TFT -#define VPOST_USING_LCD_IDX 3 -#define BSP_LCD_BPP 32 -#define BSP_LCD_WIDTH 800 -#define BSP_LCD_HEIGHT 480 -#define BSP_USING_VPOST_OSD -#define BSP_USING_USBD -#define BSP_USING_USBH - -/* On-board Peripheral Drivers */ - -#define BSP_USING_CONSOLE -#define BOARD_USING_IP101GR -#define BOARD_USING_NAU8822 -#define BOARD_USING_STORAGE_SDCARD -#define BOARD_USING_STORAGE_SPIFLASH -#define BOARD_USING_BUZZER -#define BOARD_USING_USB0_DEVICE_HOST -#define BOARD_USING_USB1_HOST - -/* Board extended module drivers */ - -#define BOARD_USING_LCM -#define BOARD_USING_LCM_FW070TFT_WVGA -#define BOARD_USING_ADCTOUCH - -/* Nuvoton Packages Config */ - -#define NU_PKG_USING_UTILS -#define NU_PKG_USING_NAU8822 -#define NU_PKG_USING_ADC_TOUCH - -#endif diff --git a/bsp/nuvoton/nk-n9h30/rtconfig.py b/bsp/nuvoton/nk-n9h30/rtconfig.py index 752155f321..51b6917e87 100644 --- a/bsp/nuvoton/nk-n9h30/rtconfig.py +++ b/bsp/nuvoton/nk-n9h30/rtconfig.py @@ -23,8 +23,8 @@ elif CROSS_TOOL == 'keil': if os.getenv('RTT_EXEC_PATH'): EXEC_PATH = os.getenv('RTT_EXEC_PATH') -BUILD = 'debug' -#BUILD = '' +#BUILD = 'debug' +BUILD = '' CORE = 'arm926ej-s' MAP_FILE = 'rtthread_n9h30.map' diff --git a/bsp/nuvoton/nk-rtu980/.config b/bsp/nuvoton/nk-rtu980/.config index 4cbe5820da..41fae917ba 100644 --- a/bsp/nuvoton/nk-rtu980/.config +++ b/bsp/nuvoton/nk-rtu980/.config @@ -8,6 +8,7 @@ # CONFIG_RT_NAME_MAX=16 # CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_SMART is not set # CONFIG_RT_USING_SMP is not set CONFIG_RT_ALIGN_SIZE=4 # CONFIG_RT_THREAD_PRIORITY_8 is not set @@ -61,7 +62,7 @@ CONFIG_RT_USING_SMALL_MEM=y # CONFIG_RT_USING_SLAB is not set CONFIG_RT_USING_MEMHEAP=y CONFIG_RT_MEMHEAP_FAST_MODE=y -# CONFIG_RT_MEMHEAP_BSET_MODE is not set +# CONFIG_RT_MEMHEAP_BEST_MODE is not set CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y # CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set # CONFIG_RT_USING_SLAB_AS_HEAP is not set @@ -76,15 +77,20 @@ CONFIG_RT_USING_HEAP=y # CONFIG_RT_USING_DEVICE=y # CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_DM is not set # CONFIG_RT_USING_INTERRUPT_INFO is not set CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=256 CONFIG_RT_CONSOLE_DEVICE_NAME="uart0" CONFIG_RT_VER_NUM=0x50000 -CONFIG_ARCH_ARM=y -# CONFIG_RT_USING_CPU_FFS is not set -CONFIG_ARCH_ARM_ARM9=y +CONFIG_RT_USING_CACHE=y +# CONFIG_ARCH_ARM_BOOTWITH_FLUSH_CACHE is not set # CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set +# CONFIG_RT_USING_CPU_FFS is not set +CONFIG_ARCH_MM_MMU=y +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_MMU=y +CONFIG_ARCH_ARM_ARM9=y # # RT-Thread Components @@ -141,7 +147,9 @@ CONFIG_RT_DFS_ELM_REENTRANT=y CONFIG_RT_DFS_ELM_MUTEX_TIMEOUT=3000 CONFIG_RT_USING_DFS_DEVFS=y # CONFIG_RT_USING_DFS_ROMFS is not set +# CONFIG_RT_USING_DFS_CROMFS is not set # CONFIG_RT_USING_DFS_RAMFS is not set +# CONFIG_RT_USING_DFS_TMPFS is not set # CONFIG_RT_USING_DFS_NFS is not set CONFIG_RT_USING_FAL=y CONFIG_FAL_DEBUG_CONFIG=y @@ -149,12 +157,12 @@ CONFIG_FAL_DEBUG=1 CONFIG_FAL_PART_HAS_TABLE_CFG=y CONFIG_FAL_USING_SFUD_PORT=y CONFIG_FAL_USING_NOR_FLASH_DEV_NAME="norflash0" -# CONFIG_RT_USING_LWP is not set # # Device Drivers # CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 CONFIG_RT_USING_SYSTEM_WORKQUEUE=y CONFIG_RT_SYSTEM_WORKQUEUE_STACKSIZE=2048 CONFIG_RT_SYSTEM_WORKQUEUE_PRIORITY=23 @@ -176,10 +184,14 @@ CONFIG_RT_USING_I2C_BITOPS=y CONFIG_RT_USING_PIN=y CONFIG_RT_USING_ADC=y # CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set # CONFIG_RT_USING_PWM is not set # CONFIG_RT_USING_MTD_NOR is not set # CONFIG_RT_USING_MTD_NAND is not set # CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_FDT is not set CONFIG_RT_USING_RTC=y # CONFIG_RT_USING_ALARM is not set CONFIG_RT_USING_SOFT_RTC=y @@ -200,6 +212,7 @@ CONFIG_RT_USING_WDT=y # CONFIG_RT_USING_AUDIO is not set # CONFIG_RT_USING_SENSOR is not set # CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_LCD is not set CONFIG_RT_USING_HWCRYPTO=y CONFIG_RT_HWCRYPTO_DEFAULT_NAME="hwcryto" CONFIG_RT_HWCRYPTO_IV_MAX_SIZE=16 @@ -226,7 +239,9 @@ CONFIG_RT_HWCRYPTO_USING_RNG=y # CONFIG_RT_HWCRYPTO_USING_BIGNUM is not set # CONFIG_RT_USING_PULSE_ENCODER is not set # CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_DEV_BUS is not set # CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_VIRTIO is not set # # Using USB @@ -430,7 +445,6 @@ CONFIG_UTEST_THR_PRIORITY=20 # CONFIG_PKG_USING_COAP is not set # CONFIG_PKG_USING_NOPOLL is not set # CONFIG_PKG_USING_NETUTILS is not set -# CONFIG_PKG_USING_NETUTILS_LATEST_VERSION is not set # CONFIG_PKG_USING_CMUX is not set # CONFIG_PKG_USING_PPP_DEVICE is not set # CONFIG_PKG_USING_AT_DEVICE is not set @@ -478,6 +492,7 @@ CONFIG_UTEST_THR_PRIORITY=20 # CONFIG_PKG_USING_AGILE_FTP is not set # CONFIG_PKG_USING_EMBEDDEDPROTO is not set # CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_RYANMQTT is not set # CONFIG_PKG_USING_LORA_PKT_FWD is not set # CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set # CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set @@ -485,6 +500,7 @@ CONFIG_UTEST_THR_PRIORITY=20 # CONFIG_PKG_USING_SMALL_MODBUS is not set # CONFIG_PKG_USING_NET_SERVER is not set # CONFIG_PKG_USING_ZFTP is not set +# CONFIG_PKG_USING_WOL is not set # # security packages @@ -576,7 +592,6 @@ CONFIG_UTEST_THR_PRIORITY=20 # CONFIG_PKG_USING_SEGGER_RTT is not set # CONFIG_PKG_USING_RDB is not set # CONFIG_PKG_USING_ULOG_EASYFLASH is not set -# CONFIG_PKG_USING_ULOG_FILE is not set # CONFIG_PKG_USING_LOGMGR is not set # CONFIG_PKG_USING_ADBD is not set # CONFIG_PKG_USING_COREMARK is not set @@ -610,8 +625,8 @@ CONFIG_UTEST_THR_PRIORITY=20 # CONFIG_PKG_USING_CBOX is not set # CONFIG_PKG_USING_SNOWFLAKE is not set # CONFIG_PKG_USING_HASH_MATCH is not set -# CONFIG_PKG_USING_FIRE_PID_CURVE is not set # CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set # # system packages @@ -647,7 +662,6 @@ CONFIG_UTEST_THR_PRIORITY=20 # CONFIG_PKG_USING_UC_CLK is not set # CONFIG_PKG_USING_UC_COMMON is not set # CONFIG_PKG_USING_UC_MODBUS is not set -# CONFIG_PKG_USING_RTDUINO is not set # CONFIG_PKG_USING_FREERTOS_WRAPPER is not set # CONFIG_PKG_USING_CAIRO is not set # CONFIG_PKG_USING_PIXMAN is not set @@ -686,19 +700,93 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_KMULTI_RTIMER is not set # CONFIG_PKG_USING_TFDB is not set # CONFIG_PKG_USING_QPC is not set +# CONFIG_PKG_USING_AGILE_UPGRADE is not set # # peripheral libraries and drivers # -# CONFIG_PKG_USING_SENSORS_DRIVERS is not set -# CONFIG_PKG_USING_REALTEK_AMEBA is not set + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_TMP1075 is not set +# CONFIG_PKG_USING_SR04 is not set +# CONFIG_PKG_USING_CCS811 is not set +# CONFIG_PKG_USING_PMSXX is not set +# CONFIG_PKG_USING_RT3020 is not set +# CONFIG_PKG_USING_MLX90632 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set # CONFIG_PKG_USING_SHT2X is not set # CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_AD7746 is not set # CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set # CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set # CONFIG_PKG_USING_STM32_SDIO is not set # CONFIG_PKG_USING_ESP_IDF is not set -# CONFIG_PKG_USING_ICM20608 is not set # CONFIG_PKG_USING_BUTTON is not set # CONFIG_PKG_USING_PCF8574 is not set # CONFIG_PKG_USING_SX12XX is not set @@ -721,12 +809,9 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_AGILE_LED is not set # CONFIG_PKG_USING_AT24CXX is not set # CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set -# CONFIG_PKG_USING_AD7746 is not set # CONFIG_PKG_USING_PCA9685 is not set # CONFIG_PKG_USING_I2C_TOOLS is not set # CONFIG_PKG_USING_NRF24L01 is not set -# CONFIG_PKG_USING_TOUCH_DRIVERS is not set -# CONFIG_PKG_USING_MAX17048 is not set # CONFIG_PKG_USING_RPLIDAR is not set # CONFIG_PKG_USING_AS608 is not set # CONFIG_PKG_USING_RC522 is not set @@ -741,7 +826,6 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_CAN_YMODEM is not set # CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set # CONFIG_PKG_USING_QLED is not set -# CONFIG_PKG_USING_PAJ7620 is not set # CONFIG_PKG_USING_AGILE_CONSOLE is not set # CONFIG_PKG_USING_LD3320 is not set # CONFIG_PKG_USING_WK2124 is not set @@ -772,10 +856,11 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_BL_MCU_SDK is not set # CONFIG_PKG_USING_SOFT_SERIAL is not set # CONFIG_PKG_USING_MB85RS16 is not set -# CONFIG_PKG_USING_CW2015 is not set # CONFIG_PKG_USING_RFM300 is not set # CONFIG_PKG_USING_IO_INPUT_FILTER is not set # CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_FINGERPRINT is not set # # AI packages @@ -790,6 +875,12 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_QUEST is not set # CONFIG_PKG_USING_NAXOS is not set +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_UKAL is not set + # # miscellaneous packages # @@ -845,7 +936,6 @@ CONFIG_PKG_OPTPARSE_VER="latest" # CONFIG_PKG_USING_VI is not set # CONFIG_PKG_USING_KI is not set # CONFIG_PKG_USING_ARMv7M_DWT is not set -# CONFIG_PKG_USING_UKAL is not set # CONFIG_PKG_USING_CRCLIB is not set # CONFIG_PKG_USING_LWGPS is not set # CONFIG_PKG_USING_STATE_MACHINE is not set @@ -855,6 +945,213 @@ CONFIG_PKG_OPTPARSE_VER="latest" # CONFIG_PKG_USING_MFBD is not set # CONFIG_PKG_USING_SLCAN2RTT is not set # CONFIG_PKG_USING_SOEM is not set +# CONFIG_PKG_USING_QPARAM is not set +# CONFIG_PKG_USING_CorevMCU_CLI is not set + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects +# +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_ADAFRUIT_MAX31855 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set +# CONFIG_PKG_USING_ADAFRUIT_MSA301 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set +# CONFIG_PKG_USING_SEEED_ITG3200 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set +# CONFIG_PKG_USING_SEEED_MP503 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set + +# +# Other +# + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set + +# +# Uncategorized +# # # Hardware Drivers Config @@ -962,7 +1259,6 @@ CONFIG_BOARD_USING_IP101GR=y # CONFIG_NU_PKG_USING_UTILS=y CONFIG_NU_PKG_USING_DEMO=y -# CONFIG_NU_PKG_USING_LVGL is not set # CONFIG_NU_PKG_USING_BMX055 is not set # CONFIG_NU_PKG_USING_MAX31875 is not set # CONFIG_NU_PKG_USING_NCT7717U is not set @@ -975,5 +1271,3 @@ CONFIG_NU_PKG_USING_DEMO=y # CONFIG_NU_PKG_USING_TPC is not set # CONFIG_NU_PKG_USING_ADC_TOUCH is not set # CONFIG_NU_PKG_USING_SPINAND is not set -CONFIG_UTEST_CMD_PREFIX="bsp.nuvoton.utest." -CONFIG_BOARD_USE_UTEST=y diff --git a/bsp/nuvoton/nk-rtu980/project.uvproj b/bsp/nuvoton/nk-rtu980/project.uvproj deleted file mode 100644 index 8a72e069b3..0000000000 --- a/bsp/nuvoton/nk-rtu980/project.uvproj +++ /dev/null @@ -1,2284 +0,0 @@ - - - 1.1 -
### uVision Project, (C) Keil Software
- - - rtthread - 0x4 - ARM-ADS - 5060750::V5.06 update 6 (build 750)::ARMCC - 0 - - - Nuvoton_ARM9_Series - Nuvoton - IRAM(0x0-0x0) CLOCK(000000000) CPUTYPE(ARM926EJ-S) - - - - 0 - - - - - - - - - - - - 0 - 0 - - - - Atmel\SAM9260\ - Atmel\SAM9260\ - - 0 - 0 - 0 - 0 - 1 - - .\build\keil4\ - rtthread - 1 - 0 - 0 - 1 - 1 - .\build\keil4\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf.exe --bin --output "$L@L.bin" "$L@L.axf" - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARM.DLL - -cAT91SAM9 - DARMATS9.DLL - -p91SAM9260 - SARM.DLL - - TARMATS9.DLL - -p91SAM9260 - - - - 1 - 0 - 0 - 0 - 16 - - - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - - - 1 - 1 - 0 - 1 - 1 - 1 - 0 - 1 - 1 - 1 - - 0 - 18 - - - - - - - - - - - - - ..\libraries\nuc980\Script\NUC980xx61.ini - Segger\JLTAgdi.dll - - - - - 1 - 0 - 0 - 0 - 1 - 4098 - - 0 - Segger\JLTAgdi.dll - - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - ARM926EJ-S - - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x1 - - - 1 - 0x100000 - 0x8000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x1 - - - 0 - 0x0 - 0x0 - - - - - - 1 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 2 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 0 - 0 - 0 - - --c99 - RT_USING_LIBC, __RTTHREAD__, __STDC_LIMIT_MACROS, RT_USING_ARM_LIBC, __CLK_TCK=RT_TICK_PER_SECOND - - applications;.;board;..\..\..\components\libc\compilers\common\include;..\..\..\components\libc\compilers\common\extension;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\arm926;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\hwcrypto;.;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\spi;..\..\..\components\drivers\include;..\..\..\components\drivers\spi\sfud\inc;..\..\..\components\drivers\include;..\libraries\nuc980\rtt_port;..\..\..\components\fal\inc;..\..\..\components\dfs\include;..\..\..\components\dfs\filesystems\devfs;..\..\..\components\dfs\filesystems\elmfat;..\..\..\components\finsh;.;..\..\..\include;..\libraries\nuc980\Driver\Include;..\..\..\components\net\lwip\lwip-2.1.2\src\include;..\..\..\components\net\lwip\lwip-2.1.2\src\include\netif;..\..\..\components\net\lwip\port;packages\netutils-latest\ntp;packages\netutils-latest\tftp;.;..\libraries\nu_packages\Demo;..\libraries\nu_packages\TPC;..\libraries\nuc980\UsbHostLib\inc;..\libraries\nu_packages\NuUtils\inc;packages\optparse-latest;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\posix\io\stdio;..\..\..\components\libc\posix\ipc;packages\ramdisk-latest\inc;..\..\..\components\drivers\usb\usbdevice;..\..\..\components\drivers\usb\usbhost;..\..\..\components\drivers\usb\usbhost\class;..\..\..\components\drivers\usb\usbhost\core;..\..\..\components\drivers\usb\usbhost\include;..\..\..\components\drivers\include;..\..\..\components\net\netdev\include;..\..\..\components\net\sal\include;..\..\..\components\net\sal\include\socket;..\..\..\components\net\sal\impl;..\..\..\components\net\sal\include\dfs_net;..\..\..\components\net\sal\include\socket\sys_socket;..\..\..\components\utilities\utest - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x20000000 - 0x20800000 - - .\linking_scripts\nuc980.sct - - - - - - - - - - - Applications - - - main.c - 1 - applications\main.c - - - - - mnt.c - 1 - applications\mnt.c - - - - - board - - - board_dev.c - 1 - board\board_dev.c - - - - - nu_pin_init.c - 1 - board\nu_pin_init.c - - - - - Compiler - - - syscall_mem.c - 1 - ..\..\..\components\libc\compilers\armlibc\syscall_mem.c - - - - - syscalls.c - 1 - ..\..\..\components\libc\compilers\armlibc\syscalls.c - - - - - cctype.c - 1 - ..\..\..\components\libc\compilers\common\cctype.c - - - - - cstdio.c - 1 - ..\..\..\components\libc\compilers\common\cstdio.c - - - - - cstdlib.c - 1 - ..\..\..\components\libc\compilers\common\cstdlib.c - - - - - cstring.c - 1 - ..\..\..\components\libc\compilers\common\cstring.c - - - - - ctime.c - 1 - ..\..\..\components\libc\compilers\common\ctime.c - - - - - cwchar.c - 1 - ..\..\..\components\libc\compilers\common\cwchar.c - - - - - CPU - - - context_rvds.S - 2 - ..\..\..\libcpu\arm\arm926\context_rvds.S - - - - - cpuport.c - 1 - ..\..\..\libcpu\arm\arm926\cpuport.c - - - - - machine.c - 1 - ..\..\..\libcpu\arm\arm926\machine.c - - - - - mmu.c - 1 - ..\..\..\libcpu\arm\arm926\mmu.c - - - - - stack.c - 1 - ..\..\..\libcpu\arm\arm926\stack.c - - - - - start_rvds.S - 2 - ..\..\..\libcpu\arm\arm926\start_rvds.S - - - - - trap.c - 1 - ..\..\..\libcpu\arm\arm926\trap.c - - - - - backtrace.c - 1 - ..\..\..\libcpu\arm\common\backtrace.c - - - - - div0.c - 1 - ..\..\..\libcpu\arm\common\div0.c - - - - - showmem.c - 1 - ..\..\..\libcpu\arm\common\showmem.c - - - - - DeviceDrivers - - - can.c - 1 - ..\..\..\components\drivers\can\can.c - - - - - --c99 - - - - - - - - - - - - cputime.c - 1 - ..\..\..\components\drivers\cputime\cputime.c - - - - - --c99 - - - - - - - - - - - - hw_hash.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_hash.c - - - - - --c99 - - - - - - - - - - - - hw_rng.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_rng.c - - - - - --c99 - - - - - - - - - - - - hw_symmetric.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_symmetric.c - - - - - --c99 - - - - - - - - - - - - hwcrypto.c - 1 - ..\..\..\components\drivers\hwcrypto\hwcrypto.c - - - - - --c99 - - - - - - - - - - - - hwtimer.c - 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c - - - - - --c99 - - - - - - - - - - - - i2c-bit-ops.c - 1 - ..\..\..\components\drivers\i2c\i2c-bit-ops.c - - - - - --c99 - - - - - - - - - - - - i2c_core.c - 1 - ..\..\..\components\drivers\i2c\i2c_core.c - - - - - --c99 - - - - - - - - - - - - i2c_dev.c - 1 - ..\..\..\components\drivers\i2c\i2c_dev.c - - - - - --c99 - - - - - - - - - - - - completion.c - 1 - ..\..\..\components\drivers\ipc\completion.c - - - - - --c99 - - - - - - - - - - - - dataqueue.c - 1 - ..\..\..\components\drivers\ipc\dataqueue.c - - - - - --c99 - - - - - - - - - - - - pipe.c - 1 - ..\..\..\components\drivers\ipc\pipe.c - - - - - --c99 - - - - - - - - - - - - ringblk_buf.c - 1 - ..\..\..\components\drivers\ipc\ringblk_buf.c - - - - - --c99 - - - - - - - - - - - - ringbuffer.c - 1 - ..\..\..\components\drivers\ipc\ringbuffer.c - - - - - --c99 - - - - - - - - - - - - waitqueue.c - 1 - ..\..\..\components\drivers\ipc\waitqueue.c - - - - - --c99 - - - - - - - - - - - - workqueue.c - 1 - ..\..\..\components\drivers\ipc\workqueue.c - - - - - --c99 - - - - - - - - - - - - adc.c - 1 - ..\..\..\components\drivers\misc\adc.c - - - - - --c99 - - - - - - - - - - - - pin.c - 1 - ..\..\..\components\drivers\misc\pin.c - - - - - --c99 - - - - - - - - - - - - rtc.c - 1 - ..\..\..\components\drivers\rtc\rtc.c - - - - - --c99 - - - - - - - - - - - - soft_rtc.c - 1 - ..\..\..\components\drivers\rtc\soft_rtc.c - - - - - --c99 - - - - - - - - - - - - serial.c - 1 - ..\..\..\components\drivers\serial\serial.c - - - - - --c99 - - - - - - - - - - - - qspi_core.c - 1 - ..\..\..\components\drivers\spi\qspi_core.c - - - - - --c99 - - - - - - - - - - - - sfud.c - 1 - ..\..\..\components\drivers\spi\sfud\src\sfud.c - - - - - --c99 - - - - - - - - - - - - sfud_sfdp.c - 1 - ..\..\..\components\drivers\spi\sfud\src\sfud_sfdp.c - - - - - --c99 - - - - - - - - - - - - spi_core.c - 1 - ..\..\..\components\drivers\spi\spi_core.c - - - - - --c99 - - - - - - - - - - - - spi_dev.c - 1 - ..\..\..\components\drivers\spi\spi_dev.c - - - - - --c99 - - - - - - - - - - - - spi_flash_sfud.c - 1 - ..\..\..\components\drivers\spi\spi_flash_sfud.c - - - - - --c99 - - - - - - - - - - - - watchdog.c - 1 - ..\..\..\components\drivers\watchdog\watchdog.c - - - - - --c99 - - - - - - - - - - - - Drivers - - - drv_pdma.c - 1 - ..\libraries\nuc980\rtt_port\drv_pdma.c - - - - - drv_sdh.c - 1 - ..\libraries\nuc980\rtt_port\drv_sdh.c - - - - - drv_systick.c - 1 - ..\libraries\nuc980\rtt_port\drv_systick.c - - - - - drv_etimer_capture.c - 1 - ..\libraries\nuc980\rtt_port\drv_etimer_capture.c - - - - - drv_qspi.c - 1 - ..\libraries\nuc980\rtt_port\drv_qspi.c - - - - - drv_etimer.c - 1 - ..\libraries\nuc980\rtt_port\drv_etimer.c - - - - - drv_can.c - 1 - ..\libraries\nuc980\rtt_port\drv_can.c - - - - - drv_ebi.c - 1 - ..\libraries\nuc980\rtt_port\drv_ebi.c - - - - - drv_softi2c.c - 1 - ..\libraries\nuc980\rtt_port\drv_softi2c.c - - - - - drv_pwm.c - 1 - ..\libraries\nuc980\rtt_port\drv_pwm.c - - - - - drv_uart.c - 1 - ..\libraries\nuc980\rtt_port\drv_uart.c - - - - - drv_spi.c - 1 - ..\libraries\nuc980\rtt_port\drv_spi.c - - - - - drv_i2c.c - 1 - ..\libraries\nuc980\rtt_port\drv_i2c.c - - - - - drv_adc.c - 1 - ..\libraries\nuc980\rtt_port\drv_adc.c - - - - - drv_gpio.c - 1 - ..\libraries\nuc980\rtt_port\drv_gpio.c - - - - - drv_sys.c - 1 - ..\libraries\nuc980\rtt_port\drv_sys.c - - - - - drv_usbd.c - 1 - ..\libraries\nuc980\rtt_port\drv_usbd.c - - - - - drv_crypto.c - 1 - ..\libraries\nuc980\rtt_port\drv_crypto.c - - - - - drv_common.c - 1 - ..\libraries\nuc980\rtt_port\drv_common.c - - - - - drv_i2s.c - 1 - ..\libraries\nuc980\rtt_port\drv_i2s.c - - - - - drv_emac.c - 1 - ..\libraries\nuc980\rtt_port\drv_emac.c - - - - - drv_wdt.c - 1 - ..\libraries\nuc980\rtt_port\drv_wdt.c - - - - - drv_scuart.c - 1 - ..\libraries\nuc980\rtt_port\drv_scuart.c - - - - - drv_usbhost.c - 1 - ..\libraries\nuc980\rtt_port\drv_usbhost.c - - - - - drv_rtc.c - 1 - ..\libraries\nuc980\rtt_port\drv_rtc.c - - - - - Fal - - - fal_flash.c - 1 - ..\..\..\components\fal\src\fal_flash.c - - - - - fal_partition.c - 1 - ..\..\..\components\fal\src\fal_partition.c - - - - - fal_rtt.c - 1 - ..\..\..\components\fal\src\fal_rtt.c - - - - - fal_flash_sfud_port.c - 1 - ..\..\..\components\fal\samples\porting\fal_flash_sfud_port.c - - - - - fal.c - 1 - ..\..\..\components\fal\src\fal.c - - - - - Filesystem - - - devfs.c - 1 - ..\..\..\components\dfs\filesystems\devfs\devfs.c - - - - - dfs_elm.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\dfs_elm.c - - - - - ff.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\ff.c - - - - - ffunicode.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\ffunicode.c - - - - - dfs.c - 1 - ..\..\..\components\dfs\src\dfs.c - - - - - dfs_file.c - 1 - ..\..\..\components\dfs\src\dfs_file.c - - - - - dfs_fs.c - 1 - ..\..\..\components\dfs\src\dfs_fs.c - - - - - dfs_posix.c - 1 - ..\..\..\components\dfs\src\dfs_posix.c - - - - - Finsh - - - shell.c - 1 - ..\..\..\components\finsh\shell.c - - - - - msh.c - 1 - ..\..\..\components\finsh\msh.c - - - - - msh_parse.c - 1 - ..\..\..\components\finsh\msh_parse.c - - - - - cmd.c - 1 - ..\..\..\components\finsh\cmd.c - - - - - msh_file.c - 1 - ..\..\..\components\finsh\msh_file.c - - - - - Kernel - - - clock.c - 1 - ..\..\..\src\clock.c - - - - - components.c - 1 - ..\..\..\src\components.c - - - - - device.c - 1 - ..\..\..\src\device.c - - - - - idle.c - 1 - ..\..\..\src\idle.c - - - - - ipc.c - 1 - ..\..\..\src\ipc.c - - - - - irq.c - 1 - ..\..\..\src\irq.c - - - - - kservice.c - 1 - ..\..\..\src\kservice.c - - - - - mem.c - 1 - ..\..\..\src\mem.c - - - - - memheap.c - 1 - ..\..\..\src\memheap.c - - - - - mempool.c - 1 - ..\..\..\src\mempool.c - - - - - object.c - 1 - ..\..\..\src\object.c - - - - - scheduler.c - 1 - ..\..\..\src\scheduler.c - - - - - signal.c - 1 - ..\..\..\src\signal.c - - - - - thread.c - 1 - ..\..\..\src\thread.c - - - - - timer.c - 1 - ..\..\..\src\timer.c - - - - - Libraries - - - nu_qspi.c - 1 - ..\libraries\nuc980\Driver\Source\nu_qspi.c - - - - - nu_emac.c - 1 - ..\libraries\nuc980\Driver\Source\nu_emac.c - - - - - nu_i2s.c - 1 - ..\libraries\nuc980\Driver\Source\nu_i2s.c - - - - - nu_wwdt.c - 1 - ..\libraries\nuc980\Driver\Source\nu_wwdt.c - - - - - nu_cap.c - 1 - ..\libraries\nuc980\Driver\Source\nu_cap.c - - - - - nu_sdh.c - 1 - ..\libraries\nuc980\Driver\Source\nu_sdh.c - - - - - nu_rtc.c - 1 - ..\libraries\nuc980\Driver\Source\nu_rtc.c - - - - - nu_ebi.c - 1 - ..\libraries\nuc980\Driver\Source\nu_ebi.c - - - - - nu_etimer.c - 1 - ..\libraries\nuc980\Driver\Source\nu_etimer.c - - - - - nu_scuart.c - 1 - ..\libraries\nuc980\Driver\Source\nu_scuart.c - - - - - nu_usbd.c - 1 - ..\libraries\nuc980\Driver\Source\nu_usbd.c - - - - - nu_sys.c - 1 - ..\libraries\nuc980\Driver\Source\nu_sys.c - - - - - nu_gpio.c - 1 - ..\libraries\nuc980\Driver\Source\nu_gpio.c - - - - - nu_i2c.c - 1 - ..\libraries\nuc980\Driver\Source\nu_i2c.c - - - - - nu_wdt.c - 1 - ..\libraries\nuc980\Driver\Source\nu_wdt.c - - - - - nu_can.c - 1 - ..\libraries\nuc980\Driver\Source\nu_can.c - - - - - nu_pdma.c - 1 - ..\libraries\nuc980\Driver\Source\nu_pdma.c - - - - - nu_spi.c - 1 - ..\libraries\nuc980\Driver\Source\nu_spi.c - - - - - nu_crypto.c - 1 - ..\libraries\nuc980\Driver\Source\nu_crypto.c - - - - - nu_uart.c - 1 - ..\libraries\nuc980\Driver\Source\nu_uart.c - - - - - lwIP - - - api_lib.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\api\api_lib.c - - - - - api_msg.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\api\api_msg.c - - - - - err.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\api\err.c - - - - - if_api.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\api\if_api.c - - - - - netbuf.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\api\netbuf.c - - - - - netdb.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\api\netdb.c - - - - - netifapi.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\api\netifapi.c - - - - - sockets.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\api\sockets.c - - - - - tcpip.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\api\tcpip.c - - - - - ping.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\apps\ping\ping.c - - - - - altcp.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\altcp.c - - - - - altcp_alloc.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\altcp_alloc.c - - - - - altcp_tcp.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\altcp_tcp.c - - - - - def.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\def.c - - - - - dns.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\dns.c - - - - - inet_chksum.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\inet_chksum.c - - - - - init.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\init.c - - - - - ip.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\ip.c - - - - - autoip.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\ipv4\autoip.c - - - - - dhcp.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\ipv4\dhcp.c - - - - - etharp.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\ipv4\etharp.c - - - - - icmp.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\ipv4\icmp.c - - - - - igmp.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\ipv4\igmp.c - - - - - ip4.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\ipv4\ip4.c - - - - - ip4_addr.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\ipv4\ip4_addr.c - - - - - ip4_frag.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\ipv4\ip4_frag.c - - - - - memp.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\memp.c - - - - - netif.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\netif.c - - - - - pbuf.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\pbuf.c - - - - - raw.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\raw.c - - - - - stats.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\stats.c - - - - - sys.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\sys.c - - - - - tcp.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\tcp.c - - - - - tcp_in.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\tcp_in.c - - - - - tcp_out.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\tcp_out.c - - - - - timeouts.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\timeouts.c - - - - - udp.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\core\udp.c - - - - - ethernet.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\netif\ethernet.c - - - - - lowpan6.c - 1 - ..\..\..\components\net\lwip\lwip-2.1.2\src\netif\lowpan6.c - - - - - ethernetif.c - 1 - ..\..\..\components\net\lwip\port\ethernetif.c - - - - - sys_arch.c - 1 - ..\..\..\components\net\lwip\port\sys_arch.c - - - - - NetUtils - - - iperf.c - 1 - packages\netutils-latest\iperf\iperf.c - - - - - ntp.c - 1 - packages\netutils-latest\ntp\ntp.c - - - - - tftp_client.c - 1 - packages\netutils-latest\tftp\tftp_client.c - - - - - tftp_port.c - 1 - packages\netutils-latest\tftp\tftp_port.c - - - - - tftp_server.c - 1 - packages\netutils-latest\tftp\tftp_server.c - - - - - tftp_xfer.c - 1 - packages\netutils-latest\tftp\tftp_xfer.c - - - - - nu_pkgs_demo - - - usbd_cdc_vcom_echo.c - 1 - ..\libraries\nu_packages\Demo\usbd_cdc_vcom_echo.c - - - - - slcd_show_tick.c - 1 - ..\libraries\nu_packages\Demo\slcd_show_tick.c - - - - - usbd_hid_dance_mouse.c - 1 - ..\libraries\nu_packages\Demo\usbd_hid_dance_mouse.c - - - - - nuc980_usbhostlib - - - ehci_iso.c - 1 - ..\libraries\nuc980\UsbHostLib\src\ehci_iso.c - - - - - ohci.c - 1 - ..\libraries\nuc980\UsbHostLib\src\ohci.c - - - - - mem_alloc.c - 1 - ..\libraries\nuc980\UsbHostLib\src\mem_alloc.c - - - - - support.c - 1 - ..\libraries\nuc980\UsbHostLib\src\support.c - - - - - usb_core.c - 1 - ..\libraries\nuc980\UsbHostLib\src\usb_core.c - - - - - ehci.c - 1 - ..\libraries\nuc980\UsbHostLib\src\ehci.c - - - - - optparse - - - optparse.c - 1 - packages\optparse-latest\optparse.c - - - - - POSIX - - - poll.c - 1 - ..\..\..\components\libc\posix\io\poll\poll.c - - - - - select.c - 1 - ..\..\..\components\libc\posix\io\poll\select.c - - - - - ramdisk - - - drv_ramdisk.c - 1 - packages\ramdisk-latest\src\drv_ramdisk.c - - - - - rt_usbd - - - cdc_vcom.c - 1 - ..\..\..\components\drivers\usb\usbdevice\class\cdc_vcom.c - - - - - usbdevice_core.c - 1 - ..\..\..\components\drivers\usb\usbdevice\core\usbdevice_core.c - - - - - usbdevice.c - 1 - ..\..\..\components\drivers\usb\usbdevice\core\usbdevice.c - - - - - mstorage.c - 1 - ..\..\..\components\drivers\usb\usbdevice\class\mstorage.c - - - - - rt_usbh - - - hub.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\hub.c - - - - - usbhost.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\usbhost.c - - - - - mass.c - 1 - ..\..\..\components\drivers\usb\usbhost\class\mass.c - - - - - usbhost_core.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\usbhost_core.c - - - - - udisk.c - 1 - ..\..\..\components\drivers\usb\usbhost\class\udisk.c - - - - - driver.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\driver.c - - - - - SAL - - - netdev.c - 1 - ..\..\..\components\net\netdev\src\netdev.c - - - - - netdev_ipaddr.c - 1 - ..\..\..\components\net\netdev\src\netdev_ipaddr.c - - - - - dfs_net.c - 1 - ..\..\..\components\net\sal\dfs_net\dfs_net.c - - - - - af_inet_lwip.c - 1 - ..\..\..\components\net\sal\impl\af_inet_lwip.c - - - - - net_netdb.c - 1 - ..\..\..\components\net\sal\socket\net_netdb.c - - - - - net_sockets.c - 1 - ..\..\..\components\net\sal\socket\net_sockets.c - - - - - sal_socket.c - 1 - ..\..\..\components\net\sal\src\sal_socket.c - - - - - UTest - - - utest.c - 1 - ..\..\..\components\utilities\utest\utest.c - - - - - - -
diff --git a/bsp/nuvoton/nk-rtu980/rtconfig.h b/bsp/nuvoton/nk-rtu980/rtconfig.h deleted file mode 100644 index 4e9727b9f2..0000000000 --- a/bsp/nuvoton/nk-rtu980/rtconfig.h +++ /dev/null @@ -1,427 +0,0 @@ -#ifndef RT_CONFIG_H__ -#define RT_CONFIG_H__ - -/* Automatically generated file; DO NOT EDIT. */ -/* RT-Thread Configuration */ - -/* RT-Thread Kernel */ - -#define RT_NAME_MAX 16 -#define RT_ALIGN_SIZE 4 -#define RT_THREAD_PRIORITY_32 -#define RT_THREAD_PRIORITY_MAX 32 -#define RT_TICK_PER_SECOND 1000 -#define RT_USING_OVERFLOW_CHECK -#define RT_USING_HOOK -#define RT_HOOK_USING_FUNC_PTR -#define RT_USING_IDLE_HOOK -#define RT_IDLE_HOOK_LIST_SIZE 4 -#define IDLE_THREAD_STACK_SIZE 2048 - -/* kservice optimization */ - -#define RT_DEBUG -#define RT_DEBUG_COLOR - -/* Inter-Thread communication */ - -#define RT_USING_SEMAPHORE -#define RT_USING_MUTEX -#define RT_USING_EVENT -#define RT_USING_MAILBOX -#define RT_USING_MESSAGEQUEUE -#define RT_USING_SIGNALS - -/* Memory Management */ - -#define RT_USING_MEMPOOL -#define RT_USING_SMALL_MEM -#define RT_USING_MEMHEAP -#define RT_MEMHEAP_FAST_MODE -#define RT_USING_SMALL_MEM_AS_HEAP -#define RT_USING_MEMTRACE -#define RT_USING_HEAP - -/* Kernel Device Object */ - -#define RT_USING_DEVICE -#define RT_USING_CONSOLE -#define RT_CONSOLEBUF_SIZE 256 -#define RT_CONSOLE_DEVICE_NAME "uart0" -#define RT_VER_NUM 0x40101 -#define ARCH_ARM -#define ARCH_ARM_ARM9 - -/* RT-Thread Components */ - -#define RT_USING_COMPONENTS_INIT -#define RT_USING_USER_MAIN -#define RT_MAIN_THREAD_STACK_SIZE 2048 -#define RT_MAIN_THREAD_PRIORITY 10 -#define RT_USING_MSH -#define RT_USING_FINSH -#define FINSH_USING_MSH -#define FINSH_THREAD_NAME "tshell" -#define FINSH_THREAD_PRIORITY 20 -#define FINSH_THREAD_STACK_SIZE 4096 -#define FINSH_USING_HISTORY -#define FINSH_HISTORY_LINES 5 -#define FINSH_USING_SYMTAB -#define FINSH_CMD_SIZE 80 -#define MSH_USING_BUILT_IN_COMMANDS -#define FINSH_USING_DESCRIPTION -#define FINSH_ARG_MAX 10 -#define RT_USING_DFS -#define DFS_USING_POSIX -#define DFS_USING_WORKDIR -#define DFS_FILESYSTEMS_MAX 16 -#define DFS_FILESYSTEM_TYPES_MAX 16 -#define DFS_FD_MAX 64 -#define RT_USING_DFS_MNTTABLE -#define RT_USING_DFS_ELMFAT - -/* elm-chan's FatFs, Generic FAT Filesystem Module */ - -#define RT_DFS_ELM_CODE_PAGE 437 -#define RT_DFS_ELM_WORD_ACCESS -#define RT_DFS_ELM_USE_LFN_3 -#define RT_DFS_ELM_USE_LFN 3 -#define RT_DFS_ELM_LFN_UNICODE_0 -#define RT_DFS_ELM_LFN_UNICODE 0 -#define RT_DFS_ELM_MAX_LFN 255 -#define RT_DFS_ELM_DRIVES 8 -#define RT_DFS_ELM_MAX_SECTOR_SIZE 4096 -#define RT_DFS_ELM_REENTRANT -#define RT_DFS_ELM_MUTEX_TIMEOUT 3000 -#define RT_USING_DFS_DEVFS -#define RT_USING_FAL -#define FAL_DEBUG_CONFIG -#define FAL_DEBUG 1 -#define FAL_PART_HAS_TABLE_CFG -#define FAL_USING_SFUD_PORT -#define FAL_USING_NOR_FLASH_DEV_NAME "norflash0" - -/* Device Drivers */ - -#define RT_USING_DEVICE_IPC -#define RT_USING_SYSTEM_WORKQUEUE -#define RT_SYSTEM_WORKQUEUE_STACKSIZE 2048 -#define RT_SYSTEM_WORKQUEUE_PRIORITY 23 -#define RT_USING_SERIAL -#define RT_USING_SERIAL_V1 -#define RT_SERIAL_USING_DMA -#define RT_SERIAL_RB_BUFSZ 2048 -#define RT_USING_CAN -#define RT_CAN_USING_HDR -#define RT_USING_HWTIMER -#define RT_USING_CPUTIME -#define RT_USING_I2C -#define RT_USING_I2C_BITOPS -#define RT_USING_PIN -#define RT_USING_ADC -#define RT_USING_RTC -#define RT_USING_SOFT_RTC -#define RT_USING_SPI -#define RT_USING_QSPI -#define RT_USING_SFUD -#define RT_SFUD_USING_SFDP -#define RT_SFUD_USING_FLASH_INFO_TABLE -#define RT_SFUD_USING_QSPI -#define RT_SFUD_SPI_MAX_HZ 50000000 -#define RT_USING_WDT -#define RT_USING_HWCRYPTO -#define RT_HWCRYPTO_DEFAULT_NAME "hwcryto" -#define RT_HWCRYPTO_IV_MAX_SIZE 16 -#define RT_HWCRYPTO_KEYBIT_MAX_SIZE 256 -#define RT_HWCRYPTO_USING_AES -#define RT_HWCRYPTO_USING_AES_ECB -#define RT_HWCRYPTO_USING_AES_CBC -#define RT_HWCRYPTO_USING_AES_CFB -#define RT_HWCRYPTO_USING_AES_CTR -#define RT_HWCRYPTO_USING_AES_OFB -#define RT_HWCRYPTO_USING_SHA1 -#define RT_HWCRYPTO_USING_SHA2 -#define RT_HWCRYPTO_USING_SHA2_224 -#define RT_HWCRYPTO_USING_SHA2_256 -#define RT_HWCRYPTO_USING_SHA2_384 -#define RT_HWCRYPTO_USING_SHA2_512 -#define RT_HWCRYPTO_USING_RNG - -/* Using USB */ - -#define RT_USING_USB -#define RT_USING_USB_HOST -#define RT_USBH_MSTORAGE -#define UDISK_MOUNTPOINT "/mnt/udisk" -#define RT_USING_USB_DEVICE -#define RT_USBD_THREAD_STACK_SZ 4096 -#define USB_VENDOR_ID 0x0FFE -#define USB_PRODUCT_ID 0x0001 -#define RT_USB_DEVICE_COMPOSITE -#define RT_USB_DEVICE_CDC -#define RT_USB_DEVICE_NONE -#define RT_USB_DEVICE_MSTORAGE -#define RT_VCOM_TASK_STK_SIZE 2048 -#define RT_CDC_RX_BUFSIZE 128 -#define RT_VCOM_SERNO "32021919830108" -#define RT_VCOM_SER_LEN 14 -#define RT_VCOM_TX_TIMEOUT 1000 -#define RT_USB_MSTORAGE_DISK_NAME "ramdisk1" - -/* C/C++ and POSIX layer */ - -#define RT_LIBC_DEFAULT_TIMEZONE 8 - -/* POSIX (Portable Operating System Interface) layer */ - -#define RT_USING_POSIX_FS -#define RT_USING_POSIX_DEVIO -#define RT_USING_POSIX_POLL -#define RT_USING_POSIX_SELECT -#define RT_USING_POSIX_SOCKET - -/* Interprocess Communication (IPC) */ - - -/* Socket is in the 'Network' category */ - - -/* Network */ - -#define RT_USING_SAL - -/* Docking with protocol stacks */ - -#define SAL_USING_LWIP -#define SAL_USING_POSIX -#define RT_USING_NETDEV -#define NETDEV_USING_IFCONFIG -#define NETDEV_USING_PING -#define NETDEV_USING_NETSTAT -#define NETDEV_USING_AUTO_DEFAULT -#define NETDEV_IPV4 1 -#define NETDEV_IPV6 0 -#define RT_USING_LWIP -#define RT_USING_LWIP212 -#define RT_USING_LWIP_VER_NUM 0x20102 -#define RT_LWIP_MEM_ALIGNMENT 4 -#define RT_LWIP_IGMP -#define RT_LWIP_ICMP -#define RT_LWIP_DNS -#define RT_LWIP_DHCP -#define IP_SOF_BROADCAST 1 -#define IP_SOF_BROADCAST_RECV 1 - -/* Static IPv4 Address */ - -#define RT_LWIP_IPADDR "192.168.31.55" -#define RT_LWIP_GWADDR "192.168.31.1" -#define RT_LWIP_MSKADDR "255.255.255.0" -#define RT_LWIP_UDP -#define RT_LWIP_TCP -#define RT_LWIP_RAW -#define RT_MEMP_NUM_NETCONN 16 -#define RT_LWIP_PBUF_NUM 256 -#define RT_LWIP_RAW_PCB_NUM 16 -#define RT_LWIP_UDP_PCB_NUM 16 -#define RT_LWIP_TCP_PCB_NUM 16 -#define RT_LWIP_TCP_SEG_NUM 64 -#define RT_LWIP_TCP_SND_BUF 16384 -#define RT_LWIP_TCP_WND 65535 -#define RT_LWIP_TCPTHREAD_PRIORITY 10 -#define RT_LWIP_TCPTHREAD_MBOX_SIZE 256 -#define RT_LWIP_TCPTHREAD_STACKSIZE 4096 -#define RT_LWIP_ETHTHREAD_PRIORITY 12 -#define RT_LWIP_ETHTHREAD_STACKSIZE 4096 -#define RT_LWIP_ETHTHREAD_MBOX_SIZE 256 -#define RT_LWIP_REASSEMBLY_FRAG -#define LWIP_NETIF_STATUS_CALLBACK 1 -#define LWIP_NETIF_LINK_CALLBACK 1 -#define SO_REUSE 1 -#define LWIP_SO_RCVTIMEO 1 -#define LWIP_SO_SNDTIMEO 1 -#define LWIP_SO_RCVBUF 1 -#define LWIP_SO_LINGER 0 -#define RT_LWIP_NETIF_LOOPBACK -#define LWIP_NETIF_LOOPBACK 1 -#define RT_LWIP_STATS -#define RT_LWIP_USING_PING - -/* Utilities */ - -#define RT_USING_UTEST -#define UTEST_THR_STACK_SIZE 4096 -#define UTEST_THR_PRIORITY 20 - -/* RT-Thread Utestcases */ - - -/* RT-Thread online packages */ - -/* IoT - internet of things */ - - -/* Wi-Fi */ - -/* Marvell WiFi */ - - -/* Wiced WiFi */ - -#define PKG_USING_NETUTILS -#define PKG_NETUTILS_TFTP -#define PKG_NETUTILS_IPERF -#define PKG_NETUTILS_NTP -#define NTP_USING_AUTO_SYNC -#define NTP_AUTO_SYNC_FIRST_DELAY 30 -#define NTP_AUTO_SYNC_PERIOD 3600 -#define NETUTILS_NTP_HOSTNAME "0.tw.pool.ntp.org" -#define NETUTILS_NTP_HOSTNAME2 "1.tw.pool.ntp.org" -#define NETUTILS_NTP_HOSTNAME3 "2.tw.pool.ntp.org" -#define PKG_USING_NETUTILS_LATEST_VERSION -#define PKG_NETUTILS_VER_NUM 0x99999 - -/* IoT Cloud */ - - -/* security packages */ - - -/* language packages */ - -/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ - - -/* XML: Extensible Markup Language */ - - -/* multimedia packages */ - -/* LVGL: powerful and easy-to-use embedded GUI library */ - - -/* u8g2: a monochrome graphic library */ - - -/* PainterEngine: A cross-platform graphics application framework written in C language */ - - -/* tools packages */ - - -/* system packages */ - -/* enhanced kernel services */ - - -/* acceleration: Assembly language or algorithmic acceleration packages */ - - -/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ - - -/* Micrium: Micrium software products porting for RT-Thread */ - -#define PKG_USING_RAMDISK -#define PKG_USING_RAMDISK_LATEST_VERSION - -/* peripheral libraries and drivers */ - - -/* Kendryte SDK */ - - -/* AI packages */ - - -/* miscellaneous packages */ - -/* project laboratory */ - -/* samples: kernel and components samples */ - - -/* entertainment: terminal games and other interesting software packages */ - -#define PKG_USING_OPTPARSE -#define PKG_USING_OPTPARSE_LATEST_VERSION - -/* Privated Packages of RealThread */ - - -/* Network Utilities */ - - -/* RT-Thread Smart */ - - -/* Hardware Drivers Config */ - -/* On-chip Peripheral Drivers */ - -#define SOC_SERIES_NUC980 -#define BSP_USE_STDDRIVER_SOURCE -#define BSP_USING_MMU -#define BSP_USING_PDMA -#define NU_PDMA_MEMFUN_ACTOR_MAX 2 -#define BSP_USING_GPIO -#define BSP_USING_EMAC -#define BSP_USING_EMAC1 -#define NU_EMAC_PDMA_MEMCOPY -#define NU_EMAC_PDMA_MEMCOPY_THRESHOLD 128 -#define BSP_USING_ADC -#define BSP_USING_TMR -#define BSP_USING_TIMER -#define BSP_USING_TMR0 -#define BSP_USING_TIMER0 -#define BSP_USING_TMR1 -#define BSP_USING_TIMER1 -#define BSP_USING_TMR2 -#define BSP_USING_TIMER2 -#define BSP_USING_TMR3 -#define BSP_USING_TIMER3 -#define BSP_USING_TMR4 -#define BSP_USING_TIMER4 -#define BSP_USING_UART -#define BSP_USING_UART0 -#define BSP_USING_UART4 -#define BSP_USING_UART4_TX_DMA -#define BSP_USING_UART4_RX_DMA -#define BSP_USING_UART8 -#define BSP_USING_UART8_TX_DMA -#define BSP_USING_UART8_RX_DMA -#define BSP_USING_I2C -#define BSP_USING_I2C1 -#define BSP_USING_CAN -#define BSP_USING_CAN3 -#define BSP_USING_SPI -#define BSP_USING_SPI_PDMA -#define BSP_USING_SPI0 -#define BSP_USING_SPI0_PDMA -#define BSP_USING_SPI1_NONE -#define BSP_USING_QSPI -#define BSP_USING_QSPI_PDMA -#define BSP_USING_QSPI0 -#define BSP_USING_QSPI0_PDMA -#define BSP_USING_CRYPTO -#define BSP_USING_WDT -#define BSP_USING_USBD -#define BSP_USING_USBH - -/* On-board Peripheral Drivers */ - -#define BSP_USING_CONSOLE -#define BOARD_USING_UART8_RS485 -#define BOARD_USING_STORAGE_SPIFLASH -#define BOARD_USING_USB0_DEVICE_HOST - -/* Board extended module drivers */ - -#define BOARD_USING_IP101GR - -/* Nuvoton Packages Config */ - -#define NU_PKG_USING_UTILS -#define NU_PKG_USING_DEMO - -#endif diff --git a/bsp/nuvoton/nk-rtu980/rtconfig.py b/bsp/nuvoton/nk-rtu980/rtconfig.py index c0d6b5a46d..b4931ae159 100644 --- a/bsp/nuvoton/nk-rtu980/rtconfig.py +++ b/bsp/nuvoton/nk-rtu980/rtconfig.py @@ -16,7 +16,7 @@ if os.getenv('RTT_ROOT'): if CROSS_TOOL == 'gcc': PLATFORM = 'gcc' EXEC_PATH = r'C:\Program Files (x86)\GNU Tools ARM Embedded\6 2017-q1-update\bin' -elif CROSS_TOOL == 'keil': +if CROSS_TOOL == 'keil': PLATFORM = 'armcc' EXEC_PATH = r'C:\Keil_v5' diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/.config b/bsp/nuvoton/numaker-hmi-ma35d1/.config index 5cf42f36ff..a97d3b7fd3 100644 --- a/bsp/nuvoton/numaker-hmi-ma35d1/.config +++ b/bsp/nuvoton/numaker-hmi-ma35d1/.config @@ -9,8 +9,8 @@ CONFIG_USE_MA35D1_AARCH32=y # CONFIG_RT_NAME_MAX=8 # CONFIG_RT_USING_ARCH_DATA_TYPE is not set -CONFIG_RT_USING_SMP=y -CONFIG_RT_CPUS_NR=2 +# CONFIG_RT_USING_SMART is not set +# CONFIG_RT_USING_SMP is not set CONFIG_RT_ALIGN_SIZE=32 # CONFIG_RT_THREAD_PRIORITY_8 is not set CONFIG_RT_THREAD_PRIORITY_32=y @@ -23,7 +23,6 @@ CONFIG_RT_HOOK_USING_FUNC_PTR=y CONFIG_RT_USING_IDLE_HOOK=y CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 CONFIG_IDLE_THREAD_STACK_SIZE=4096 -CONFIG_SYSTEM_THREAD_STACK_SIZE=4096 CONFIG_RT_USING_TIMER_SOFT=y CONFIG_RT_TIMER_THREAD_PRIO=4 CONFIG_RT_TIMER_THREAD_STACK_SIZE=4096 @@ -67,7 +66,7 @@ CONFIG_RT_USING_SMALL_MEM=y # CONFIG_RT_USING_SLAB is not set CONFIG_RT_USING_MEMHEAP=y CONFIG_RT_MEMHEAP_FAST_MODE=y -# CONFIG_RT_MEMHEAP_BSET_MODE is not set +# CONFIG_RT_MEMHEAP_BEST_MODE is not set CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y # CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set # CONFIG_RT_USING_SLAB_AS_HEAP is not set @@ -82,19 +81,26 @@ CONFIG_RT_USING_HEAP=y # CONFIG_RT_USING_DEVICE=y # CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_DM is not set CONFIG_RT_USING_INTERRUPT_INFO=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=4096 CONFIG_RT_CONSOLE_DEVICE_NAME="uart0" CONFIG_RT_VER_NUM=0x50000 -CONFIG_ARCH_ARM=y +CONFIG_RT_USING_CACHE=y +# CONFIG_ARCH_ARM_BOOTWITH_FLUSH_CACHE is not set +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set CONFIG_RT_USING_CPU_FFS=y +CONFIG_ARCH_MM_MMU=y +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_MMU=y CONFIG_ARCH_ARM_CORTEX_A=y CONFIG_RT_SMP_AUTO_BOOT=y CONFIG_RT_USING_GIC_V2=y # CONFIG_RT_USING_GIC_V3 is not set +CONFIG_ARCH_ARM_SECURE_MODE=y +# CONFIG_RT_BACKTRACE_FUNCTION_NAME is not set CONFIG_ARCH_ARMV8=y -# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set # # RT-Thread Components @@ -151,15 +157,17 @@ CONFIG_RT_DFS_ELM_REENTRANT=y CONFIG_RT_DFS_ELM_MUTEX_TIMEOUT=3000 CONFIG_RT_USING_DFS_DEVFS=y # CONFIG_RT_USING_DFS_ROMFS is not set +# CONFIG_RT_USING_DFS_CROMFS is not set # CONFIG_RT_USING_DFS_RAMFS is not set +# CONFIG_RT_USING_DFS_TMPFS is not set # CONFIG_RT_USING_DFS_NFS is not set # CONFIG_RT_USING_FAL is not set -# CONFIG_RT_USING_LWP is not set # # Device Drivers # CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 CONFIG_RT_USING_SYSTEM_WORKQUEUE=y CONFIG_RT_SYSTEM_WORKQUEUE_STACKSIZE=2048 CONFIG_RT_SYSTEM_WORKQUEUE_PRIORITY=23 @@ -179,11 +187,15 @@ CONFIG_RT_USING_I2C_BITOPS=y CONFIG_RT_USING_PIN=y CONFIG_RT_USING_ADC=y # CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set CONFIG_RT_USING_PWM=y # CONFIG_RT_USING_MTD_NOR is not set CONFIG_RT_USING_MTD_NAND=y CONFIG_RT_MTD_NAND_DEBUG=y # CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_FDT is not set CONFIG_RT_USING_RTC=y # CONFIG_RT_USING_ALARM is not set # CONFIG_RT_USING_SOFT_RTC is not set @@ -209,10 +221,13 @@ CONFIG_RT_AUDIO_RECORD_PIPE_SIZE=2048 # CONFIG_RT_USING_SENSOR is not set CONFIG_RT_USING_TOUCH=y # CONFIG_RT_TOUCH_PIN_IRQ is not set +# CONFIG_RT_USING_LCD is not set # CONFIG_RT_USING_HWCRYPTO is not set # CONFIG_RT_USING_PULSE_ENCODER is not set # CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_DEV_BUS is not set # CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_VIRTIO is not set # # Using USB @@ -507,6 +522,7 @@ CONFIG_UTEST_SMALL_MEM_TC=y # CONFIG_PKG_USING_AGILE_FTP is not set # CONFIG_PKG_USING_EMBEDDEDPROTO is not set # CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_RYANMQTT is not set # CONFIG_PKG_USING_LORA_PKT_FWD is not set # CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set # CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set @@ -514,6 +530,7 @@ CONFIG_UTEST_SMALL_MEM_TC=y # CONFIG_PKG_USING_SMALL_MODBUS is not set # CONFIG_PKG_USING_NET_SERVER is not set # CONFIG_PKG_USING_ZFTP is not set +# CONFIG_PKG_USING_WOL is not set # # security packages @@ -563,14 +580,20 @@ CONFIG_PKG_USING_LVGL=y CONFIG_PKG_LVGL_PATH="/packages/multimedia/LVGL/LVGL" CONFIG_PKG_LVGL_THREAD_PRIO=20 CONFIG_PKG_LVGL_THREAD_STACK_SIZE=4096 -CONFIG_PKG_LVGL_DISP_REFR_PERIOD=5 +CONFIG_PKG_LVGL_DISP_REFR_PERIOD=16 +# CONFIG_PKG_USING_LVGL_SQUARELINE is not set # CONFIG_PKG_LVGL_USING_EXAMPLES is not set CONFIG_PKG_LVGL_USING_DEMOS=y -# CONFIG_PKG_LVGL_USING_V08020 is not set +# CONFIG_PKG_LVGL_USING_V08034 is not set +# CONFIG_PKG_LVGL_USING_V08033 is not set +# CONFIG_PKG_LVGL_USING_V08032 is not set +# CONFIG_PKG_LVGL_USING_V08031 is not set # CONFIG_PKG_LVGL_USING_V08030 is not set -CONFIG_PKG_LVGL_USING_LATEST_VERSION=y -CONFIG_PKG_LVGL_VER_NUM=0x99999 -CONFIG_PKG_LVGL_VER="latest" +# CONFIG_PKG_LVGL_USING_V08020 is not set +CONFIG_PKG_LVGL_USING_V8_3_LATEST_VERSION=y +# CONFIG_PKG_LVGL_USING_LATEST_VERSION is not set +CONFIG_PKG_LVGL_VER_NUM=0x0803F +CONFIG_PKG_LVGL_VER="v8.3-latest" # CONFIG_PKG_USING_LITTLEVGL2RTT is not set # CONFIG_PKG_USING_LV_MUSIC_DEMO is not set # CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set @@ -595,14 +618,10 @@ CONFIG_PKG_WAVPLAYER_VER="latest" # CONFIG_PKG_USING_TJPGD is not set # CONFIG_PKG_USING_PDFGEN is not set # CONFIG_PKG_USING_HELIX is not set -# CONFIG_PKG_USING_HELIX_V100 is not set -# CONFIG_PKG_USING_HELIX_LATEST_VERSION is not set # CONFIG_PKG_USING_AZUREGUIX is not set # CONFIG_PKG_USING_TOUCHGFX2RTT is not set # CONFIG_PKG_USING_NUEMWIN is not set # CONFIG_PKG_USING_MP3PLAYER is not set -# CONFIG_PKG_USING_MP3PLAYER_V100 is not set -# CONFIG_PKG_USING_MP3PLAYER_LATEST_VERSION is not set # CONFIG_PKG_USING_TINYJPEG is not set # CONFIG_PKG_USING_UGUI is not set @@ -628,7 +647,6 @@ CONFIG_PKG_WAVPLAYER_VER="latest" # CONFIG_PKG_USING_SEGGER_RTT is not set # CONFIG_PKG_USING_RDB is not set # CONFIG_PKG_USING_ULOG_EASYFLASH is not set -# CONFIG_PKG_USING_ULOG_FILE is not set # CONFIG_PKG_USING_LOGMGR is not set # CONFIG_PKG_USING_ADBD is not set # CONFIG_PKG_USING_COREMARK is not set @@ -662,8 +680,8 @@ CONFIG_PKG_WAVPLAYER_VER="latest" # CONFIG_PKG_USING_CBOX is not set # CONFIG_PKG_USING_SNOWFLAKE is not set # CONFIG_PKG_USING_HASH_MATCH is not set -# CONFIG_PKG_USING_FIRE_PID_CURVE is not set # CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set # # system packages @@ -699,7 +717,6 @@ CONFIG_PKG_WAVPLAYER_VER="latest" # CONFIG_PKG_USING_UC_CLK is not set # CONFIG_PKG_USING_UC_COMMON is not set # CONFIG_PKG_USING_UC_MODBUS is not set -# CONFIG_PKG_USING_RTDUINO is not set # CONFIG_PKG_USING_FREERTOS_WRAPPER is not set # CONFIG_PKG_USING_CAIRO is not set # CONFIG_PKG_USING_PIXMAN is not set @@ -738,19 +755,93 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_KMULTI_RTIMER is not set # CONFIG_PKG_USING_TFDB is not set # CONFIG_PKG_USING_QPC is not set +# CONFIG_PKG_USING_AGILE_UPGRADE is not set # # peripheral libraries and drivers # -# CONFIG_PKG_USING_SENSORS_DRIVERS is not set -# CONFIG_PKG_USING_REALTEK_AMEBA is not set + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_TMP1075 is not set +# CONFIG_PKG_USING_SR04 is not set +# CONFIG_PKG_USING_CCS811 is not set +# CONFIG_PKG_USING_PMSXX is not set +# CONFIG_PKG_USING_RT3020 is not set +# CONFIG_PKG_USING_MLX90632 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set # CONFIG_PKG_USING_SHT2X is not set # CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_AD7746 is not set # CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set # CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set # CONFIG_PKG_USING_STM32_SDIO is not set # CONFIG_PKG_USING_ESP_IDF is not set -# CONFIG_PKG_USING_ICM20608 is not set # CONFIG_PKG_USING_BUTTON is not set # CONFIG_PKG_USING_PCF8574 is not set # CONFIG_PKG_USING_SX12XX is not set @@ -773,12 +864,9 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_AGILE_LED is not set # CONFIG_PKG_USING_AT24CXX is not set # CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set -# CONFIG_PKG_USING_AD7746 is not set # CONFIG_PKG_USING_PCA9685 is not set # CONFIG_PKG_USING_I2C_TOOLS is not set # CONFIG_PKG_USING_NRF24L01 is not set -# CONFIG_PKG_USING_TOUCH_DRIVERS is not set -# CONFIG_PKG_USING_MAX17048 is not set # CONFIG_PKG_USING_RPLIDAR is not set # CONFIG_PKG_USING_AS608 is not set # CONFIG_PKG_USING_RC522 is not set @@ -793,7 +881,6 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_CAN_YMODEM is not set # CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set # CONFIG_PKG_USING_QLED is not set -# CONFIG_PKG_USING_PAJ7620 is not set # CONFIG_PKG_USING_AGILE_CONSOLE is not set # CONFIG_PKG_USING_LD3320 is not set # CONFIG_PKG_USING_WK2124 is not set @@ -824,10 +911,11 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_BL_MCU_SDK is not set # CONFIG_PKG_USING_SOFT_SERIAL is not set # CONFIG_PKG_USING_MB85RS16 is not set -# CONFIG_PKG_USING_CW2015 is not set # CONFIG_PKG_USING_RFM300 is not set # CONFIG_PKG_USING_IO_INPUT_FILTER is not set # CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_FINGERPRINT is not set # # AI packages @@ -842,6 +930,12 @@ CONFIG_PKG_RAMDISK_VER="latest" # CONFIG_PKG_USING_QUEST is not set # CONFIG_PKG_USING_NAXOS is not set +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_UKAL is not set + # # miscellaneous packages # @@ -897,7 +991,6 @@ CONFIG_PKG_OPTPARSE_VER="latest" # CONFIG_PKG_USING_VI is not set # CONFIG_PKG_USING_KI is not set # CONFIG_PKG_USING_ARMv7M_DWT is not set -# CONFIG_PKG_USING_UKAL is not set # CONFIG_PKG_USING_CRCLIB is not set # CONFIG_PKG_USING_LWGPS is not set # CONFIG_PKG_USING_STATE_MACHINE is not set @@ -907,8 +1000,213 @@ CONFIG_PKG_OPTPARSE_VER="latest" # CONFIG_PKG_USING_MFBD is not set # CONFIG_PKG_USING_SLCAN2RTT is not set # CONFIG_PKG_USING_SOEM is not set -CONFIG_UTEST_CMD_PREFIX="bsp.nuvoton.utest." -CONFIG_BOARD_USE_UTEST=y +# CONFIG_PKG_USING_QPARAM is not set +# CONFIG_PKG_USING_CorevMCU_CLI is not set + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects +# +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_ADAFRUIT_MAX31855 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set +# CONFIG_PKG_USING_ADAFRUIT_MSA301 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set +# CONFIG_PKG_USING_SEEED_ITG3200 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set +# CONFIG_PKG_USING_SEEED_MP503 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set + +# +# Other +# + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set + +# +# Uncategorized +# # # Hardware Drivers Config @@ -918,6 +1216,11 @@ CONFIG_BOARD_USE_UTEST=y # On-chip Peripheral Drivers # CONFIG_SOC_SERIES_MA35D1=y +CONFIG_BSP_USING_SSPCC=y +CONFIG_BSP_USING_SSMCC=y +CONFIG_BSP_USING_UMCTL2=y +CONFIG_BSP_USING_RTP=y +CONFIG_RTP_USING_AT_STARTUP=y CONFIG_RT_USING_FPU=y # CONFIG_BSP_USE_STDDRIVER_SOURCE is not set CONFIG_BSP_USING_PDMA=y @@ -1006,9 +1309,6 @@ CONFIG_BSP_USING_QSPI0=y # CONFIG_BSP_USING_SCUART is not set # CONFIG_BSP_USING_ECAP is not set # CONFIG_BSP_USING_QEI is not set -# CONFIG_BSP_USING_CRYPTO is not set -# CONFIG_BSP_USING_TRNG is not set -# CONFIG_BSP_USING_CRC is not set # CONFIG_BSP_USING_SOFT_I2C is not set CONFIG_BSP_USING_DISP=y CONFIG_LCM_USING_FW070TFT_WSVGA=y @@ -1020,8 +1320,13 @@ CONFIG_BSP_LCD_WIDTH=1024 CONFIG_BSP_LCD_HEIGHT=600 CONFIG_DISP_USING_OVERLAY=y # CONFIG_BSP_USING_WDT is not set +CONFIG_BSP_USING_HWSEM=y +CONFIG_BSP_USING_HWSEM0=y +CONFIG_BSP_USING_WHC=y +CONFIG_BSP_USING_WHC0=y +# CONFIG_BSP_USING_WHC1 is not set +CONFIG_BSP_USING_NFI=y # CONFIG_BSP_USING_EBI is not set -# CONFIG_BSP_USING_USBD is not set CONFIG_BSP_USING_USBH=y CONFIG_BSP_USING_HSUSBH0=y CONFIG_BSP_USING_HSUSBH1=y @@ -1033,9 +1338,11 @@ CONFIG_BSP_USING_CONSOLE=y CONFIG_BOARD_USING_NAU8822=y CONFIG_BOARD_USING_STORAGE_SDCARD=y CONFIG_BOARD_USING_STORAGE_EMMC=y +CONFIG_BOARD_USING_STORAGE_RAWNAND=y # CONFIG_BOARD_USING_STORAGE_SPIFLASH is not set CONFIG_BOARD_USING_STORAGE_SPINAND=y # CONFIG_BOARD_USING_BUZZER is not set +# CONFIG_BOARD_USING_MPU6500 is not set CONFIG_BOARD_USING_USBHOST=y # @@ -1046,16 +1353,14 @@ CONFIG_BOARD_USING_LCM=y CONFIG_BOARD_USING_LCM_FW070TFT_WSVGA=y # CONFIG_BOARD_USING_GT911 is not set CONFIG_BOARD_USING_ADCTOUCH=y -CONFIG_BOARD_USING_SENSOR0=y -CONFIG_BOARD_USING_SENSON0_ID=0 +# CONFIG_BOARD_USING_SENSOR0 is not set # CONFIG_BOARD_USING_SENSOR1 is not set # # Nuvoton Packages Config # CONFIG_NU_PKG_USING_UTILS=y -# CONFIG_NU_PKG_USING_DEMO is not set -CONFIG_NU_PKG_USING_LVGL=y +CONFIG_NU_PKG_USING_DEMO=y # CONFIG_NU_PKG_USING_BMX055 is not set # CONFIG_NU_PKG_USING_MAX31875 is not set # CONFIG_NU_PKG_USING_NCT7717U is not set diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/README.md b/bsp/nuvoton/numaker-hmi-ma35d1/README.md index 4d95d63512..915680a8b7 100644 --- a/bsp/nuvoton/numaker-hmi-ma35d1/README.md +++ b/bsp/nuvoton/numaker-hmi-ma35d1/README.md @@ -88,10 +88,10 @@ Support GCC compiler. More information of these compiler version as following: | Compiler | Tested version | | -- | -- | -| GCC | 6-2017-q1-update| +| GCC | Arm Embedded Toolchain 10.3-2021.10 (Env 1.3.5 embedded version)| ## **Build RT-Thread** -You can build rt-thread.bin for NuMaker-HMI-MA35D1 board. Steps as following. Notice, the building will include **ma35-rtp/rtthread.bin** file into **NuMaker-HMI-MA35D1/rtthread.bin** for heterogeneous multi-core demonstration. +You can build rt-thread.bin for NuMaker-HMI-MA35D1 board. Steps as following. Notice, the building will include **ma35-rtp/rtthread.bin** file into **numaker-hmi-ma35d1/rtthread.bin** for heterogeneous multi-core demonstration. ```bash # cd rt-thread/bsp/nuvoton/numaker-hmi-ma35d1 @@ -194,8 +194,8 @@ You can run windows batch script to download rtthread.bin into Raw NAND flash, t |Connector on board|Wiring|Usage| |-|-|-| -|VCOM(CON21)|Use an USB line| rt-thread@RTP Console | -|RS232_16(CON14)|Using an USB to RS232 convert| rt-thread@CA35 Console | +|VCOM(CON21)|Use an USB line| rt-thread@CA35 Console | +|RS232_16(CON14)|Using an USB to RS232 convert| rt-thread@RTP Console | You can use Tera Term terminate emulator (or other software) to type commands of RTT. All parameters of serial communication are shown in below image. Here, you can find out the corresponding port number of Nuvoton Virtual Com Port in window device manager. @@ -206,11 +206,11 @@ You can use Tera Term terminate emulator (or other software) to type commands of ## **Purchase** -* [Nuvoton Direct](https://ComingSoon) +* [Nuvoton Direct](https://direct.nuvoton.com/en/numaker-hmi-ma35d1-s1) ## **Resources** -* [Download Board Schematics](https://ComingSoon) -* [Download Quick Start Guide](https://ComingSoon) -* [Download TRM](https://ComingSoon) +* [Download Board Schematics](https://www.nuvoton.com/resource-download.jsp?tp_GUID=HL102022102107140870) +* [Download User Manual](https://www.nuvoton.com/resource-download.jsp?tp_GUID=UG132022101900252882) +* [Download Datasheet](https://www.nuvoton.com/resource-download.jsp?tp_GUID=DA00-MA35D16) * [Download NuWriter](https://github.com/OpenNuvoton/MA35D1_NuWriter) diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_conf.h b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_conf.h index c902bc904c..b046f3c8c8 100644 --- a/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_conf.h +++ b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_conf.h @@ -22,7 +22,7 @@ #define LV_USE_PERF_MONITOR 1 //#define CONFIG_LV_LOG_LEVEL LV_LOG_LEVEL_TRACE -//#define LV_USE_DEMO_RTT_MUSIC 1 +#define LV_USE_DEMO_RTT_MUSIC 1 #if LV_USE_DEMO_RTT_MUSIC #define LV_COLOR_SCREEN_TRANSP 1 #define LV_DEMO_RTT_MUSIC_AUTO_PLAY 1 @@ -32,7 +32,7 @@ #endif /* Please comment LV_USE_DEMO_RTT_MUSIC declaration before un-comment below */ -#define LV_USE_DEMO_WIDGETS 1 +//#define LV_USE_DEMO_WIDGETS 1 //#define LV_USE_DEMO_BENCHMARK 1 #endif diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_demo.c b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_demo.c index 7a04e1804a..1f8382d46a 100644 --- a/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_demo.c +++ b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_demo.c @@ -10,23 +10,22 @@ #include -void lv_user_gui_init(void) +RT_WEAK void lv_user_gui_init(void) { /* display demo; you may replace with your LVGL application at here and disable related definitions. */ #if LV_USE_DEMO_BENCHMARK extern void lv_demo_benchmark(void); lv_demo_benchmark(); -#endif -#if LV_USE_DEMO_WIDGETS +#elif LV_USE_DEMO_WIDGETS extern void lv_demo_widgets(void); lv_demo_widgets(); -#endif -#if LV_USE_DEMO_MUSIC || LV_USE_DEMO_RTT_MUSIC +#elif (LV_USE_DEMO_MUSIC || LV_USE_DEMO_RTT_MUSIC) extern void lv_demo_music(void); lv_demo_music(); + #endif } diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_disp.c b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_disp.c index 8c1de86b8d..5856a29fc6 100644 --- a/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_disp.c +++ b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_disp.c @@ -17,6 +17,10 @@ #define DBG_COLOR #include +#if !defined(NU_PKG_LVGL_RENDERING_LAYER) + #define NU_PKG_LVGL_RENDERING_LAYER "lcd" +#endif + /*A static or global variable to store the buffers*/ static lv_disp_draw_buf_t disp_buf; static rt_device_t lcd_device = 0; @@ -47,24 +51,6 @@ static void nu_antitearing(lv_disp_draw_buf_t *draw_buf, lv_color_t *color_p) } } -static void nu_flush_direct(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) -{ - /* Use PANDISPLAY */ - rt_device_control(lcd_device, RTGRAPHIC_CTRL_PAN_DISPLAY, color_p); - - //TODO - nu_antitearing(disp_drv->draw_buf, color_p); - - if (!u32FirstFlush) - { - /* Enable backlight at first flushing. */ - rt_device_control(lcd_device, RTGRAPHIC_CTRL_POWERON, RT_NULL); - u32FirstFlush = 1; - } - - lv_disp_flush_ready(disp_drv); -} - static void nu_flush_full_refresh(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) { rt_hw_cpu_dcache_clean(color_p, disp_drv->draw_buf->size * sizeof(lv_color_t)); @@ -86,16 +72,29 @@ static void nu_flush_full_refresh(lv_disp_drv_t *disp_drv, const lv_area_t *area static void nu_flush(lv_disp_drv_t *disp_drv, const lv_area_t *area, lv_color_t *color_p) { - int32_t flush_area_w = lv_area_get_width(area); - int32_t flush_area_h = lv_area_get_height(area); + int32_t x, y; + int32_t w = lv_area_get_width(area); + int32_t h = lv_area_get_height(area); + lv_color_t *pDisp; - rt_kprintf("[%s %08x] %dx%d %d %d %d %d\n", __func__, color_p, flush_area_w, flush_area_h, area->x1, area->y1, area->x2, area->y2); + pDisp = (lv_color_t *)info.framebuffer + (info.width * area->y1 + area->x1); /* Update dirty region. */ - //TODO + for (y = 0; y < h; y++) + { + for (x = 0; x < w; x++) + { + pDisp[x] = color_p[x]; + } + pDisp += info.width; + color_p += w; + } if (!u32FirstFlush) { + /* Point to first screen buffer address. */ + rt_device_control(lcd_device, RTGRAPHIC_CTRL_PAN_DISPLAY, info.framebuffer); + /* Enable backlight at first flushing. */ rt_device_control(lcd_device, RTGRAPHIC_CTRL_POWERON, RT_NULL); u32FirstFlush = 1; @@ -115,7 +114,7 @@ void lv_port_disp_init(void) void *buf2 = RT_NULL; uint32_t u32FBSize; - lcd_device = rt_device_find("lcd"); + lcd_device = rt_device_find(NU_PKG_LVGL_RENDERING_LAYER); if (lcd_device == 0) { LOG_E("error!"); @@ -142,30 +141,25 @@ void lv_port_disp_init(void) /*Set the resolution of the display*/ disp_drv.hor_res = info.width; disp_drv.ver_res = info.height; - disp_drv.full_refresh = 1; - //disp_drv.direct_mode = 1; + //disp_drv.full_refresh = 1; u32FBSize = info.height * info.width * (info.bits_per_pixel / 8); - if (disp_drv.full_refresh || disp_drv.direct_mode) + if (disp_drv.full_refresh) { + disp_drv.flush_cb = nu_flush_full_refresh; buf1 = (void *)((uint32_t)info.framebuffer & (~UNCACHEABLE)); buf2 = (void *)((uint32_t)buf1 + u32FBSize); buf3_next = (void *)((uint32_t)buf2 + u32FBSize); - rt_kprintf("LVGL: Triple screen-sized buffers(%s) - buf1@%08x, buf2@%08x, buf3_next@%08x\n", (disp_drv.full_refresh == 1) ? "full_refresh" : "direct_mode", buf1, buf2, buf3_next); - if (disp_drv.direct_mode) - disp_drv.flush_cb = nu_flush_direct; - else - disp_drv.flush_cb = nu_flush_full_refresh; + LOG_I("LVGL: Triple screen-sized buffers(full_refresh) - buf1@%08x, buf2@%08x, buf3_next@%08x\n", buf1, buf2, buf3_next); } else { - buf1 = (void *)(((uint32_t)info.framebuffer) + u32FBSize); - buf2 = (void *)((uint32_t)buf1 + u32FBSize); - rt_kprintf("LVGL: Two screen-sized buffers - buf1@%08x, buf2@%08x\n", buf1, buf2); - rt_device_control(lcd_device, RTGRAPHIC_CTRL_PAN_DISPLAY, info.framebuffer); - disp_drv.flush_cb = nu_flush; + buf1 = (void *)(((uint32_t)info.framebuffer & (~UNCACHEABLE)) + u32FBSize); + buf2 = (void *)((uint32_t)buf1 + u32FBSize); + + rt_kprintf("LVGL: Two screen-sized buffers - buf1@%08x, buf2@%08x\n", buf1, buf2); } /*Initialize `disp_buf` with the buffer(s).*/ diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_disp.h b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_disp.h deleted file mode 100644 index b11ce3c5b6..0000000000 --- a/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_disp.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2021-10-18 Meco Man The first version - */ -#ifndef LV_PORT_DISP_H -#define LV_PORT_DISP_H - -#ifdef __cplusplus -extern "C" { -#endif - -void lv_port_disp_init(void); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_indev.h b/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_indev.h deleted file mode 100644 index bde7176807..0000000000 --- a/bsp/nuvoton/numaker-hmi-ma35d1/applications/lvgl/lv_port_indev.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2021-10-18 Meco Man The first version - */ -#ifndef LV_PORT_INDEV_H -#define LV_PORT_INDEV_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -extern lv_indev_t *button_indev; - -void lv_port_indev_init(void); -void lv_port_indev_input(rt_int16_t x, rt_int16_t y, lv_indev_state_t state); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/applications/main.c b/bsp/nuvoton/numaker-hmi-ma35d1/applications/main.c index 4c781acff3..87a2c7cc3e 100644 --- a/bsp/nuvoton/numaker-hmi-ma35d1/applications/main.c +++ b/bsp/nuvoton/numaker-hmi-ma35d1/applications/main.c @@ -47,25 +47,3 @@ int main(int argc, char **argv) } #endif - -void happy_counter(void *pdata) -{ - uint32_t counter = 0; - while (1) - { - rt_kprintf("cpu-%d %d\r\n", rt_hw_cpu_id(), counter++); - rt_thread_mdelay(1000); - } -} - -void go_happy_counter(void) -{ - rt_thread_t tid = rt_thread_create("cpu-1", happy_counter, RT_NULL, 2048, 10, 20); - RT_ASSERT(tid != RT_NULL); - - rt_thread_control(tid, RT_THREAD_CTRL_BIND_CPU, (void *)1); - - rt_thread_startup(tid); -} -MSH_CMD_EXPORT(go_happy_counter, go happy counter); - diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/applications/mnt.c b/bsp/nuvoton/numaker-hmi-ma35d1/applications/mnt.c index 2ddb18f2ba..601362ab50 100644 --- a/bsp/nuvoton/numaker-hmi-ma35d1/applications/mnt.c +++ b/bsp/nuvoton/numaker-hmi-ma35d1/applications/mnt.c @@ -12,6 +12,8 @@ #include +#if defined(RT_USING_DFS) + #define LOG_TAG "mnt" #define DBG_ENABLE #define DBG_SECTION_NAME "mnt" @@ -57,9 +59,10 @@ const struct dfs_mount_tbl mount_table[] = { RAMDISK_UDC, "/mnt/ram_usbd", "elm", 0, RT_NULL }, #endif #if defined(PKG_USING_DFS_YAFFS) - { "nand1", "/mnt/filesystem", "yaffs", 0, RT_NULL }, + { "nand1", "/mnt/nand1", "yaffs", 0, RT_NULL }, + { "rawnd1", "/mnt/nfi", "yaffs", 0, RT_NULL }, #elif defined(RT_USING_DFS_UFFS) - { "nand1", "/mnt/filesystem", "uffs", 0, RT_NULL }, + { "nand1", "/mnt/nand1", "uffs", 0, RT_NULL }, #endif { "sd0", "/mnt/sd0", "elm", 0, RT_NULL }, { "sd0p0", "/mnt/sd0p0", "elm", 0, RT_NULL }, @@ -163,9 +166,10 @@ exit_mkdir_p: #if defined(PKG_USING_DFS_YAFFS) && defined(RT_USING_DFS_MNTTABLE) #include "yaffs_guts.h" -void yaffs_dev_init(void) +int yaffs_dev_init(void) { int i; + for (i = 0; i < sizeof(mount_table) / sizeof(struct dfs_mount_tbl); i++) { if (mount_table[i].filesystemtype && !rt_strcmp(mount_table[i].filesystemtype, "yaffs")) @@ -173,11 +177,26 @@ void yaffs_dev_init(void) struct rt_mtd_nand_device *psMtdNandDev = RT_MTD_NAND_DEVICE(rt_device_find(mount_table[i].device_name)); if (psMtdNandDev) { + LOG_I("yaffs start [%s].", mount_table[i].device_name); + yaffs_start_up(psMtdNandDev, (const char *)mount_table[i].path); + + LOG_I("dfs mount [%s].", mount_table[i].device_name); + if (dfs_mount(mount_table[i].device_name, + mount_table[i].path, + mount_table[i].filesystemtype, + mount_table[i].rwflag, + mount_table[i].data) != 0) + { + LOG_E("mount fs[%s] on %s failed.", mount_table[i].filesystemtype, mount_table[i].path); + } } } } + + return 0; } +INIT_APP_EXPORT(yaffs_dev_init); #endif /* Initialize the filesystem */ @@ -214,7 +233,8 @@ int filesystem_init(void) mkdir_p("/cache", 0x777); mkdir_p("/download", 0x777); mkdir_p("/mnt/ram_usbd", 0x777); - mkdir_p("/mnt/filesystem", 0x777); + mkdir_p("/mnt/nand1", 0x777); + mkdir_p("/mnt/nfi", 0x777); mkdir_p("/mnt/sd0", 0x777); mkdir_p("/mnt/sd0p0", 0x777); mkdir_p("/mnt/sd0p1", 0x777); @@ -254,13 +274,10 @@ int filesystem_init(void) } #endif -#if defined(PKG_USING_DFS_YAFFS) && defined(RT_USING_DFS_MNTTABLE) - yaffs_dev_init(); -#endif - exit_filesystem_init: return -result; } INIT_ENV_EXPORT(filesystem_init); #endif +#endif diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/board/Kconfig b/bsp/nuvoton/numaker-hmi-ma35d1/board/Kconfig index 2fbf0bf116..134a2e50b9 100644 --- a/bsp/nuvoton/numaker-hmi-ma35d1/board/Kconfig +++ b/bsp/nuvoton/numaker-hmi-ma35d1/board/Kconfig @@ -32,6 +32,12 @@ menu "Hardware Drivers Config" select BSP_USING_SDH1 default y + config BOARD_USING_STORAGE_RAWNAND + bool "Raw NAND supporting(over nfi)" + select BSP_USING_NFI + select RT_USING_MTD_NAND + default y + config BOARD_USING_STORAGE_SPIFLASH bool "SPI NOR FLASH supporting(over qspi0)" select BSP_USING_QSPI @@ -52,6 +58,17 @@ menu "Hardware Drivers Config" select BSP_USING_EPWM1_PWM default y + config BOARD_USING_MPU6500 + bool "MPU6500 6-axis MotionTracking Sensor(over i2c1)" + select RT_USING_SENSOR + select PKG_USING_MPU6XXX + select PKG_USING_MPU6XXX_LATEST_VERSION + select PKG_USING_MPU6XXX_ACCE + select PKG_USING_MPU6XXX_GYRO + select BSP_USING_I2C + select BSP_USING_I2C1 + default y + config BOARD_USING_USBHOST bool "USB HOST function" select BSP_USING_USBH @@ -139,7 +156,7 @@ menu "Hardware Drivers Config" if BOARD_USING_SENSOR1 config BOARD_USING_SENSON1_ID int "Specify Sensor1 ID" - default 0 + default 0 range 0 2 help HM1055=0 diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/board/board.h b/bsp/nuvoton/numaker-hmi-ma35d1/board/board.h index 5d422bcf19..33c01c6097 100644 --- a/bsp/nuvoton/numaker-hmi-ma35d1/board/board.h +++ b/bsp/nuvoton/numaker-hmi-ma35d1/board/board.h @@ -29,6 +29,9 @@ extern int __bss_end; #include #define MTD_SPINAND_PARTITION_NUM 3 extern struct rt_mtd_nand_device mtd_partitions[MTD_SPINAND_PARTITION_NUM]; + + #define MTD_NFI_PARTITION_NUM 3 + extern struct rt_mtd_nand_device mtd_partitions_nfi[MTD_NFI_PARTITION_NUM]; #endif extern void rt_hw_board_init(void); extern void nu_clock_init(void); diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/board/board_dev.c b/bsp/nuvoton/numaker-hmi-ma35d1/board/board_dev.c index 97959fc4a4..a475663591 100644 --- a/bsp/nuvoton/numaker-hmi-ma35d1/board/board_dev.c +++ b/bsp/nuvoton/numaker-hmi-ma35d1/board/board_dev.c @@ -14,6 +14,8 @@ #include #include "drv_gpio.h" #include "drv_sys.h" +#include "drv_sspcc.h" + #include "board.h" @@ -149,7 +151,7 @@ static int rt_hw_spiflash_init(void) #endif return 0; } -INIT_COMPONENT_EXPORT(rt_hw_spiflash_init); +INIT_DEVICE_EXPORT(rt_hw_spiflash_init); #endif /* BOARD_USING_STORAGE_SPIFLASH */ #if defined(BOARD_USING_STORAGE_SPINAND) && defined(NU_PKG_USING_SPINAND) @@ -193,7 +195,52 @@ static int rt_hw_spinand_init(void) return 0; } -INIT_COMPONENT_EXPORT(rt_hw_spinand_init); +INIT_DEVICE_EXPORT(rt_hw_spinand_init); +#endif + +#if defined(BOARD_USING_MPU6500) && defined(PKG_USING_MPU6XXX) + +#include "sensor_inven_mpu6xxx.h" + +int rt_hw_mpu6xxx_port(void) +{ + struct rt_sensor_config cfg; + rt_base_t mpu_int = NU_GET_PININDEX(NU_PL, 8); + + cfg.intf.dev_name = "i2c1"; + cfg.intf.arg = (void *)MPU6XXX_ADDR_DEFAULT; + cfg.irq_pin.pin = mpu_int; + + return rt_hw_mpu6xxx_init("mpu", &cfg); +} +INIT_APP_EXPORT(rt_hw_mpu6xxx_port); +#endif /* BOARD_USING_MPU6500 */ + +#if defined(BOARD_USING_STORAGE_RAWNAND) && defined(BSP_USING_NFI) +struct rt_mtd_nand_device mtd_partitions_nfi[MTD_NFI_PARTITION_NUM] = +{ + [0] = + { + /*nand0: rtthread*/ + .block_start = 0, + .block_end = 63, + .block_total = 64, + }, + [1] = + { + /*nand1: for filesystem mounting*/ + .block_start = 64, + .block_end = 8191, + .block_total = 8128, + }, + [2] = + { + /*nand2: Whole blocks size, overlay*/ + .block_start = 0, + .block_end = 8191, + .block_total = 8192, + } +}; #endif #if defined(BOARD_USING_NAU8822) && defined(NU_PKG_USING_NAU8822) diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/board/nutool_pincfg/nutool_pincfg.c b/bsp/nuvoton/numaker-hmi-ma35d1/board/nutool_pincfg/nutool_pincfg.c index e31c79cd08..f3a413b336 100644 --- a/bsp/nuvoton/numaker-hmi-ma35d1/board/nutool_pincfg/nutool_pincfg.c +++ b/bsp/nuvoton/numaker-hmi-ma35d1/board/nutool_pincfg/nutool_pincfg.c @@ -11,181 +11,6 @@ /******************** MCU:MA35D16A887C(BGA312) -Pin Configuration: -PinA2:I2C2_SCL -PinA3:EADC0_CH7 -PinA4:EADC0_CH3 -PinA5:RGMII1_TXCLK -PinA6:RGMII1_RXCLK -PinA7:RGMII1_RXCTL -PinA8:RGMII1_MDIO -PinA9:RGMII0_TXCLK -PinA10:RGMII0_RXD1 -PinA11:RGMII0_RXCLK -PinA12:RGMII0_TXCTL -PinA13:I2S0_DI -PinA14:VCAP1_SFIELD -PinA15:VCAP1_HSYNC -PinA16:VCAP1_PIXCLK -PinA17:VCAP1_DATA5 -PinB1:ADC0_CH4 -PinB2:I2C1_SCL -PinB3:EADC0_CH5 -PinB4:EADC0_CH4 -PinB5:EADC0_CH1 -PinB6:RGMII1_TXD3 -PinB7:RGMII1_RXD0 -PinB8:RGMII1_TXCTL -PinB9:RGMII0_TXD2 -PinB10:RGMII0_RXD2 -PinB11:RGMII0_RXCTL -PinB12:RGMII0_MDIO -PinB13:I2S0_BCLK -PinB14:VCAP1_VSYNC -PinB15:VCAP1_SCLK -PinB16:VCAP1_DATA7 -PinB17:VCAP1_DATA0 -PinB18:VCAP1_DATA2 -PinC1:ADC0_CH7 -PinC2:ADC0_CH5 -PinC3:I2C2_SDA -PinC4:EADC0_CH2 -PinC5:EADC0_CH0 -PinC6:RGMII1_TXD2 -PinC7:RGMII1_RXD2 -PinC8:RGMII1_TXD0 -PinC9:RGMII0_TXD3 -PinC10:RGMII0_RXD0 -PinC11:RGMII0_TXD1 -PinC12:RGMII0_MDC -PinC13:I2S0_LRCK -PinC14:VCAP1_DATA8 -PinC15:VCAP1_DATA6 -PinC16:VCAP1_DATA4 -PinC17:VCAP1_DATA1 -PinC18:VCAP1_DATA3 -PinD1:ADC0_CH6 -PinD2:I2C1_SDA -PinD3:EADC0_CH6 -PinD6:RGMII1_RXD3 -PinD7:RGMII1_RXD1 -PinD8:RGMII1_TXD1 -PinD9:RGMII1_MDC -PinD10:RGMII0_RXD3 -PinD11:RGMII0_TXD0 -PinD12:I2S0_DO -PinD13:I2S0_MCLK -PinD14:VCAP1_DATA9 -PinD16:UART10_nCTS -PinD17:UART10_TXD -PinD18:SD0_CLK -PinE1:HSUSBH_PWREN -PinE2:CAN1_RXD -PinE3:HSUSBH_OVC -PinE4:HSUSB0_VBUSVLD -PinE15:UART10_nRTS -PinE16:UART10_RXD -PinE17:SD0_WP -PinE18:SD0_DAT0 -PinF3:CAN1_TXD -PinF4:NAND_DATA3 -PinF16:UART14_RXD -PinF17:SD0_nCD -PinF18:SD0_CMD -PinG3:NAND_DATA0 -PinG4:NAND_DATA5 -PinG16:UART16_nRTS -PinG17:SD0_DAT3 -PinG18:SD0_DAT1 -PinH3:NAND_DATA1 -PinH4:NAND_DATA7 -PinH15:UART12_nRTS -PinH16:UART16_nCTS -PinH18:SD0_DAT2 -PinJ3:NAND_DATA6 -PinJ4:NAND_RDY -PinJ15:UART12_RXD -PinJ16:UART16_TXD -PinJ18:I2C4_SCL -PinK1:NAND_DATA2 -PinK2:NAND_DATA4 -PinK3:NAND_nRE -PinK4:NAND_ALE -PinK5:NAND_nWE -PinK16:UART16_RXD -PinK18:I2C4_SDA -PinL1:NAND_nCS -PinL2:NAND_CLE -PinL15:UART12_TXD -PinL16:I2C5_SDA -PinM5:NAND_nWP -PinM15:UART14_nRTS -PinM16:I2C5_SCL -PinM17:CAN3_RXD -PinN1:EPWM1_CH5 -PinN2:I2C3_SDA -PinN17:CAN3_TXD -PinP1:I2C3_SCL -PinP7:VCAP0_SFIELD -PinP8:SD1_nCD -PinP9:SD1_WP -PinP15:UART14_TXD -PinR5:VCAP0_DATA9 -PinR6:VCAP0_DATA7 -PinR9:SD1_DAT1 -PinR10:LCM_DEN -PinR11:LCM_DATA1 -PinR12:LCM_DATA6 -PinR13:LCM_DATA11 -PinR14:LCM_DATA15 -PinR16:LCM_DATA18 -PinR17:LCM_DATA20 -PinR18:LCM_DATA22 -PinT1:UART0_TXD -PinT2:UART0_RXD -PinT4:VCAP0_HSYNC -PinT5:VCAP0_DATA1 -PinT6:VCAP0_DATA5 -PinT7:VCAP0_DATA6 -PinT9:SD1_CMD -PinT10:LCM_VSYNC -PinT11:LCM_DATA0 -PinT12:LCM_DATA5 -PinT13:LCM_DATA10 -PinT14:LCM_DATA14 -PinT15:QSPI0_MISO1 -PinT16:LCM_DATA16 -PinT17:LCM_DATA17 -PinT18:LCM_DATA23 -PinU4:VCAP0_VSYNC -PinU5:VCAP0_DATA2 -PinU6:VCAP0_DATA3 -PinU7:VCAP0_DATA8 -PinU8:SD1_DAT3 -PinU9:SD1_DAT0 -PinU10:LCM_HSYNC -PinU11:LCM_DATA7 -PinU12:LCM_DATA4 -PinU13:LCM_DATA9 -PinU14:LCM_DATA13 -PinU15:QSPI0_MISO0 -PinU16:QSPI0_SS0 -PinU17:LCM_DATA19 -PinU18:LCM_DATA21 -PinV3:VCAP0_SCLK -PinV4:VCAP0_PIXCLK -PinV5:VCAP0_DATA0 -PinV6:VCAP0_DATA4 -PinV8:SD1_CLK -PinV9:SD1_DAT2 -PinV10:LCM_CLK -PinV11:LCM_DATA2 -PinV12:LCM_DATA3 -PinV13:LCM_DATA8 -PinV14:LCM_DATA12 -PinV15:QSPI0_MOSI1 -PinV16:QSPI0_MOSI0 -PinV17:QSPI0_CLK ********************/ #include "ma35d1.h" @@ -430,7 +255,7 @@ void nutool_pincfg_deinit_lcm(void) void nutool_pincfg_init_nand(void) { SYS->GPA_MFPH &= ~(SYS_GPA_MFPH_PA14MFP_Msk | SYS_GPA_MFPH_PA13MFP_Msk | SYS_GPA_MFPH_PA12MFP_Msk | SYS_GPA_MFPH_PA11MFP_Msk | SYS_GPA_MFPH_PA10MFP_Msk | SYS_GPA_MFPH_PA9MFP_Msk | SYS_GPA_MFPH_PA8MFP_Msk); - SYS->GPA_MFPH |= (SYS_GPA_MFPH_PA14MFP_NAND_nWP | SYS_GPA_MFPH_PA13MFP_NAND_nCS | SYS_GPA_MFPH_PA12MFP_NAND_ALE | SYS_GPA_MFPH_PA11MFP_NAND_CLE | SYS_GPA_MFPH_PA10MFP_NAND_nWE | SYS_GPA_MFPH_PA9MFP_NAND_nRE | SYS_GPA_MFPH_PA8MFP_NAND_RDY); + SYS->GPA_MFPH |= (SYS_GPA_MFPH_PA14MFP_NAND_nWP | SYS_GPA_MFPH_PA13MFP_NAND_nCS0 | SYS_GPA_MFPH_PA12MFP_NAND_ALE | SYS_GPA_MFPH_PA11MFP_NAND_CLE | SYS_GPA_MFPH_PA10MFP_NAND_nWE | SYS_GPA_MFPH_PA9MFP_NAND_nRE | SYS_GPA_MFPH_PA8MFP_NAND_RDY0); SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA7MFP_Msk | SYS_GPA_MFPL_PA6MFP_Msk | SYS_GPA_MFPL_PA5MFP_Msk | SYS_GPA_MFPL_PA4MFP_Msk | SYS_GPA_MFPL_PA3MFP_Msk | SYS_GPA_MFPL_PA2MFP_Msk | SYS_GPA_MFPL_PA1MFP_Msk | SYS_GPA_MFPL_PA0MFP_Msk); SYS->GPA_MFPL |= (SYS_GPA_MFPL_PA7MFP_NAND_DATA7 | SYS_GPA_MFPL_PA6MFP_NAND_DATA6 | SYS_GPA_MFPL_PA5MFP_NAND_DATA5 | SYS_GPA_MFPL_PA4MFP_NAND_DATA4 | SYS_GPA_MFPL_PA3MFP_NAND_DATA3 | SYS_GPA_MFPL_PA2MFP_NAND_DATA2 | SYS_GPA_MFPL_PA1MFP_NAND_DATA1 | SYS_GPA_MFPL_PA0MFP_NAND_DATA0); @@ -637,19 +462,19 @@ void nutool_pincfg_deinit_uart16(void) return; } -void nutool_pincfg_init_vcap0(void) +void nutool_pincfg_init_ccap0(void) { SYS->GPK_MFPH &= ~(SYS_GPK_MFPH_PK11MFP_Msk | SYS_GPK_MFPH_PK10MFP_Msk | SYS_GPK_MFPH_PK9MFP_Msk); - SYS->GPK_MFPH |= (SYS_GPK_MFPH_PK11MFP_VCAP0_HSYNC | SYS_GPK_MFPH_PK10MFP_VCAP0_PIXCLK | SYS_GPK_MFPH_PK9MFP_VCAP0_SCLK); + SYS->GPK_MFPH |= (SYS_GPK_MFPH_PK11MFP_CCAP0_HSYNC | SYS_GPK_MFPH_PK10MFP_CCAP0_PIXCLK | SYS_GPK_MFPH_PK9MFP_CCAP0_SCLK); SYS->GPM_MFPH &= ~(SYS_GPM_MFPH_PM11MFP_Msk | SYS_GPM_MFPH_PM10MFP_Msk | SYS_GPM_MFPH_PM9MFP_Msk | SYS_GPM_MFPH_PM8MFP_Msk); - SYS->GPM_MFPH |= (SYS_GPM_MFPH_PM11MFP_VCAP0_DATA9 | SYS_GPM_MFPH_PM10MFP_VCAP0_DATA8 | SYS_GPM_MFPH_PM9MFP_VCAP0_DATA7 | SYS_GPM_MFPH_PM8MFP_VCAP0_DATA6); + SYS->GPM_MFPH |= (SYS_GPM_MFPH_PM11MFP_CCAP0_DATA9 | SYS_GPM_MFPH_PM10MFP_CCAP0_DATA8 | SYS_GPM_MFPH_PM9MFP_CCAP0_DATA7 | SYS_GPM_MFPH_PM8MFP_CCAP0_DATA6); SYS->GPM_MFPL &= ~(SYS_GPM_MFPL_PM7MFP_Msk | SYS_GPM_MFPL_PM6MFP_Msk | SYS_GPM_MFPL_PM5MFP_Msk | SYS_GPM_MFPL_PM4MFP_Msk | SYS_GPM_MFPL_PM3MFP_Msk | SYS_GPM_MFPL_PM2MFP_Msk | SYS_GPM_MFPL_PM1MFP_Msk | SYS_GPM_MFPL_PM0MFP_Msk); - SYS->GPM_MFPL |= (SYS_GPM_MFPL_PM7MFP_VCAP0_DATA5 | SYS_GPM_MFPL_PM6MFP_VCAP0_DATA4 | SYS_GPM_MFPL_PM5MFP_VCAP0_DATA3 | SYS_GPM_MFPL_PM4MFP_VCAP0_DATA2 | SYS_GPM_MFPL_PM3MFP_VCAP0_DATA1 | SYS_GPM_MFPL_PM2MFP_VCAP0_DATA0 | SYS_GPM_MFPL_PM1MFP_VCAP0_SFIELD | SYS_GPM_MFPL_PM0MFP_VCAP0_VSYNC); + SYS->GPM_MFPL |= (SYS_GPM_MFPL_PM7MFP_CCAP0_DATA5 | SYS_GPM_MFPL_PM6MFP_CCAP0_DATA4 | SYS_GPM_MFPL_PM5MFP_CCAP0_DATA3 | SYS_GPM_MFPL_PM4MFP_CCAP0_DATA2 | SYS_GPM_MFPL_PM3MFP_CCAP0_DATA1 | SYS_GPM_MFPL_PM2MFP_CCAP0_DATA0 | SYS_GPM_MFPL_PM1MFP_CCAP0_SFIELD | SYS_GPM_MFPL_PM0MFP_CCAP0_VSYNC); return; } -void nutool_pincfg_deinit_vcap0(void) +void nutool_pincfg_deinit_ccap0(void) { SYS->GPK_MFPH &= ~(SYS_GPK_MFPH_PK11MFP_Msk | SYS_GPK_MFPH_PK10MFP_Msk | SYS_GPK_MFPH_PK9MFP_Msk); SYS->GPM_MFPH &= ~(SYS_GPM_MFPH_PM11MFP_Msk | SYS_GPM_MFPH_PM10MFP_Msk | SYS_GPM_MFPH_PM9MFP_Msk | SYS_GPM_MFPH_PM8MFP_Msk); @@ -658,17 +483,17 @@ void nutool_pincfg_deinit_vcap0(void) return; } -void nutool_pincfg_init_vcap1(void) +void nutool_pincfg_init_ccap1(void) { SYS->GPN_MFPH &= ~(SYS_GPN_MFPH_PN14MFP_Msk | SYS_GPN_MFPH_PN13MFP_Msk | SYS_GPN_MFPH_PN12MFP_Msk | SYS_GPN_MFPH_PN11MFP_Msk | SYS_GPN_MFPH_PN10MFP_Msk | SYS_GPN_MFPH_PN9MFP_Msk | SYS_GPN_MFPH_PN8MFP_Msk); - SYS->GPN_MFPH |= (SYS_GPN_MFPH_PN14MFP_VCAP1_SFIELD | SYS_GPN_MFPH_PN13MFP_VCAP1_VSYNC | SYS_GPN_MFPH_PN12MFP_VCAP1_HSYNC | SYS_GPN_MFPH_PN11MFP_VCAP1_PIXCLK | SYS_GPN_MFPH_PN10MFP_VCAP1_SCLK | SYS_GPN_MFPH_PN9MFP_VCAP1_DATA9 | SYS_GPN_MFPH_PN8MFP_VCAP1_DATA8); + SYS->GPN_MFPH |= (SYS_GPN_MFPH_PN14MFP_CCAP1_SFIELD | SYS_GPN_MFPH_PN13MFP_CCAP1_VSYNC | SYS_GPN_MFPH_PN12MFP_CCAP1_HSYNC | SYS_GPN_MFPH_PN11MFP_CCAP1_PIXCLK | SYS_GPN_MFPH_PN10MFP_CCAP1_SCLK | SYS_GPN_MFPH_PN9MFP_CCAP1_DATA9 | SYS_GPN_MFPH_PN8MFP_CCAP1_DATA8); SYS->GPN_MFPL &= ~(SYS_GPN_MFPL_PN7MFP_Msk | SYS_GPN_MFPL_PN6MFP_Msk | SYS_GPN_MFPL_PN5MFP_Msk | SYS_GPN_MFPL_PN4MFP_Msk | SYS_GPN_MFPL_PN3MFP_Msk | SYS_GPN_MFPL_PN2MFP_Msk | SYS_GPN_MFPL_PN1MFP_Msk | SYS_GPN_MFPL_PN0MFP_Msk); - SYS->GPN_MFPL |= (SYS_GPN_MFPL_PN7MFP_VCAP1_DATA7 | SYS_GPN_MFPL_PN6MFP_VCAP1_DATA6 | SYS_GPN_MFPL_PN5MFP_VCAP1_DATA5 | SYS_GPN_MFPL_PN4MFP_VCAP1_DATA4 | SYS_GPN_MFPL_PN3MFP_VCAP1_DATA3 | SYS_GPN_MFPL_PN2MFP_VCAP1_DATA2 | SYS_GPN_MFPL_PN1MFP_VCAP1_DATA1 | SYS_GPN_MFPL_PN0MFP_VCAP1_DATA0); + SYS->GPN_MFPL |= (SYS_GPN_MFPL_PN7MFP_CCAP1_DATA7 | SYS_GPN_MFPL_PN6MFP_CCAP1_DATA6 | SYS_GPN_MFPL_PN5MFP_CCAP1_DATA5 | SYS_GPN_MFPL_PN4MFP_CCAP1_DATA4 | SYS_GPN_MFPL_PN3MFP_CCAP1_DATA3 | SYS_GPN_MFPL_PN2MFP_CCAP1_DATA2 | SYS_GPN_MFPL_PN1MFP_CCAP1_DATA1 | SYS_GPN_MFPL_PN0MFP_CCAP1_DATA0); return; } -void nutool_pincfg_deinit_vcap1(void) +void nutool_pincfg_deinit_ccap1(void) { SYS->GPN_MFPH &= ~(SYS_GPN_MFPH_PN14MFP_Msk | SYS_GPN_MFPH_PN13MFP_Msk | SYS_GPN_MFPH_PN12MFP_Msk | SYS_GPN_MFPH_PN11MFP_Msk | SYS_GPN_MFPH_PN10MFP_Msk | SYS_GPN_MFPH_PN9MFP_Msk | SYS_GPN_MFPH_PN8MFP_Msk); SYS->GPN_MFPL &= ~(SYS_GPN_MFPL_PN7MFP_Msk | SYS_GPN_MFPL_PN6MFP_Msk | SYS_GPN_MFPL_PN5MFP_Msk | SYS_GPN_MFPL_PN4MFP_Msk | SYS_GPN_MFPL_PN3MFP_Msk | SYS_GPN_MFPL_PN2MFP_Msk | SYS_GPN_MFPL_PN1MFP_Msk | SYS_GPN_MFPL_PN0MFP_Msk); @@ -732,8 +557,8 @@ void nutool_pincfg_init(void) nutool_pincfg_init_uart12(); nutool_pincfg_init_uart14(); nutool_pincfg_init_uart16(); - nutool_pincfg_init_vcap0(); - nutool_pincfg_init_vcap1(); + nutool_pincfg_init_ccap0(); + nutool_pincfg_init_ccap1(); return; } @@ -765,8 +590,8 @@ void nutool_pincfg_deinit(void) nutool_pincfg_deinit_uart12(); nutool_pincfg_deinit_uart14(); nutool_pincfg_deinit_uart16(); - nutool_pincfg_deinit_vcap0(); - nutool_pincfg_deinit_vcap1(); + nutool_pincfg_deinit_ccap0(); + nutool_pincfg_deinit_ccap1(); return; } diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/linking_scripts/aarch32.ld b/bsp/nuvoton/numaker-hmi-ma35d1/linking_scripts/aarch32.ld index aeda604e2c..8dad35f515 100644 --- a/bsp/nuvoton/numaker-hmi-ma35d1/linking_scripts/aarch32.ld +++ b/bsp/nuvoton/numaker-hmi-ma35d1/linking_scripts/aarch32.ld @@ -3,6 +3,12 @@ OUTPUT_ARCH(arm) SECTIONS { + ".usbhostlib" 0x28000000 (NOLOAD): + { + . = ALIGN(4) ; + *(.usbhostlib.*) + } + . = 0x80400000; __text_start = .; diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/README.md b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/README.md index 4ff12603c1..25a4cade1b 100644 --- a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/README.md +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/README.md @@ -1,19 +1,25 @@ -# nuwriter_scripts +# **nuwriter_scripts** Some scripts can help you program firmware into storages in this folder. -## Requirement +## **Requirement** -### [Python for Window](https://www.python.org/downloads/windows/) +### [Python3 for Window](https://www.python.org/downloads/windows/) + +After installing Python3, some plug-in as below must be installed. -After installing Python, some plug-in as below must be installed. ```bash -$ pip3 install pyusb usb crypto ecdsa crcmod tqdm pycryptodome +pip3 install pyusb usb crypto ecdsa crcmod tqdm pycryptodome ``` +Notice: + +- Tested python3 version is 3.10.1. +- Please remember to add Python to PATH environment variable. + ### [Libusb for Window](http://sourceforge.net/projects/libusb/files/libusb-1.0/libusb-1.0.20/libusb-1.0.20.7z/download) -In Windows platform, it is required to install libusb manually. +On Windows platform, it is required to install libusb manually. ```bash Step 1: Download the library extract the download file. @@ -21,24 +27,88 @@ Step 2: Copy MS64\dll\libusb-1.0.dll to C:\Windows\System32. Step 3: Copy MS64\dll\libusb-1.0.lib to C:\Users\\AppData\Local\Programs\Python\\Lib. ``` -## Double-click Scripts for Windows +### [USB Driver for Window](https://github.com/OpenNuvoton/MA35D1_NuWriter/blob/master/driver/WinUSB4NuVCOM.exe?raw=true) -### nuwriter_ddr_download_and_run.bat +NuWriter must install **WinUSB4NuVCOM.exe** on the computer. + +## **Double-click Scripts for Windows** + +If your NuWriter_MA35 python running is ready, you can do following batch script files for Window directly. + +### **nuwriter_ddr_download_and_run.bat** Download rtthread.bin binary file into DDR. The address is 0x80400000. -### nuwriter_sd_programming.bat +### **nuwriter_sd_programming.bat** Program header, DDR timing setting and rtthread.bin binary file into SD card or EMMC. -### nuwriter_spinand_programming.bat +### **nuwriter_spinand_programming.bat** Program header, DDR timing setting and rtthread.bin binary file into SPI NAND flash. -### nuwriter_nand_programming.bat +### **nuwriter_nand_programming.bat** Program header, DDR timing setting and rtthread.bin binary file into NAND flash. -### See also +## **Bash Scripts for Linux** + +If your NuWriter_MA35 python running is ready, you can do following bash script files for Linux directly. +If not, the **install_linux.sh** will help user to install related python module installation. + +```bash +# ./install_linux.sh +``` + +### **nuwriter_ddr_download_and_run.sh** + +Download rtthread.bin binary file into DDR. The address is 0x80400000. + +### **nuwriter_sd_programming.sh** + +Program header, DDR timing setting and rtthread.bin binary file into SD card or EMMC. + +### **nuwriter_spinand_programming.sh** + +Program header, DDR timing setting and rtthread.bin binary file into SPI NAND flash. + +### **nuwriter_nand_programming.sh** + +Program header, DDR timing setting and rtthread.bin binary file into NAND flash. + + +## **Troubleshoot** + +### **Fail to create symbolic folder** + +```bash +Create symbolic folder conv failed +``` + +- To switch **Developer Mode** in Window. To enter [Settings], [Update & Security], [For developers], [Developer Mode] page, then set it **On** +- Use **Administrator** permission to install python3, libusb and utilities. + +### **Use NuWriter_MA35.exe** + +Due to the python execution file size and saving network bandwidth, we just only release the python code in this repository. We also provide [NuWriter_MA35.exe](https://github.com/OpenNuvoton/MA35D1_NuWriter/blob/master/EXE/NuWriter_MA35.exe?raw=true) python execution. You can run the packaged app without installing a Python interpreter or any modules. You can use **NuWriter_MA35.exe** and do some modification. + +```bash +To modify "py -3 nuwriter.py" to "NuWriter_MA35.exe" +``` + +For example, the **nuwriter_ddr_download_and_run.bat** modification is as following: + +```bash +:forever_develop +NuWriter_MA35.exe -a ddrimg\enc_ddr3_winbond_256mb.bin +IF %ERRORLEVEL% EQU 0 ( + NuWriter_MA35.exe -o execute -w ddr 0x80400000 ..\rtthread.bin +) +pause +goto :forever_develop +``` + +## **See also** + [NuWriter Repository](https://github.com/OpenNuvoton/MA35D1_NuWriter) diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/install_linux.sh b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/install_linux.sh new file mode 100644 index 0000000000..82a10a7f53 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/install_linux.sh @@ -0,0 +1,7 @@ +#!/bin/bash + +set -x -e + +sudo apt-get install python3 python3-pip + +pip3 install -r requirements.txt diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_ddr_download_and_run.sh b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_ddr_download_and_run.sh new file mode 100644 index 0000000000..c670d12410 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_ddr_download_and_run.sh @@ -0,0 +1,8 @@ +#!/bin/bash + +set -x -e + +python3 nuwriter.py -a ddrimg/enc_ddr3_winbond_256mb.bin; + +python3 nuwriter.py -o execute -w ddr 0x80400000 ../rtthread.bin + diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_nand_programming.sh b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_nand_programming.sh new file mode 100644 index 0000000000..3058b76749 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_nand_programming.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +set -x -e + +python3 nuwriter.py -c header-nand.json + +python3 nuwriter.py -p pack-nand.json + +python3 nuwriter.py -a ddrimg/enc_ddr3_winbond_256mb.bin + +python3 nuwriter.py -w nand pack/pack.bin diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_sd_programming.sh b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_sd_programming.sh new file mode 100644 index 0000000000..5548dd07b3 --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_sd_programming.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +set -x -e + +python3 nuwriter.py -c header-sd.json + +python3 nuwriter.py -p pack-sd.json + +python3 nuwriter.py -a ddrimg/enc_ddr3_winbond_256mb.bin + +python3 nuwriter.py -w sd pack/pack.bin diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_spinand_programming.sh b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_spinand_programming.sh new file mode 100644 index 0000000000..f2de73ea3e --- /dev/null +++ b/bsp/nuvoton/numaker-hmi-ma35d1/nuwriter_scripts/nuwriter_spinand_programming.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +set -x -e + +python3 nuwriter.py -c header-nand.json + +python3 nuwriter.py -p pack-nand.json + +python3 nuwriter.py -a ddrimg/enc_ddr3_winbond_256mb.bin + +python3 nuwriter.py -w spinand pack/pack.bin diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/rtconfig.py b/bsp/nuvoton/numaker-hmi-ma35d1/rtconfig.py index 5d1b514111..ace1d14eee 100644 --- a/bsp/nuvoton/numaker-hmi-ma35d1/rtconfig.py +++ b/bsp/nuvoton/numaker-hmi-ma35d1/rtconfig.py @@ -16,7 +16,8 @@ if os.getenv('RTT_ROOT'): if CROSS_TOOL == 'gcc': PLATFORM = 'gcc' EXEC_PATH = r'C:\Program Files (x86)\GNU Tools ARM Embedded\6 2017-q1-update\bin' -elif os.getenv('RTT_EXEC_PATH'): + +if os.getenv('RTT_EXEC_PATH'): EXEC_PATH = os.getenv('RTT_EXEC_PATH') #BUILD = 'debug' @@ -40,10 +41,9 @@ if PLATFORM == 'gcc': OBJCPY = PREFIX + 'objcopy' STRIP = PREFIX + 'strip' - DEVICE = ' -march=armv8-a -mfpu=neon-vfpv4 -ftree-vectorize -ffast-math -mfloat-abi=softfp' -# DEVICE = ' -march=armv7-a -mfpu=vfpv3-d16 -ftree-vectorize -ffast-math -mfloat-abi=softfp' + DEVICE = ' -march=armv8-a -mfpu=neon-vfpv4 -ftree-vectorize -ffast-math -msoft-float' CFLAGS = DEVICE + ' -Wall -fno-zero-initialized-in-bss ' - AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -D__ASSEMBLY__' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -D__ASSEMBLY__ -I. ' LFLAGS = DEVICE + ' -nostartfiles -Wl,--gc-sections,-cref,-Map=' + MAP_FILE + ',-cref,-u,system_vectors' + ' -T ' + LINK_FILE + '.ld' CXXFLAGS = ' -march=armv8-a -mfpu=neon-vfpv4 -std=c++11 ' @@ -58,10 +58,10 @@ if PLATFORM == 'gcc': LPATH = '' if BUILD == 'debug': - CFLAGS += ' -O0 -gdwarf-2 -g' + CFLAGS += ' -O0 -gdwarf-2 -g ' AFLAGS += ' -gdwarf-2' else: - CFLAGS += ' -O2' + CFLAGS += ' -O2 ' CXXFLAGS = CFLAGS diff --git a/bsp/nuvoton/numaker-iot-m467/.config b/bsp/nuvoton/numaker-iot-m467/.config index 46b064294d..97a2bf67d6 100644 --- a/bsp/nuvoton/numaker-iot-m467/.config +++ b/bsp/nuvoton/numaker-iot-m467/.config @@ -8,6 +8,7 @@ # CONFIG_RT_NAME_MAX=8 # CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_SMART is not set # CONFIG_RT_USING_SMP is not set CONFIG_RT_ALIGN_SIZE=4 # CONFIG_RT_THREAD_PRIORITY_8 is not set @@ -74,16 +75,19 @@ CONFIG_RT_USING_HEAP=y # CONFIG_RT_USING_DEVICE=y # CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_DM is not set # CONFIG_RT_USING_INTERRUPT_INFO is not set CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=256 CONFIG_RT_CONSOLE_DEVICE_NAME="uart0" CONFIG_RT_VER_NUM=0x50000 -CONFIG_ARCH_ARM=y +# CONFIG_RT_USING_CACHE is not set +# CONFIG_ARCH_ARM_BOOTWITH_FLUSH_CACHE is not set +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set CONFIG_RT_USING_CPU_FFS=y +CONFIG_ARCH_ARM=y CONFIG_ARCH_ARM_CORTEX_M=y CONFIG_ARCH_ARM_CORTEX_M4=y -# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set # # RT-Thread Components @@ -140,7 +144,9 @@ CONFIG_RT_DFS_ELM_REENTRANT=y CONFIG_RT_DFS_ELM_MUTEX_TIMEOUT=3000 CONFIG_RT_USING_DFS_DEVFS=y # CONFIG_RT_USING_DFS_ROMFS is not set +# CONFIG_RT_USING_DFS_CROMFS is not set # CONFIG_RT_USING_DFS_RAMFS is not set +# CONFIG_RT_USING_DFS_TMPFS is not set # CONFIG_RT_USING_DFS_NFS is not set CONFIG_RT_USING_FAL=y CONFIG_FAL_DEBUG_CONFIG=y @@ -148,12 +154,12 @@ CONFIG_FAL_DEBUG=1 CONFIG_FAL_PART_HAS_TABLE_CFG=y CONFIG_FAL_USING_SFUD_PORT=y CONFIG_FAL_USING_NOR_FLASH_DEV_NAME="norflash0" -# CONFIG_RT_USING_LWP is not set # # Device Drivers # CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 CONFIG_RT_USING_SYSTEM_WORKQUEUE=y CONFIG_RT_SYSTEM_WORKQUEUE_STACKSIZE=2048 CONFIG_RT_SYSTEM_WORKQUEUE_PRIORITY=23 @@ -175,10 +181,14 @@ CONFIG_RT_USING_I2C_BITOPS=y CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_ADC is not set # CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set CONFIG_RT_USING_PWM=y # CONFIG_RT_USING_MTD_NOR is not set # CONFIG_RT_USING_MTD_NAND is not set # CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_FDT is not set CONFIG_RT_USING_RTC=y # CONFIG_RT_USING_ALARM is not set # CONFIG_RT_USING_SOFT_RTC is not set @@ -209,6 +219,7 @@ CONFIG_RT_AUDIO_RECORD_PIPE_SIZE=2048 CONFIG_RT_USING_SENSOR=y CONFIG_RT_USING_SENSOR_CMD=y # CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_LCD is not set CONFIG_RT_USING_HWCRYPTO=y CONFIG_RT_HWCRYPTO_DEFAULT_NAME="hwcryto" CONFIG_RT_HWCRYPTO_IV_MAX_SIZE=16 @@ -245,7 +256,9 @@ CONFIG_RT_HWCRYPTO_USING_CRC_04C11DB7=y # CONFIG_RT_USING_PULSE_ENCODER is not set CONFIG_RT_USING_INPUT_CAPTURE=y CONFIG_RT_INPUT_CAPTURE_RB_SIZE=100 +# CONFIG_RT_USING_DEV_BUS is not set # CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_VIRTIO is not set # # Using USB @@ -512,6 +525,7 @@ CONFIG_ESP8266_SAMPLE_RECV_BUFF_LEN=2048 # CONFIG_AT_DEVICE_USING_M5311 is not set # CONFIG_AT_DEVICE_USING_L610 is not set # CONFIG_AT_DEVICE_USING_N720 is not set +# CONFIG_AT_DEVICE_USING_ML305 is not set # CONFIG_PKG_USING_AT_DEVICE_V204 is not set # CONFIG_PKG_USING_AT_DEVICE_V203 is not set # CONFIG_PKG_USING_AT_DEVICE_V202 is not set @@ -564,6 +578,7 @@ CONFIG_PKG_AT_DEVICE_VER_NUM=0x99999 # CONFIG_PKG_USING_AGILE_FTP is not set # CONFIG_PKG_USING_EMBEDDEDPROTO is not set # CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_RYANMQTT is not set # CONFIG_PKG_USING_LORA_PKT_FWD is not set # CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set # CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set @@ -571,6 +586,7 @@ CONFIG_PKG_AT_DEVICE_VER_NUM=0x99999 # CONFIG_PKG_USING_SMALL_MODBUS is not set # CONFIG_PKG_USING_NET_SERVER is not set # CONFIG_PKG_USING_ZFTP is not set +# CONFIG_PKG_USING_WOL is not set # # security packages @@ -662,7 +678,6 @@ CONFIG_PKG_AT_DEVICE_VER_NUM=0x99999 # CONFIG_PKG_USING_SEGGER_RTT is not set # CONFIG_PKG_USING_RDB is not set # CONFIG_PKG_USING_ULOG_EASYFLASH is not set -# CONFIG_PKG_USING_ULOG_FILE is not set # CONFIG_PKG_USING_LOGMGR is not set # CONFIG_PKG_USING_ADBD is not set # CONFIG_PKG_USING_COREMARK is not set @@ -696,8 +711,8 @@ CONFIG_PKG_AT_DEVICE_VER_NUM=0x99999 # CONFIG_PKG_USING_CBOX is not set # CONFIG_PKG_USING_SNOWFLAKE is not set # CONFIG_PKG_USING_HASH_MATCH is not set -# CONFIG_PKG_USING_FIRE_PID_CURVE is not set # CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set # # system packages @@ -708,7 +723,15 @@ CONFIG_PKG_AT_DEVICE_VER_NUM=0x99999 # # CONFIG_PKG_USING_RT_MEMCPY_CM is not set # CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set -# CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set +CONFIG_PKG_USING_RT_VSNPRINTF_FULL=y +CONFIG_PKG_RT_VSNPRINTF_FULL_PATH="/packages/system/enhanced-kservice/rt_vsnprintf_full" +# CONFIG_RT_VSNPRINTF_FULL_REPLACING_SPRINTF is not set +# CONFIG_RT_VSNPRINTF_FULL_REPLACING_SNPRINTF is not set +# CONFIG_RT_VSNPRINTF_FULL_REPLACING_PRINTF is not set +# CONFIG_RT_VSNPRINTF_FULL_REPLACING_VSPRINTF is not set +# CONFIG_RT_VSNPRINTF_FULL_REPLACING_VSNPRINTF is not set +CONFIG_PKG_USING_RT_VSNPRINTF_FULL_LATEST_VERSION=y +CONFIG_PKG_RT_VSNPRINTF_FULL_VER="latest" # # acceleration: Assembly language or algorithmic acceleration packages @@ -733,7 +756,6 @@ CONFIG_PKG_AT_DEVICE_VER_NUM=0x99999 # CONFIG_PKG_USING_UC_CLK is not set # CONFIG_PKG_USING_UC_COMMON is not set # CONFIG_PKG_USING_UC_MODBUS is not set -# CONFIG_PKG_USING_RTDUINO is not set # CONFIG_PKG_USING_FREERTOS_WRAPPER is not set # CONFIG_PKG_USING_CAIRO is not set # CONFIG_PKG_USING_PIXMAN is not set @@ -768,12 +790,15 @@ CONFIG_PKG_AT_DEVICE_VER_NUM=0x99999 # CONFIG_PKG_USING_KMULTI_RTIMER is not set # CONFIG_PKG_USING_TFDB is not set # CONFIG_PKG_USING_QPC is not set +# CONFIG_PKG_USING_AGILE_UPGRADE is not set # # peripheral libraries and drivers # -CONFIG_PKG_USING_SENSORS_DRIVERS=y -# CONFIG_PKG_USING_FINGERPRINT is not set + +# +# sensors drivers +# # CONFIG_PKG_USING_LSM6DSM is not set # CONFIG_PKG_USING_LSM6DSL is not set # CONFIG_PKG_USING_LPS22HB is not set @@ -789,16 +814,11 @@ CONFIG_PKG_USING_SENSORS_DRIVERS=y # CONFIG_PKG_USING_DF220 is not set # CONFIG_PKG_USING_HSHCAL001 is not set # CONFIG_PKG_USING_BH1750 is not set -CONFIG_PKG_USING_MPU6XXX=y -CONFIG_PKG_MPU6XXX_PATH="/packages/peripherals/sensors/mpu6xxx" +# CONFIG_PKG_USING_MPU6XXX is not set # CONFIG_PKG_USING_MPU6XXX_V001 is not set # CONFIG_PKG_USING_MPU6XXX_V100 is not set # CONFIG_PKG_USING_MPU6XXX_V110 is not set -CONFIG_PKG_USING_MPU6XXX_LATEST_VERSION=y -CONFIG_PKG_MPU6XXX_VER="latest" -CONFIG_PKG_USING_MPU6XXX_ACCE=y -CONFIG_PKG_USING_MPU6XXX_GYRO=y -CONFIG_PKG_USING_MPU6XXX_MAG=y +# CONFIG_PKG_USING_MPU6XXX_LATEST_VERSION is not set # CONFIG_PKG_USING_AHT10 is not set # CONFIG_PKG_USING_AP3216C is not set # CONFIG_PKG_USING_TSL4531 is not set @@ -822,6 +842,8 @@ CONFIG_PKG_USING_MPU6XXX_MAG=y # CONFIG_PKG_USING_RT3020 is not set # CONFIG_PKG_USING_MLX90632 is not set # CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90397 is not set # CONFIG_PKG_USING_MS5611 is not set # CONFIG_PKG_USING_MAX31865 is not set # CONFIG_PKG_USING_VL53L0X is not set @@ -834,14 +856,31 @@ CONFIG_PKG_USING_MPU6XXX_MAG=y # CONFIG_PKG_USING_ISL29035 is not set # CONFIG_PKG_USING_MMC3680KJ is not set # CONFIG_PKG_USING_QMP6989 is not set -# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_BALANCE is not set # CONFIG_PKG_USING_SHT2X is not set # CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_AD7746 is not set # CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set # CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set # CONFIG_PKG_USING_STM32_SDIO is not set # CONFIG_PKG_USING_ESP_IDF is not set -# CONFIG_PKG_USING_ICM20608 is not set # CONFIG_PKG_USING_BUTTON is not set # CONFIG_PKG_USING_PCF8574 is not set # CONFIG_PKG_USING_SX12XX is not set @@ -864,12 +903,9 @@ CONFIG_PKG_USING_MPU6XXX_MAG=y # CONFIG_PKG_USING_AGILE_LED is not set # CONFIG_PKG_USING_AT24CXX is not set # CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set -# CONFIG_PKG_USING_AD7746 is not set # CONFIG_PKG_USING_PCA9685 is not set # CONFIG_PKG_USING_I2C_TOOLS is not set # CONFIG_PKG_USING_NRF24L01 is not set -# CONFIG_PKG_USING_TOUCH_DRIVERS is not set -# CONFIG_PKG_USING_MAX17048 is not set # CONFIG_PKG_USING_RPLIDAR is not set # CONFIG_PKG_USING_AS608 is not set # CONFIG_PKG_USING_RC522 is not set @@ -884,7 +920,6 @@ CONFIG_PKG_USING_MPU6XXX_MAG=y # CONFIG_PKG_USING_CAN_YMODEM is not set # CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set # CONFIG_PKG_USING_QLED is not set -# CONFIG_PKG_USING_PAJ7620 is not set # CONFIG_PKG_USING_AGILE_CONSOLE is not set # CONFIG_PKG_USING_LD3320 is not set # CONFIG_PKG_USING_WK2124 is not set @@ -915,10 +950,11 @@ CONFIG_PKG_USING_MPU6XXX_MAG=y # CONFIG_PKG_USING_BL_MCU_SDK is not set # CONFIG_PKG_USING_SOFT_SERIAL is not set # CONFIG_PKG_USING_MB85RS16 is not set -# CONFIG_PKG_USING_CW2015 is not set # CONFIG_PKG_USING_RFM300 is not set # CONFIG_PKG_USING_IO_INPUT_FILTER is not set # CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_FINGERPRINT is not set # # AI packages @@ -933,6 +969,12 @@ CONFIG_PKG_USING_MPU6XXX_MAG=y # CONFIG_PKG_USING_QUEST is not set # CONFIG_PKG_USING_NAXOS is not set +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_UKAL is not set + # # miscellaneous packages # @@ -984,7 +1026,6 @@ CONFIG_PKG_USING_MPU6XXX_MAG=y # CONFIG_PKG_USING_VI is not set # CONFIG_PKG_USING_KI is not set # CONFIG_PKG_USING_ARMv7M_DWT is not set -# CONFIG_PKG_USING_UKAL is not set # CONFIG_PKG_USING_CRCLIB is not set # CONFIG_PKG_USING_LWGPS is not set # CONFIG_PKG_USING_STATE_MACHINE is not set @@ -994,6 +1035,213 @@ CONFIG_PKG_USING_MPU6XXX_MAG=y # CONFIG_PKG_USING_MFBD is not set # CONFIG_PKG_USING_SLCAN2RTT is not set # CONFIG_PKG_USING_SOEM is not set +# CONFIG_PKG_USING_QPARAM is not set +# CONFIG_PKG_USING_CorevMCU_CLI is not set + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects +# +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_ADAFRUIT_MAX31855 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set +# CONFIG_PKG_USING_ADAFRUIT_MSA301 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set +# CONFIG_PKG_USING_SEEED_ITG3200 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set +# CONFIG_PKG_USING_SEEED_MP503 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set + +# +# Other +# + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set + +# +# Uncategorized +# # # Hardware Drivers Config @@ -1141,7 +1389,7 @@ CONFIG_BOARD_USING_STORAGE_SDCARD=y CONFIG_BOARD_USING_STORAGE_SPIFLASH=y CONFIG_BOARD_USING_CANFD0=y CONFIG_BOARD_USING_NCT7717U=y -CONFIG_BOARD_USING_MPU6500=y +# CONFIG_BOARD_USING_MPU6500 is not set CONFIG_BOARD_USING_USB_D_H=y # CONFIG_BOARD_USING_HSUSBD is not set # CONFIG_BOARD_USING_HSUSBD_USBH is not set @@ -1152,13 +1400,13 @@ CONFIG_BOARD_USING_HSUSBH_USBD=y # # Board extended module drivers # +# CONFIG_BOARD_USING_LCD_ILI9341 is not set # # Nuvoton Packages Config # CONFIG_NU_PKG_USING_UTILS=y CONFIG_NU_PKG_USING_DEMO=y -# CONFIG_NU_PKG_USING_LVGL is not set # CONFIG_NU_PKG_USING_BMX055 is not set # CONFIG_NU_PKG_USING_MAX31875 is not set CONFIG_NU_PKG_USING_NCT7717U=y @@ -1171,5 +1419,3 @@ CONFIG_NU_PKG_USING_NCT7717U=y # CONFIG_NU_PKG_USING_TPC is not set # CONFIG_NU_PKG_USING_ADC_TOUCH is not set # CONFIG_NU_PKG_USING_SPINAND is not set -CONFIG_UTEST_CMD_PREFIX="bsp.nuvoton.utest." -CONFIG_BOARD_USE_UTEST=y diff --git a/bsp/nuvoton/numaker-iot-m467/applications/lvgl/lv_demo.c b/bsp/nuvoton/numaker-iot-m467/applications/lvgl/lv_demo.c index 7a04e1804a..ebfbba2273 100644 --- a/bsp/nuvoton/numaker-iot-m467/applications/lvgl/lv_demo.c +++ b/bsp/nuvoton/numaker-iot-m467/applications/lvgl/lv_demo.c @@ -17,16 +17,15 @@ void lv_user_gui_init(void) #if LV_USE_DEMO_BENCHMARK extern void lv_demo_benchmark(void); lv_demo_benchmark(); -#endif -#if LV_USE_DEMO_WIDGETS +#elif LV_USE_DEMO_WIDGETS extern void lv_demo_widgets(void); lv_demo_widgets(); -#endif -#if LV_USE_DEMO_MUSIC || LV_USE_DEMO_RTT_MUSIC +#elif (LV_USE_DEMO_MUSIC || LV_USE_DEMO_RTT_MUSIC) extern void lv_demo_music(void); lv_demo_music(); + #endif } diff --git a/bsp/nuvoton/numaker-iot-m467/applications/lvgl/lv_port_disp.c b/bsp/nuvoton/numaker-iot-m467/applications/lvgl/lv_port_disp.c index a86452c5d5..445c4993e1 100644 --- a/bsp/nuvoton/numaker-iot-m467/applications/lvgl/lv_port_disp.c +++ b/bsp/nuvoton/numaker-iot-m467/applications/lvgl/lv_port_disp.c @@ -16,6 +16,10 @@ #define DBG_COLOR #include +#if !defined(NU_PKG_LVGL_RENDERING_LAYER) + #define NU_PKG_LVGL_RENDERING_LAYER "lcd" +#endif + /*A static or global variable to store the buffers*/ static lv_disp_draw_buf_t disp_buf; static lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ @@ -47,7 +51,7 @@ void lv_port_disp_init(void) rt_err_t result; void *buf1 = RT_NULL; - lcd_device = rt_device_find("lcd"); + lcd_device = rt_device_find(NU_PKG_LVGL_RENDERING_LAYER); if (lcd_device == 0) { LOG_E("error!"); diff --git a/bsp/nuvoton/numaker-iot-m467/applications/lvgl/lv_port_disp.h b/bsp/nuvoton/numaker-iot-m467/applications/lvgl/lv_port_disp.h deleted file mode 100644 index b11ce3c5b6..0000000000 --- a/bsp/nuvoton/numaker-iot-m467/applications/lvgl/lv_port_disp.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2021-10-18 Meco Man The first version - */ -#ifndef LV_PORT_DISP_H -#define LV_PORT_DISP_H - -#ifdef __cplusplus -extern "C" { -#endif - -void lv_port_disp_init(void); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/bsp/nuvoton/numaker-iot-m467/applications/lvgl/lv_port_indev.h b/bsp/nuvoton/numaker-iot-m467/applications/lvgl/lv_port_indev.h deleted file mode 100644 index bde7176807..0000000000 --- a/bsp/nuvoton/numaker-iot-m467/applications/lvgl/lv_port_indev.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2021-10-18 Meco Man The first version - */ -#ifndef LV_PORT_INDEV_H -#define LV_PORT_INDEV_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -extern lv_indev_t *button_indev; - -void lv_port_indev_init(void); -void lv_port_indev_input(rt_int16_t x, rt_int16_t y, lv_indev_state_t state); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/bsp/nuvoton/numaker-iot-m467/board/Kconfig b/bsp/nuvoton/numaker-iot-m467/board/Kconfig index f2fe37f2f5..bdbb46d7b9 100644 --- a/bsp/nuvoton/numaker-iot-m467/board/Kconfig +++ b/bsp/nuvoton/numaker-iot-m467/board/Kconfig @@ -55,6 +55,8 @@ menu "Hardware Drivers Config" config BOARD_USING_MPU6500 bool "MPU6500 6-axis MotionTracking Sensor(over i2c2)" select PKG_USING_MPU6XXX + select PKG_USING_MPU6XXX_LATEST_VERSION + select PKG_USING_MPU6XXX_ACCE select BSP_USING_I2C select BSP_USING_I2C2 default y diff --git a/bsp/nuvoton/numaker-iot-m467/board/NuPinConfig/nutool_pincfg.c b/bsp/nuvoton/numaker-iot-m467/board/NuPinConfig/nutool_pincfg.c index 45d2d9368d..d06d719449 100644 --- a/bsp/nuvoton/numaker-iot-m467/board/NuPinConfig/nutool_pincfg.c +++ b/bsp/nuvoton/numaker-iot-m467/board/NuPinConfig/nutool_pincfg.c @@ -151,7 +151,7 @@ Pin175:EADC0_CH7 Pin176:EADC0_CH6 ********************/ -#include "M460.h" +#include "NuMicro.h" #include "rtconfig.h" void nutool_pincfg_init_can0(void) diff --git a/bsp/nuvoton/numaker-iot-m467/board/board_dev.c b/bsp/nuvoton/numaker-iot-m467/board/board_dev.c index 0c78b0bb7e..4056784edd 100644 --- a/bsp/nuvoton/numaker-iot-m467/board/board_dev.c +++ b/bsp/nuvoton/numaker-iot-m467/board/board_dev.c @@ -185,7 +185,7 @@ int rt_hw_mpu6xxx_port(void) rt_base_t mpu_int = NU_GET_PININDEX(NU_PD, 2); cfg.intf.dev_name = "i2c2"; - cfg.intf.user_data = (void *)MPU6XXX_ADDR_DEFAULT; + cfg.intf.arg = (void *)MPU6XXX_ADDR_DEFAULT; cfg.irq_pin.pin = mpu_int; return rt_hw_mpu6xxx_init("mpu", &cfg); diff --git a/bsp/nuvoton/numaker-iot-m487/.config b/bsp/nuvoton/numaker-iot-m487/.config index e90907c703..8d896645e0 100644 --- a/bsp/nuvoton/numaker-iot-m487/.config +++ b/bsp/nuvoton/numaker-iot-m487/.config @@ -8,6 +8,7 @@ # CONFIG_RT_NAME_MAX=8 # CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_SMART is not set # CONFIG_RT_USING_SMP is not set CONFIG_RT_ALIGN_SIZE=4 # CONFIG_RT_THREAD_PRIORITY_8 is not set @@ -74,16 +75,19 @@ CONFIG_RT_USING_HEAP=y # CONFIG_RT_USING_DEVICE=y # CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_DM is not set # CONFIG_RT_USING_INTERRUPT_INFO is not set CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=256 CONFIG_RT_CONSOLE_DEVICE_NAME="uart0" CONFIG_RT_VER_NUM=0x50000 -CONFIG_ARCH_ARM=y +# CONFIG_RT_USING_CACHE is not set +# CONFIG_ARCH_ARM_BOOTWITH_FLUSH_CACHE is not set +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set CONFIG_RT_USING_CPU_FFS=y +CONFIG_ARCH_ARM=y CONFIG_ARCH_ARM_CORTEX_M=y CONFIG_ARCH_ARM_CORTEX_M4=y -# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set # # RT-Thread Components @@ -140,18 +144,20 @@ CONFIG_RT_DFS_ELM_REENTRANT=y CONFIG_RT_DFS_ELM_MUTEX_TIMEOUT=3000 CONFIG_RT_USING_DFS_DEVFS=y # CONFIG_RT_USING_DFS_ROMFS is not set +# CONFIG_RT_USING_DFS_CROMFS is not set # CONFIG_RT_USING_DFS_RAMFS is not set +# CONFIG_RT_USING_DFS_TMPFS is not set CONFIG_RT_USING_FAL=y CONFIG_FAL_DEBUG_CONFIG=y CONFIG_FAL_DEBUG=1 CONFIG_FAL_PART_HAS_TABLE_CFG=y # CONFIG_FAL_USING_SFUD_PORT is not set -# CONFIG_RT_USING_LWP is not set # # Device Drivers # CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 CONFIG_RT_USING_SYSTEM_WORKQUEUE=y CONFIG_RT_SYSTEM_WORKQUEUE_STACKSIZE=2048 CONFIG_RT_SYSTEM_WORKQUEUE_PRIORITY=23 @@ -173,6 +179,9 @@ CONFIG_RT_USING_I2C_BITOPS=y CONFIG_RT_USING_PIN=y CONFIG_RT_USING_ADC=y # CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set CONFIG_RT_USING_PWM=y # CONFIG_RT_USING_MTD_NOR is not set # CONFIG_RT_USING_MTD_NAND is not set @@ -182,6 +191,7 @@ CONFIG_PM_TICKLESS_THRESHOLD_TIME=2 # CONFIG_PM_ENABLE_DEBUG is not set # CONFIG_PM_ENABLE_SUSPEND_SLEEP_MODE is not set # CONFIG_PM_ENABLE_THRESHOLD_SLEEP_MODE is not set +# CONFIG_RT_USING_FDT is not set CONFIG_RT_USING_RTC=y # CONFIG_RT_USING_ALARM is not set # CONFIG_RT_USING_SOFT_RTC is not set @@ -212,6 +222,7 @@ CONFIG_RT_AUDIO_RECORD_PIPE_SIZE=2048 CONFIG_RT_USING_SENSOR=y CONFIG_RT_USING_SENSOR_CMD=y # CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_LCD is not set CONFIG_RT_USING_HWCRYPTO=y CONFIG_RT_HWCRYPTO_DEFAULT_NAME="hwcryto" CONFIG_RT_HWCRYPTO_IV_MAX_SIZE=16 @@ -247,7 +258,9 @@ CONFIG_RT_HWCRYPTO_USING_CRC_04C11DB7=y # CONFIG_RT_HWCRYPTO_USING_BIGNUM is not set # CONFIG_RT_USING_PULSE_ENCODER is not set # CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_DEV_BUS is not set # CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_VIRTIO is not set # # Using USB @@ -433,6 +446,7 @@ CONFIG_ESP8266_SAMPLE_RECV_BUFF_LEN=2048 # CONFIG_AT_DEVICE_USING_M5311 is not set # CONFIG_AT_DEVICE_USING_L610 is not set # CONFIG_AT_DEVICE_USING_N720 is not set +# CONFIG_AT_DEVICE_USING_ML305 is not set # CONFIG_PKG_USING_AT_DEVICE_V204 is not set # CONFIG_PKG_USING_AT_DEVICE_V203 is not set # CONFIG_PKG_USING_AT_DEVICE_V202 is not set @@ -485,6 +499,7 @@ CONFIG_PKG_AT_DEVICE_VER_NUM=0x99999 # CONFIG_PKG_USING_AGILE_FTP is not set # CONFIG_PKG_USING_EMBEDDEDPROTO is not set # CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_RYANMQTT is not set # CONFIG_PKG_USING_LORA_PKT_FWD is not set # CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set # CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set @@ -492,6 +507,7 @@ CONFIG_PKG_AT_DEVICE_VER_NUM=0x99999 # CONFIG_PKG_USING_SMALL_MODBUS is not set # CONFIG_PKG_USING_NET_SERVER is not set # CONFIG_PKG_USING_ZFTP is not set +# CONFIG_PKG_USING_WOL is not set # # security packages @@ -583,7 +599,6 @@ CONFIG_PKG_AT_DEVICE_VER_NUM=0x99999 # CONFIG_PKG_USING_SEGGER_RTT is not set # CONFIG_PKG_USING_RDB is not set # CONFIG_PKG_USING_ULOG_EASYFLASH is not set -# CONFIG_PKG_USING_ULOG_FILE is not set # CONFIG_PKG_USING_LOGMGR is not set # CONFIG_PKG_USING_ADBD is not set # CONFIG_PKG_USING_COREMARK is not set @@ -617,8 +632,8 @@ CONFIG_PKG_AT_DEVICE_VER_NUM=0x99999 # CONFIG_PKG_USING_CBOX is not set # CONFIG_PKG_USING_SNOWFLAKE is not set # CONFIG_PKG_USING_HASH_MATCH is not set -# CONFIG_PKG_USING_FIRE_PID_CURVE is not set # CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set # # system packages @@ -629,7 +644,15 @@ CONFIG_PKG_AT_DEVICE_VER_NUM=0x99999 # # CONFIG_PKG_USING_RT_MEMCPY_CM is not set # CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set -# CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set +CONFIG_PKG_USING_RT_VSNPRINTF_FULL=y +CONFIG_PKG_RT_VSNPRINTF_FULL_PATH="/packages/system/enhanced-kservice/rt_vsnprintf_full" +# CONFIG_RT_VSNPRINTF_FULL_REPLACING_SPRINTF is not set +# CONFIG_RT_VSNPRINTF_FULL_REPLACING_SNPRINTF is not set +# CONFIG_RT_VSNPRINTF_FULL_REPLACING_PRINTF is not set +# CONFIG_RT_VSNPRINTF_FULL_REPLACING_VSPRINTF is not set +# CONFIG_RT_VSNPRINTF_FULL_REPLACING_VSNPRINTF is not set +CONFIG_PKG_USING_RT_VSNPRINTF_FULL_LATEST_VERSION=y +CONFIG_PKG_RT_VSNPRINTF_FULL_VER="latest" # # acceleration: Assembly language or algorithmic acceleration packages @@ -654,7 +677,6 @@ CONFIG_PKG_AT_DEVICE_VER_NUM=0x99999 # CONFIG_PKG_USING_UC_CLK is not set # CONFIG_PKG_USING_UC_COMMON is not set # CONFIG_PKG_USING_UC_MODBUS is not set -# CONFIG_PKG_USING_RTDUINO is not set # CONFIG_PKG_USING_FREERTOS_WRAPPER is not set # CONFIG_PKG_USING_CAIRO is not set # CONFIG_PKG_USING_PIXMAN is not set @@ -689,19 +711,93 @@ CONFIG_PKG_AT_DEVICE_VER_NUM=0x99999 # CONFIG_PKG_USING_KMULTI_RTIMER is not set # CONFIG_PKG_USING_TFDB is not set # CONFIG_PKG_USING_QPC is not set +# CONFIG_PKG_USING_AGILE_UPGRADE is not set # # peripheral libraries and drivers # -# CONFIG_PKG_USING_SENSORS_DRIVERS is not set -# CONFIG_PKG_USING_REALTEK_AMEBA is not set + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_TMP1075 is not set +# CONFIG_PKG_USING_SR04 is not set +# CONFIG_PKG_USING_CCS811 is not set +# CONFIG_PKG_USING_PMSXX is not set +# CONFIG_PKG_USING_RT3020 is not set +# CONFIG_PKG_USING_MLX90632 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set # CONFIG_PKG_USING_SHT2X is not set # CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_AD7746 is not set # CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set # CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set # CONFIG_PKG_USING_STM32_SDIO is not set # CONFIG_PKG_USING_ESP_IDF is not set -# CONFIG_PKG_USING_ICM20608 is not set # CONFIG_PKG_USING_BUTTON is not set # CONFIG_PKG_USING_PCF8574 is not set # CONFIG_PKG_USING_SX12XX is not set @@ -724,12 +820,9 @@ CONFIG_PKG_AT_DEVICE_VER_NUM=0x99999 # CONFIG_PKG_USING_AGILE_LED is not set # CONFIG_PKG_USING_AT24CXX is not set # CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set -# CONFIG_PKG_USING_AD7746 is not set # CONFIG_PKG_USING_PCA9685 is not set # CONFIG_PKG_USING_I2C_TOOLS is not set # CONFIG_PKG_USING_NRF24L01 is not set -# CONFIG_PKG_USING_TOUCH_DRIVERS is not set -# CONFIG_PKG_USING_MAX17048 is not set # CONFIG_PKG_USING_RPLIDAR is not set # CONFIG_PKG_USING_AS608 is not set # CONFIG_PKG_USING_RC522 is not set @@ -744,7 +837,6 @@ CONFIG_PKG_AT_DEVICE_VER_NUM=0x99999 # CONFIG_PKG_USING_CAN_YMODEM is not set # CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set # CONFIG_PKG_USING_QLED is not set -# CONFIG_PKG_USING_PAJ7620 is not set # CONFIG_PKG_USING_AGILE_CONSOLE is not set # CONFIG_PKG_USING_LD3320 is not set # CONFIG_PKG_USING_WK2124 is not set @@ -775,10 +867,11 @@ CONFIG_PKG_AT_DEVICE_VER_NUM=0x99999 # CONFIG_PKG_USING_BL_MCU_SDK is not set # CONFIG_PKG_USING_SOFT_SERIAL is not set # CONFIG_PKG_USING_MB85RS16 is not set -# CONFIG_PKG_USING_CW2015 is not set # CONFIG_PKG_USING_RFM300 is not set # CONFIG_PKG_USING_IO_INPUT_FILTER is not set # CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_FINGERPRINT is not set # # AI packages @@ -793,6 +886,12 @@ CONFIG_PKG_AT_DEVICE_VER_NUM=0x99999 # CONFIG_PKG_USING_QUEST is not set # CONFIG_PKG_USING_NAXOS is not set +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_UKAL is not set + # # miscellaneous packages # @@ -844,7 +943,6 @@ CONFIG_PKG_AT_DEVICE_VER_NUM=0x99999 # CONFIG_PKG_USING_VI is not set # CONFIG_PKG_USING_KI is not set # CONFIG_PKG_USING_ARMv7M_DWT is not set -# CONFIG_PKG_USING_UKAL is not set # CONFIG_PKG_USING_CRCLIB is not set # CONFIG_PKG_USING_LWGPS is not set # CONFIG_PKG_USING_STATE_MACHINE is not set @@ -854,6 +952,213 @@ CONFIG_PKG_AT_DEVICE_VER_NUM=0x99999 # CONFIG_PKG_USING_MFBD is not set # CONFIG_PKG_USING_SLCAN2RTT is not set # CONFIG_PKG_USING_SOEM is not set +# CONFIG_PKG_USING_QPARAM is not set +# CONFIG_PKG_USING_CorevMCU_CLI is not set + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects +# +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_ADAFRUIT_MAX31855 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set +# CONFIG_PKG_USING_ADAFRUIT_MSA301 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set +# CONFIG_PKG_USING_SEEED_ITG3200 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set +# CONFIG_PKG_USING_SEEED_MP503 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set + +# +# Other +# + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set + +# +# Uncategorized +# # # Hardware Drivers Config @@ -962,7 +1267,7 @@ CONFIG_NU_USBHOST_HUB_POLLING_INTERVAL=100 CONFIG_BSP_USING_NULINKME=y # CONFIG_BOARD_USING_IP101GR is not set CONFIG_BOARD_USING_ESP8266=y -CONFIG_BOARD_USING_BMX055=y +# CONFIG_BOARD_USING_BMX055 is not set CONFIG_BOARD_USING_NAU88L25=y CONFIG_BOARD_USING_STORAGE_SDCARD=y CONFIG_BOARD_USING_STORAGE_SPIFLASH=y @@ -984,8 +1289,7 @@ CONFIG_BOARD_USING_HSUSBH_USBD=y # CONFIG_NU_PKG_USING_UTILS=y CONFIG_NU_PKG_USING_DEMO=y -# CONFIG_NU_PKG_USING_LVGL is not set -CONFIG_NU_PKG_USING_BMX055=y +# CONFIG_NU_PKG_USING_BMX055 is not set # CONFIG_NU_PKG_USING_MAX31875 is not set # CONFIG_NU_PKG_USING_NCT7717U is not set CONFIG_NU_PKG_USING_NAU88L25=y @@ -997,5 +1301,3 @@ CONFIG_NU_PKG_USING_NAU88L25=y # CONFIG_NU_PKG_USING_TPC is not set # CONFIG_NU_PKG_USING_ADC_TOUCH is not set # CONFIG_NU_PKG_USING_SPINAND is not set -CONFIG_UTEST_CMD_PREFIX="bsp.nuvoton.utest." -CONFIG_BOARD_USE_UTEST=y diff --git a/bsp/nuvoton/numaker-iot-m487/Nu_Link_Driver.ini b/bsp/nuvoton/numaker-iot-m487/Nu_Link_Driver.ini deleted file mode 100644 index f702d5c1aa..0000000000 --- a/bsp/nuvoton/numaker-iot-m487/Nu_Link_Driver.ini +++ /dev/null @@ -1,1036 +0,0 @@ -[Version] -Nu_LinkVersion=V5.14 -[Process] -ProcessID=0x00004840 -ProcessCreationTime_L=0xb55cd40e -ProcessCreationTime_H=0x01d6e4e3 -NuLinkID=0x77885acd -NuLinkIDs_Count=0x00000001 -NuLinkID0=0x77885acd -[ChipSelect] -;ChipName= -ChipName=M481 -[NUC505] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=NUC505_SPIFLASH.FLM -[NUC4xx] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=NUC400_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x014fb180 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[NUC2xx] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NUC200_AP_128.FLM -[NUC1311] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NUC1311_AP_64.FLM -[NUC126] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=NUC126_AP_256.FLM -[NUC121] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NUC121_AP_32.FLM -[NUC1xx] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NUC100_AP_128.FLM -[NUC029] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NUC029_AP_16.FLM -[NM1820] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NM1820_AP_17_5.FLM -[NM1810] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NM1810_AP_29_5.FLM -[NM1500] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NM1500_AP_128.FLM -[NM1330] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NM1330_AP_64.FLM -[NM1320] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NM1320_AP_32.FLM -[NM1230] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NM1230_AP_64.FLM -[NM1200] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NM1200_AP_8.FLM -[NM1120] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NM1120_AP_29_5.FLM -[TF5100] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=TF5100_AP_64.FLM -[NDA102] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NDA102_AP_29_5.FLM -[Nano103] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=Nano103_AP_64.FLM -[Nano100] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=Nano100_AP_64.FLM -[N576] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=N576_AP_145.FLM -[N575] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=N575_AP_145.FLM -[N572] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=N572Fxxx.FLM -[N571] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=N571E000.FLM -[N570] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=N570_AP_64.FLM -[N569] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=N569_AP_64.FLM -[N512] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=N512_AP_64.FLM -[Mini57] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=Mini57_AP_29_5.FLM -[Mini51] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=Mini51_AP_16.FLM -[M481] -Connect=2 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x00004000 -ProgramAlgorithm=M481_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[M480LD] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M480LD_AP_256.FLM -[M451] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M451_AP_256.FLM -[M251] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=M251_AP_192.FLM -[M2351] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M2351_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[M261] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M261_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[MR63] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=MR63_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[M0564] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=M0564_AP_256.FLM -[M0519] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=M0519_AP_128.FLM -[M0518] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=M0518_AP_64.FLM -[M05x] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=M0516_AP_64.FLM -[M031] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=M031_AP_128.FLM -Bank=0 -[NPCX] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=NPCX_AP_512.FLM -[I94000] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=I94000_AP_512.FLM -[ISD9300] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=ISD9300_AP_145.FLM -[I9200] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=I9200_AP_128.FLM -[ISD9xxx] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=ISD9100_AP_145.FLM -[ISD9000] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=ISD9000_AP_64.FLM -[AU9xxx] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=AU9100_AP_145.FLM -[General] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm= -[Autodetect] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm= -[I96000] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=2 -Program=0 -Verify=0 -ResetAndRun=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x8000 -ProgramAlgorithm= -[M030G] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -DisableTimeoutDetect=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=M030G_AP_64.FLM -[M0A21] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=M0A21_AP_32.FLM -[M2354] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Bank=0 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -CheckDPM=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M2354_AP_1M.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[M471] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Bank=0 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M471_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[M479] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M479_AP_256.FLM -[NM1240] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NM1240_AP_64.FLM -[M071] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=M071_AP_128.FLM diff --git a/bsp/nuvoton/numaker-iot-m487/applications/lvgl/lv_port_disp.h b/bsp/nuvoton/numaker-iot-m487/applications/lvgl/lv_port_disp.h deleted file mode 100644 index b11ce3c5b6..0000000000 --- a/bsp/nuvoton/numaker-iot-m487/applications/lvgl/lv_port_disp.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2021-10-18 Meco Man The first version - */ -#ifndef LV_PORT_DISP_H -#define LV_PORT_DISP_H - -#ifdef __cplusplus -extern "C" { -#endif - -void lv_port_disp_init(void); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/bsp/nuvoton/numaker-iot-m487/applications/lvgl/lv_port_indev.h b/bsp/nuvoton/numaker-iot-m487/applications/lvgl/lv_port_indev.h deleted file mode 100644 index bde7176807..0000000000 --- a/bsp/nuvoton/numaker-iot-m487/applications/lvgl/lv_port_indev.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2021-10-18 Meco Man The first version - */ -#ifndef LV_PORT_INDEV_H -#define LV_PORT_INDEV_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -extern lv_indev_t *button_indev; - -void lv_port_indev_init(void); -void lv_port_indev_input(rt_int16_t x, rt_int16_t y, lv_indev_state_t state); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/bsp/nuvoton/numaker-iot-m487/board/board_dev.c b/bsp/nuvoton/numaker-iot-m487/board/board_dev.c index 97288f2d74..1f9488d07b 100644 --- a/bsp/nuvoton/numaker-iot-m487/board/board_dev.c +++ b/bsp/nuvoton/numaker-iot-m487/board/board_dev.c @@ -158,7 +158,7 @@ int rt_hw_max31875_port(void) struct rt_sensor_config cfg; cfg.intf.dev_name = "i2c1"; - cfg.intf.user_data = (void *)MAX31875_I2C_SLAVE_ADR_R0; + cfg.intf.arg = (void *)MAX31875_I2C_SLAVE_ADR_R0; cfg.irq_pin.pin = PIN_IRQ_PIN_NONE; rt_hw_max31875_init("max31875", &cfg); @@ -174,7 +174,7 @@ int rt_hw_bmx055_port(void) { struct rt_sensor_config cfg; cfg.intf.dev_name = "i2c2"; - cfg.intf.user_data = (void *)0; + cfg.intf.arg = (void *)0; cfg.irq_pin.pin = PIN_IRQ_PIN_NONE; rt_hw_bmx055_init("bmx055", &cfg); diff --git a/bsp/nuvoton/numaker-iot-m487/project.uvproj b/bsp/nuvoton/numaker-iot-m487/project.uvproj deleted file mode 100644 index 425375cfb1..0000000000 --- a/bsp/nuvoton/numaker-iot-m487/project.uvproj +++ /dev/null @@ -1,2383 +0,0 @@ - - - 1.1 -
### uVision Project, (C) Keil Software
- - - rtthread-m480 - 0x4 - ARM-ADS - - - M487JIDAE - Nuvoton - IRAM(0x20000000-0x20027FFF) IROM(0-0x7FFFF) CLOCK(192000000) CPUTYPE("Cortex-M4") FPU2 - - undefined - - 0 - - - - - - - - - - - SFD\Nuvoton\M481_v1.SFR - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\build\keil4\ - rtthread - 1 - 0 - 1 - 1 - 1 - .\build\keil4\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 1 - 0 - fromelf.exe --bin --output "$L@L.bin" "$L@L.axf" - - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - - DARMCM1.DLL - - SARMCM3.DLL - - TARMCM1.DLL - - - - - 1 - 0 - 0 - 0 - 16 - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - - 0 - 10 - - - - - - - - - - - - - - NULink\Nu_Link.dll - - - - - 1 - 0 - 0 - 1 - 1 - 4101 - - 0 - NULink\Nu_Link.dll - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 8 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x28000 - - - 1 - 0x0 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x28000 - - - 0 - 0x0 - 0x0 - - - - - - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - --c99 - RT_USING_LIBC, __RTTHREAD__, __STDC_LIMIT_MACROS, RT_USING_ARM_LIBC, __CLK_TCK=RT_TICK_PER_SECOND - - applications;.;..\..\..\components\net\at\include;..\..\..\components\net\at\at_socket;packages\at_device-latest\inc;packages\at_device-latest\class\esp8266;..\libraries\m480\CMSIS\Include;..\..\..\components\libc\compilers\common\include;..\..\..\components\libc\compilers\common\extension;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m4;..\..\..\components\drivers\audio;..\..\..\components\drivers\include;..\..\..\components\drivers\hwcrypto;.;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\spi;..\..\..\components\drivers\include;..\..\..\components\drivers\spi\sfud\inc;..\..\..\components\drivers\include;board;board\NuClockConfig;board\NuPinConfig;..\libraries\m480\Device\Nuvoton\M480\Include;..\libraries\m480\rtt_port;..\..\..\components\fal\inc;..\..\..\components\dfs\include;..\..\..\components\dfs\filesystems\devfs;..\..\..\components\dfs\filesystems\elmfat;..\..\..\components\finsh;.;..\..\..\include;..\libraries\m480\StdDriver\inc;..\libraries\m480\USBHostLib\inc;..\libraries\nu_packages\BMX055;..\libraries\nu_packages\BMX055\libraries\BMA2x2_driver;..\libraries\nu_packages\BMX055\libraries\BMG160_driver;..\libraries\nu_packages\BMX055\libraries\BMM050_driver;..\libraries\nu_packages\Demo;..\libraries\nu_packages\AudioCodec;..\libraries\nu_packages\TPC;..\libraries\nu_packages\NuUtils\inc;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\posix\io\stdio;..\..\..\components\libc\posix\ipc;..\..\..\components\drivers\usb\usbdevice;..\..\..\components\drivers\usb\usbhost;..\..\..\components\drivers\usb\usbhost\class;..\..\..\components\drivers\usb\usbhost\core;..\..\..\components\drivers\usb\usbhost\include;..\..\..\components\drivers\include;..\..\..\components\net\netdev\include;..\..\..\components\net\sal\include;..\..\..\components\net\sal\include\socket;..\..\..\components\net\sal\impl;..\..\..\components\net\sal\include\dfs_net;..\..\..\components\net\sal\include\socket\sys_socket;..\..\..\components\drivers\sensors;..\..\..\components\drivers\include;..\..\..\components\utilities\utest - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - .\linking_scripts\m480_flash.sct - - - - - - - - - - - Applications - - - mnt.c - 1 - applications\mnt.c - - - - - main.c - 1 - applications\main.c - - - - - AT - - - at_utils.c - 1 - ..\..\..\components\net\at\src\at_utils.c - - - - - at_socket.c - 1 - ..\..\..\components\net\at\at_socket\at_socket.c - - - - - at_cli.c - 1 - ..\..\..\components\net\at\src\at_cli.c - - - - - at_client.c - 1 - ..\..\..\components\net\at\src\at_client.c - - - - - at_device - - - at_device_esp8266.c - 1 - packages\at_device-latest\class\esp8266\at_device_esp8266.c - - - - - at_socket_esp8266.c - 1 - packages\at_device-latest\class\esp8266\at_socket_esp8266.c - - - - - at_device.c - 1 - packages\at_device-latest\src\at_device.c - - - - - Compiler - - - syscall_mem.c - 1 - ..\..\..\components\libc\compilers\armlibc\syscall_mem.c - - - - - syscalls.c - 1 - ..\..\..\components\libc\compilers\armlibc\syscalls.c - - - - - cctype.c - 1 - ..\..\..\components\libc\compilers\common\cctype.c - - - - - cstdio.c - 1 - ..\..\..\components\libc\compilers\common\cstdio.c - - - - - cstdlib.c - 1 - ..\..\..\components\libc\compilers\common\cstdlib.c - - - - - cstring.c - 1 - ..\..\..\components\libc\compilers\common\cstring.c - - - - - ctime.c - 1 - ..\..\..\components\libc\compilers\common\ctime.c - - - - - cwchar.c - 1 - ..\..\..\components\libc\compilers\common\cwchar.c - - - - - CPU - - - backtrace.c - 1 - ..\..\..\libcpu\arm\common\backtrace.c - - - - - div0.c - 1 - ..\..\..\libcpu\arm\common\div0.c - - - - - showmem.c - 1 - ..\..\..\libcpu\arm\common\showmem.c - - - - - context_rvds.S - 2 - ..\..\..\libcpu\arm\cortex-m4\context_rvds.S - - - - - cpuport.c - 1 - ..\..\..\libcpu\arm\cortex-m4\cpuport.c - - - - - DeviceDrivers - - - audio.c - 1 - ..\..\..\components\drivers\audio\audio.c - - - - - --c99 - - - - - - - - - - - - audio_pipe.c - 1 - ..\..\..\components\drivers\audio\audio_pipe.c - - - - - --c99 - - - - - - - - - - - - can.c - 1 - ..\..\..\components\drivers\can\can.c - - - - - --c99 - - - - - - - - - - - - hw_crc.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_crc.c - - - - - --c99 - - - - - - - - - - - - hw_hash.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_hash.c - - - - - --c99 - - - - - - - - - - - - hw_rng.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_rng.c - - - - - --c99 - - - - - - - - - - - - hw_symmetric.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_symmetric.c - - - - - --c99 - - - - - - - - - - - - hwcrypto.c - 1 - ..\..\..\components\drivers\hwcrypto\hwcrypto.c - - - - - --c99 - - - - - - - - - - - - hwtimer.c - 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c - - - - - --c99 - - - - - - - - - - - - i2c-bit-ops.c - 1 - ..\..\..\components\drivers\i2c\i2c-bit-ops.c - - - - - --c99 - - - - - - - - - - - - i2c_core.c - 1 - ..\..\..\components\drivers\i2c\i2c_core.c - - - - - --c99 - - - - - - - - - - - - i2c_dev.c - 1 - ..\..\..\components\drivers\i2c\i2c_dev.c - - - - - --c99 - - - - - - - - - - - - completion.c - 1 - ..\..\..\components\drivers\ipc\completion.c - - - - - --c99 - - - - - - - - - - - - dataqueue.c - 1 - ..\..\..\components\drivers\ipc\dataqueue.c - - - - - --c99 - - - - - - - - - - - - pipe.c - 1 - ..\..\..\components\drivers\ipc\pipe.c - - - - - --c99 - - - - - - - - - - - - ringblk_buf.c - 1 - ..\..\..\components\drivers\ipc\ringblk_buf.c - - - - - --c99 - - - - - - - - - - - - ringbuffer.c - 1 - ..\..\..\components\drivers\ipc\ringbuffer.c - - - - - --c99 - - - - - - - - - - - - waitqueue.c - 1 - ..\..\..\components\drivers\ipc\waitqueue.c - - - - - --c99 - - - - - - - - - - - - workqueue.c - 1 - ..\..\..\components\drivers\ipc\workqueue.c - - - - - --c99 - - - - - - - - - - - - adc.c - 1 - ..\..\..\components\drivers\misc\adc.c - - - - - --c99 - - - - - - - - - - - - pin.c - 1 - ..\..\..\components\drivers\misc\pin.c - - - - - --c99 - - - - - - - - - - - - rt_drv_pwm.c - 1 - ..\..\..\components\drivers\misc\rt_drv_pwm.c - - - - - --c99 - - - - - - - - - - - - lptimer.c - 1 - ..\..\..\components\drivers\pm\lptimer.c - - - - - --c99 - - - - - - - - - - - - pm.c - 1 - ..\..\..\components\drivers\pm\pm.c - - - - - --c99 - - - - - - - - - - - - rtc.c - 1 - ..\..\..\components\drivers\rtc\rtc.c - - - - - --c99 - - - - - - - - - - - - block_dev.c - 1 - ..\..\..\components\drivers\sdio\block_dev.c - - - - - --c99 - - - - - - - - - - - - mmc.c - 1 - ..\..\..\components\drivers\sdio\mmc.c - - - - - --c99 - - - - - - - - - - - - mmcsd_core.c - 1 - ..\..\..\components\drivers\sdio\mmcsd_core.c - - - - - --c99 - - - - - - - - - - - - sd.c - 1 - ..\..\..\components\drivers\sdio\sd.c - - - - - --c99 - - - - - - - - - - - - sdio.c - 1 - ..\..\..\components\drivers\sdio\sdio.c - - - - - --c99 - - - - - - - - - - - - serial.c - 1 - ..\..\..\components\drivers\serial\serial.c - - - - - --c99 - - - - - - - - - - - - qspi_core.c - 1 - ..\..\..\components\drivers\spi\qspi_core.c - - - - - --c99 - - - - - - - - - - - - sfud.c - 1 - ..\..\..\components\drivers\spi\sfud\src\sfud.c - - - - - --c99 - - - - - - - - - - - - sfud_sfdp.c - 1 - ..\..\..\components\drivers\spi\sfud\src\sfud_sfdp.c - - - - - --c99 - - - - - - - - - - - - spi_core.c - 1 - ..\..\..\components\drivers\spi\spi_core.c - - - - - --c99 - - - - - - - - - - - - spi_dev.c - 1 - ..\..\..\components\drivers\spi\spi_dev.c - - - - - --c99 - - - - - - - - - - - - spi_flash_sfud.c - 1 - ..\..\..\components\drivers\spi\spi_flash_sfud.c - - - - - --c99 - - - - - - - - - - - - watchdog.c - 1 - ..\..\..\components\drivers\watchdog\watchdog.c - - - - - --c99 - - - - - - - - - - - - Drivers - - - startup_M480.s - 2 - ..\libraries\m480\Device\Nuvoton\M480\Source\ARM\startup_M480.s - - - - - system_M480.c - 1 - ..\libraries\m480\Device\Nuvoton\M480\Source\system_M480.c - - - - - nutool_modclkcfg.c - 1 - board\NuClockConfig\nutool_modclkcfg.c - - - - - nutool_pincfg.c - 1 - board\NuPinConfig\nutool_pincfg.c - - - - - board_dev.c - 1 - board\board_dev.c - - - - - drv_bpwm.c - 1 - ..\libraries\m480\rtt_port\drv_bpwm.c - - - - - drv_bpwm_capture.c - 1 - ..\libraries\m480\rtt_port\drv_bpwm_capture.c - - - - - drv_can.c - 1 - ..\libraries\m480\rtt_port\drv_can.c - - - - - drv_clk.c - 1 - ..\libraries\m480\rtt_port\drv_clk.c - - - - - drv_common.c - 1 - ..\libraries\m480\rtt_port\drv_common.c - - - - - drv_crc.c - 1 - ..\libraries\m480\rtt_port\drv_crc.c - - - - - drv_crypto.c - 1 - ..\libraries\m480\rtt_port\drv_crypto.c - - - - - drv_eadc.c - 1 - ..\libraries\m480\rtt_port\drv_eadc.c - - - - - drv_ebi.c - 1 - ..\libraries\m480\rtt_port\drv_ebi.c - - - - - drv_ecap.c - 1 - ..\libraries\m480\rtt_port\drv_ecap.c - - - - - drv_emac.c - 1 - ..\libraries\m480\rtt_port\drv_emac.c - - - - - drv_epwm.c - 1 - ..\libraries\m480\rtt_port\drv_epwm.c - - - - - drv_epwm_capture.c - 1 - ..\libraries\m480\rtt_port\drv_epwm_capture.c - - - - - drv_fmc.c - 1 - ..\libraries\m480\rtt_port\drv_fmc.c - - - - - drv_gpio.c - 1 - ..\libraries\m480\rtt_port\drv_gpio.c - - - - - drv_hsotg.c - 1 - ..\libraries\m480\rtt_port\drv_hsotg.c - - - - - drv_hsusbd.c - 1 - ..\libraries\m480\rtt_port\drv_hsusbd.c - - - - - drv_i2c.c - 1 - ..\libraries\m480\rtt_port\drv_i2c.c - - - - - drv_i2s.c - 1 - ..\libraries\m480\rtt_port\drv_i2s.c - - - - - drv_pdma.c - 1 - ..\libraries\m480\rtt_port\drv_pdma.c - - - - - drv_qei.c - 1 - ..\libraries\m480\rtt_port\drv_qei.c - - - - - drv_qspi.c - 1 - ..\libraries\m480\rtt_port\drv_qspi.c - - - - - drv_rtc.c - 1 - ..\libraries\m480\rtt_port\drv_rtc.c - - - - - drv_scuart.c - 1 - ..\libraries\m480\rtt_port\drv_scuart.c - - - - - drv_sdh.c - 1 - ..\libraries\m480\rtt_port\drv_sdh.c - - - - - drv_sdio.c - 1 - ..\libraries\m480\rtt_port\drv_sdio.c - - - - - drv_softi2c.c - 1 - ..\libraries\m480\rtt_port\drv_softi2c.c - - - - - drv_spi.c - 1 - ..\libraries\m480\rtt_port\drv_spi.c - - - - - drv_spii2s.c - 1 - ..\libraries\m480\rtt_port\drv_spii2s.c - - - - - drv_timer.c - 1 - ..\libraries\m480\rtt_port\drv_timer.c - - - - - drv_timer_capture.c - 1 - ..\libraries\m480\rtt_port\drv_timer_capture.c - - - - - drv_tpwm.c - 1 - ..\libraries\m480\rtt_port\drv_tpwm.c - - - - - drv_trng.c - 1 - ..\libraries\m480\rtt_port\drv_trng.c - - - - - drv_uart.c - 1 - ..\libraries\m480\rtt_port\drv_uart.c - - - - - drv_ui2c.c - 1 - ..\libraries\m480\rtt_port\drv_ui2c.c - - - - - drv_usbd.c - 1 - ..\libraries\m480\rtt_port\drv_usbd.c - - - - - drv_usbhost.c - 1 - ..\libraries\m480\rtt_port\drv_usbhost.c - - - - - drv_uspi.c - 1 - ..\libraries\m480\rtt_port\drv_uspi.c - - - - - drv_uuart.c - 1 - ..\libraries\m480\rtt_port\drv_uuart.c - - - - - drv_wdt.c - 1 - ..\libraries\m480\rtt_port\drv_wdt.c - - - - - Fal - - - fal.c - 1 - ..\..\..\components\fal\src\fal.c - - - - - fal_partition.c - 1 - ..\..\..\components\fal\src\fal_partition.c - - - - - fal_flash.c - 1 - ..\..\..\components\fal\src\fal_flash.c - - - - - fal_rtt.c - 1 - ..\..\..\components\fal\src\fal_rtt.c - - - - - Filesystem - - - devfs.c - 1 - ..\..\..\components\dfs\filesystems\devfs\devfs.c - - - - - dfs_elm.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\dfs_elm.c - - - - - ff.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\ff.c - - - - - ffunicode.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\ffunicode.c - - - - - dfs.c - 1 - ..\..\..\components\dfs\src\dfs.c - - - - - dfs_file.c - 1 - ..\..\..\components\dfs\src\dfs_file.c - - - - - dfs_fs.c - 1 - ..\..\..\components\dfs\src\dfs_fs.c - - - - - dfs_posix.c - 1 - ..\..\..\components\dfs\src\dfs_posix.c - - - - - Finsh - - - shell.c - 1 - ..\..\..\components\finsh\shell.c - - - - - msh.c - 1 - ..\..\..\components\finsh\msh.c - - - - - msh_parse.c - 1 - ..\..\..\components\finsh\msh_parse.c - - - - - cmd.c - 1 - ..\..\..\components\finsh\cmd.c - - - - - msh_file.c - 1 - ..\..\..\components\finsh\msh_file.c - - - - - Kernel - - - clock.c - 1 - ..\..\..\src\clock.c - - - - - components.c - 1 - ..\..\..\src\components.c - - - - - device.c - 1 - ..\..\..\src\device.c - - - - - idle.c - 1 - ..\..\..\src\idle.c - - - - - ipc.c - 1 - ..\..\..\src\ipc.c - - - - - irq.c - 1 - ..\..\..\src\irq.c - - - - - kservice.c - 1 - ..\..\..\src\kservice.c - - - - - mem.c - 1 - ..\..\..\src\mem.c - - - - - mempool.c - 1 - ..\..\..\src\mempool.c - - - - - object.c - 1 - ..\..\..\src\object.c - - - - - scheduler.c - 1 - ..\..\..\src\scheduler.c - - - - - signal.c - 1 - ..\..\..\src\signal.c - - - - - thread.c - 1 - ..\..\..\src\thread.c - - - - - timer.c - 1 - ..\..\..\src\timer.c - - - - - Libraries - - - nu_spi.c - 1 - ..\libraries\m480\StdDriver\src\nu_spi.c - - - - - nu_eadc.c - 1 - ..\libraries\m480\StdDriver\src\nu_eadc.c - - - - - nu_i2c.c - 1 - ..\libraries\m480\StdDriver\src\nu_i2c.c - - - - - nu_hsusbd.c - 1 - ..\libraries\m480\StdDriver\src\nu_hsusbd.c - - - - - nu_ebi.c - 1 - ..\libraries\m480\StdDriver\src\nu_ebi.c - - - - - nu_usci_spi.c - 1 - ..\libraries\m480\StdDriver\src\nu_usci_spi.c - - - - - nu_fmc.c - 1 - ..\libraries\m480\StdDriver\src\nu_fmc.c - - - - - nu_timer_pwm.c - 1 - ..\libraries\m480\StdDriver\src\nu_timer_pwm.c - - - - - nu_i2s.c - 1 - ..\libraries\m480\StdDriver\src\nu_i2s.c - - - - - nu_clk.c - 1 - ..\libraries\m480\StdDriver\src\nu_clk.c - - - - - nu_spim.c - 1 - ..\libraries\m480\StdDriver\src\nu_spim.c - - - - - nu_sys.c - 1 - ..\libraries\m480\StdDriver\src\nu_sys.c - - - - - nu_dac.c - 1 - ..\libraries\m480\StdDriver\src\nu_dac.c - - - - - nu_timer.c - 1 - ..\libraries\m480\StdDriver\src\nu_timer.c - - - - - nu_gpio.c - 1 - ..\libraries\m480\StdDriver\src\nu_gpio.c - - - - - nu_rtc.c - 1 - ..\libraries\m480\StdDriver\src\nu_rtc.c - - - - - nu_wdt.c - 1 - ..\libraries\m480\StdDriver\src\nu_wdt.c - - - - - nu_crypto.c - 1 - ..\libraries\m480\StdDriver\src\nu_crypto.c - - - - - nu_trng.c - 1 - ..\libraries\m480\StdDriver\src\nu_trng.c - - - - - nu_qei.c - 1 - ..\libraries\m480\StdDriver\src\nu_qei.c - - - - - nu_usci_uart.c - 1 - ..\libraries\m480\StdDriver\src\nu_usci_uart.c - - - - - nu_wwdt.c - 1 - ..\libraries\m480\StdDriver\src\nu_wwdt.c - - - - - nu_ecap.c - 1 - ..\libraries\m480\StdDriver\src\nu_ecap.c - - - - - nu_epwm.c - 1 - ..\libraries\m480\StdDriver\src\nu_epwm.c - - - - - nu_usbd.c - 1 - ..\libraries\m480\StdDriver\src\nu_usbd.c - - - - - nu_can.c - 1 - ..\libraries\m480\StdDriver\src\nu_can.c - - - - - nu_qspi.c - 1 - ..\libraries\m480\StdDriver\src\nu_qspi.c - - - - - nu_emac.c - 1 - ..\libraries\m480\StdDriver\src\nu_emac.c - - - - - nu_sdh.c - 1 - ..\libraries\m480\StdDriver\src\nu_sdh.c - - - - - nu_bpwm.c - 1 - ..\libraries\m480\StdDriver\src\nu_bpwm.c - - - - - nu_usci_i2c.c - 1 - ..\libraries\m480\StdDriver\src\nu_usci_i2c.c - - - - - nu_pdma.c - 1 - ..\libraries\m480\StdDriver\src\nu_pdma.c - - - - - nu_uart.c - 1 - ..\libraries\m480\StdDriver\src\nu_uart.c - - - - - nu_sc.c - 1 - ..\libraries\m480\StdDriver\src\nu_sc.c - - - - - nu_acmp.c - 1 - ..\libraries\m480\StdDriver\src\nu_acmp.c - - - - - nu_crc.c - 1 - ..\libraries\m480\StdDriver\src\nu_crc.c - - - - - nu_scuart.c - 1 - ..\libraries\m480\StdDriver\src\nu_scuart.c - - - - - nu_ccap.c - 1 - ..\libraries\m480\StdDriver\src\nu_ccap.c - - - - - m480_usbhostlib - - - ehci_iso.c - 1 - ..\libraries\m480\USBHostLib\src\ehci_iso.c - - - - - usb_core.c - 1 - ..\libraries\m480\USBHostLib\src\usb_core.c - - - - - ohci.c - 1 - ..\libraries\m480\USBHostLib\src\ohci.c - - - - - mem_alloc.c - 1 - ..\libraries\m480\USBHostLib\src\mem_alloc.c - - - - - ehci.c - 1 - ..\libraries\m480\USBHostLib\src\ehci.c - - - - - nu_pkgs_bmx055 - - - bmg160.c - 1 - ..\libraries\nu_packages\BMX055\libraries\BMG160_driver\bmg160.c - - - - - bma2x2.c - 1 - ..\libraries\nu_packages\BMX055\libraries\BMA2x2_driver\bma2x2.c - - - - - sensor_bmx055.c - 1 - ..\libraries\nu_packages\BMX055\sensor_bmx055.c - - - - - bmm050.c - 1 - ..\libraries\nu_packages\BMX055\libraries\BMM050_driver\bmm050.c - - - - - nu_pkgs_demo - - - usbd_cdc_vcom_echo.c - 1 - ..\libraries\nu_packages\Demo\usbd_cdc_vcom_echo.c - - - - - slcd_show_tick.c - 1 - ..\libraries\nu_packages\Demo\slcd_show_tick.c - - - - - usbd_hid_dance_mouse.c - 1 - ..\libraries\nu_packages\Demo\usbd_hid_dance_mouse.c - - - - - nu_pkgs_nau88l25 - - - audio_test.c - 1 - ..\libraries\nu_packages\AudioCodec\audio_test.c - - - - - acodec_nau88l25.c - 1 - ..\libraries\nu_packages\AudioCodec\acodec_nau88l25.c - - - - - POSIX - - - poll.c - 1 - ..\..\..\components\libc\posix\io\poll\poll.c - - - - - select.c - 1 - ..\..\..\components\libc\posix\io\poll\select.c - - - - - rt_usbd - - - hid.c - 1 - ..\..\..\components\drivers\usb\usbdevice\class\hid.c - - - - - usbdevice_core.c - 1 - ..\..\..\components\drivers\usb\usbdevice\core\usbdevice_core.c - - - - - usbdevice.c - 1 - ..\..\..\components\drivers\usb\usbdevice\core\usbdevice.c - - - - - rt_usbh - - - hub.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\hub.c - - - - - usbhost.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\usbhost.c - - - - - udisk.c - 1 - ..\..\..\components\drivers\usb\usbhost\class\udisk.c - - - - - usbhost_core.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\usbhost_core.c - - - - - mass.c - 1 - ..\..\..\components\drivers\usb\usbhost\class\mass.c - - - - - driver.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\driver.c - - - - - SAL - - - netdev.c - 1 - ..\..\..\components\net\netdev\src\netdev.c - - - - - netdev_ipaddr.c - 1 - ..\..\..\components\net\netdev\src\netdev_ipaddr.c - - - - - dfs_net.c - 1 - ..\..\..\components\net\sal\dfs_net\dfs_net.c - - - - - af_inet_at.c - 1 - ..\..\..\components\net\sal\impl\af_inet_at.c - - - - - net_netdb.c - 1 - ..\..\..\components\net\sal\socket\net_netdb.c - - - - - net_sockets.c - 1 - ..\..\..\components\net\sal\socket\net_sockets.c - - - - - sal_socket.c - 1 - ..\..\..\components\net\sal\src\sal_socket.c - - - - - Sensors - - - sensor_cmd.c - 1 - ..\..\..\components\drivers\sensors\sensor_cmd.c - - - - - sensor.c - 1 - ..\..\..\components\drivers\sensors\sensor.c - - - - - UTest - - - utest.c - 1 - ..\..\..\components\utilities\utest\utest.c - - - - - - -
diff --git a/bsp/nuvoton/numaker-iot-m487/project.uvprojx b/bsp/nuvoton/numaker-iot-m487/project.uvprojx deleted file mode 100644 index 7386ea8e82..0000000000 --- a/bsp/nuvoton/numaker-iot-m487/project.uvprojx +++ /dev/null @@ -1,2378 +0,0 @@ - - - 2.1 -
### uVision Project, (C) Keil Software
- - - rtthread-m480 - 0x4 - ARM-ADS - 0 - - - M487JIDAE - Nuvoton - Nuvoton.NuMicro_DFP.1.3.13 - https://github.com/OpenNuvoton/cmsis-packs/raw/master/ - IRAM(0x20000000,0x28000) IROM(0x00000000,0x80000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0M481_AP_512 -FS00 -FL080000 -FP0($$Device:M487JIDAE$Flash\M481_AP_512.FLM)) - 0 - $$Device:M487JIDAE$Device\M480\Include\M480.h - - - - - - - - - - $$Device:M487JIDAE$SVD\Nuvoton\M481_v1.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\build\keil5\ - rtthread - 1 - 0 - 1 - 1 - 1 - .\build\keil5\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf.exe --bin --output "$L@L.bin" "$L@L.axf" - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - - DARMCM1.DLL - - SARMCM3.DLL - - TARMCM1.DLL - - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4103 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x28000 - - - 1 - 0x0 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x28000 - - - 0 - 0x0 - 0x0 - - - - - - 1 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 0 - 0 - 0 - - --c99 - RT_USING_LIBC, __RTTHREAD__, __STDC_LIMIT_MACROS, RT_USING_ARM_LIBC, __CLK_TCK=RT_TICK_PER_SECOND - - applications;.;..\..\..\components\net\at\include;..\..\..\components\net\at\at_socket;packages\at_device-latest\inc;packages\at_device-latest\class\esp8266;..\libraries\m480\CMSIS\Include;..\..\..\components\libc\compilers\common\include;..\..\..\components\libc\compilers\common\extension;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m4;..\..\..\components\drivers\audio;..\..\..\components\drivers\include;..\..\..\components\drivers\hwcrypto;.;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\spi;..\..\..\components\drivers\include;..\..\..\components\drivers\spi\sfud\inc;..\..\..\components\drivers\include;board;board\NuClockConfig;board\NuPinConfig;..\libraries\m480\Device\Nuvoton\M480\Include;..\libraries\m480\rtt_port;..\..\..\components\fal\inc;..\..\..\components\dfs\include;..\..\..\components\dfs\filesystems\devfs;..\..\..\components\dfs\filesystems\elmfat;..\..\..\components\finsh;.;..\..\..\include;..\libraries\m480\StdDriver\inc;..\libraries\m480\USBHostLib\inc;..\libraries\nu_packages\BMX055;..\libraries\nu_packages\BMX055\libraries\BMA2x2_driver;..\libraries\nu_packages\BMX055\libraries\BMG160_driver;..\libraries\nu_packages\BMX055\libraries\BMM050_driver;..\libraries\nu_packages\Demo;..\libraries\nu_packages\AudioCodec;..\libraries\nu_packages\TPC;..\libraries\nu_packages\NuUtils\inc;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\posix\io\stdio;..\..\..\components\libc\posix\ipc;..\..\..\components\drivers\usb\usbdevice;..\..\..\components\drivers\usb\usbhost;..\..\..\components\drivers\usb\usbhost\class;..\..\..\components\drivers\usb\usbhost\core;..\..\..\components\drivers\usb\usbhost\include;..\..\..\components\drivers\include;..\..\..\components\net\netdev\include;..\..\..\components\net\sal\include;..\..\..\components\net\sal\include\socket;..\..\..\components\net\sal\impl;..\..\..\components\net\sal\include\dfs_net;..\..\..\components\net\sal\include\socket\sys_socket;..\..\..\components\drivers\sensors;..\..\..\components\drivers\include;..\..\..\components\utilities\utest - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\linking_scripts\m480_flash.sct - - - - - - - - - - - Applications - - - main.c - 1 - applications\main.c - - - - - mnt.c - 1 - applications\mnt.c - - - - - AT - - - at_cli.c - 1 - ..\..\..\components\net\at\src\at_cli.c - - - - - at_client.c - 1 - ..\..\..\components\net\at\src\at_client.c - - - - - at_utils.c - 1 - ..\..\..\components\net\at\src\at_utils.c - - - - - at_socket.c - 1 - ..\..\..\components\net\at\at_socket\at_socket.c - - - - - at_device - - - at_device.c - 1 - packages\at_device-latest\src\at_device.c - - - - - at_device_esp8266.c - 1 - packages\at_device-latest\class\esp8266\at_device_esp8266.c - - - - - at_socket_esp8266.c - 1 - packages\at_device-latest\class\esp8266\at_socket_esp8266.c - - - - - Compiler - - - syscall_mem.c - 1 - ..\..\..\components\libc\compilers\armlibc\syscall_mem.c - - - - - syscalls.c - 1 - ..\..\..\components\libc\compilers\armlibc\syscalls.c - - - - - cctype.c - 1 - ..\..\..\components\libc\compilers\common\cctype.c - - - - - cstdio.c - 1 - ..\..\..\components\libc\compilers\common\cstdio.c - - - - - cstdlib.c - 1 - ..\..\..\components\libc\compilers\common\cstdlib.c - - - - - cstring.c - 1 - ..\..\..\components\libc\compilers\common\cstring.c - - - - - ctime.c - 1 - ..\..\..\components\libc\compilers\common\ctime.c - - - - - cwchar.c - 1 - ..\..\..\components\libc\compilers\common\cwchar.c - - - - - CPU - - - backtrace.c - 1 - ..\..\..\libcpu\arm\common\backtrace.c - - - - - div0.c - 1 - ..\..\..\libcpu\arm\common\div0.c - - - - - showmem.c - 1 - ..\..\..\libcpu\arm\common\showmem.c - - - - - context_rvds.S - 2 - ..\..\..\libcpu\arm\cortex-m4\context_rvds.S - - - - - cpuport.c - 1 - ..\..\..\libcpu\arm\cortex-m4\cpuport.c - - - - - DeviceDrivers - - - audio.c - 1 - ..\..\..\components\drivers\audio\audio.c - - - - - --c99 - - - - - - - - - - - - audio_pipe.c - 1 - ..\..\..\components\drivers\audio\audio_pipe.c - - - - - --c99 - - - - - - - - - - - - can.c - 1 - ..\..\..\components\drivers\can\can.c - - - - - --c99 - - - - - - - - - - - - hw_crc.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_crc.c - - - - - --c99 - - - - - - - - - - - - hw_hash.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_hash.c - - - - - --c99 - - - - - - - - - - - - hw_rng.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_rng.c - - - - - --c99 - - - - - - - - - - - - hw_symmetric.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_symmetric.c - - - - - --c99 - - - - - - - - - - - - hwcrypto.c - 1 - ..\..\..\components\drivers\hwcrypto\hwcrypto.c - - - - - --c99 - - - - - - - - - - - - hwtimer.c - 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c - - - - - --c99 - - - - - - - - - - - - i2c-bit-ops.c - 1 - ..\..\..\components\drivers\i2c\i2c-bit-ops.c - - - - - --c99 - - - - - - - - - - - - i2c_core.c - 1 - ..\..\..\components\drivers\i2c\i2c_core.c - - - - - --c99 - - - - - - - - - - - - i2c_dev.c - 1 - ..\..\..\components\drivers\i2c\i2c_dev.c - - - - - --c99 - - - - - - - - - - - - completion.c - 1 - ..\..\..\components\drivers\ipc\completion.c - - - - - --c99 - - - - - - - - - - - - dataqueue.c - 1 - ..\..\..\components\drivers\ipc\dataqueue.c - - - - - --c99 - - - - - - - - - - - - pipe.c - 1 - ..\..\..\components\drivers\ipc\pipe.c - - - - - --c99 - - - - - - - - - - - - ringblk_buf.c - 1 - ..\..\..\components\drivers\ipc\ringblk_buf.c - - - - - --c99 - - - - - - - - - - - - ringbuffer.c - 1 - ..\..\..\components\drivers\ipc\ringbuffer.c - - - - - --c99 - - - - - - - - - - - - waitqueue.c - 1 - ..\..\..\components\drivers\ipc\waitqueue.c - - - - - --c99 - - - - - - - - - - - - workqueue.c - 1 - ..\..\..\components\drivers\ipc\workqueue.c - - - - - --c99 - - - - - - - - - - - - adc.c - 1 - ..\..\..\components\drivers\misc\adc.c - - - - - --c99 - - - - - - - - - - - - pin.c - 1 - ..\..\..\components\drivers\misc\pin.c - - - - - --c99 - - - - - - - - - - - - rt_drv_pwm.c - 1 - ..\..\..\components\drivers\misc\rt_drv_pwm.c - - - - - --c99 - - - - - - - - - - - - lptimer.c - 1 - ..\..\..\components\drivers\pm\lptimer.c - - - - - --c99 - - - - - - - - - - - - pm.c - 1 - ..\..\..\components\drivers\pm\pm.c - - - - - --c99 - - - - - - - - - - - - rtc.c - 1 - ..\..\..\components\drivers\rtc\rtc.c - - - - - --c99 - - - - - - - - - - - - block_dev.c - 1 - ..\..\..\components\drivers\sdio\block_dev.c - - - - - --c99 - - - - - - - - - - - - mmc.c - 1 - ..\..\..\components\drivers\sdio\mmc.c - - - - - --c99 - - - - - - - - - - - - mmcsd_core.c - 1 - ..\..\..\components\drivers\sdio\mmcsd_core.c - - - - - --c99 - - - - - - - - - - - - sd.c - 1 - ..\..\..\components\drivers\sdio\sd.c - - - - - --c99 - - - - - - - - - - - - sdio.c - 1 - ..\..\..\components\drivers\sdio\sdio.c - - - - - --c99 - - - - - - - - - - - - serial.c - 1 - ..\..\..\components\drivers\serial\serial.c - - - - - --c99 - - - - - - - - - - - - qspi_core.c - 1 - ..\..\..\components\drivers\spi\qspi_core.c - - - - - --c99 - - - - - - - - - - - - sfud.c - 1 - ..\..\..\components\drivers\spi\sfud\src\sfud.c - - - - - --c99 - - - - - - - - - - - - sfud_sfdp.c - 1 - ..\..\..\components\drivers\spi\sfud\src\sfud_sfdp.c - - - - - --c99 - - - - - - - - - - - - spi_core.c - 1 - ..\..\..\components\drivers\spi\spi_core.c - - - - - --c99 - - - - - - - - - - - - spi_dev.c - 1 - ..\..\..\components\drivers\spi\spi_dev.c - - - - - --c99 - - - - - - - - - - - - spi_flash_sfud.c - 1 - ..\..\..\components\drivers\spi\spi_flash_sfud.c - - - - - --c99 - - - - - - - - - - - - watchdog.c - 1 - ..\..\..\components\drivers\watchdog\watchdog.c - - - - - --c99 - - - - - - - - - - - - Drivers - - - startup_M480.s - 2 - ..\libraries\m480\Device\Nuvoton\M480\Source\ARM\startup_M480.s - - - - - system_M480.c - 1 - ..\libraries\m480\Device\Nuvoton\M480\Source\system_M480.c - - - - - nutool_modclkcfg.c - 1 - board\NuClockConfig\nutool_modclkcfg.c - - - - - nutool_pincfg.c - 1 - board\NuPinConfig\nutool_pincfg.c - - - - - board_dev.c - 1 - board\board_dev.c - - - - - drv_bpwm.c - 1 - ..\libraries\m480\rtt_port\drv_bpwm.c - - - - - drv_bpwm_capture.c - 1 - ..\libraries\m480\rtt_port\drv_bpwm_capture.c - - - - - drv_can.c - 1 - ..\libraries\m480\rtt_port\drv_can.c - - - - - drv_clk.c - 1 - ..\libraries\m480\rtt_port\drv_clk.c - - - - - drv_common.c - 1 - ..\libraries\m480\rtt_port\drv_common.c - - - - - drv_crc.c - 1 - ..\libraries\m480\rtt_port\drv_crc.c - - - - - drv_crypto.c - 1 - ..\libraries\m480\rtt_port\drv_crypto.c - - - - - drv_eadc.c - 1 - ..\libraries\m480\rtt_port\drv_eadc.c - - - - - drv_ebi.c - 1 - ..\libraries\m480\rtt_port\drv_ebi.c - - - - - drv_ecap.c - 1 - ..\libraries\m480\rtt_port\drv_ecap.c - - - - - drv_emac.c - 1 - ..\libraries\m480\rtt_port\drv_emac.c - - - - - drv_epwm.c - 1 - ..\libraries\m480\rtt_port\drv_epwm.c - - - - - drv_epwm_capture.c - 1 - ..\libraries\m480\rtt_port\drv_epwm_capture.c - - - - - drv_fmc.c - 1 - ..\libraries\m480\rtt_port\drv_fmc.c - - - - - drv_gpio.c - 1 - ..\libraries\m480\rtt_port\drv_gpio.c - - - - - drv_hsotg.c - 1 - ..\libraries\m480\rtt_port\drv_hsotg.c - - - - - drv_hsusbd.c - 1 - ..\libraries\m480\rtt_port\drv_hsusbd.c - - - - - drv_i2c.c - 1 - ..\libraries\m480\rtt_port\drv_i2c.c - - - - - drv_i2s.c - 1 - ..\libraries\m480\rtt_port\drv_i2s.c - - - - - drv_pdma.c - 1 - ..\libraries\m480\rtt_port\drv_pdma.c - - - - - drv_qei.c - 1 - ..\libraries\m480\rtt_port\drv_qei.c - - - - - drv_qspi.c - 1 - ..\libraries\m480\rtt_port\drv_qspi.c - - - - - drv_rtc.c - 1 - ..\libraries\m480\rtt_port\drv_rtc.c - - - - - drv_scuart.c - 1 - ..\libraries\m480\rtt_port\drv_scuart.c - - - - - drv_sdh.c - 1 - ..\libraries\m480\rtt_port\drv_sdh.c - - - - - drv_sdio.c - 1 - ..\libraries\m480\rtt_port\drv_sdio.c - - - - - drv_softi2c.c - 1 - ..\libraries\m480\rtt_port\drv_softi2c.c - - - - - drv_spi.c - 1 - ..\libraries\m480\rtt_port\drv_spi.c - - - - - drv_spii2s.c - 1 - ..\libraries\m480\rtt_port\drv_spii2s.c - - - - - drv_timer.c - 1 - ..\libraries\m480\rtt_port\drv_timer.c - - - - - drv_timer_capture.c - 1 - ..\libraries\m480\rtt_port\drv_timer_capture.c - - - - - drv_tpwm.c - 1 - ..\libraries\m480\rtt_port\drv_tpwm.c - - - - - drv_trng.c - 1 - ..\libraries\m480\rtt_port\drv_trng.c - - - - - drv_uart.c - 1 - ..\libraries\m480\rtt_port\drv_uart.c - - - - - drv_ui2c.c - 1 - ..\libraries\m480\rtt_port\drv_ui2c.c - - - - - drv_usbd.c - 1 - ..\libraries\m480\rtt_port\drv_usbd.c - - - - - drv_usbhost.c - 1 - ..\libraries\m480\rtt_port\drv_usbhost.c - - - - - drv_uspi.c - 1 - ..\libraries\m480\rtt_port\drv_uspi.c - - - - - drv_uuart.c - 1 - ..\libraries\m480\rtt_port\drv_uuart.c - - - - - drv_wdt.c - 1 - ..\libraries\m480\rtt_port\drv_wdt.c - - - - - Fal - - - fal_rtt.c - 1 - ..\..\..\components\fal\src\fal_rtt.c - - - - - fal_flash.c - 1 - ..\..\..\components\fal\src\fal_flash.c - - - - - fal.c - 1 - ..\..\..\components\fal\src\fal.c - - - - - fal_partition.c - 1 - ..\..\..\components\fal\src\fal_partition.c - - - - - Filesystem - - - devfs.c - 1 - ..\..\..\components\dfs\filesystems\devfs\devfs.c - - - - - dfs_elm.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\dfs_elm.c - - - - - ff.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\ff.c - - - - - ffunicode.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\ffunicode.c - - - - - dfs.c - 1 - ..\..\..\components\dfs\src\dfs.c - - - - - dfs_file.c - 1 - ..\..\..\components\dfs\src\dfs_file.c - - - - - dfs_fs.c - 1 - ..\..\..\components\dfs\src\dfs_fs.c - - - - - dfs_posix.c - 1 - ..\..\..\components\dfs\src\dfs_posix.c - - - - - Finsh - - - shell.c - 1 - ..\..\..\components\finsh\shell.c - - - - - msh.c - 1 - ..\..\..\components\finsh\msh.c - - - - - msh_parse.c - 1 - ..\..\..\components\finsh\msh_parse.c - - - - - cmd.c - 1 - ..\..\..\components\finsh\cmd.c - - - - - msh_file.c - 1 - ..\..\..\components\finsh\msh_file.c - - - - - Kernel - - - clock.c - 1 - ..\..\..\src\clock.c - - - - - components.c - 1 - ..\..\..\src\components.c - - - - - device.c - 1 - ..\..\..\src\device.c - - - - - idle.c - 1 - ..\..\..\src\idle.c - - - - - ipc.c - 1 - ..\..\..\src\ipc.c - - - - - irq.c - 1 - ..\..\..\src\irq.c - - - - - kservice.c - 1 - ..\..\..\src\kservice.c - - - - - mem.c - 1 - ..\..\..\src\mem.c - - - - - mempool.c - 1 - ..\..\..\src\mempool.c - - - - - object.c - 1 - ..\..\..\src\object.c - - - - - scheduler.c - 1 - ..\..\..\src\scheduler.c - - - - - signal.c - 1 - ..\..\..\src\signal.c - - - - - thread.c - 1 - ..\..\..\src\thread.c - - - - - timer.c - 1 - ..\..\..\src\timer.c - - - - - Libraries - - - nu_pdma.c - 1 - ..\libraries\m480\StdDriver\src\nu_pdma.c - - - - - nu_clk.c - 1 - ..\libraries\m480\StdDriver\src\nu_clk.c - - - - - nu_acmp.c - 1 - ..\libraries\m480\StdDriver\src\nu_acmp.c - - - - - nu_ebi.c - 1 - ..\libraries\m480\StdDriver\src\nu_ebi.c - - - - - nu_trng.c - 1 - ..\libraries\m480\StdDriver\src\nu_trng.c - - - - - nu_usci_i2c.c - 1 - ..\libraries\m480\StdDriver\src\nu_usci_i2c.c - - - - - nu_ccap.c - 1 - ..\libraries\m480\StdDriver\src\nu_ccap.c - - - - - nu_usci_uart.c - 1 - ..\libraries\m480\StdDriver\src\nu_usci_uart.c - - - - - nu_ecap.c - 1 - ..\libraries\m480\StdDriver\src\nu_ecap.c - - - - - nu_dac.c - 1 - ..\libraries\m480\StdDriver\src\nu_dac.c - - - - - nu_spim.c - 1 - ..\libraries\m480\StdDriver\src\nu_spim.c - - - - - nu_hsusbd.c - 1 - ..\libraries\m480\StdDriver\src\nu_hsusbd.c - - - - - nu_usbd.c - 1 - ..\libraries\m480\StdDriver\src\nu_usbd.c - - - - - nu_qei.c - 1 - ..\libraries\m480\StdDriver\src\nu_qei.c - - - - - nu_epwm.c - 1 - ..\libraries\m480\StdDriver\src\nu_epwm.c - - - - - nu_crypto.c - 1 - ..\libraries\m480\StdDriver\src\nu_crypto.c - - - - - nu_scuart.c - 1 - ..\libraries\m480\StdDriver\src\nu_scuart.c - - - - - nu_sdh.c - 1 - ..\libraries\m480\StdDriver\src\nu_sdh.c - - - - - nu_sys.c - 1 - ..\libraries\m480\StdDriver\src\nu_sys.c - - - - - nu_usci_spi.c - 1 - ..\libraries\m480\StdDriver\src\nu_usci_spi.c - - - - - nu_bpwm.c - 1 - ..\libraries\m480\StdDriver\src\nu_bpwm.c - - - - - nu_fmc.c - 1 - ..\libraries\m480\StdDriver\src\nu_fmc.c - - - - - nu_wwdt.c - 1 - ..\libraries\m480\StdDriver\src\nu_wwdt.c - - - - - nu_qspi.c - 1 - ..\libraries\m480\StdDriver\src\nu_qspi.c - - - - - nu_i2s.c - 1 - ..\libraries\m480\StdDriver\src\nu_i2s.c - - - - - nu_gpio.c - 1 - ..\libraries\m480\StdDriver\src\nu_gpio.c - - - - - nu_emac.c - 1 - ..\libraries\m480\StdDriver\src\nu_emac.c - - - - - nu_i2c.c - 1 - ..\libraries\m480\StdDriver\src\nu_i2c.c - - - - - nu_wdt.c - 1 - ..\libraries\m480\StdDriver\src\nu_wdt.c - - - - - nu_can.c - 1 - ..\libraries\m480\StdDriver\src\nu_can.c - - - - - nu_uart.c - 1 - ..\libraries\m480\StdDriver\src\nu_uart.c - - - - - nu_spi.c - 1 - ..\libraries\m480\StdDriver\src\nu_spi.c - - - - - nu_timer.c - 1 - ..\libraries\m480\StdDriver\src\nu_timer.c - - - - - nu_eadc.c - 1 - ..\libraries\m480\StdDriver\src\nu_eadc.c - - - - - nu_rtc.c - 1 - ..\libraries\m480\StdDriver\src\nu_rtc.c - - - - - nu_sc.c - 1 - ..\libraries\m480\StdDriver\src\nu_sc.c - - - - - nu_timer_pwm.c - 1 - ..\libraries\m480\StdDriver\src\nu_timer_pwm.c - - - - - nu_crc.c - 1 - ..\libraries\m480\StdDriver\src\nu_crc.c - - - - - m480_usbhostlib - - - mem_alloc.c - 1 - ..\libraries\m480\USBHostLib\src\mem_alloc.c - - - - - ehci.c - 1 - ..\libraries\m480\USBHostLib\src\ehci.c - - - - - ehci_iso.c - 1 - ..\libraries\m480\USBHostLib\src\ehci_iso.c - - - - - ohci.c - 1 - ..\libraries\m480\USBHostLib\src\ohci.c - - - - - usb_core.c - 1 - ..\libraries\m480\USBHostLib\src\usb_core.c - - - - - nu_pkgs_bmx055 - - - bmg160.c - 1 - ..\libraries\nu_packages\BMX055\libraries\BMG160_driver\bmg160.c - - - - - bma2x2.c - 1 - ..\libraries\nu_packages\BMX055\libraries\BMA2x2_driver\bma2x2.c - - - - - sensor_bmx055.c - 1 - ..\libraries\nu_packages\BMX055\sensor_bmx055.c - - - - - bmm050.c - 1 - ..\libraries\nu_packages\BMX055\libraries\BMM050_driver\bmm050.c - - - - - nu_pkgs_demo - - - usbd_cdc_vcom_echo.c - 1 - ..\libraries\nu_packages\Demo\usbd_cdc_vcom_echo.c - - - - - slcd_show_tick.c - 1 - ..\libraries\nu_packages\Demo\slcd_show_tick.c - - - - - usbd_hid_dance_mouse.c - 1 - ..\libraries\nu_packages\Demo\usbd_hid_dance_mouse.c - - - - - nu_pkgs_nau88l25 - - - audio_test.c - 1 - ..\libraries\nu_packages\AudioCodec\audio_test.c - - - - - acodec_nau88l25.c - 1 - ..\libraries\nu_packages\AudioCodec\acodec_nau88l25.c - - - - - POSIX - - - poll.c - 1 - ..\..\..\components\libc\posix\io\poll\poll.c - - - - - select.c - 1 - ..\..\..\components\libc\posix\io\poll\select.c - - - - - rt_usbd - - - usbdevice_core.c - 1 - ..\..\..\components\drivers\usb\usbdevice\core\usbdevice_core.c - - - - - usbdevice.c - 1 - ..\..\..\components\drivers\usb\usbdevice\core\usbdevice.c - - - - - hid.c - 1 - ..\..\..\components\drivers\usb\usbdevice\class\hid.c - - - - - rt_usbh - - - udisk.c - 1 - ..\..\..\components\drivers\usb\usbhost\class\udisk.c - - - - - mass.c - 1 - ..\..\..\components\drivers\usb\usbhost\class\mass.c - - - - - hub.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\hub.c - - - - - usbhost.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\usbhost.c - - - - - usbhost_core.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\usbhost_core.c - - - - - driver.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\driver.c - - - - - SAL - - - netdev.c - 1 - ..\..\..\components\net\netdev\src\netdev.c - - - - - netdev_ipaddr.c - 1 - ..\..\..\components\net\netdev\src\netdev_ipaddr.c - - - - - dfs_net.c - 1 - ..\..\..\components\net\sal\dfs_net\dfs_net.c - - - - - af_inet_at.c - 1 - ..\..\..\components\net\sal\impl\af_inet_at.c - - - - - net_netdb.c - 1 - ..\..\..\components\net\sal\socket\net_netdb.c - - - - - net_sockets.c - 1 - ..\..\..\components\net\sal\socket\net_sockets.c - - - - - sal_socket.c - 1 - ..\..\..\components\net\sal\src\sal_socket.c - - - - - Sensors - - - sensor_cmd.c - 1 - ..\..\..\components\drivers\sensors\sensor_cmd.c - - - - - sensor.c - 1 - ..\..\..\components\drivers\sensors\sensor.c - - - - - UTest - - - utest.c - 1 - ..\..\..\components\utilities\utest\utest.c - - - - - - - - - - - - - - - - - - -
diff --git a/bsp/nuvoton/numaker-iot-m487/rtconfig.h b/bsp/nuvoton/numaker-iot-m487/rtconfig.h deleted file mode 100644 index 78a3082c5b..0000000000 --- a/bsp/nuvoton/numaker-iot-m487/rtconfig.h +++ /dev/null @@ -1,398 +0,0 @@ -#ifndef RT_CONFIG_H__ -#define RT_CONFIG_H__ - -/* Automatically generated file; DO NOT EDIT. */ -/* RT-Thread Configuration */ - -/* RT-Thread Kernel */ - -#define RT_NAME_MAX 8 -#define RT_ALIGN_SIZE 4 -#define RT_THREAD_PRIORITY_32 -#define RT_THREAD_PRIORITY_MAX 32 -#define RT_TICK_PER_SECOND 1000 -#define RT_USING_OVERFLOW_CHECK -#define RT_USING_HOOK -#define RT_HOOK_USING_FUNC_PTR -#define RT_USING_IDLE_HOOK -#define RT_IDLE_HOOK_LIST_SIZE 4 -#define IDLE_THREAD_STACK_SIZE 1024 - -/* kservice optimization */ - -#define RT_DEBUG -#define RT_DEBUG_COLOR - -/* Inter-Thread communication */ - -#define RT_USING_SEMAPHORE -#define RT_USING_MUTEX -#define RT_USING_EVENT -#define RT_USING_MAILBOX -#define RT_USING_MESSAGEQUEUE -#define RT_USING_SIGNALS - -/* Memory Management */ - -#define RT_USING_MEMPOOL -#define RT_USING_SMALL_MEM -#define RT_USING_SMALL_MEM_AS_HEAP -#define RT_USING_HEAP - -/* Kernel Device Object */ - -#define RT_USING_DEVICE -#define RT_USING_CONSOLE -#define RT_CONSOLEBUF_SIZE 256 -#define RT_CONSOLE_DEVICE_NAME "uart0" -#define RT_VER_NUM 0x40101 -#define ARCH_ARM -#define RT_USING_CPU_FFS -#define ARCH_ARM_CORTEX_M -#define ARCH_ARM_CORTEX_M4 - -/* RT-Thread Components */ - -#define RT_USING_COMPONENTS_INIT -#define RT_USING_USER_MAIN -#define RT_MAIN_THREAD_STACK_SIZE 2048 -#define RT_MAIN_THREAD_PRIORITY 10 -#define RT_USING_MSH -#define RT_USING_FINSH -#define FINSH_USING_MSH -#define FINSH_THREAD_NAME "tshell" -#define FINSH_THREAD_PRIORITY 20 -#define FINSH_THREAD_STACK_SIZE 2048 -#define FINSH_USING_HISTORY -#define FINSH_HISTORY_LINES 5 -#define FINSH_USING_SYMTAB -#define FINSH_CMD_SIZE 80 -#define MSH_USING_BUILT_IN_COMMANDS -#define FINSH_USING_DESCRIPTION -#define FINSH_ARG_MAX 10 -#define RT_USING_DFS -#define DFS_USING_POSIX -#define DFS_USING_WORKDIR -#define DFS_FILESYSTEMS_MAX 8 -#define DFS_FILESYSTEM_TYPES_MAX 4 -#define DFS_FD_MAX 32 -#define RT_USING_DFS_MNTTABLE -#define RT_USING_DFS_ELMFAT - -/* elm-chan's FatFs, Generic FAT Filesystem Module */ - -#define RT_DFS_ELM_CODE_PAGE 437 -#define RT_DFS_ELM_WORD_ACCESS -#define RT_DFS_ELM_USE_LFN_3 -#define RT_DFS_ELM_USE_LFN 3 -#define RT_DFS_ELM_LFN_UNICODE_0 -#define RT_DFS_ELM_LFN_UNICODE 0 -#define RT_DFS_ELM_MAX_LFN 255 -#define RT_DFS_ELM_DRIVES 8 -#define RT_DFS_ELM_MAX_SECTOR_SIZE 4096 -#define RT_DFS_ELM_REENTRANT -#define RT_DFS_ELM_MUTEX_TIMEOUT 3000 -#define RT_USING_DFS_DEVFS -#define RT_USING_FAL -#define FAL_DEBUG_CONFIG -#define FAL_DEBUG 1 -#define FAL_PART_HAS_TABLE_CFG - -/* Device Drivers */ - -#define RT_USING_DEVICE_IPC -#define RT_USING_SYSTEM_WORKQUEUE -#define RT_SYSTEM_WORKQUEUE_STACKSIZE 2048 -#define RT_SYSTEM_WORKQUEUE_PRIORITY 23 -#define RT_USING_SERIAL -#define RT_USING_SERIAL_V1 -#define RT_SERIAL_USING_DMA -#define RT_SERIAL_RB_BUFSZ 2048 -#define RT_USING_CAN -#define RT_USING_HWTIMER -#define RT_USING_I2C -#define RT_USING_I2C_BITOPS -#define RT_USING_PIN -#define RT_USING_ADC -#define RT_USING_PWM -#define RT_USING_PM -#define PM_TICKLESS_THRESHOLD_TIME 2 -#define RT_USING_RTC -#define RT_USING_SDIO -#define RT_SDIO_STACK_SIZE 2048 -#define RT_SDIO_THREAD_PRIORITY 15 -#define RT_MMCSD_STACK_SIZE 2048 -#define RT_MMCSD_THREAD_PREORITY 22 -#define RT_MMCSD_MAX_PARTITION 16 -#define RT_USING_SPI -#define RT_USING_QSPI -#define RT_USING_SFUD -#define RT_SFUD_USING_SFDP -#define RT_SFUD_USING_FLASH_INFO_TABLE -#define RT_SFUD_SPI_MAX_HZ 50000000 -#define RT_USING_WDT -#define RT_USING_AUDIO -#define RT_AUDIO_REPLAY_MP_BLOCK_SIZE 4096 -#define RT_AUDIO_REPLAY_MP_BLOCK_COUNT 2 -#define RT_AUDIO_RECORD_PIPE_SIZE 2048 -#define RT_USING_SENSOR -#define RT_USING_SENSOR_CMD -#define RT_USING_HWCRYPTO -#define RT_HWCRYPTO_DEFAULT_NAME "hwcryto" -#define RT_HWCRYPTO_IV_MAX_SIZE 16 -#define RT_HWCRYPTO_KEYBIT_MAX_SIZE 256 -#define RT_HWCRYPTO_USING_AES -#define RT_HWCRYPTO_USING_AES_ECB -#define RT_HWCRYPTO_USING_AES_CBC -#define RT_HWCRYPTO_USING_AES_CFB -#define RT_HWCRYPTO_USING_AES_CTR -#define RT_HWCRYPTO_USING_AES_OFB -#define RT_HWCRYPTO_USING_DES -#define RT_HWCRYPTO_USING_DES_ECB -#define RT_HWCRYPTO_USING_DES_CBC -#define RT_HWCRYPTO_USING_3DES -#define RT_HWCRYPTO_USING_3DES_ECB -#define RT_HWCRYPTO_USING_3DES_CBC -#define RT_HWCRYPTO_USING_SHA1 -#define RT_HWCRYPTO_USING_SHA2 -#define RT_HWCRYPTO_USING_SHA2_224 -#define RT_HWCRYPTO_USING_SHA2_256 -#define RT_HWCRYPTO_USING_SHA2_384 -#define RT_HWCRYPTO_USING_SHA2_512 -#define RT_HWCRYPTO_USING_RNG -#define RT_HWCRYPTO_USING_CRC -#define RT_HWCRYPTO_USING_CRC_07 -#define RT_HWCRYPTO_USING_CRC_8005 -#define RT_HWCRYPTO_USING_CRC_1021 -#define RT_HWCRYPTO_USING_CRC_04C11DB7 - -/* Using USB */ - -#define RT_USING_USB -#define RT_USING_USB_HOST -#define RT_USBH_MSTORAGE -#define UDISK_MOUNTPOINT "/mnt/udisk/" -#define RT_USING_USB_DEVICE -#define RT_USBD_THREAD_STACK_SZ 4096 -#define USB_VENDOR_ID 0x0FFE -#define USB_PRODUCT_ID 0x0001 -#define _RT_USB_DEVICE_HID -#define RT_USB_DEVICE_HID -#define RT_USB_DEVICE_HID_MOUSE - -/* C/C++ and POSIX layer */ - -#define RT_LIBC_DEFAULT_TIMEZONE 8 - -/* POSIX (Portable Operating System Interface) layer */ - -#define RT_USING_POSIX_FS -#define RT_USING_POSIX_DEVIO -#define RT_USING_POSIX_POLL -#define RT_USING_POSIX_SELECT - -/* Interprocess Communication (IPC) */ - - -/* Socket is in the 'Network' category */ - - -/* Network */ - -#define RT_USING_SAL -#define SAL_INTERNET_CHECK - -/* Docking with protocol stacks */ - -#define SAL_USING_AT -#define SAL_USING_POSIX -#define RT_USING_NETDEV -#define NETDEV_USING_IFCONFIG -#define NETDEV_USING_PING -#define NETDEV_USING_NETSTAT -#define NETDEV_USING_AUTO_DEFAULT -#define NETDEV_IPV4 1 -#define NETDEV_IPV6 0 -#define RT_USING_AT -#define AT_USING_CLIENT -#define AT_CLIENT_NUM_MAX 1 -#define AT_USING_SOCKET -#define AT_USING_CLI -#define AT_CMD_MAX_LEN 512 -#define AT_SW_VERSION_NUM 0x10301 - -/* Utilities */ - -#define RT_USING_UTEST -#define UTEST_THR_STACK_SIZE 4096 -#define UTEST_THR_PRIORITY 20 - -/* RT-Thread Utestcases */ - - -/* RT-Thread online packages */ - -/* IoT - internet of things */ - - -/* Wi-Fi */ - -/* Marvell WiFi */ - - -/* Wiced WiFi */ - -#define PKG_USING_AT_DEVICE -#define AT_DEVICE_USING_ESP8266 -#define AT_DEVICE_ESP8266_INIT_ASYN -#define AT_DEVICE_ESP8266_SOCKET -#define PKG_USING_AT_DEVICE_LATEST_VERSION -#define PKG_AT_DEVICE_VER_NUM 0x99999 - -/* IoT Cloud */ - - -/* security packages */ - - -/* language packages */ - -/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ - - -/* XML: Extensible Markup Language */ - - -/* multimedia packages */ - -/* LVGL: powerful and easy-to-use embedded GUI library */ - - -/* u8g2: a monochrome graphic library */ - - -/* PainterEngine: A cross-platform graphics application framework written in C language */ - - -/* tools packages */ - - -/* system packages */ - -/* enhanced kernel services */ - - -/* acceleration: Assembly language or algorithmic acceleration packages */ - - -/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ - - -/* Micrium: Micrium software products porting for RT-Thread */ - - -/* peripheral libraries and drivers */ - - -/* Kendryte SDK */ - - -/* AI packages */ - - -/* miscellaneous packages */ - -/* project laboratory */ - -/* samples: kernel and components samples */ - - -/* entertainment: terminal games and other interesting software packages */ - - -/* Privated Packages of RealThread */ - - -/* Network Utilities */ - - -/* RT-Thread Smart */ - - -/* Hardware Drivers Config */ - -/* On-chip Peripheral Drivers */ - -#define SOC_SERIES_M480 -#define BSP_USE_STDDRIVER_SOURCE -#define BSP_USING_PDMA -#define NU_PDMA_MEMFUN_ACTOR_MAX 2 -#define NU_PDMA_SGTBL_POOL_SIZE 16 -#define BSP_USING_FMC -#define BSP_USING_GPIO -#define BSP_USING_CLK -#define NU_CLK_INVOKE_WKTMR -#define BSP_USING_RTC -#define NU_RTC_SUPPORT_MSH_CMD -#define BSP_USING_TMR -#define BSP_USING_UART -#define BSP_USING_UART0 -#define BSP_USING_UART1 -#define BSP_USING_UART1_TX_DMA -#define BSP_USING_UART1_RX_DMA -#define BSP_USING_UART2 -#define BSP_USING_UART2_TX_DMA -#define BSP_USING_UART2_RX_DMA -#define BSP_USING_I2C -#define BSP_USING_I2C0 -#define BSP_USING_I2C1 -#define BSP_USING_I2C2 -#define BSP_USING_USCI -#define BSP_USING_UUART -#define BSP_USING_USCI0 -#define BSP_USING_UUART0 -#define BSP_USING_UUART0_TX_DMA -#define BSP_USING_UUART0_RX_DMA -#define BSP_USING_SDH -#define BSP_USING_SDH0 -#define BSP_USING_SPI -#define BSP_USING_SPI_PDMA -#define BSP_USING_SPI0_NONE -#define BSP_USING_SPI1 -#define BSP_USING_SPI1_PDMA -#define BSP_USING_SPI2 -#define BSP_USING_SPI3_NONE -#define BSP_USING_I2S -#define NU_I2S_DMA_FIFO_SIZE 2048 -#define BSP_USING_QSPI -#define BSP_USING_QSPI0 -#define BSP_USING_CRYPTO -#define BSP_USING_CRC -#define NU_CRC_USE_PDMA -#define BSP_USING_WDT -#define BSP_USING_USBD -#define BSP_USING_HSUSBH -#define NU_USBHOST_HUB_POLLING_INTERVAL 100 - -/* On-board Peripheral Drivers */ - -#define BSP_USING_NULINKME -#define BOARD_USING_ESP8266 -#define BOARD_USING_BMX055 -#define BOARD_USING_NAU88L25 -#define BOARD_USING_STORAGE_SDCARD -#define BOARD_USING_STORAGE_SPIFLASH -#define BOARD_USING_USB_D_H -#define BOARD_USING_HSUSBH_USBD - -/* Board extended module drivers */ - - -/* Nuvoton Packages Config */ - -#define NU_PKG_USING_UTILS -#define NU_PKG_USING_DEMO -#define NU_PKG_USING_BMX055 -#define NU_PKG_USING_NAU88L25 - -#endif diff --git a/bsp/nuvoton/numaker-iot-ma35d1/.config b/bsp/nuvoton/numaker-iot-ma35d1/.config new file mode 100644 index 0000000000..4008893646 --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/.config @@ -0,0 +1,1381 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# +CONFIG_USE_MA35D1_AARCH32=y + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_SMART is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_ALIGN_SIZE=32 +# CONFIG_RT_THREAD_PRIORITY_8 is not set +CONFIG_RT_THREAD_PRIORITY_32=y +# CONFIG_RT_THREAD_PRIORITY_256 is not set +CONFIG_RT_THREAD_PRIORITY_MAX=32 +CONFIG_RT_TICK_PER_SECOND=1000 +CONFIG_RT_USING_OVERFLOW_CHECK=y +CONFIG_RT_USING_HOOK=y +CONFIG_RT_HOOK_USING_FUNC_PTR=y +CONFIG_RT_USING_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=4096 +CONFIG_RT_USING_TIMER_SOFT=y +CONFIG_RT_TIMER_THREAD_PRIO=4 +CONFIG_RT_TIMER_THREAD_STACK_SIZE=4096 + +# +# kservice optimization +# +CONFIG_RT_KSERVICE_USING_STDLIB=y +# CONFIG_RT_KSERVICE_USING_STDLIB_MEMORY is not set +# CONFIG_RT_KSERVICE_USING_TINY_SIZE is not set +# CONFIG_RT_USING_TINY_FFS is not set +# CONFIG_RT_KPRINTF_USING_LONGLONG is not set +CONFIG_RT_DEBUG=y +CONFIG_RT_DEBUG_COLOR=y +# CONFIG_RT_DEBUG_INIT_CONFIG is not set +# CONFIG_RT_DEBUG_THREAD_CONFIG is not set +# CONFIG_RT_DEBUG_SCHEDULER_CONFIG is not set +# CONFIG_RT_DEBUG_IPC_CONFIG is not set +# CONFIG_RT_DEBUG_TIMER_CONFIG is not set +# CONFIG_RT_DEBUG_IRQ_CONFIG is not set +# CONFIG_RT_DEBUG_MEM_CONFIG is not set +# CONFIG_RT_DEBUG_SLAB_CONFIG is not set +# CONFIG_RT_DEBUG_MEMHEAP_CONFIG is not set +# CONFIG_RT_DEBUG_MODULE_CONFIG is not set + +# +# Inter-Thread communication +# +CONFIG_RT_USING_SEMAPHORE=y +CONFIG_RT_USING_MUTEX=y +CONFIG_RT_USING_EVENT=y +CONFIG_RT_USING_MAILBOX=y +CONFIG_RT_USING_MESSAGEQUEUE=y +# CONFIG_RT_USING_SIGNALS is not set + +# +# Memory Management +# +CONFIG_RT_USING_MEMPOOL=y +CONFIG_RT_USING_SMALL_MEM=y +# CONFIG_RT_USING_SLAB is not set +CONFIG_RT_USING_MEMHEAP=y +CONFIG_RT_MEMHEAP_FAST_MODE=y +# CONFIG_RT_MEMHEAP_BEST_MODE is not set +CONFIG_RT_USING_SMALL_MEM_AS_HEAP=y +# CONFIG_RT_USING_MEMHEAP_AS_HEAP is not set +# CONFIG_RT_USING_SLAB_AS_HEAP is not set +# CONFIG_RT_USING_USERHEAP is not set +# CONFIG_RT_USING_NOHEAP is not set +# CONFIG_RT_USING_MEMTRACE is not set +# CONFIG_RT_USING_HEAP_ISR is not set +CONFIG_RT_USING_HEAP=y + +# +# Kernel Device Object +# +CONFIG_RT_USING_DEVICE=y +# CONFIG_RT_USING_DEVICE_OPS is not set +# CONFIG_RT_USING_DM is not set +CONFIG_RT_USING_INTERRUPT_INFO=y +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=4096 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart0" +CONFIG_RT_VER_NUM=0x50000 +CONFIG_RT_USING_CACHE=y +# CONFIG_ARCH_ARM_BOOTWITH_FLUSH_CACHE is not set +# CONFIG_ARCH_CPU_STACK_GROWS_UPWARD is not set +CONFIG_RT_USING_CPU_FFS=y +CONFIG_ARCH_MM_MMU=y +CONFIG_ARCH_ARM=y +CONFIG_ARCH_ARM_MMU=y +CONFIG_ARCH_ARM_CORTEX_A=y +CONFIG_RT_SMP_AUTO_BOOT=y +CONFIG_RT_USING_GIC_V2=y +# CONFIG_RT_USING_GIC_V3 is not set +# CONFIG_ARCH_ARM_SECURE_MODE is not set +# CONFIG_RT_BACKTRACE_FUNCTION_NAME is not set +CONFIG_ARCH_ARMV8=y + +# +# RT-Thread Components +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=4096 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 +CONFIG_RT_USING_LEGACY=y +CONFIG_RT_USING_MSH=y +CONFIG_RT_USING_FINSH=y +CONFIG_FINSH_USING_MSH=y +CONFIG_FINSH_THREAD_NAME="tshell" +CONFIG_FINSH_THREAD_PRIORITY=20 +CONFIG_FINSH_THREAD_STACK_SIZE=4096 +CONFIG_FINSH_USING_HISTORY=y +CONFIG_FINSH_HISTORY_LINES=5 +CONFIG_FINSH_USING_SYMTAB=y +CONFIG_FINSH_CMD_SIZE=128 +CONFIG_MSH_USING_BUILT_IN_COMMANDS=y +CONFIG_FINSH_USING_DESCRIPTION=y +# CONFIG_FINSH_ECHO_DISABLE_DEFAULT is not set +# CONFIG_FINSH_USING_AUTH is not set +CONFIG_FINSH_ARG_MAX=10 +CONFIG_RT_USING_DFS=y +CONFIG_DFS_USING_POSIX=y +CONFIG_DFS_USING_WORKDIR=y +CONFIG_DFS_FILESYSTEMS_MAX=32 +CONFIG_DFS_FILESYSTEM_TYPES_MAX=32 +CONFIG_DFS_FD_MAX=128 +CONFIG_RT_USING_DFS_MNTTABLE=y +CONFIG_RT_USING_DFS_ELMFAT=y + +# +# elm-chan's FatFs, Generic FAT Filesystem Module +# +CONFIG_RT_DFS_ELM_CODE_PAGE=437 +CONFIG_RT_DFS_ELM_WORD_ACCESS=y +# CONFIG_RT_DFS_ELM_USE_LFN_0 is not set +# CONFIG_RT_DFS_ELM_USE_LFN_1 is not set +# CONFIG_RT_DFS_ELM_USE_LFN_2 is not set +CONFIG_RT_DFS_ELM_USE_LFN_3=y +CONFIG_RT_DFS_ELM_USE_LFN=3 +CONFIG_RT_DFS_ELM_LFN_UNICODE_0=y +# CONFIG_RT_DFS_ELM_LFN_UNICODE_1 is not set +# CONFIG_RT_DFS_ELM_LFN_UNICODE_2 is not set +# CONFIG_RT_DFS_ELM_LFN_UNICODE_3 is not set +CONFIG_RT_DFS_ELM_LFN_UNICODE=0 +CONFIG_RT_DFS_ELM_MAX_LFN=255 +CONFIG_RT_DFS_ELM_DRIVES=8 +CONFIG_RT_DFS_ELM_MAX_SECTOR_SIZE=512 +# CONFIG_RT_DFS_ELM_USE_ERASE is not set +CONFIG_RT_DFS_ELM_REENTRANT=y +CONFIG_RT_DFS_ELM_MUTEX_TIMEOUT=3000 +CONFIG_RT_USING_DFS_DEVFS=y +# CONFIG_RT_USING_DFS_ROMFS is not set +# CONFIG_RT_USING_DFS_CROMFS is not set +# CONFIG_RT_USING_DFS_RAMFS is not set +# CONFIG_RT_USING_DFS_TMPFS is not set +# CONFIG_RT_USING_DFS_NFS is not set +# CONFIG_RT_USING_FAL is not set + +# +# Device Drivers +# +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_UNAMED_PIPE_NUMBER=64 +CONFIG_RT_USING_SYSTEM_WORKQUEUE=y +CONFIG_RT_SYSTEM_WORKQUEUE_STACKSIZE=2048 +CONFIG_RT_SYSTEM_WORKQUEUE_PRIORITY=23 +CONFIG_RT_USING_SERIAL=y +CONFIG_RT_USING_SERIAL_V1=y +# CONFIG_RT_USING_SERIAL_V2 is not set +CONFIG_RT_SERIAL_USING_DMA=y +CONFIG_RT_SERIAL_RB_BUFSZ=256 +CONFIG_RT_USING_CAN=y +# CONFIG_RT_CAN_USING_HDR is not set +# CONFIG_RT_CAN_USING_CANFD is not set +CONFIG_RT_USING_HWTIMER=y +# CONFIG_RT_USING_CPUTIME is not set +CONFIG_RT_USING_I2C=y +# CONFIG_RT_I2C_DEBUG is not set +CONFIG_RT_USING_I2C_BITOPS=y +# CONFIG_RT_I2C_BITOPS_DEBUG is not set +# CONFIG_RT_USING_PHY is not set +CONFIG_RT_USING_PIN=y +CONFIG_RT_USING_ADC=y +# CONFIG_RT_USING_DAC is not set +# CONFIG_RT_USING_NULL is not set +# CONFIG_RT_USING_ZERO is not set +# CONFIG_RT_USING_RANDOM is not set +CONFIG_RT_USING_PWM=y +# CONFIG_RT_USING_MTD_NOR is not set +CONFIG_RT_USING_MTD_NAND=y +CONFIG_RT_MTD_NAND_DEBUG=y +# CONFIG_RT_USING_PM is not set +# CONFIG_RT_USING_FDT is not set +CONFIG_RT_USING_RTC=y +# CONFIG_RT_USING_ALARM is not set +# CONFIG_RT_USING_SOFT_RTC is not set +CONFIG_RT_USING_SDIO=y +CONFIG_RT_SDIO_STACK_SIZE=4096 +CONFIG_RT_SDIO_THREAD_PRIORITY=15 +CONFIG_RT_MMCSD_STACK_SIZE=4096 +CONFIG_RT_MMCSD_THREAD_PREORITY=22 +CONFIG_RT_MMCSD_MAX_PARTITION=8 +# CONFIG_RT_SDIO_DEBUG is not set +CONFIG_RT_USING_SPI=y +# CONFIG_RT_USING_SPI_BITOPS is not set +CONFIG_RT_USING_QSPI=y +# CONFIG_RT_USING_SPI_MSD is not set +# CONFIG_RT_USING_SFUD is not set +# CONFIG_RT_USING_ENC28J60 is not set +# CONFIG_RT_USING_SPI_WIFI is not set +# CONFIG_RT_USING_WDT is not set +CONFIG_RT_USING_AUDIO=y +CONFIG_RT_AUDIO_REPLAY_MP_BLOCK_SIZE=4096 +CONFIG_RT_AUDIO_REPLAY_MP_BLOCK_COUNT=2 +CONFIG_RT_AUDIO_RECORD_PIPE_SIZE=2048 +# CONFIG_RT_USING_SENSOR is not set +# CONFIG_RT_USING_TOUCH is not set +# CONFIG_RT_USING_LCD is not set +# CONFIG_RT_USING_HWCRYPTO is not set +# CONFIG_RT_USING_PULSE_ENCODER is not set +# CONFIG_RT_USING_INPUT_CAPTURE is not set +# CONFIG_RT_USING_DEV_BUS is not set +# CONFIG_RT_USING_WIFI is not set +# CONFIG_RT_USING_VIRTIO is not set + +# +# Using USB +# +CONFIG_RT_USING_USB=y +CONFIG_RT_USING_USB_HOST=y +CONFIG_RT_USBH_MSTORAGE=y +CONFIG_UDISK_MOUNTPOINT="/mnt/udisk" +# CONFIG_RT_USBH_HID is not set +# CONFIG_RT_USING_USB_DEVICE is not set +CONFIG_RT_USBD_THREAD_STACK_SZ=4096 + +# +# C/C++ and POSIX layer +# +CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8 + +# +# POSIX (Portable Operating System Interface) layer +# +CONFIG_RT_USING_POSIX_FS=y +# CONFIG_RT_USING_POSIX_DEVIO is not set +# CONFIG_RT_USING_POSIX_STDIO is not set +CONFIG_RT_USING_POSIX_POLL=y +CONFIG_RT_USING_POSIX_SELECT=y +CONFIG_RT_USING_POSIX_SOCKET=y +# CONFIG_RT_USING_POSIX_TERMIOS is not set +# CONFIG_RT_USING_POSIX_AIO is not set +# CONFIG_RT_USING_POSIX_MMAN is not set +CONFIG_RT_USING_POSIX_DELAY=y +CONFIG_RT_USING_POSIX_CLOCK=y +# CONFIG_RT_USING_POSIX_TIMER is not set +CONFIG_RT_USING_PTHREADS=y +CONFIG_PTHREAD_NUM_MAX=8 +CONFIG_RT_USING_MODULE=y +CONFIG_RT_USING_CUSTOM_DLMODULE=y + +# +# Interprocess Communication (IPC) +# +# CONFIG_RT_USING_POSIX_PIPE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_QUEUE is not set +# CONFIG_RT_USING_POSIX_MESSAGE_SEMAPHORE is not set + +# +# Socket is in the 'Network' category +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Network +# +CONFIG_RT_USING_SAL=y +CONFIG_SAL_INTERNET_CHECK=y + +# +# Docking with protocol stacks +# +CONFIG_SAL_USING_LWIP=y +# CONFIG_SAL_USING_AT is not set +# CONFIG_SAL_USING_TLS is not set +CONFIG_SAL_USING_POSIX=y +CONFIG_RT_USING_NETDEV=y +CONFIG_NETDEV_USING_IFCONFIG=y +CONFIG_NETDEV_USING_PING=y +CONFIG_NETDEV_USING_NETSTAT=y +CONFIG_NETDEV_USING_AUTO_DEFAULT=y +# CONFIG_NETDEV_USING_IPV6 is not set +CONFIG_NETDEV_IPV4=1 +CONFIG_NETDEV_IPV6=0 +# CONFIG_NETDEV_IPV6_SCOPES is not set +CONFIG_RT_USING_LWIP=y +# CONFIG_RT_USING_LWIP_LOCAL_VERSION is not set +# CONFIG_RT_USING_LWIP141 is not set +# CONFIG_RT_USING_LWIP203 is not set +CONFIG_RT_USING_LWIP212=y +# CONFIG_RT_USING_LWIP_LATEST is not set +CONFIG_RT_USING_LWIP_VER_NUM=0x20102 +# CONFIG_RT_USING_LWIP_IPV6 is not set +CONFIG_RT_LWIP_MEM_ALIGNMENT=32 +CONFIG_RT_LWIP_IGMP=y +CONFIG_RT_LWIP_ICMP=y +# CONFIG_RT_LWIP_SNMP is not set +CONFIG_RT_LWIP_DNS=y +CONFIG_RT_LWIP_DHCP=y +CONFIG_IP_SOF_BROADCAST=1 +CONFIG_IP_SOF_BROADCAST_RECV=1 + +# +# Static IPv4 Address +# +CONFIG_RT_LWIP_IPADDR="192.168.31.55" +CONFIG_RT_LWIP_GWADDR="192.168.31.1" +CONFIG_RT_LWIP_MSKADDR="255.255.255.0" +CONFIG_RT_LWIP_UDP=y +CONFIG_RT_LWIP_TCP=y +CONFIG_RT_LWIP_RAW=y +# CONFIG_RT_LWIP_PPP is not set +CONFIG_RT_MEMP_NUM_NETCONN=32 +CONFIG_RT_LWIP_PBUF_NUM=8192 +CONFIG_RT_LWIP_RAW_PCB_NUM=32 +CONFIG_RT_LWIP_UDP_PCB_NUM=32 +CONFIG_RT_LWIP_TCP_PCB_NUM=32 +CONFIG_RT_LWIP_TCP_SEG_NUM=1024 +CONFIG_RT_LWIP_TCP_SND_BUF=8192 +CONFIG_RT_LWIP_TCP_WND=10240 +CONFIG_RT_LWIP_TCPTHREAD_PRIORITY=10 +CONFIG_RT_LWIP_TCPTHREAD_MBOX_SIZE=8192 +CONFIG_RT_LWIP_TCPTHREAD_STACKSIZE=4096 +# CONFIG_LWIP_NO_RX_THREAD is not set +# CONFIG_LWIP_NO_TX_THREAD is not set +CONFIG_RT_LWIP_ETHTHREAD_PRIORITY=12 +CONFIG_RT_LWIP_ETHTHREAD_STACKSIZE=4096 +CONFIG_RT_LWIP_ETHTHREAD_MBOX_SIZE=8192 +CONFIG_RT_LWIP_REASSEMBLY_FRAG=y +CONFIG_LWIP_NETIF_STATUS_CALLBACK=1 +CONFIG_LWIP_NETIF_LINK_CALLBACK=1 +CONFIG_SO_REUSE=1 +CONFIG_LWIP_SO_RCVTIMEO=1 +CONFIG_LWIP_SO_SNDTIMEO=1 +CONFIG_LWIP_SO_RCVBUF=1 +CONFIG_LWIP_SO_LINGER=0 +CONFIG_RT_LWIP_NETIF_LOOPBACK=y +CONFIG_LWIP_NETIF_LOOPBACK=1 +CONFIG_RT_LWIP_STATS=y +CONFIG_RT_LWIP_USING_HW_CHECKSUM=y +CONFIG_RT_LWIP_USING_PING=y +# CONFIG_LWIP_USING_DHCPD is not set +# CONFIG_RT_LWIP_DEBUG is not set +# CONFIG_RT_USING_AT is not set + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +CONFIG_RT_USING_ULOG=y +# CONFIG_ULOG_OUTPUT_LVL_A is not set +# CONFIG_ULOG_OUTPUT_LVL_E is not set +# CONFIG_ULOG_OUTPUT_LVL_W is not set +# CONFIG_ULOG_OUTPUT_LVL_I is not set +CONFIG_ULOG_OUTPUT_LVL_D=y +CONFIG_ULOG_OUTPUT_LVL=7 +CONFIG_ULOG_USING_ISR_LOG=y +CONFIG_ULOG_ASSERT_ENABLE=y +CONFIG_ULOG_LINE_BUF_SIZE=128 +# CONFIG_ULOG_USING_ASYNC_OUTPUT is not set + +# +# log format +# +# CONFIG_ULOG_OUTPUT_FLOAT is not set +CONFIG_ULOG_USING_COLOR=y +CONFIG_ULOG_OUTPUT_TIME=y +# CONFIG_ULOG_TIME_USING_TIMESTAMP is not set +CONFIG_ULOG_OUTPUT_LEVEL=y +CONFIG_ULOG_OUTPUT_TAG=y +# CONFIG_ULOG_OUTPUT_THREAD_NAME is not set +CONFIG_ULOG_BACKEND_USING_CONSOLE=y +# CONFIG_ULOG_BACKEND_USING_FILE is not set +# CONFIG_ULOG_USING_FILTER is not set +# CONFIG_ULOG_USING_SYSLOG is not set +CONFIG_RT_USING_UTEST=y +CONFIG_UTEST_THR_STACK_SIZE=4096 +CONFIG_UTEST_THR_PRIORITY=20 +# CONFIG_RT_USING_VAR_EXPORT is not set +# CONFIG_RT_USING_RT_LINK is not set +# CONFIG_RT_USING_VBUS is not set + +# +# RT-Thread Utestcases +# +CONFIG_RT_USING_UTESTCASES=y + +# +# Utest Self Testcase +# +CONFIG_UTEST_SELF_PASS_TC=y + +# +# Kernel Testcase +# +CONFIG_UTEST_MEMHEAP_TC=y +CONFIG_UTEST_SMALL_MEM_TC=y +# CONFIG_UTEST_IRQ_TC is not set +# CONFIG_UTEST_SEMAPHORE_TC is not set +# CONFIG_UTEST_EVENT_TC is not set +# CONFIG_UTEST_TIMER_TC is not set +# CONFIG_UTEST_MESSAGEQUEUE_TC is not set +# CONFIG_UTEST_SIGNAL_TC is not set +# CONFIG_UTEST_MUTEX_TC is not set +# CONFIG_UTEST_MAILBOX_TC is not set +# CONFIG_UTEST_THREAD_TC is not set + +# +# CPP11 Testcase +# +# CONFIG_UTEST_CPP11_THREAD_TC is not set + +# +# Utest Serial Testcase +# +# CONFIG_UTEST_SERIAL_TC is not set + +# +# RTT Posix Testcase +# +# CONFIG_RTT_POSIX_TESTCASE is not set + +# +# RT-Thread online packages +# + +# +# IoT - internet of things +# +# CONFIG_PKG_USING_LWIP is not set +# CONFIG_PKG_USING_LORAWAN_DRIVER is not set +# CONFIG_PKG_USING_PAHOMQTT is not set +# CONFIG_PKG_USING_UMQTT is not set +# CONFIG_PKG_USING_WEBCLIENT is not set +# CONFIG_PKG_USING_WEBNET is not set +# CONFIG_PKG_USING_MONGOOSE is not set +# CONFIG_PKG_USING_MYMQTT is not set +# CONFIG_PKG_USING_KAWAII_MQTT is not set +# CONFIG_PKG_USING_BC28_MQTT is not set +# CONFIG_PKG_USING_WEBTERMINAL is not set +# CONFIG_PKG_USING_LIBMODBUS is not set +# CONFIG_PKG_USING_FREEMODBUS is not set +# CONFIG_PKG_USING_NANOPB is not set + +# +# Wi-Fi +# + +# +# Marvell WiFi +# +# CONFIG_PKG_USING_WLANMARVELL is not set + +# +# Wiced WiFi +# +# CONFIG_PKG_USING_WLAN_WICED is not set +# CONFIG_PKG_USING_RW007 is not set +# CONFIG_PKG_USING_COAP is not set +# CONFIG_PKG_USING_NOPOLL is not set +# CONFIG_PKG_USING_NETUTILS is not set +# CONFIG_PKG_USING_CMUX is not set +# CONFIG_PKG_USING_PPP_DEVICE is not set +# CONFIG_PKG_USING_AT_DEVICE is not set +# CONFIG_PKG_USING_ATSRV_SOCKET is not set +# CONFIG_PKG_USING_WIZNET is not set +# CONFIG_PKG_USING_ZB_COORDINATOR is not set + +# +# IoT Cloud +# +# CONFIG_PKG_USING_ONENET is not set +# CONFIG_PKG_USING_GAGENT_CLOUD is not set +# CONFIG_PKG_USING_ALI_IOTKIT is not set +# CONFIG_PKG_USING_AZURE is not set +# CONFIG_PKG_USING_TENCENT_IOT_EXPLORER is not set +# CONFIG_PKG_USING_JIOT-C-SDK is not set +# CONFIG_PKG_USING_UCLOUD_IOT_SDK is not set +# CONFIG_PKG_USING_JOYLINK is not set +# CONFIG_PKG_USING_EZ_IOT_OS is not set +# CONFIG_PKG_USING_IOTSHARP_SDK is not set +# CONFIG_PKG_USING_NIMBLE is not set +# CONFIG_PKG_USING_LLSYNC_SDK_ADAPTER is not set +# CONFIG_PKG_USING_OTA_DOWNLOADER is not set +# CONFIG_PKG_USING_IPMSG is not set +# CONFIG_PKG_USING_LSSDP is not set +# CONFIG_PKG_USING_AIRKISS_OPEN is not set +# CONFIG_PKG_USING_LIBRWS is not set +# CONFIG_PKG_USING_TCPSERVER is not set +# CONFIG_PKG_USING_PROTOBUF_C is not set +# CONFIG_PKG_USING_DLT645 is not set +# CONFIG_PKG_USING_QXWZ is not set +# CONFIG_PKG_USING_SMTP_CLIENT is not set +# CONFIG_PKG_USING_ABUP_FOTA is not set +# CONFIG_PKG_USING_LIBCURL2RTT is not set +# CONFIG_PKG_USING_CAPNP is not set +# CONFIG_PKG_USING_AGILE_TELNET is not set +# CONFIG_PKG_USING_NMEALIB is not set +# CONFIG_PKG_USING_PDULIB is not set +# CONFIG_PKG_USING_BTSTACK is not set +# CONFIG_PKG_USING_LORAWAN_ED_STACK is not set +# CONFIG_PKG_USING_WAYZ_IOTKIT is not set +# CONFIG_PKG_USING_MAVLINK is not set +# CONFIG_PKG_USING_BSAL is not set +# CONFIG_PKG_USING_AGILE_MODBUS is not set +# CONFIG_PKG_USING_AGILE_FTP is not set +# CONFIG_PKG_USING_EMBEDDEDPROTO is not set +# CONFIG_PKG_USING_RT_LINK_HW is not set +# CONFIG_PKG_USING_RYANMQTT is not set +# CONFIG_PKG_USING_LORA_PKT_FWD is not set +# CONFIG_PKG_USING_LORA_GW_DRIVER_LIB is not set +# CONFIG_PKG_USING_LORA_PKT_SNIFFER is not set +# CONFIG_PKG_USING_HM is not set +# CONFIG_PKG_USING_SMALL_MODBUS is not set +# CONFIG_PKG_USING_NET_SERVER is not set +# CONFIG_PKG_USING_ZFTP is not set +# CONFIG_PKG_USING_WOL is not set + +# +# security packages +# +# CONFIG_PKG_USING_MBEDTLS is not set +# CONFIG_PKG_USING_LIBSODIUM is not set +# CONFIG_PKG_USING_LIBHYDROGEN is not set +# CONFIG_PKG_USING_TINYCRYPT is not set +# CONFIG_PKG_USING_TFM is not set +# CONFIG_PKG_USING_YD_CRYPTO is not set + +# +# language packages +# + +# +# JSON: JavaScript Object Notation, a lightweight data-interchange format +# +# CONFIG_PKG_USING_CJSON is not set +# CONFIG_PKG_USING_LJSON is not set +# CONFIG_PKG_USING_RT_CJSON_TOOLS is not set +# CONFIG_PKG_USING_RAPIDJSON is not set +# CONFIG_PKG_USING_JSMN is not set +# CONFIG_PKG_USING_AGILE_JSMN is not set +# CONFIG_PKG_USING_PARSON is not set + +# +# XML: Extensible Markup Language +# +# CONFIG_PKG_USING_SIMPLE_XML is not set +# CONFIG_PKG_USING_EZXML is not set +# CONFIG_PKG_USING_LUATOS_SOC is not set +# CONFIG_PKG_USING_LUA is not set +# CONFIG_PKG_USING_JERRYSCRIPT is not set +# CONFIG_PKG_USING_MICROPYTHON is not set +# CONFIG_PKG_USING_PIKASCRIPT is not set +# CONFIG_PKG_USING_RTT_RUST is not set + +# +# multimedia packages +# + +# +# LVGL: powerful and easy-to-use embedded GUI library +# +# CONFIG_PKG_USING_LVGL is not set +# CONFIG_PKG_USING_LITTLEVGL2RTT is not set +# CONFIG_PKG_USING_LV_MUSIC_DEMO is not set +# CONFIG_PKG_USING_GUI_GUIDER_DEMO is not set + +# +# u8g2: a monochrome graphic library +# +# CONFIG_PKG_USING_U8G2_OFFICIAL is not set +# CONFIG_PKG_USING_U8G2 is not set +# CONFIG_PKG_USING_OPENMV is not set +# CONFIG_PKG_USING_MUPDF is not set +# CONFIG_PKG_USING_STEMWIN is not set +CONFIG_PKG_USING_WAVPLAYER=y +CONFIG_PKG_WAVPLAYER_PATH="/packages/multimedia/wavplayer" +CONFIG_PKG_WP_USING_PLAY=y +CONFIG_PKG_WP_PLAY_DEVICE="sound0" +CONFIG_PKG_WP_USING_RECORD=y +CONFIG_PKG_WP_RECORD_DEVICE="sound0" +# CONFIG_PKG_USING_WAVPLAYER_V020 is not set +CONFIG_PKG_USING_WAVPLAYER_LATEST_VERSION=y +CONFIG_PKG_WAVPLAYER_VER="latest" +# CONFIG_PKG_USING_TJPGD is not set +# CONFIG_PKG_USING_PDFGEN is not set +# CONFIG_PKG_USING_HELIX is not set +# CONFIG_PKG_USING_AZUREGUIX is not set +# CONFIG_PKG_USING_TOUCHGFX2RTT is not set +# CONFIG_PKG_USING_NUEMWIN is not set +# CONFIG_PKG_USING_MP3PLAYER is not set +# CONFIG_PKG_USING_TINYJPEG is not set +# CONFIG_PKG_USING_UGUI is not set + +# +# PainterEngine: A cross-platform graphics application framework written in C language +# +# CONFIG_PKG_USING_PAINTERENGINE is not set +# CONFIG_PKG_USING_PAINTERENGINE_AUX is not set +# CONFIG_PKG_USING_MCURSES is not set +# CONFIG_PKG_USING_TERMBOX is not set +# CONFIG_PKG_USING_VT100 is not set +# CONFIG_PKG_USING_QRCODE is not set +# CONFIG_PKG_USING_GUIENGINE is not set +# CONFIG_PKG_USING_PERSIMMON is not set + +# +# tools packages +# +# CONFIG_PKG_USING_CMBACKTRACE is not set +# CONFIG_PKG_USING_EASYFLASH is not set +# CONFIG_PKG_USING_EASYLOGGER is not set +# CONFIG_PKG_USING_SYSTEMVIEW is not set +# CONFIG_PKG_USING_SEGGER_RTT is not set +# CONFIG_PKG_USING_RDB is not set +# CONFIG_PKG_USING_ULOG_EASYFLASH is not set +# CONFIG_PKG_USING_LOGMGR is not set +# CONFIG_PKG_USING_ADBD is not set +# CONFIG_PKG_USING_COREMARK is not set +# CONFIG_PKG_USING_DHRYSTONE is not set +# CONFIG_PKG_USING_MEMORYPERF is not set +# CONFIG_PKG_USING_NR_MICRO_SHELL is not set +# CONFIG_PKG_USING_CHINESE_FONT_LIBRARY is not set +# CONFIG_PKG_USING_LUNAR_CALENDAR is not set +# CONFIG_PKG_USING_BS8116A is not set +# CONFIG_PKG_USING_GPS_RMC is not set +# CONFIG_PKG_USING_URLENCODE is not set +# CONFIG_PKG_USING_UMCN is not set +# CONFIG_PKG_USING_LWRB2RTT is not set +# CONFIG_PKG_USING_CPU_USAGE is not set +# CONFIG_PKG_USING_GBK2UTF8 is not set +# CONFIG_PKG_USING_VCONSOLE is not set +# CONFIG_PKG_USING_KDB is not set +# CONFIG_PKG_USING_WAMR is not set +# CONFIG_PKG_USING_MICRO_XRCE_DDS_CLIENT is not set +# CONFIG_PKG_USING_LWLOG is not set +# CONFIG_PKG_USING_ANV_TRACE is not set +# CONFIG_PKG_USING_ANV_MEMLEAK is not set +# CONFIG_PKG_USING_ANV_TESTSUIT is not set +# CONFIG_PKG_USING_ANV_BENCH is not set +# CONFIG_PKG_USING_DEVMEM is not set +# CONFIG_PKG_USING_REGEX is not set +# CONFIG_PKG_USING_MEM_SANDBOX is not set +# CONFIG_PKG_USING_SOLAR_TERMS is not set +# CONFIG_PKG_USING_GAN_ZHI is not set +# CONFIG_PKG_USING_FDT is not set +# CONFIG_PKG_USING_CBOX is not set +# CONFIG_PKG_USING_SNOWFLAKE is not set +# CONFIG_PKG_USING_HASH_MATCH is not set +# CONFIG_PKG_USING_ARMV7M_DWT_TOOL is not set +# CONFIG_PKG_USING_VOFA_PLUS is not set + +# +# system packages +# + +# +# enhanced kernel services +# +# CONFIG_PKG_USING_RT_MEMCPY_CM is not set +# CONFIG_PKG_USING_RT_KPRINTF_THREADSAFE is not set +# CONFIG_PKG_USING_RT_VSNPRINTF_FULL is not set + +# +# acceleration: Assembly language or algorithmic acceleration packages +# +# CONFIG_PKG_USING_QFPLIB_M0_FULL is not set +# CONFIG_PKG_USING_QFPLIB_M0_TINY is not set +# CONFIG_PKG_USING_QFPLIB_M3 is not set + +# +# CMSIS: ARM Cortex-M Microcontroller Software Interface Standard +# +# CONFIG_PKG_USING_CMSIS_5 is not set +# CONFIG_PKG_USING_CMSIS_RTOS1 is not set +# CONFIG_PKG_USING_CMSIS_RTOS2 is not set + +# +# Micrium: Micrium software products porting for RT-Thread +# +# CONFIG_PKG_USING_UCOSIII_WRAPPER is not set +# CONFIG_PKG_USING_UCOSII_WRAPPER is not set +# CONFIG_PKG_USING_UC_CRC is not set +# CONFIG_PKG_USING_UC_CLK is not set +# CONFIG_PKG_USING_UC_COMMON is not set +# CONFIG_PKG_USING_UC_MODBUS is not set +# CONFIG_PKG_USING_FREERTOS_WRAPPER is not set +# CONFIG_PKG_USING_CAIRO is not set +# CONFIG_PKG_USING_PIXMAN is not set +# CONFIG_PKG_USING_PARTITION is not set +# CONFIG_PKG_USING_PERF_COUNTER is not set +# CONFIG_PKG_USING_FLASHDB is not set +# CONFIG_PKG_USING_SQLITE is not set +# CONFIG_PKG_USING_RTI is not set +# CONFIG_PKG_USING_DFS_YAFFS is not set +# CONFIG_PKG_USING_LITTLEFS is not set +# CONFIG_PKG_USING_DFS_JFFS2 is not set +# CONFIG_PKG_USING_DFS_UFFS is not set +# CONFIG_PKG_USING_LWEXT4 is not set +# CONFIG_PKG_USING_THREAD_POOL is not set +# CONFIG_PKG_USING_ROBOTS is not set +# CONFIG_PKG_USING_EV is not set +# CONFIG_PKG_USING_SYSWATCH is not set +# CONFIG_PKG_USING_SYS_LOAD_MONITOR is not set +# CONFIG_PKG_USING_PLCCORE is not set +CONFIG_PKG_USING_RAMDISK=y +CONFIG_PKG_RAMDISK_PATH="/packages/system/ramdisk" +# CONFIG_PKG_USING_RAMDISK_V010 is not set +CONFIG_PKG_USING_RAMDISK_LATEST_VERSION=y +CONFIG_PKG_RAMDISK_VER="latest" +# CONFIG_PKG_USING_MININI is not set +# CONFIG_PKG_USING_QBOOT is not set +# CONFIG_PKG_USING_PPOOL is not set +# CONFIG_PKG_USING_OPENAMP is not set +# CONFIG_PKG_USING_LPM is not set +# CONFIG_PKG_USING_TLSF is not set +# CONFIG_PKG_USING_EVENT_RECORDER is not set +# CONFIG_PKG_USING_ARM_2D is not set +# CONFIG_PKG_USING_MCUBOOT is not set +# CONFIG_PKG_USING_TINYUSB is not set +# CONFIG_PKG_USING_CHERRYUSB is not set +# CONFIG_PKG_USING_KMULTI_RTIMER is not set +# CONFIG_PKG_USING_TFDB is not set +# CONFIG_PKG_USING_QPC is not set +# CONFIG_PKG_USING_AGILE_UPGRADE is not set + +# +# peripheral libraries and drivers +# + +# +# sensors drivers +# +# CONFIG_PKG_USING_LSM6DSM is not set +# CONFIG_PKG_USING_LSM6DSL is not set +# CONFIG_PKG_USING_LPS22HB is not set +# CONFIG_PKG_USING_HTS221 is not set +# CONFIG_PKG_USING_LSM303AGR is not set +# CONFIG_PKG_USING_BME280 is not set +# CONFIG_PKG_USING_BME680 is not set +# CONFIG_PKG_USING_BMA400 is not set +# CONFIG_PKG_USING_BMI160_BMX160 is not set +# CONFIG_PKG_USING_SPL0601 is not set +# CONFIG_PKG_USING_MS5805 is not set +# CONFIG_PKG_USING_DA270 is not set +# CONFIG_PKG_USING_DF220 is not set +# CONFIG_PKG_USING_HSHCAL001 is not set +# CONFIG_PKG_USING_BH1750 is not set +# CONFIG_PKG_USING_MPU6XXX is not set +# CONFIG_PKG_USING_AHT10 is not set +# CONFIG_PKG_USING_AP3216C is not set +# CONFIG_PKG_USING_TSL4531 is not set +# CONFIG_PKG_USING_DS18B20 is not set +# CONFIG_PKG_USING_DHT11 is not set +# CONFIG_PKG_USING_DHTXX is not set +# CONFIG_PKG_USING_GY271 is not set +# CONFIG_PKG_USING_GP2Y10 is not set +# CONFIG_PKG_USING_SGP30 is not set +# CONFIG_PKG_USING_HDC1000 is not set +# CONFIG_PKG_USING_BMP180 is not set +# CONFIG_PKG_USING_BMP280 is not set +# CONFIG_PKG_USING_SHTC1 is not set +# CONFIG_PKG_USING_BMI088 is not set +# CONFIG_PKG_USING_HMC5883 is not set +# CONFIG_PKG_USING_MAX6675 is not set +# CONFIG_PKG_USING_TMP1075 is not set +# CONFIG_PKG_USING_SR04 is not set +# CONFIG_PKG_USING_CCS811 is not set +# CONFIG_PKG_USING_PMSXX is not set +# CONFIG_PKG_USING_RT3020 is not set +# CONFIG_PKG_USING_MLX90632 is not set +# CONFIG_PKG_USING_MLX90393 is not set +# CONFIG_PKG_USING_MLX90392 is not set +# CONFIG_PKG_USING_MLX90397 is not set +# CONFIG_PKG_USING_MS5611 is not set +# CONFIG_PKG_USING_MAX31865 is not set +# CONFIG_PKG_USING_VL53L0X is not set +# CONFIG_PKG_USING_INA260 is not set +# CONFIG_PKG_USING_MAX30102 is not set +# CONFIG_PKG_USING_INA226 is not set +# CONFIG_PKG_USING_LIS2DH12 is not set +# CONFIG_PKG_USING_HS300X is not set +# CONFIG_PKG_USING_ZMOD4410 is not set +# CONFIG_PKG_USING_ISL29035 is not set +# CONFIG_PKG_USING_MMC3680KJ is not set +# CONFIG_PKG_USING_QMP6989 is not set +# CONFIG_PKG_USING_BALANCE is not set +# CONFIG_PKG_USING_SHT2X is not set +# CONFIG_PKG_USING_SHT3X is not set +# CONFIG_PKG_USING_AD7746 is not set +# CONFIG_PKG_USING_ADT74XX is not set +# CONFIG_PKG_USING_MAX17048 is not set +# CONFIG_PKG_USING_AS7341 is not set +# CONFIG_PKG_USING_CW2015 is not set +# CONFIG_PKG_USING_ICM20608 is not set +# CONFIG_PKG_USING_PAJ7620 is not set + +# +# touch drivers +# +# CONFIG_PKG_USING_GT9147 is not set +# CONFIG_PKG_USING_GT1151 is not set +# CONFIG_PKG_USING_GT917S is not set +# CONFIG_PKG_USING_GT911 is not set +# CONFIG_PKG_USING_FT6206 is not set +# CONFIG_PKG_USING_FT5426 is not set +# CONFIG_PKG_USING_FT6236 is not set +# CONFIG_PKG_USING_XPT2046_TOUCH is not set +# CONFIG_PKG_USING_REALTEK_AMEBA is not set +# CONFIG_PKG_USING_STM32_SDIO is not set +# CONFIG_PKG_USING_ESP_IDF is not set +# CONFIG_PKG_USING_BUTTON is not set +# CONFIG_PKG_USING_PCF8574 is not set +# CONFIG_PKG_USING_SX12XX is not set +# CONFIG_PKG_USING_SIGNAL_LED is not set +# CONFIG_PKG_USING_LEDBLINK is not set +# CONFIG_PKG_USING_LITTLED is not set +# CONFIG_PKG_USING_LKDGUI is not set +# CONFIG_PKG_USING_NRF5X_SDK is not set +# CONFIG_PKG_USING_NRFX is not set +# CONFIG_PKG_USING_WM_LIBRARIES is not set + +# +# Kendryte SDK +# +# CONFIG_PKG_USING_K210_SDK is not set +# CONFIG_PKG_USING_KENDRYTE_SDK is not set +# CONFIG_PKG_USING_INFRARED is not set +# CONFIG_PKG_USING_MULTI_INFRARED is not set +# CONFIG_PKG_USING_AGILE_BUTTON is not set +# CONFIG_PKG_USING_AGILE_LED is not set +# CONFIG_PKG_USING_AT24CXX is not set +# CONFIG_PKG_USING_MOTIONDRIVER2RTT is not set +# CONFIG_PKG_USING_PCA9685 is not set +# CONFIG_PKG_USING_I2C_TOOLS is not set +# CONFIG_PKG_USING_NRF24L01 is not set +# CONFIG_PKG_USING_RPLIDAR is not set +# CONFIG_PKG_USING_AS608 is not set +# CONFIG_PKG_USING_RC522 is not set +# CONFIG_PKG_USING_WS2812B is not set +# CONFIG_PKG_USING_EMBARC_BSP is not set +# CONFIG_PKG_USING_EXTERN_RTC_DRIVERS is not set +# CONFIG_PKG_USING_MULTI_RTIMER is not set +# CONFIG_PKG_USING_MAX7219 is not set +# CONFIG_PKG_USING_BEEP is not set +# CONFIG_PKG_USING_EASYBLINK is not set +# CONFIG_PKG_USING_PMS_SERIES is not set +# CONFIG_PKG_USING_CAN_YMODEM is not set +# CONFIG_PKG_USING_LORA_RADIO_DRIVER is not set +# CONFIG_PKG_USING_QLED is not set +# CONFIG_PKG_USING_AGILE_CONSOLE is not set +# CONFIG_PKG_USING_LD3320 is not set +# CONFIG_PKG_USING_WK2124 is not set +# CONFIG_PKG_USING_LY68L6400 is not set +# CONFIG_PKG_USING_DM9051 is not set +# CONFIG_PKG_USING_SSD1306 is not set +# CONFIG_PKG_USING_QKEY is not set +# CONFIG_PKG_USING_RS485 is not set +# CONFIG_PKG_USING_RS232 is not set +# CONFIG_PKG_USING_NES is not set +# CONFIG_PKG_USING_VIRTUAL_SENSOR is not set +# CONFIG_PKG_USING_VDEVICE is not set +# CONFIG_PKG_USING_SGM706 is not set +# CONFIG_PKG_USING_STM32WB55_SDK is not set +# CONFIG_PKG_USING_RDA58XX is not set +# CONFIG_PKG_USING_LIBNFC is not set +# CONFIG_PKG_USING_MFOC is not set +# CONFIG_PKG_USING_TMC51XX is not set +# CONFIG_PKG_USING_TCA9534 is not set +# CONFIG_PKG_USING_KOBUKI is not set +# CONFIG_PKG_USING_ROSSERIAL is not set +# CONFIG_PKG_USING_MICRO_ROS is not set +# CONFIG_PKG_USING_MCP23008 is not set +# CONFIG_PKG_USING_BLUETRUM_SDK is not set +# CONFIG_PKG_USING_MISAKA_AT24CXX is not set +# CONFIG_PKG_USING_MISAKA_RGB_BLING is not set +# CONFIG_PKG_USING_LORA_MODEM_DRIVER is not set +# CONFIG_PKG_USING_BL_MCU_SDK is not set +# CONFIG_PKG_USING_SOFT_SERIAL is not set +# CONFIG_PKG_USING_MB85RS16 is not set +# CONFIG_PKG_USING_RFM300 is not set +# CONFIG_PKG_USING_IO_INPUT_FILTER is not set +# CONFIG_PKG_USING_RASPBERRYPI_PICO_SDK is not set +# CONFIG_PKG_USING_LRF_NV7LIDAR is not set +# CONFIG_PKG_USING_FINGERPRINT is not set + +# +# AI packages +# +# CONFIG_PKG_USING_LIBANN is not set +# CONFIG_PKG_USING_NNOM is not set +# CONFIG_PKG_USING_ONNX_BACKEND is not set +# CONFIG_PKG_USING_ONNX_PARSER is not set +# CONFIG_PKG_USING_TENSORFLOWLITEMICRO is not set +# CONFIG_PKG_USING_ELAPACK is not set +# CONFIG_PKG_USING_ULAPACK is not set +# CONFIG_PKG_USING_QUEST is not set +# CONFIG_PKG_USING_NAXOS is not set + +# +# Signal Processing and Control Algorithm Packages +# +# CONFIG_PKG_USING_FIRE_PID_CURVE is not set +# CONFIG_PKG_USING_UKAL is not set + +# +# miscellaneous packages +# + +# +# project laboratory +# + +# +# samples: kernel and components samples +# +# CONFIG_PKG_USING_KERNEL_SAMPLES is not set +# CONFIG_PKG_USING_FILESYSTEM_SAMPLES is not set +# CONFIG_PKG_USING_NETWORK_SAMPLES is not set +# CONFIG_PKG_USING_PERIPHERAL_SAMPLES is not set + +# +# entertainment: terminal games and other interesting software packages +# +# CONFIG_PKG_USING_CMATRIX is not set +# CONFIG_PKG_USING_SL is not set +# CONFIG_PKG_USING_CAL is not set +# CONFIG_PKG_USING_ACLOCK is not set +# CONFIG_PKG_USING_THREES is not set +# CONFIG_PKG_USING_2048 is not set +# CONFIG_PKG_USING_SNAKE is not set +# CONFIG_PKG_USING_TETRIS is not set +# CONFIG_PKG_USING_DONUT is not set +# CONFIG_PKG_USING_COWSAY is not set +# CONFIG_PKG_USING_LIBCSV is not set +CONFIG_PKG_USING_OPTPARSE=y +CONFIG_PKG_OPTPARSE_PATH="/packages/misc/optparse" +CONFIG_PKG_USING_OPTPARSE_LATEST_VERSION=y +CONFIG_PKG_OPTPARSE_VER="latest" +# CONFIG_OPTPARSE_USING_DEMO is not set +# CONFIG_PKG_USING_FASTLZ is not set +# CONFIG_PKG_USING_MINILZO is not set +# CONFIG_PKG_USING_QUICKLZ is not set +# CONFIG_PKG_USING_LZMA is not set +# CONFIG_PKG_USING_MULTIBUTTON is not set +# CONFIG_PKG_USING_FLEXIBLE_BUTTON is not set +# CONFIG_PKG_USING_CANFESTIVAL is not set +# CONFIG_PKG_USING_ZLIB is not set +# CONFIG_PKG_USING_MINIZIP is not set +# CONFIG_PKG_USING_HEATSHRINK is not set +# CONFIG_PKG_USING_DSTR is not set +# CONFIG_PKG_USING_TINYFRAME is not set +# CONFIG_PKG_USING_KENDRYTE_DEMO is not set +# CONFIG_PKG_USING_DIGITALCTRL is not set +# CONFIG_PKG_USING_UPACKER is not set +# CONFIG_PKG_USING_UPARAM is not set +# CONFIG_PKG_USING_HELLO is not set +# CONFIG_PKG_USING_VI is not set +# CONFIG_PKG_USING_KI is not set +# CONFIG_PKG_USING_ARMv7M_DWT is not set +# CONFIG_PKG_USING_CRCLIB is not set +# CONFIG_PKG_USING_LWGPS is not set +# CONFIG_PKG_USING_STATE_MACHINE is not set +# CONFIG_PKG_USING_DESIGN_PATTERN is not set +# CONFIG_PKG_USING_CONTROLLER is not set +# CONFIG_PKG_USING_PHASE_LOCKED_LOOP is not set +# CONFIG_PKG_USING_MFBD is not set +# CONFIG_PKG_USING_SLCAN2RTT is not set +# CONFIG_PKG_USING_SOEM is not set +# CONFIG_PKG_USING_QPARAM is not set +# CONFIG_PKG_USING_CorevMCU_CLI is not set + +# +# Arduino libraries +# +# CONFIG_PKG_USING_RTDUINO is not set + +# +# Projects +# +# CONFIG_PKG_USING_ARDUINO_ULTRASOUND_RADAR is not set +# CONFIG_PKG_USING_ARDUINO_SENSOR_KIT is not set +# CONFIG_PKG_USING_ARDUINO_MATLAB_SUPPORT is not set + +# +# Sensors +# +# CONFIG_PKG_USING_ARDUINO_SENSOR_DEVICE_DRIVERS is not set +# CONFIG_PKG_USING_ARDUINO_CAPACITIVESENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL375 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L0X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL53L1X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSOR is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VL6180X is not set +# CONFIG_PKG_USING_ADAFRUIT_MAX31855 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31865 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX31856 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX6675 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90614 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS1 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AHTX0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM9DS0 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADT7410 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME680 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9808 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4728 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA219 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR390 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DHT is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM6DS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO055 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MAX1704X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMC56X3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90393 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90395 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ICM20X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_DPS310 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTS221 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT4X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADXL343 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS726X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AMG88XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2320 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AM2315 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LTR329_LTR303 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP085_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP183_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BMP3XX is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MS8607 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MLX90640 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MMA8451 is not set +# CONFIG_PKG_USING_ADAFRUIT_MSA301 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BNO08X_RVC is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS2MDL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303DLH_MAG is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LC709203F is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CAP1188 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_CCS811 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_NAU7802 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS331 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS2X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LPS35HW is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LSM303_ACCEL is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_LIS3DH is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8591 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPL3115A2 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPR121 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPRLS is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MPU6050 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCT2075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PM25AQI is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_EMC2101 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXAS21002C is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SCD30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_FXOS8700 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HMC5883_UNIFIED is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP30 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP006 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TLA202X is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCS34725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI7021 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SGP40 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SHTC3 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU21DF is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AS7341 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_HTU31D is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SENSORLAB is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_INA260 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP007_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_L3GD20 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TMP117 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSC2007 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TSL2591_LIBRARY is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VCNL4040 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML6075 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_VEML7700 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LIS3DHTR is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DHT is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL335 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_ADXL345 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BME280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP280 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_H3LIS331DL is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MMA7660 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TSL2561 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PAJ7620 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VL53L0X is not set +# CONFIG_PKG_USING_SEEED_ITG3200 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT31 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HP20X is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_DRV2605L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BBM150 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HMC5883L is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM303DLH is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_TCS3414CS is not set +# CONFIG_PKG_USING_SEEED_MP503 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_BMP085 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HIGHTEMP is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_VEML6070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SI1145 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_SHT35 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_AT42QT1070 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LSM6DS3 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HDC1000 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_HM3301 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_MCP9600 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LTC2941 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_LDC1612 is not set + +# +# Display +# +# CONFIG_PKG_USING_ARDUINO_U8G2 is not set +# CONFIG_PKG_USING_SEEED_TM1637 is not set + +# +# Timing +# +# CONFIG_PKG_USING_ARDUINO_MSTIMER2 is not set + +# +# Data Processing +# +# CONFIG_PKG_USING_ARDUINO_KALMANFILTER is not set +# CONFIG_PKG_USING_ARDUINO_ARDUINOJSON is not set + +# +# Data Storage +# + +# +# Communication +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PN532 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_SI4713 is not set + +# +# Device Control +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCF8574 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_PCA9685 is not set +# CONFIG_PKG_USING_ARDUINO_SEEED_PCF85063TP is not set + +# +# Other +# + +# +# Signal IO +# +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BUSIO is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_TCA8418 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP23017 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_ADS1X15 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_AW9523 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP3008 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_MCP4725 is not set +# CONFIG_PKG_USING_ARDUINO_ADAFRUIT_BD3491FS is not set + +# +# Uncategorized +# + +# +# Hardware Drivers Config +# + +# +# On-chip Peripheral Drivers +# +CONFIG_SOC_SERIES_MA35D1=y +CONFIG_BSP_USING_SSPCC=y +CONFIG_BSP_USING_SSMCC=y +CONFIG_BSP_USING_UMCTL2=y +CONFIG_BSP_USING_RTP=y +CONFIG_RTP_USING_AT_STARTUP=y +CONFIG_RT_USING_FPU=y +CONFIG_BSP_USE_STDDRIVER_SOURCE=y +CONFIG_BSP_USING_PDMA=y +CONFIG_BSP_USING_PDMA0=y +CONFIG_BSP_USING_PDMA1=y +# CONFIG_BSP_USING_PDMA2 is not set +# CONFIG_BSP_USING_PDMA3 is not set +CONFIG_NU_PDMA_MEMFUN_ACTOR_MAX=4 +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_GMAC=y +CONFIG_BSP_USING_GMAC0=y +CONFIG_BSP_USING_GMAC1=y +CONFIG_BSP_USING_RTC=y +# CONFIG_NU_RTC_SUPPORT_IO_RW is not set +# CONFIG_NU_RTC_SUPPORT_MSH_CMD is not set +# CONFIG_BSP_USING_ADC is not set +# CONFIG_BSP_USING_CCAP is not set +CONFIG_BSP_USING_EADC=y +CONFIG_BSP_USING_EADC0=y +CONFIG_BSP_USING_TMR=y +CONFIG_BSP_USING_TIMER=y +CONFIG_BSP_USING_TMR0=y +CONFIG_BSP_USING_TIMER0=y +# CONFIG_BSP_USING_TPWM0 is not set +CONFIG_BSP_USING_TMR1=y +CONFIG_BSP_USING_TIMER1=y +# CONFIG_BSP_USING_TPWM1 is not set +CONFIG_BSP_USING_TMR2=y +CONFIG_BSP_USING_TIMER2=y +# CONFIG_BSP_USING_TPWM2 is not set +CONFIG_BSP_USING_TMR3=y +CONFIG_BSP_USING_TIMER3=y +# CONFIG_BSP_USING_TPWM3 is not set +CONFIG_BSP_USING_TMR4=y +CONFIG_BSP_USING_TIMER4=y +# CONFIG_BSP_USING_TPWM4 is not set +CONFIG_BSP_USING_TMR5=y +CONFIG_BSP_USING_TIMER5=y +# CONFIG_BSP_USING_TPWM5 is not set +CONFIG_BSP_USING_TMR6=y +CONFIG_BSP_USING_TIMER6=y +# CONFIG_BSP_USING_TPWM6 is not set +CONFIG_BSP_USING_TMR7=y +CONFIG_BSP_USING_TIMER7=y +# CONFIG_BSP_USING_TPWM7 is not set +CONFIG_BSP_USING_TMR8=y +CONFIG_BSP_USING_TIMER8=y +# CONFIG_BSP_USING_TPWM8 is not set +CONFIG_BSP_USING_TMR9=y +CONFIG_BSP_USING_TIMER9=y +# CONFIG_BSP_USING_TPWM9 is not set +CONFIG_BSP_USING_TMR10=y +CONFIG_BSP_USING_TIMER10=y +# CONFIG_BSP_USING_TPWM10 is not set +CONFIG_BSP_USING_TMR11=y +CONFIG_BSP_USING_TIMER11=y +# CONFIG_BSP_USING_TPWM11 is not set +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_UART0=y +# CONFIG_BSP_USING_UART0_TX_DMA is not set +# CONFIG_BSP_USING_UART0_RX_DMA is not set +# CONFIG_BSP_USING_UART1 is not set +# CONFIG_BSP_USING_UART2 is not set +# CONFIG_BSP_USING_UART3 is not set +# CONFIG_BSP_USING_UART4 is not set +# CONFIG_BSP_USING_UART5 is not set +# CONFIG_BSP_USING_UART6 is not set +# CONFIG_BSP_USING_UART7 is not set +# CONFIG_BSP_USING_UART8 is not set +# CONFIG_BSP_USING_UART9 is not set +CONFIG_BSP_USING_UART10=y +CONFIG_BSP_USING_UART10_TX_DMA=y +CONFIG_BSP_USING_UART10_RX_DMA=y +# CONFIG_BSP_USING_UART11 is not set +CONFIG_BSP_USING_UART12=y +CONFIG_BSP_USING_UART12_TX_DMA=y +CONFIG_BSP_USING_UART12_RX_DMA=y +# CONFIG_BSP_USING_UART13 is not set +# CONFIG_BSP_USING_UART14 is not set +# CONFIG_BSP_USING_UART15 is not set +CONFIG_BSP_USING_UART16=y +# CONFIG_BSP_USING_UART16_TX_DMA is not set +# CONFIG_BSP_USING_UART16_RX_DMA is not set +CONFIG_BSP_USING_I2C=y +CONFIG_BSP_USING_I2C0=y +CONFIG_BSP_USING_I2C1=y +CONFIG_BSP_USING_I2C2=y +# CONFIG_BSP_USING_I2C3 is not set +CONFIG_BSP_USING_I2C4=y +CONFIG_BSP_USING_I2C5=y +CONFIG_BSP_USING_SDH=y +# CONFIG_BSP_USING_SDH0 is not set +CONFIG_BSP_USING_SDH1=y +CONFIG_BSP_USING_CANFD=y +# CONFIG_BSP_USING_CANFD0 is not set +# CONFIG_BSP_USING_CANFD1 is not set +# CONFIG_BSP_USING_CANFD2 is not set +# CONFIG_BSP_USING_CANFD3 is not set +# CONFIG_BSP_USING_EPWM is not set +CONFIG_BSP_USING_SPI=y +# CONFIG_BSP_USING_SPI_PDMA is not set +CONFIG_BSP_USING_SPI0_NONE=y +# CONFIG_BSP_USING_SPI0 is not set +# CONFIG_BSP_USING_SPII2S0 is not set +CONFIG_BSP_USING_SPI1_NONE=y +# CONFIG_BSP_USING_SPI1 is not set +# CONFIG_BSP_USING_SPII2S1 is not set +CONFIG_BSP_USING_SPI2_NONE=y +# CONFIG_BSP_USING_SPI2 is not set +# CONFIG_BSP_USING_SPII2S2 is not set +CONFIG_BSP_USING_SPI3_NONE=y +# CONFIG_BSP_USING_SPI3 is not set +# CONFIG_BSP_USING_SPII2S3 is not set +CONFIG_BSP_USING_I2S=y +CONFIG_BSP_USING_I2S0=y +# CONFIG_BSP_USING_I2S1 is not set +CONFIG_NU_I2S_DMA_FIFO_SIZE=2048 +CONFIG_BSP_USING_QSPI=y +# CONFIG_BSP_USING_QSPI_PDMA is not set +CONFIG_BSP_USING_QSPI0=y +# CONFIG_BSP_USING_QSPI0_PDMA is not set +# CONFIG_BSP_USING_QSPI1 is not set +# CONFIG_BSP_USING_SCUART is not set +# CONFIG_BSP_USING_ECAP is not set +# CONFIG_BSP_USING_QEI is not set +# CONFIG_BSP_USING_SOFT_I2C is not set +# CONFIG_BSP_USING_DISP is not set +# CONFIG_BSP_USING_WDT is not set +CONFIG_BSP_USING_HWSEM=y +CONFIG_BSP_USING_HWSEM0=y +CONFIG_BSP_USING_WHC=y +CONFIG_BSP_USING_WHC0=y +# CONFIG_BSP_USING_WHC1 is not set +CONFIG_BSP_USING_NFI=y +# CONFIG_BSP_USING_EBI is not set +CONFIG_BSP_USING_USBH=y +CONFIG_BSP_USING_HSUSBH0=y +CONFIG_BSP_USING_HSUSBH1=y + +# +# On-board Peripheral Drivers +# +CONFIG_BSP_USING_CONSOLE=y +CONFIG_BOARD_USING_NAU8822=y +CONFIG_BOARD_USING_GMAC0=y +CONFIG_BOARD_USING_GMAC1=y +CONFIG_BOARD_USING_STORAGE_SDCARD=y +CONFIG_BOARD_USING_STORAGE_RAWNAND=y +# CONFIG_BOARD_USING_STORAGE_SPIFLASH is not set +CONFIG_BOARD_USING_STORAGE_SPINAND=y +CONFIG_BOARD_USING_USBHOST=y + +# +# Board extended module drivers +# +# CONFIG_BOARD_USING_SENSOR0 is not set + +# +# Nuvoton Packages Config +# +CONFIG_NU_PKG_USING_UTILS=y +CONFIG_NU_PKG_USING_DEMO=y +# CONFIG_NU_PKG_USING_BMX055 is not set +# CONFIG_NU_PKG_USING_MAX31875 is not set +# CONFIG_NU_PKG_USING_NCT7717U is not set +# CONFIG_NU_PKG_USING_NAU88L25 is not set +CONFIG_NU_PKG_USING_NAU8822=y +# CONFIG_NU_PKG_USING_DA9062 is not set +# CONFIG_NU_PKG_USING_ILI9341 is not set +# CONFIG_NU_PKG_USING_SSD1963 is not set +# CONFIG_NU_PKG_USING_FSA506 is not set +# CONFIG_NU_PKG_USING_TPC is not set +# CONFIG_NU_PKG_USING_ADC_TOUCH is not set +CONFIG_NU_PKG_USING_SPINAND=y diff --git a/bsp/nuvoton/numaker-iot-ma35d1/Kconfig b/bsp/nuvoton/numaker-iot-ma35d1/Kconfig new file mode 100644 index 0000000000..a78782d615 --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/Kconfig @@ -0,0 +1,27 @@ +mainmenu "RT-Thread Configuration" + +config BSP_DIR + string + option env="BSP_ROOT" + default "." + +config RTT_DIR + string + option env="RTT_ROOT" + default "../../.." + +# you can change the RTT_ROOT default "../../.." to your rtthread_root, +# example : default "F:/git_repositories/rt-thread" + +config PKGS_DIR + string + option env="PKGS_ROOT" + default "packages" + +config USE_MA35D1_AARCH32 + bool + default y + +source "$RTT_DIR/Kconfig" +source "$PKGS_DIR/Kconfig" +source "$BSP_DIR/board/Kconfig" diff --git a/bsp/nuvoton/numaker-iot-ma35d1/README.md b/bsp/nuvoton/numaker-iot-ma35d1/README.md new file mode 100644 index 0000000000..bfa419a5ad --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/README.md @@ -0,0 +1,133 @@ +# **NuMaker-IOT-MA35D1** + +## **Introduction** + +The NuMicro® MA35D1 series is a heterogeneous multi-core microprocessor targeted to high-end edge IIoT gateway. It is based on dual 64-bit Arm® Cortex®-A35 cores with speed up to 1 GHz, and one 180 MHz Arm® Cortex®-M4 core. Based on the high-performance cores, the MA35D1 series facilities the tiny AI/ML for edge computing. + +The NuMaker-IoT-MA35D1 evaluation board provides the Ethernet and connectivity features of Nuvoton NuMicro MA35D1 series microprocessors, based on MA35D16F987C (LQFP216 package, and stacking a 512 MB DDR). The NuMaker-IoT-MA35D1 includes rich peripherals such as one set of Gigabit Ethernet, one set of Megabit Ethernet, high-speed USB2.0 Host and device, one set of SD3.0 in MicroSD slot, one set of CAN FD, and RS-485 and RS232 serial communication ports. Furthermore, the NuMaker-IoT-MA35D1 provides discrete power supply to be the reference design. It also provides compatible headers with Raspberry Pi and Arduino UNO for minimizing effort in connecting popular sensors and modules to the system. + +|

NuMaker-IoT-MA35D1(Frontend view)

|

NuMaker-IoT-MA35D1(Backend view)

| +|--|--| +|

fishy

|

fishy

| + +## **NuMaker-IoT-MA35D1 Features** + +
    +
  • Target Chip
  • +
      +
    • MA35D16F987C (LQFP216) MCP package with DDR3L (512 MB), which can run up to 800 MHz
    • +
    +
  • Power
  • +
      +
    • 5V/2A Power Jack, USB VCOM Port or HUSB0 Device
    • +
    • Battery header for RTC power
    • +
    +
  • Memory Devices (Power-on Setting DIP switches for system booting selection)
  • +
      +
    • Quad SPI Flash (QSPI0): Winbond SPI-NAND Flash W25N04KWZEIR (512 MB)
    • +
    • NAND Flash: Winbond NAND Flash W29N08GVSIAA (1 GB)
    • +
    • MicroSD memory card (SD1, supports SD3.0)
    • +
    +
  • One Gigabit Ethernet: 1 x RGMII PHY (RTL8211FDI-CG) and RJ45 port connector
  • +
  • One 10/100 Megabit Ethernet: 1 x RMII PHY (RTL8201FI-VC) and RJ45 port connector
  • +
  • Two High Speed USB: HSUSB0 (Host/Device) and HSUSB1 (Host)
  • +
  • One Raspberry Pi 40-pin header connector
  • +
  • Arduino UNO Compatible Extension Connectors
  • +
  • One Camera Capture (CMOS sensor) header connector
  • +
  • One Audio codec (NAU88C22) with microphone input and speaker output
  • +
  • One set of RS232: Transceiver and header connector
  • +
  • One set of RS485: Transceiver and header connector
  • +
  • One set of CAN FD: Transceiver and header connector
  • +
  • Four Key buttons
  • +
  • Three user defined LEDs
  • +
+ +## **Supported compiler** + +Support GCC compiler. More information of these compiler version as following: + +| Compiler | Tested version | +| -- | -- | +| GCC | Arm Embedded Toolchain 10.3-2021.10 (Env 1.3.5 embedded version)| + +## **Build RT-Thread** + +You can build rt-thread.bin for NuMaker-IoT-MA35D1 board. Steps as following. Notice, the building will include **ma35-rtp/rtthread.bin** file into **numaker-iot-ma35d1/rtthread.bin** for heterogeneous multi-core demonstration. + +```bash +# cd rt-thread/bsp/nuvoton/numaker-iot-ma35d1 +# menuconfig --generate +# scons -c +# pkgs --update +# scons -j 16 + +\bsp\nuvoton\numaker-iot-ma35d1\rtthread.bin +``` + +## **Program firmware using NuWriter** + +To switch SW7 dip-switch on NuMaker-IoT-MA35D1 to do corresponding actions as below. + +**Power-on Setting** +L: OFF dip-switch +H: ON dip-switch + +| Memory Storage | **Burn to** settings | **Boot from** settings | +|--|--|--| +| **DDR** |
  • Switch 1(PG0) to ON.
  • Switch 3(PG2) to ON.
  • Switch 4(PG3) to ON.
  • Switch Others to OFF.
| | +| **Raw NAND**
(Select Ignore BCH and Page setting) |
  • Switch 1(PG0) to ON.
  • Switch 3(PG2) to ON.
  • Switch 4(PG3) to ON.
  • Switch Others to OFF.
|
  • Switch 1(PG0) to ON.
  • Switch 4(PG3) to ON.
  • Switch Others to OFF.
| +| **Serial NAND**
(Select 4-bit mode) |
  • Switch 1(PG0) to ON.
  • Switch 3(PG2) to ON.
  • Switch 4(PG3) to ON.
  • Switch 7(PG6) to ON.
  • Switch Others to OFF.
|
  • Switch 1(PG0) to ON.
  • Switch 7(PG6) to ON.
  • Switch Others to OFF.
+ +### **Download to DDR and Run** + +You can run windows batch script to download rtthread.bin into memory, then run it. The path of batch script as below. + +For 512MB DD3L downloading: +```bash +\bsp\nuvoton\numaker-iot-ma35d1\nuwriter_scripts\nuwriter_ddr3_512mb_download_and_run.bat +``` + +For 128MB DD2 downloading: +```bash +\bsp\nuvoton\numaker-iot-ma35d1\nuwriter_scripts\nuwriter_ddr2_128mb_download_and_run.bat +``` + +### **Burn to Serial NAND** + +You can run windows batch script to download rtthread.bin into SPI-NAND flash, then run it. The path of batch script as below. + +```bash +\bsp\nuvoton\numaker-iot-ma35d1\nuwriter_scripts\nuwriter_spinand_programming.bat +``` + +### **Burn to Raw NAND** + +You can run windows batch script to download rtthread.bin into Raw NAND flash, then run it. The path of batch script as below. + +```bash +\bsp\nuvoton\numaker-iot-ma35d1\nuwriter_scripts\nuwriter_nand_programming.bat +``` + +## **Test** + +|Connector on board|Wiring|Usage| +|-|-|-| +|VCOM(CON9)|Use an USB line| rt-thread@CA35 Console | + +You can use Tera Term terminate emulator (or other software) to type commands of RTT. All parameters of serial communication are shown in below image. Here, you can find out the corresponding port number of Nuvoton Virtual Com Port in window device manager. + +

+fishy +

+
+ +## **Purchase** + +* [Nuvoton Direct](https://direct.nuvoton.com/en/numaker-iot-ma35d1-a1) + +## **Resources** + +* [Download Board Schematics](https://www.nuvoton.com/resource-download.jsp?tp_GUID=HL102022101207193137) +* [Download User Manual](https://www.nuvoton.com/resource-download.jsp?tp_GUID=UG132022101707255524) +* [Download Datasheet](https://www.nuvoton.com/resource-download.jsp?tp_GUID=DA00-MA35D16) +* [Download NuWriter](https://github.com/OpenNuvoton/MA35D1_NuWriter) diff --git a/bsp/nuvoton/numaker-iot-ma35d1/SConscript b/bsp/nuvoton/numaker-iot-ma35d1/SConscript new file mode 100644 index 0000000000..fe0ae941ae --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/SConscript @@ -0,0 +1,14 @@ +# for module compiling +import os +Import('RTT_ROOT') + +cwd = str(Dir('#')) +objs = [] +list = os.listdir(cwd) + +for d in list: + path = os.path.join(cwd, d) + if os.path.isfile(os.path.join(path, 'SConscript')): + objs = objs + SConscript(os.path.join(d, 'SConscript')) + +Return('objs') diff --git a/bsp/nuvoton/numaker-iot-ma35d1/SConstruct b/bsp/nuvoton/numaker-iot-ma35d1/SConstruct new file mode 100644 index 0000000000..5143e3012d --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/SConstruct @@ -0,0 +1,58 @@ +import os +import sys +import rtconfig + +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') +else: + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../..') + +sys.path = sys.path + [os.path.join(RTT_ROOT, 'tools')] +try: + from building import * +except: + print('Cannot found RT-Thread root directory, please check RTT_ROOT') + print(RTT_ROOT) + exit(-1) + +TARGET = 'rtthread.' + rtconfig.TARGET_EXT + +DefaultEnvironment(tools=[]) +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS, + CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS, + CXXCOM = '$CXX -o $TARGET -c $CXXFLAGS $_CCCOMCOM $SOURCES') + +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) +env['ASCOM'] = env['ASPPCOM'] + +Export('RTT_ROOT') +Export('rtconfig') + +SDK_ROOT = os.path.abspath('./') + +if os.path.exists(SDK_ROOT + '/libraries'): + libraries_path_prefix = SDK_ROOT + '/libraries' +else: + libraries_path_prefix = os.path.dirname(SDK_ROOT) + '/libraries' + +SDK_LIB = libraries_path_prefix +Export('SDK_LIB') + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT) + +nuvoton_library = 'ma35' +rtconfig.BSP_LIBRARY_TYPE = nuvoton_library + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, nuvoton_library, 'SConscript'))) + +# include nu_pkgs +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'nu_packages', 'SConscript'))) + +# make a building +DoBuilding(TARGET, objs) diff --git a/bsp/nuvoton/numaker-iot-ma35d1/applications/SConscript b/bsp/nuvoton/numaker-iot-ma35d1/applications/SConscript new file mode 100644 index 0000000000..a3ccbe0469 --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/applications/SConscript @@ -0,0 +1,11 @@ +from building import * +import os +cwd = GetCurrentDir() +src = Glob('*.c') +CPPPATH = [cwd] +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) +list = os.listdir(cwd) +for item in list: + if os.path.isfile(os.path.join(cwd, item, 'SConscript')): + group = group + SConscript(os.path.join(item, 'SConscript')) +Return('group') diff --git a/bsp/nuvoton/numaker-iot-ma35d1/applications/main.c b/bsp/nuvoton/numaker-iot-ma35d1/applications/main.c new file mode 100644 index 0000000000..ff2061ff1b --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/applications/main.c @@ -0,0 +1,121 @@ +/**************************************************************************//** +* +* @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-6-1 Wayne First version +* +******************************************************************************/ + +#include +#include +#include "drv_common.h" + +#if defined(RT_USING_PIN) +#include "drv_gpio.h" + +/* defined the LED_0 pin: PN6 */ +#define LED_0 NU_GET_PININDEX(NU_PN, 6) + +/* defined the LED_1 pin: PN7 */ +#define LED_1 NU_GET_PININDEX(NU_PN, 7) + +/* defined the LED_2 pin: PN10 */ +#define LED_2 NU_GET_PININDEX(NU_PN, 10) + +/* defined the KEY_0 pin: PN2 */ +#define KEY_0 NU_GET_PININDEX(NU_PN, 2) + +/* defined the KEY_1 pin: PN3 */ +#define KEY_1 NU_GET_PININDEX(NU_PN, 3) + +/* defined the KEY_2 pin: PN12 */ +#define KEY_2 NU_GET_PININDEX(NU_PN, 12) + +/* defined the KEY_3 pin: PN13 */ +#define KEY_3 NU_GET_PININDEX(NU_PN, 13) + +void nu_button_cb(void *args) +{ + uint32_t u32Key = (uint32_t)args; + + switch (u32Key) + { + case KEY_0: + rt_kprintf("KEY_0 pressed\n"); + rt_pin_write(LED_1, PIN_HIGH); + break; + case KEY_1: + rt_kprintf("KEY_1 pressed\n"); + rt_pin_write(LED_1, PIN_LOW); + break; + case KEY_2: + rt_kprintf("KEY_2 pressed\n"); + rt_pin_write(LED_2, PIN_HIGH); + break; + case KEY_3: + rt_kprintf("KEY_3 pressed\n"); + rt_pin_write(LED_2, PIN_LOW); + break; + } +} + +static void nu_button_init(void) +{ + /* set KEY_0 pin mode to input, pull-up, falling edge and enable interrupt. */ + rt_pin_mode(KEY_0, PIN_MODE_INPUT_PULLUP); + rt_pin_attach_irq(KEY_0, PIN_IRQ_MODE_FALLING, nu_button_cb, (void *)KEY_0); + rt_pin_irq_enable(KEY_0, PIN_IRQ_ENABLE); + + /* set KEY_1 pin mode to input, pull-up, falling edge and enable interrupt. */ + rt_pin_mode(KEY_1, PIN_MODE_INPUT_PULLUP); + rt_pin_attach_irq(KEY_1, PIN_IRQ_MODE_FALLING, nu_button_cb, (void *)KEY_1); + rt_pin_irq_enable(KEY_1, PIN_IRQ_ENABLE); + + /* set KEY_2 pin mode to input, pull-up, falling edge and enable interrupt. */ + rt_pin_mode(KEY_2, PIN_MODE_INPUT_PULLUP); + rt_pin_attach_irq(KEY_2, PIN_IRQ_MODE_FALLING, nu_button_cb, (void *)KEY_2); + rt_pin_irq_enable(KEY_2, PIN_IRQ_ENABLE); + + /* set KEY_3 pin mode to input, pull-up, falling edge and enable interrupt. */ + rt_pin_mode(KEY_3, PIN_MODE_INPUT_PULLUP); + rt_pin_attach_irq(KEY_3, PIN_IRQ_MODE_FALLING, nu_button_cb, (void *)KEY_3); + rt_pin_irq_enable(KEY_3, PIN_IRQ_ENABLE); +} + + +int main(int argc, char **argv) +{ + int counter = 100000; + + /* set on-board buttons */ + nu_button_init(); + + /* set LED_0, LED_1 and LED_2 pin mode to output */ + rt_pin_mode(LED_0, PIN_MODE_OUTPUT); + rt_pin_mode(LED_1, PIN_MODE_OUTPUT); + rt_pin_mode(LED_2, PIN_MODE_OUTPUT); + + while (counter--) + { + rt_pin_write(LED_0, PIN_HIGH); + rt_thread_mdelay(100); + rt_pin_write(LED_0, PIN_LOW); + rt_thread_mdelay(100); + } + + return 0; +} + +#else + +int main(int argc, char **argv) +{ + rt_kprintf("cpu-%d %d\r\n", rt_hw_cpu_id(), nu_cpu_dcache_line_size()); + return 0; +} + +#endif diff --git a/bsp/nuvoton/numaker-iot-ma35d1/applications/mnt.c b/bsp/nuvoton/numaker-iot-ma35d1/applications/mnt.c new file mode 100644 index 0000000000..c3e3045e3d --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/applications/mnt.c @@ -0,0 +1,283 @@ +/**************************************************************************//** +* +* @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-6-26 Wayne First version +* +******************************************************************************/ + +#include + +#if defined(RT_USING_DFS) + +#define LOG_TAG "mnt" +#define DBG_ENABLE +#define DBG_SECTION_NAME "mnt" +#define DBG_LEVEL DBG_ERROR +#define DBG_COLOR +#include + +#include +#include +#include +#include +#include +#include + +#if defined(RT_USING_FAL) + #include +#endif + +#if defined(PKG_USING_RAMDISK) + #define RAMDISK_NAME "ramdisk0" + #define RAMDISK_UDC "ramdisk1" + #define MOUNT_POINT_RAMDISK0 "/" +#endif + +#if defined(BOARD_USING_STORAGE_SPIFLASH) + #define PARTITION_NAME_FILESYSTEM "filesystem" + #define MOUNT_POINT_SPIFLASH0 "/mnt/"PARTITION_NAME_FILESYSTEM +#endif + +#ifdef RT_USING_DFS_MNTTABLE + +/* +const char *device_name; +const char *path; +const char *filesystemtype; +unsigned long rwflag; +const void *data; +*/ + +const struct dfs_mount_tbl mount_table[] = +{ +#if defined(PKG_USING_RAMDISK) + { RAMDISK_UDC, "/mnt/ram_usbd", "elm", 0, RT_NULL }, +#endif +#if defined(PKG_USING_DFS_YAFFS) + { "nand1", "/mnt/nand1", "yaffs", 0, RT_NULL }, + { "rawnd1", "/mnt/nfi", "yaffs", 0, RT_NULL }, +#elif defined(RT_USING_DFS_UFFS) + { "nand1", "/mnt/nand1", "uffs", 0, RT_NULL }, +#endif + { "sd0", "/mnt/sd0", "elm", 0, RT_NULL }, + { "sd0p0", "/mnt/sd0p0", "elm", 0, RT_NULL }, + { "sd0p1", "/mnt/sd0p1", "elm", 0, RT_NULL }, + { "sd1", "/mnt/sd1", "elm", 0, RT_NULL }, + { "sd1p0", "/mnt/sd1p0", "elm", 0, RT_NULL }, + { "sd1p1", "/mnt/sd1p1", "elm", 0, RT_NULL }, + {0}, +}; +#endif + + +#if defined(PKG_USING_RAMDISK) + +extern rt_err_t ramdisk_init(const char *dev_name, rt_uint8_t *disk_addr, rt_size_t block_size, rt_size_t num_block); +int ramdisk_device_init(void) +{ + rt_err_t result = RT_EOK; + + /* Create a 8MB RAMDISK */ + result = ramdisk_init(RAMDISK_NAME, NULL, 512, 8 * 4096); + RT_ASSERT(result == RT_EOK); + + /* Create a 8MB RAMDISK */ + result = ramdisk_init(RAMDISK_UDC, NULL, 512, 8 * 4096); + RT_ASSERT(result == RT_EOK); + + return 0; +} +INIT_DEVICE_EXPORT(ramdisk_device_init); + +/* Recursive mkdir */ +static int mkdir_p(const char *dir, const mode_t mode) +{ + int ret = -1; + char *tmp = NULL; + char *p = NULL; + struct stat sb; + rt_size_t len; + + if (!dir) + goto exit_mkdir_p; + + /* Copy path */ + /* Get the string length */ + len = strlen(dir); + tmp = rt_strdup(dir); + + /* Remove trailing slash */ + if (tmp[len - 1] == '/') + { + tmp[len - 1] = '\0'; + len--; + } + + /* check if path exists and is a directory */ + if (stat(tmp, &sb) == 0) + { + if (S_ISDIR(sb.st_mode)) + { + ret = 0; + goto exit_mkdir_p; + } + } + + /* Recursive mkdir */ + for (p = tmp + 1; p - tmp <= len; p++) + { + if ((*p == '/') || (p - tmp == len)) + { + *p = 0; + + /* Test path */ + if (stat(tmp, &sb) != 0) + { + /* Path does not exist - create directory */ + if (mkdir(tmp, mode) < 0) + { + goto exit_mkdir_p; + } + } + else if (!S_ISDIR(sb.st_mode)) + { + /* Not a directory */ + goto exit_mkdir_p; + } + if (p - tmp != len) + *p = '/'; + } + } + + ret = 0; + +exit_mkdir_p: + + if (tmp) + rt_free(tmp); + + return ret; +} + +#if defined(PKG_USING_DFS_YAFFS) && defined(RT_USING_DFS_MNTTABLE) +#include "yaffs_guts.h" +int yaffs_dev_init(void) +{ + int i; + + for (i = 0; i < sizeof(mount_table) / sizeof(struct dfs_mount_tbl); i++) + { + if (mount_table[i].filesystemtype && !rt_strcmp(mount_table[i].filesystemtype, "yaffs")) + { + struct rt_mtd_nand_device *psMtdNandDev = RT_MTD_NAND_DEVICE(rt_device_find(mount_table[i].device_name)); + if (psMtdNandDev) + { + LOG_I("yaffs start [%s].", mount_table[i].device_name); + + yaffs_start_up(psMtdNandDev, (const char *)mount_table[i].path); + + LOG_I("dfs mount [%s].", mount_table[i].device_name); + if (dfs_mount(mount_table[i].device_name, + mount_table[i].path, + mount_table[i].filesystemtype, + mount_table[i].rwflag, + mount_table[i].data) != 0) + { + LOG_E("mount fs[%s] on %s failed.", mount_table[i].filesystemtype, mount_table[i].path); + } + } + } + } + + return 0; +} +INIT_APP_EXPORT(yaffs_dev_init); +#endif + +/* Initialize the filesystem */ +int filesystem_init(void) +{ + rt_err_t result = RT_EOK; + +#if defined(RT_USING_FAL) + extern int fal_init_check(void); + if (!fal_init_check()) + fal_init(); +#endif + + // ramdisk as root + if (!rt_device_find(RAMDISK_NAME)) + { + LOG_E("cannot find %s device", RAMDISK_NAME); + result = -RT_ERROR; + goto exit_filesystem_init; + } + else + { + /* Format these ramdisk */ + result = (rt_err_t)dfs_mkfs("elm", RAMDISK_NAME); + RT_ASSERT(result == RT_EOK); + + /* mount ramdisk0 as root directory */ + if (dfs_mount(RAMDISK_NAME, "/", "elm", 0, RT_NULL) == 0) + { + LOG_I("ramdisk mounted on \"/\"."); + + /* now you can create dir dynamically. */ + mkdir_p("/mnt", 0x777); + mkdir_p("/cache", 0x777); + mkdir_p("/download", 0x777); + mkdir_p("/mnt/ram_usbd", 0x777); + mkdir_p("/mnt/nand1", 0x777); + mkdir_p("/mnt/nfi", 0x777); + mkdir_p("/mnt/sd0", 0x777); + mkdir_p("/mnt/sd0p0", 0x777); + mkdir_p("/mnt/sd0p1", 0x777); + mkdir_p("/mnt/sd1", 0x777); + mkdir_p("/mnt/sd1p0", 0x777); + mkdir_p("/mnt/sd1p1", 0x777); +#if defined(RT_USBH_MSTORAGE) && defined(UDISK_MOUNTPOINT) + mkdir_p(UDISK_MOUNTPOINT, 0x777); +#endif + } + else + { + LOG_E("root folder creation failed!\n"); + goto exit_filesystem_init; + } + } + + if (!rt_device_find(RAMDISK_UDC)) + { + LOG_E("cannot find %s device", RAMDISK_UDC); + goto exit_filesystem_init; + } + else + { + /* Format these ramdisk */ + result = (rt_err_t)dfs_mkfs("elm", RAMDISK_UDC); + RT_ASSERT(result == RT_EOK); + } + +#if defined(BOARD_USING_STORAGE_SPIFLASH) + { + struct rt_device *psNorFlash = fal_blk_device_create(PARTITION_NAME_FILESYSTEM); + if (!psNorFlash) + { + rt_kprintf("Failed to create block device for %s.\n", PARTITION_NAME_FILESYSTEM); + } + } +#endif + +exit_filesystem_init: + + return -result; +} +INIT_ENV_EXPORT(filesystem_init); +#endif +#endif diff --git a/bsp/nuvoton/numaker-iot-ma35d1/board/Kconfig b/bsp/nuvoton/numaker-iot-ma35d1/board/Kconfig new file mode 100644 index 0000000000..17a2a0bb79 --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/board/Kconfig @@ -0,0 +1,90 @@ +menu "Hardware Drivers Config" + + menu "On-chip Peripheral Drivers" + source "$BSP_DIR/../libraries/ma35/rtt_port/Kconfig" + endmenu + + menu "On-board Peripheral Drivers" + + config BSP_USING_CONSOLE + bool "Enable UART0 for RTT Console(uart0)" + select BSP_USING_UART + select BSP_USING_UART0 + default y + + config BOARD_USING_NAU8822 + bool "NAU8822 Audio Codec supporting(over i2s0, i2c1)" + select NU_PKG_USING_NAU8822 + select BSP_USING_I2C1 + select BSP_USING_I2S + select BSP_USING_I2S0 + default n + + config BOARD_USING_GMAC0 + bool "Enable RGMII0 port(over e0)" + select BSP_USING_GMAC0 + select BSP_USING_GMAC + default y + + config BOARD_USING_GMAC1 + bool "Enable RMII1 port(over e1)" + select BSP_USING_GMAC1 + select BSP_USING_GMAC + default y + + config BOARD_USING_STORAGE_SDCARD + bool "SDCARD supporting(over sdh1)" + select BSP_USING_SDH + select BSP_USING_SDH1 + default y + + config BOARD_USING_STORAGE_RAWNAND + bool "Raw NAND supporting(over nfi)" + select BSP_USING_NFI + select RT_USING_MTD_NAND + default y + + config BOARD_USING_STORAGE_SPIFLASH + bool "SPI NOR FLASH supporting(over qspi0)" + select BSP_USING_QSPI + select BSP_USING_QSPI0 + default n + + config BOARD_USING_STORAGE_SPINAND + bool "SPI NAND FLASH supporting(over qspi0)" + select BSP_USING_QSPI + select BSP_USING_QSPI0 + select NU_PKG_USING_SPINAND + default y + + config BOARD_USING_USBHOST + bool "USB HOST function" + select BSP_USING_USBH + default y + + endmenu + + menu "Board extended module drivers" + + config BOARD_USING_SENSOR0 + bool "CCAP-SENSOR PORT0(over i2c2/PM1/PC12)" + select BSP_USING_I2C + select BSP_USING_I2C2 + select BSP_USING_CCAP + select BSP_USING_CCAP0 + default n + + if BOARD_USING_SENSOR0 + config BOARD_USING_SENSON0_ID + int "Specify Sensor0 ID" + default 0 if BOARD_USING_SENSOR0 + range 0 2 + help + HM1055=0 + ADV728X=1 + endif + endmenu + + source "$BSP_DIR/../libraries/nu_packages/Kconfig" + +endmenu diff --git a/bsp/nuvoton/numaker-iot-ma35d1/board/SConscript b/bsp/nuvoton/numaker-iot-ma35d1/board/SConscript new file mode 100644 index 0000000000..38791565a2 --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/board/SConscript @@ -0,0 +1,18 @@ +# RT-Thread building script for component + +from building import * + + +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +src = Split(""" +nutool_pincfg/nutool_pincfg.c +""") +src += Glob('*.c') + Glob('*.cpp') + Glob('*.S') +CPPPATH = [cwd, cwd + '/nutool_pincfg'] + +group = DefineGroup('board', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/bsp/nuvoton/numaker-iot-ma35d1/board/board.h b/bsp/nuvoton/numaker-iot-ma35d1/board/board.h new file mode 100644 index 0000000000..7572d78c77 --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/board/board.h @@ -0,0 +1,42 @@ +/**************************************************************************//** +* +* @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-6-1 Wayne First version +* +******************************************************************************/ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include "NuMicro.h" +#include "drv_sys.h" +#include "nutool_pincfg.h" + +#define BOARD_SDRAM_START 0x80400000 +#define BOARD_SDRAM_SIZE 0x07C00000 + +#define BOARD_HEAP_END ((void*)(BOARD_SDRAM_START+BOARD_SDRAM_SIZE)) +#define BOARD_HEAP_START ((void *)&__bss_end) + +extern int __bss_end; + +#if defined(RT_USING_MTD_NAND) + #include + #define MTD_SPINAND_PARTITION_NUM 3 + extern struct rt_mtd_nand_device mtd_partitions[MTD_SPINAND_PARTITION_NUM]; + + #define MTD_NFI_PARTITION_NUM 3 + extern struct rt_mtd_nand_device mtd_partitions_nfi[MTD_NFI_PARTITION_NUM]; +#endif +extern void rt_hw_board_init(void); +extern void nu_clock_init(void); +extern void nu_clock_deinit(void); +extern void nu_pin_init(void); +extern void nu_pin_deinit(void); + +#endif /* BOARD_H_ */ diff --git a/bsp/nuvoton/numaker-iot-ma35d1/board/board_dev.c b/bsp/nuvoton/numaker-iot-ma35d1/board/board_dev.c new file mode 100644 index 0000000000..89a03d8355 --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/board/board_dev.c @@ -0,0 +1,312 @@ +/**************************************************************************//** +* +* @copyright (C) 2019 Nuvoton Technology Corp. All rights reserved. +* +* SPDX-License-Identifier: Apache-2.0 +* +* Change Logs: +* Date Author Notes +* 2021-6-1 Wayne First version +* +******************************************************************************/ + +#include +#include +#include "drv_gpio.h" +#include "drv_sys.h" +#include "drv_sspcc.h" + +#include "board.h" + + +#if defined(BOARD_USING_STORAGE_SPIFLASH) +#if defined(RT_USING_SFUD) + #include "spi_flash.h" + #include "spi_flash_sfud.h" +#endif + +#include "drv_qspi.h" + +#define W25X_REG_READSTATUS (0x05) +#define W25X_REG_READSTATUS2 (0x35) +#define W25X_REG_WRITEENABLE (0x06) +#define W25X_REG_WRITESTATUS (0x01) +#define W25X_REG_QUADENABLE (0x02) + +static rt_uint8_t SpiFlash_ReadStatusReg(struct rt_qspi_device *qspi_device) +{ + rt_uint8_t u8Val; + rt_err_t result = RT_EOK; + rt_uint8_t w25x_txCMD1 = W25X_REG_READSTATUS; + + result = rt_qspi_send_then_recv(qspi_device, &w25x_txCMD1, 1, &u8Val, 1); + RT_ASSERT(result > 0); + + return u8Val; +} + +static rt_uint8_t SpiFlash_ReadStatusReg2(struct rt_qspi_device *qspi_device) +{ + rt_uint8_t u8Val; + rt_err_t result = RT_EOK; + rt_uint8_t w25x_txCMD1 = W25X_REG_READSTATUS2; + + result = rt_qspi_send_then_recv(qspi_device, &w25x_txCMD1, 1, &u8Val, 1); + RT_ASSERT(result > 0); + + return u8Val; +} + +static rt_err_t SpiFlash_WriteStatusReg(struct rt_qspi_device *qspi_device, uint8_t u8Value1, uint8_t u8Value2) +{ + rt_uint8_t w25x_txCMD1; + rt_uint8_t au8Val[2]; + rt_err_t result; + struct rt_qspi_message qspi_message = {0}; + + /* Enable WE */ + w25x_txCMD1 = W25X_REG_WRITEENABLE; + result = rt_qspi_send(qspi_device, &w25x_txCMD1, sizeof(w25x_txCMD1)); + if (result != sizeof(w25x_txCMD1)) + goto exit_SpiFlash_WriteStatusReg; + + /* Prepare status-1, 2 data */ + au8Val[0] = u8Value1; + au8Val[1] = u8Value2; + + /* 1-bit mode: Instruction+payload */ + qspi_message.instruction.content = W25X_REG_WRITESTATUS; + qspi_message.instruction.qspi_lines = 1; + + qspi_message.qspi_data_lines = 1; + qspi_message.parent.cs_take = 1; + qspi_message.parent.cs_release = 1; + qspi_message.parent.send_buf = &au8Val[0]; + qspi_message.parent.length = sizeof(au8Val); + qspi_message.parent.next = RT_NULL; + + if (rt_qspi_transfer_message(qspi_device, &qspi_message) != sizeof(au8Val)) + { + result = -RT_ERROR; + } + + result = RT_EOK; + +exit_SpiFlash_WriteStatusReg: + + return result; +} + +static void SpiFlash_WaitReady(struct rt_qspi_device *qspi_device) +{ + volatile uint8_t u8ReturnValue; + + do + { + u8ReturnValue = SpiFlash_ReadStatusReg(qspi_device); + u8ReturnValue = u8ReturnValue & 1; + } + while (u8ReturnValue != 0); // check the BUSY bit +} + +static void SpiFlash_EnterQspiMode(struct rt_qspi_device *qspi_device) +{ + rt_err_t result = RT_EOK; + + uint8_t u8Status1 = SpiFlash_ReadStatusReg(qspi_device); + uint8_t u8Status2 = SpiFlash_ReadStatusReg2(qspi_device); + + u8Status2 |= W25X_REG_QUADENABLE; + + result = SpiFlash_WriteStatusReg(qspi_device, u8Status1, u8Status2); + RT_ASSERT(result == RT_EOK); + + SpiFlash_WaitReady(qspi_device); +} + +static void SpiFlash_ExitQspiMode(struct rt_qspi_device *qspi_device) +{ + rt_err_t result = RT_EOK; + uint8_t u8Status1 = SpiFlash_ReadStatusReg(qspi_device); + uint8_t u8Status2 = SpiFlash_ReadStatusReg2(qspi_device); + + u8Status2 &= ~W25X_REG_QUADENABLE; + + result = SpiFlash_WriteStatusReg(qspi_device, u8Status1, u8Status2); + RT_ASSERT(result == RT_EOK); + + SpiFlash_WaitReady(qspi_device); +} + +static int rt_hw_spiflash_init(void) +{ + if (nu_qspi_bus_attach_device("qspi0", "qspi01", 4, SpiFlash_EnterQspiMode, SpiFlash_ExitQspiMode) != RT_EOK) + return -1; + +#if defined(RT_USING_SFUD) + if (rt_sfud_flash_probe(FAL_USING_NOR_FLASH_DEV_NAME, "qspi01") == RT_NULL) + { + return -(RT_ERROR); + } +#endif + return 0; +} +INIT_DEVICE_EXPORT(rt_hw_spiflash_init); +#endif /* BOARD_USING_STORAGE_SPIFLASH */ + +#if defined(BOARD_USING_STORAGE_SPINAND) && defined(NU_PKG_USING_SPINAND) + +#include "drv_qspi.h" +#include "spinand.h" + +struct rt_mtd_nand_device mtd_partitions[MTD_SPINAND_PARTITION_NUM] = +{ + [0] = + { + /*nand0: U-boot, env, rtthread*/ + .block_start = 0, + .block_end = 63, + .block_total = 64, + }, + [1] = + { + /*nand1: for filesystem mounting*/ + .block_start = 64, + .block_end = 4095, + .block_total = 4032, + }, + [2] = + { + /*nand2: Whole blocks size, overlay*/ + .block_start = 0, + .block_end = 4095, + .block_total = 4096, + } +}; + +static int rt_hw_spinand_init(void) +{ + if (nu_qspi_bus_attach_device("qspi0", "qspi01", 4, RT_NULL, RT_NULL) != RT_EOK) + return -1; + + if (rt_hw_mtd_spinand_register("qspi01") != RT_EOK) + return -1; + + return 0; +} + +INIT_DEVICE_EXPORT(rt_hw_spinand_init); +#endif + +#if defined(BOARD_USING_STORAGE_RAWNAND) && defined(BSP_USING_NFI) +struct rt_mtd_nand_device mtd_partitions_nfi[MTD_NFI_PARTITION_NUM] = +{ + [0] = + { + /*nand0: rtthread*/ + .block_start = 0, + .block_end = 63, + .block_total = 64, + }, + [1] = + { + /*nand1: for filesystem mounting*/ + .block_start = 64, + .block_end = 8191, + .block_total = 8128, + }, + [2] = + { + /*nand2: Whole blocks size, overlay*/ + .block_start = 0, + .block_end = 8191, + .block_total = 8192, + } +}; +#endif + +#if defined(BOARD_USING_NAU8822) && defined(NU_PKG_USING_NAU8822) +#include +S_NU_NAU8822_CONFIG sCodecConfig = +{ + .i2c_bus_name = "i2c1", + + .i2s_bus_name = "sound0", + + .pin_phonejack_en = NU_GET_PININDEX(NU_PC, 2), + + .pin_phonejack_det = NU_GET_PININDEX(NU_PC, 3), +}; + +int rt_hw_nau8822_port(void) +{ + if (nu_hw_nau8822_init(&sCodecConfig) != RT_EOK) + return -1; + + return 0; +} +INIT_COMPONENT_EXPORT(rt_hw_nau8822_port); +#endif /* BOARD_USING_NAU8822 */ + + +#if defined(BOARD_USING_SENSOR0) +#include "ccap_sensor.h" + +#define SENSOR0_RST_PIN NU_GET_PININDEX(NU_PM, 1) +#define SENSOR0_PD_PIN NU_GET_PININDEX(NU_PC, 12) + +ccap_sensor_io sIo_sensor0 = +{ + .RstPin = SENSOR0_RST_PIN, + .PwrDwnPin = SENSOR0_PD_PIN, + .I2cName = "i2c2" +}; +#endif /* BOARD_USING_SENSOR0 */ +int rt_hw_sensors_port(void) +{ +#if defined(BOARD_USING_SENSOR0) + nu_ccap_sensor_create(&sIo_sensor0, (ccap_sensor_id)BOARD_USING_SENSON0_ID, "sensor0"); +#endif + return 0; +} +INIT_COMPONENT_EXPORT(rt_hw_sensors_port); +void nu_rtp_sspcc_setup(void) +{ + /* PDMA2/3 */ + SSPCC_SET_REALM(SSPCC_PDMA2, SSPCC_SSET_SUBM); + SSPCC_SET_REALM(SSPCC_PDMA3, SSPCC_SSET_SUBM); +} + +static S_NU_REG s_NuReg_arr[] = +{ + /* QSPI0 */ + NUREG_EXPORT(CLK_CLKSEL4, CLK_CLKSEL4_QSPI0SEL_Msk, CLK_CLKSEL4_QSPI0SEL_PCLK0), + NUREG_EXPORT(CLK_APBCLK1, CLK_APBCLK1_QSPI0CKEN_Msk, CLK_APBCLK1_QSPI0CKEN_Msk), + NUREG_EXPORT(SYS_GPD_MFPL, SYS_GPD_MFPL_PD5MFP_Msk, SYS_GPD_MFPL_PD5MFP_QSPI0_MISO1), + NUREG_EXPORT(SYS_GPD_MFPL, SYS_GPD_MFPL_PD4MFP_Msk, SYS_GPD_MFPL_PD4MFP_QSPI0_MOSI1), + NUREG_EXPORT(SYS_GPD_MFPL, SYS_GPD_MFPL_PD3MFP_Msk, SYS_GPD_MFPL_PD3MFP_QSPI0_MISO0), + NUREG_EXPORT(SYS_GPD_MFPL, SYS_GPD_MFPL_PD2MFP_Msk, SYS_GPD_MFPL_PD2MFP_QSPI0_MOSI0), + NUREG_EXPORT(SYS_GPD_MFPL, SYS_GPD_MFPL_PD1MFP_Msk, SYS_GPD_MFPL_PD1MFP_QSPI0_CLK), + NUREG_EXPORT(SYS_GPD_MFPL, SYS_GPD_MFPL_PD0MFP_Msk, SYS_GPD_MFPL_PD0MFP_QSPI0_SS0), + + /* TIMERn */ + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR0CKEN_Msk, CLK_APBCLK0_TMR0CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR1CKEN_Msk, CLK_APBCLK0_TMR1CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR2CKEN_Msk, CLK_APBCLK0_TMR2CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR3CKEN_Msk, CLK_APBCLK0_TMR3CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR4CKEN_Msk, CLK_APBCLK0_TMR4CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR5CKEN_Msk, CLK_APBCLK0_TMR5CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR6CKEN_Msk, CLK_APBCLK0_TMR6CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR7CKEN_Msk, CLK_APBCLK0_TMR7CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR8CKEN_Msk, CLK_APBCLK0_TMR8CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR9CKEN_Msk, CLK_APBCLK0_TMR9CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR10CKEN_Msk, CLK_APBCLK0_TMR10CKEN_Msk), + NUREG_EXPORT(CLK_APBCLK0, CLK_APBCLK0_TMR11CKEN_Msk, CLK_APBCLK0_TMR11CKEN_Msk), + {0} +}; + +void nu_check_register(void) +{ + nu_sys_check_register(&s_NuReg_arr[0]); +} +MSH_CMD_EXPORT(nu_check_register, Check registers); diff --git a/bsp/nuvoton/numaker-iot-ma35d1/board/nutool_pincfg/nutool_pincfg.c b/bsp/nuvoton/numaker-iot-ma35d1/board/nutool_pincfg/nutool_pincfg.c new file mode 100644 index 0000000000..afdb55b5e5 --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/board/nutool_pincfg/nutool_pincfg.c @@ -0,0 +1,476 @@ +/**************************************************************************** + * @file nutool_pincfg.c + * @version V1.24 + * @Date 2022/11/01-18:39:48 + * @brief NuMicro generated code file + * + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (C) 2013-2022 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ + +/******************** +MCU:MA35D16F787C(LQFP216) +********************/ + +#include "ma35d1.h" + +void nutool_pincfg_init_adc0(void) +{ + SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB15MFP_Msk | SYS_GPB_MFPH_PB14MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk | SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB11MFP_Msk | SYS_GPB_MFPH_PB10MFP_Msk); + SYS->GPB_MFPH |= (SYS_GPB_MFPH_PB15MFP_ADC0_CH7 | SYS_GPB_MFPH_PB14MFP_ADC0_CH6 | SYS_GPB_MFPH_PB13MFP_ADC0_CH5 | SYS_GPB_MFPH_PB12MFP_ADC0_CH4 | SYS_GPB_MFPH_PB11MFP_ADC0_CH3 | SYS_GPB_MFPH_PB10MFP_ADC0_CH2); + + PB->MODE &= ~(GPIO_MODE_MODE10_Msk | GPIO_MODE_MODE11_Msk | GPIO_MODE_MODE12_Msk | GPIO_MODE_MODE13_Msk | GPIO_MODE_MODE14_Msk | GPIO_MODE_MODE15_Msk); + GPIO_DISABLE_DIGITAL_PATH(PB, BIT10 | BIT11 | BIT12 | BIT13 | BIT14 | BIT15); + + return; +} + +void nutool_pincfg_deinit_adc0(void) +{ + SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB15MFP_Msk | SYS_GPB_MFPH_PB14MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk | SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB11MFP_Msk | SYS_GPB_MFPH_PB10MFP_Msk); + + return; +} + +void nutool_pincfg_init_can1(void) +{ + SYS->GPC_MFPL &= ~(SYS_GPC_MFPL_PC7MFP_Msk | SYS_GPC_MFPL_PC6MFP_Msk); + SYS->GPC_MFPL |= (SYS_GPC_MFPL_PC7MFP_CAN1_TXD | SYS_GPC_MFPL_PC6MFP_CAN1_RXD); + + return; +} + +void nutool_pincfg_deinit_can1(void) +{ + SYS->GPC_MFPL &= ~(SYS_GPC_MFPL_PC7MFP_Msk | SYS_GPC_MFPL_PC6MFP_Msk); + + return; +} + +void nutool_pincfg_init_ccap0(void) +{ + SYS->GPK_MFPH &= ~(SYS_GPK_MFPH_PK11MFP_Msk | SYS_GPK_MFPH_PK10MFP_Msk | SYS_GPK_MFPH_PK9MFP_Msk); + SYS->GPK_MFPH |= (SYS_GPK_MFPH_PK11MFP_CCAP0_HSYNC | SYS_GPK_MFPH_PK10MFP_CCAP0_PIXCLK | SYS_GPK_MFPH_PK9MFP_CCAP0_SCLK); + SYS->GPM_MFPH &= ~(SYS_GPM_MFPH_PM11MFP_Msk | SYS_GPM_MFPH_PM10MFP_Msk | SYS_GPM_MFPH_PM9MFP_Msk | SYS_GPM_MFPH_PM8MFP_Msk); + SYS->GPM_MFPH |= (SYS_GPM_MFPH_PM11MFP_CCAP0_DATA9 | SYS_GPM_MFPH_PM10MFP_CCAP0_DATA8 | SYS_GPM_MFPH_PM9MFP_CCAP0_DATA7 | SYS_GPM_MFPH_PM8MFP_CCAP0_DATA6); + SYS->GPM_MFPL &= ~(SYS_GPM_MFPL_PM7MFP_Msk | SYS_GPM_MFPL_PM6MFP_Msk | SYS_GPM_MFPL_PM5MFP_Msk | SYS_GPM_MFPL_PM4MFP_Msk | SYS_GPM_MFPL_PM3MFP_Msk | SYS_GPM_MFPL_PM2MFP_Msk | SYS_GPM_MFPL_PM0MFP_Msk); + SYS->GPM_MFPL |= (SYS_GPM_MFPL_PM7MFP_CCAP0_DATA5 | SYS_GPM_MFPL_PM6MFP_CCAP0_DATA4 | SYS_GPM_MFPL_PM5MFP_CCAP0_DATA3 | SYS_GPM_MFPL_PM4MFP_CCAP0_DATA2 | SYS_GPM_MFPL_PM3MFP_CCAP0_DATA1 | SYS_GPM_MFPL_PM2MFP_CCAP0_DATA0 | SYS_GPM_MFPL_PM0MFP_CCAP0_VSYNC); + + return; +} + +void nutool_pincfg_deinit_ccap0(void) +{ + SYS->GPK_MFPH &= ~(SYS_GPK_MFPH_PK11MFP_Msk | SYS_GPK_MFPH_PK10MFP_Msk | SYS_GPK_MFPH_PK9MFP_Msk); + SYS->GPM_MFPH &= ~(SYS_GPM_MFPH_PM11MFP_Msk | SYS_GPM_MFPH_PM10MFP_Msk | SYS_GPM_MFPH_PM9MFP_Msk | SYS_GPM_MFPH_PM8MFP_Msk); + SYS->GPM_MFPL &= ~(SYS_GPM_MFPL_PM7MFP_Msk | SYS_GPM_MFPL_PM6MFP_Msk | SYS_GPM_MFPL_PM5MFP_Msk | SYS_GPM_MFPL_PM4MFP_Msk | SYS_GPM_MFPL_PM3MFP_Msk | SYS_GPM_MFPL_PM2MFP_Msk | SYS_GPM_MFPL_PM0MFP_Msk); + + return; +} + +void nutool_pincfg_init_hsusb0(void) +{ + SYS->GPF_MFPH &= ~(SYS_GPF_MFPH_PF15MFP_Msk); + SYS->GPF_MFPH |= (SYS_GPF_MFPH_PF15MFP_HSUSB0_VBUSVLD); + + return; +} + +void nutool_pincfg_deinit_hsusb0(void) +{ + SYS->GPF_MFPH &= ~(SYS_GPF_MFPH_PF15MFP_Msk); + + return; +} + +void nutool_pincfg_init_hsusbh(void) +{ + SYS->GPL_MFPH &= ~(SYS_GPL_MFPH_PL13MFP_Msk | SYS_GPL_MFPH_PL12MFP_Msk); + SYS->GPL_MFPH |= (SYS_GPL_MFPH_PL13MFP_HSUSBH_OVC | SYS_GPL_MFPH_PL12MFP_HSUSBH_PWREN); + + return; +} + +void nutool_pincfg_deinit_hsusbh(void) +{ + SYS->GPL_MFPH &= ~(SYS_GPL_MFPH_PL13MFP_Msk | SYS_GPL_MFPH_PL12MFP_Msk); + + return; +} + +void nutool_pincfg_init_i2c1(void) +{ + SYS->GPN_MFPL &= ~(SYS_GPN_MFPL_PN5MFP_Msk | SYS_GPN_MFPL_PN4MFP_Msk); + SYS->GPN_MFPL |= (SYS_GPN_MFPL_PN5MFP_I2C1_SCL | SYS_GPN_MFPL_PN4MFP_I2C1_SDA); + + return; +} + +void nutool_pincfg_deinit_i2c1(void) +{ + SYS->GPN_MFPL &= ~(SYS_GPN_MFPL_PN5MFP_Msk | SYS_GPN_MFPL_PN4MFP_Msk); + + return; +} + +void nutool_pincfg_init_i2c2(void) +{ + SYS->GPN_MFPL &= ~(SYS_GPN_MFPL_PN1MFP_Msk | SYS_GPN_MFPL_PN0MFP_Msk); + SYS->GPN_MFPL |= (SYS_GPN_MFPL_PN1MFP_I2C2_SCL | SYS_GPN_MFPL_PN0MFP_I2C2_SDA); + + return; +} + +void nutool_pincfg_deinit_i2c2(void) +{ + SYS->GPN_MFPL &= ~(SYS_GPN_MFPL_PN1MFP_Msk | SYS_GPN_MFPL_PN0MFP_Msk); + + return; +} + +void nutool_pincfg_init_i2c4(void) +{ + SYS->GPC_MFPL &= ~(SYS_GPC_MFPL_PC1MFP_Msk | SYS_GPC_MFPL_PC0MFP_Msk); + SYS->GPC_MFPL |= (SYS_GPC_MFPL_PC1MFP_I2C4_SCL | SYS_GPC_MFPL_PC0MFP_I2C4_SDA); + + return; +} + +void nutool_pincfg_deinit_i2c4(void) +{ + SYS->GPC_MFPL &= ~(SYS_GPC_MFPL_PC1MFP_Msk | SYS_GPC_MFPL_PC0MFP_Msk); + + return; +} + +void nutool_pincfg_init_i2c5(void) +{ + SYS->GPC_MFPL &= ~(SYS_GPC_MFPL_PC5MFP_Msk | SYS_GPC_MFPL_PC4MFP_Msk); + SYS->GPC_MFPL |= (SYS_GPC_MFPL_PC5MFP_I2C5_SCL | SYS_GPC_MFPL_PC4MFP_I2C5_SDA); + + return; +} + +void nutool_pincfg_deinit_i2c5(void) +{ + SYS->GPC_MFPL &= ~(SYS_GPC_MFPL_PC5MFP_Msk | SYS_GPC_MFPL_PC4MFP_Msk); + + return; +} + +void nutool_pincfg_init_i2s0(void) +{ + SYS->GPG_MFPH &= ~(SYS_GPG_MFPH_PG15MFP_Msk | SYS_GPG_MFPH_PG14MFP_Msk | SYS_GPG_MFPH_PG13MFP_Msk | SYS_GPG_MFPH_PG12MFP_Msk | SYS_GPG_MFPH_PG11MFP_Msk); + SYS->GPG_MFPH |= (SYS_GPG_MFPH_PG15MFP_I2S0_DO | SYS_GPG_MFPH_PG14MFP_I2S0_DI | SYS_GPG_MFPH_PG13MFP_I2S0_BCLK | SYS_GPG_MFPH_PG12MFP_I2S0_LRCK | SYS_GPG_MFPH_PG11MFP_I2S0_MCLK); + + return; +} + +void nutool_pincfg_deinit_i2s0(void) +{ + SYS->GPG_MFPH &= ~(SYS_GPG_MFPH_PG15MFP_Msk | SYS_GPG_MFPH_PG14MFP_Msk | SYS_GPG_MFPH_PG13MFP_Msk | SYS_GPG_MFPH_PG12MFP_Msk | SYS_GPG_MFPH_PG11MFP_Msk); + + return; +} + +void nutool_pincfg_init_nand(void) +{ + SYS->GPA_MFPH &= ~(SYS_GPA_MFPH_PA14MFP_Msk | SYS_GPA_MFPH_PA13MFP_Msk | SYS_GPA_MFPH_PA12MFP_Msk | SYS_GPA_MFPH_PA11MFP_Msk | SYS_GPA_MFPH_PA10MFP_Msk | SYS_GPA_MFPH_PA9MFP_Msk | SYS_GPA_MFPH_PA8MFP_Msk); + SYS->GPA_MFPH |= (SYS_GPA_MFPH_PA14MFP_NAND_nWP | SYS_GPA_MFPH_PA13MFP_NAND_nCS0 | SYS_GPA_MFPH_PA12MFP_NAND_ALE | SYS_GPA_MFPH_PA11MFP_NAND_CLE | SYS_GPA_MFPH_PA10MFP_NAND_nWE | SYS_GPA_MFPH_PA9MFP_NAND_nRE | SYS_GPA_MFPH_PA8MFP_NAND_RDY0); + SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA7MFP_Msk | SYS_GPA_MFPL_PA6MFP_Msk | SYS_GPA_MFPL_PA5MFP_Msk | SYS_GPA_MFPL_PA4MFP_Msk | SYS_GPA_MFPL_PA3MFP_Msk | SYS_GPA_MFPL_PA2MFP_Msk | SYS_GPA_MFPL_PA1MFP_Msk | SYS_GPA_MFPL_PA0MFP_Msk); + SYS->GPA_MFPL |= (SYS_GPA_MFPL_PA7MFP_NAND_DATA7 | SYS_GPA_MFPL_PA6MFP_NAND_DATA6 | SYS_GPA_MFPL_PA5MFP_NAND_DATA5 | SYS_GPA_MFPL_PA4MFP_NAND_DATA4 | SYS_GPA_MFPL_PA3MFP_NAND_DATA3 | SYS_GPA_MFPL_PA2MFP_NAND_DATA2 | SYS_GPA_MFPL_PA1MFP_NAND_DATA1 | SYS_GPA_MFPL_PA0MFP_NAND_DATA0); + + return; +} + +void nutool_pincfg_deinit_nand(void) +{ + SYS->GPA_MFPH &= ~(SYS_GPA_MFPH_PA14MFP_Msk | SYS_GPA_MFPH_PA13MFP_Msk | SYS_GPA_MFPH_PA12MFP_Msk | SYS_GPA_MFPH_PA11MFP_Msk | SYS_GPA_MFPH_PA10MFP_Msk | SYS_GPA_MFPH_PA9MFP_Msk | SYS_GPA_MFPH_PA8MFP_Msk); + SYS->GPA_MFPL &= ~(SYS_GPA_MFPL_PA7MFP_Msk | SYS_GPA_MFPL_PA6MFP_Msk | SYS_GPA_MFPL_PA5MFP_Msk | SYS_GPA_MFPL_PA4MFP_Msk | SYS_GPA_MFPL_PA3MFP_Msk | SYS_GPA_MFPL_PA2MFP_Msk | SYS_GPA_MFPL_PA1MFP_Msk | SYS_GPA_MFPL_PA0MFP_Msk); + + return; +} + +void nutool_pincfg_init_qspi0(void) +{ + SYS->GPD_MFPL &= ~(SYS_GPD_MFPL_PD5MFP_Msk | SYS_GPD_MFPL_PD4MFP_Msk | SYS_GPD_MFPL_PD3MFP_Msk | SYS_GPD_MFPL_PD2MFP_Msk | SYS_GPD_MFPL_PD1MFP_Msk | SYS_GPD_MFPL_PD0MFP_Msk); + SYS->GPD_MFPL |= (SYS_GPD_MFPL_PD5MFP_QSPI0_MISO1 | SYS_GPD_MFPL_PD4MFP_QSPI0_MOSI1 | SYS_GPD_MFPL_PD3MFP_QSPI0_MISO0 | SYS_GPD_MFPL_PD2MFP_QSPI0_MOSI0 | SYS_GPD_MFPL_PD1MFP_QSPI0_CLK | SYS_GPD_MFPL_PD0MFP_QSPI0_SS0); + + GPIO_SetDrivingCtl(PD, (BIT0 | BIT1 | BIT2 | BIT3 | BIT4 | BIT5), 4); + + return; +} + +void nutool_pincfg_deinit_qspi0(void) +{ + SYS->GPD_MFPL &= ~(SYS_GPD_MFPL_PD5MFP_Msk | SYS_GPD_MFPL_PD4MFP_Msk | SYS_GPD_MFPL_PD3MFP_Msk | SYS_GPD_MFPL_PD2MFP_Msk | SYS_GPD_MFPL_PD1MFP_Msk | SYS_GPD_MFPL_PD0MFP_Msk); + + return; +} + +void nutool_pincfg_init_rgmii0(void) +{ + SYS->GPE_MFPH &= ~(SYS_GPE_MFPH_PE13MFP_Msk | SYS_GPE_MFPH_PE12MFP_Msk | SYS_GPE_MFPH_PE11MFP_Msk | SYS_GPE_MFPH_PE10MFP_Msk | SYS_GPE_MFPH_PE9MFP_Msk | SYS_GPE_MFPH_PE8MFP_Msk); + SYS->GPE_MFPH |= (SYS_GPE_MFPH_PE13MFP_RGMII0_TXD3 | SYS_GPE_MFPH_PE12MFP_RGMII0_TXD2 | SYS_GPE_MFPH_PE11MFP_RGMII0_TXCLK | SYS_GPE_MFPH_PE10MFP_RGMII0_RXD3 | SYS_GPE_MFPH_PE9MFP_RGMII0_RXD2 | SYS_GPE_MFPH_PE8MFP_RGMII0_RXD1); + SYS->GPE_MFPL &= ~(SYS_GPE_MFPL_PE7MFP_Msk | SYS_GPE_MFPL_PE6MFP_Msk | SYS_GPE_MFPL_PE5MFP_Msk | SYS_GPE_MFPL_PE4MFP_Msk | SYS_GPE_MFPL_PE3MFP_Msk | SYS_GPE_MFPL_PE2MFP_Msk | SYS_GPE_MFPL_PE1MFP_Msk | SYS_GPE_MFPL_PE0MFP_Msk); + SYS->GPE_MFPL |= (SYS_GPE_MFPL_PE7MFP_RGMII0_RXD0 | SYS_GPE_MFPL_PE6MFP_RGMII0_RXCTL | SYS_GPE_MFPL_PE5MFP_RGMII0_RXCLK | SYS_GPE_MFPL_PE4MFP_RGMII0_TXD1 | SYS_GPE_MFPL_PE3MFP_RGMII0_TXD0 | SYS_GPE_MFPL_PE2MFP_RGMII0_TXCTL | SYS_GPE_MFPL_PE1MFP_RGMII0_MDIO | SYS_GPE_MFPL_PE0MFP_RGMII0_MDC); + + /* RGMII Mode */ + SYS->GMAC0MISCR &= ~1; + + /* Set 1.8v */ + GPIO_SetPowerMode(PE, 0x3FFF, 0); + + GPIO_SetPullCtl(PE, 0x3FFF, GPIO_PUSEL_DISABLE); + + GPIO_SetSchmittTriggere(PE, 0x3FDF, 1); //except clk + + GPIO_SetSlewCtl(PE, 0x3FFF, GPIO_SLEWCTL_NORMAL); + + GPIO_SetDrivingCtl(PE, 0x3FFF, 1); + + return; +} + +void nutool_pincfg_deinit_rgmii0(void) +{ + SYS->GPE_MFPH &= ~(SYS_GPE_MFPH_PE13MFP_Msk | SYS_GPE_MFPH_PE12MFP_Msk | SYS_GPE_MFPH_PE11MFP_Msk | SYS_GPE_MFPH_PE10MFP_Msk | SYS_GPE_MFPH_PE9MFP_Msk | SYS_GPE_MFPH_PE8MFP_Msk); + SYS->GPE_MFPL &= ~(SYS_GPE_MFPL_PE7MFP_Msk | SYS_GPE_MFPL_PE6MFP_Msk | SYS_GPE_MFPL_PE5MFP_Msk | SYS_GPE_MFPL_PE4MFP_Msk | SYS_GPE_MFPL_PE3MFP_Msk | SYS_GPE_MFPL_PE2MFP_Msk | SYS_GPE_MFPL_PE1MFP_Msk | SYS_GPE_MFPL_PE0MFP_Msk); + + return; +} + +void nutool_pincfg_init_rmii1(void) +{ + SYS->GPF_MFPH &= ~(SYS_GPF_MFPH_PF9MFP_Msk | SYS_GPF_MFPH_PF8MFP_Msk); + SYS->GPF_MFPH |= (SYS_GPF_MFPH_PF9MFP_RMII1_RXERR | SYS_GPF_MFPH_PF8MFP_RMII1_RXD1); + SYS->GPF_MFPL &= ~(SYS_GPF_MFPL_PF7MFP_Msk | SYS_GPF_MFPL_PF6MFP_Msk | SYS_GPF_MFPL_PF5MFP_Msk | SYS_GPF_MFPL_PF4MFP_Msk | SYS_GPF_MFPL_PF3MFP_Msk | SYS_GPF_MFPL_PF2MFP_Msk | SYS_GPF_MFPL_PF1MFP_Msk | SYS_GPF_MFPL_PF0MFP_Msk); + SYS->GPF_MFPL |= (SYS_GPF_MFPL_PF7MFP_RMII1_RXD0 | SYS_GPF_MFPL_PF6MFP_RMII1_CRSDV | SYS_GPF_MFPL_PF5MFP_RMII1_REFCLK | SYS_GPF_MFPL_PF4MFP_RMII1_TXD1 | SYS_GPF_MFPL_PF3MFP_RMII1_TXD0 | SYS_GPF_MFPL_PF2MFP_RMII1_TXEN | SYS_GPF_MFPL_PF1MFP_RMII1_MDIO | SYS_GPF_MFPL_PF0MFP_RMII1_MDC); + + /* RMII Mode */ + SYS->GMAC1MISCR |= 1; + + return; +} + +void nutool_pincfg_deinit_rmii1(void) +{ + SYS->GPF_MFPH &= ~(SYS_GPF_MFPH_PF9MFP_Msk | SYS_GPF_MFPH_PF8MFP_Msk); + SYS->GPF_MFPL &= ~(SYS_GPF_MFPL_PF7MFP_Msk | SYS_GPF_MFPL_PF6MFP_Msk | SYS_GPF_MFPL_PF5MFP_Msk | SYS_GPF_MFPL_PF4MFP_Msk | SYS_GPF_MFPL_PF3MFP_Msk | SYS_GPF_MFPL_PF2MFP_Msk | SYS_GPF_MFPL_PF1MFP_Msk | SYS_GPF_MFPL_PF0MFP_Msk); + + return; +} + +void nutool_pincfg_init_sd1(void) +{ + SYS->GPJ_MFPH &= ~(SYS_GPJ_MFPH_PJ11MFP_Msk | SYS_GPJ_MFPH_PJ10MFP_Msk | SYS_GPJ_MFPH_PJ9MFP_Msk | SYS_GPJ_MFPH_PJ8MFP_Msk); + SYS->GPJ_MFPH |= (SYS_GPJ_MFPH_PJ11MFP_SD1_DAT3 | SYS_GPJ_MFPH_PJ10MFP_SD1_DAT2 | SYS_GPJ_MFPH_PJ9MFP_SD1_DAT1 | SYS_GPJ_MFPH_PJ8MFP_SD1_DAT0); + SYS->GPJ_MFPL &= ~(SYS_GPJ_MFPL_PJ7MFP_Msk | SYS_GPJ_MFPL_PJ6MFP_Msk | SYS_GPJ_MFPL_PJ5MFP_Msk); + SYS->GPJ_MFPL |= (SYS_GPJ_MFPL_PJ7MFP_SD1_CLK | SYS_GPJ_MFPL_PJ6MFP_SD1_CMD | SYS_GPJ_MFPL_PJ5MFP_SD1_nCD); + + return; +} + +void nutool_pincfg_deinit_sd1(void) +{ + SYS->GPJ_MFPH &= ~(SYS_GPJ_MFPH_PJ11MFP_Msk | SYS_GPJ_MFPH_PJ10MFP_Msk | SYS_GPJ_MFPH_PJ9MFP_Msk | SYS_GPJ_MFPH_PJ8MFP_Msk); + SYS->GPJ_MFPL &= ~(SYS_GPJ_MFPL_PJ7MFP_Msk | SYS_GPJ_MFPL_PJ6MFP_Msk | SYS_GPJ_MFPL_PJ5MFP_Msk); + + return; +} + +void nutool_pincfg_init_spi0(void) +{ + SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB9MFP_Msk | SYS_GPB_MFPH_PB8MFP_Msk); + SYS->GPB_MFPH |= (SYS_GPB_MFPH_PB9MFP_SPI0_CLK | SYS_GPB_MFPH_PB8MFP_SPI0_SS1); + SYS->GPL_MFPH &= ~(SYS_GPL_MFPH_PL15MFP_Msk | SYS_GPL_MFPH_PL14MFP_Msk); + SYS->GPL_MFPH |= (SYS_GPL_MFPH_PL15MFP_SPI0_MISO | SYS_GPL_MFPH_PL14MFP_SPI0_MOSI); + + return; +} + +void nutool_pincfg_deinit_spi0(void) +{ + SYS->GPB_MFPH &= ~(SYS_GPB_MFPH_PB9MFP_Msk | SYS_GPB_MFPH_PB8MFP_Msk); + SYS->GPL_MFPH &= ~(SYS_GPL_MFPH_PL15MFP_Msk | SYS_GPL_MFPH_PL14MFP_Msk); + + return; +} + +void nutool_pincfg_init_spi2(void) +{ + SYS->GPG_MFPH &= ~(SYS_GPG_MFPH_PG10MFP_Msk | SYS_GPG_MFPH_PG9MFP_Msk | SYS_GPG_MFPH_PG8MFP_Msk); + SYS->GPG_MFPH |= (SYS_GPG_MFPH_PG10MFP_SPI2_MOSI | SYS_GPG_MFPH_PG9MFP_SPI2_CLK | SYS_GPG_MFPH_PG8MFP_SPI2_SS0); + SYS->GPK_MFPL &= ~(SYS_GPK_MFPL_PK4MFP_Msk); + SYS->GPK_MFPL |= (SYS_GPK_MFPL_PK4MFP_SPI2_MISO); + + return; +} + +void nutool_pincfg_deinit_spi2(void) +{ + SYS->GPG_MFPH &= ~(SYS_GPG_MFPH_PG10MFP_Msk | SYS_GPG_MFPH_PG9MFP_Msk | SYS_GPG_MFPH_PG8MFP_Msk); + SYS->GPK_MFPL &= ~(SYS_GPK_MFPL_PK4MFP_Msk); + + return; +} + +void nutool_pincfg_init_uart0(void) +{ + SYS->GPE_MFPH &= ~(SYS_GPE_MFPH_PE15MFP_Msk | SYS_GPE_MFPH_PE14MFP_Msk); + SYS->GPE_MFPH |= (SYS_GPE_MFPH_PE15MFP_UART0_RXD | SYS_GPE_MFPH_PE14MFP_UART0_TXD); + + return; +} + +void nutool_pincfg_deinit_uart0(void) +{ + SYS->GPE_MFPH &= ~(SYS_GPE_MFPH_PE15MFP_Msk | SYS_GPE_MFPH_PE14MFP_Msk); + + return; +} + +void nutool_pincfg_init_uart10(void) +{ + SYS->GPH_MFPL &= ~(SYS_GPH_MFPL_PH7MFP_Msk | SYS_GPH_MFPL_PH6MFP_Msk | SYS_GPH_MFPL_PH5MFP_Msk | SYS_GPH_MFPL_PH4MFP_Msk); + SYS->GPH_MFPL |= (SYS_GPH_MFPL_PH7MFP_UART10_TXD | SYS_GPH_MFPL_PH6MFP_UART10_RXD | SYS_GPH_MFPL_PH5MFP_UART10_nRTS | SYS_GPH_MFPL_PH4MFP_UART10_nCTS); + + return; +} + +void nutool_pincfg_deinit_uart10(void) +{ + SYS->GPH_MFPL &= ~(SYS_GPH_MFPL_PH7MFP_Msk | SYS_GPH_MFPL_PH6MFP_Msk | SYS_GPH_MFPL_PH5MFP_Msk | SYS_GPH_MFPL_PH4MFP_Msk); + + return; +} + +void nutool_pincfg_init_uart12(void) +{ + SYS->GPC_MFPH &= ~(SYS_GPC_MFPH_PC15MFP_Msk | SYS_GPC_MFPH_PC14MFP_Msk | SYS_GPC_MFPH_PC13MFP_Msk); + SYS->GPC_MFPH |= (SYS_GPC_MFPH_PC15MFP_UART12_TXD | SYS_GPC_MFPH_PC14MFP_UART12_RXD | SYS_GPC_MFPH_PC13MFP_UART12_nRTS); + + return; +} + +void nutool_pincfg_deinit_uart12(void) +{ + SYS->GPC_MFPH &= ~(SYS_GPC_MFPH_PC15MFP_Msk | SYS_GPC_MFPH_PC14MFP_Msk | SYS_GPC_MFPH_PC13MFP_Msk); + + return; +} + +void nutool_pincfg_init_uart13(void) +{ + SYS->GPH_MFPH &= ~(SYS_GPH_MFPH_PH13MFP_Msk | SYS_GPH_MFPH_PH12MFP_Msk); + SYS->GPH_MFPH |= (SYS_GPH_MFPH_PH13MFP_UART13_TXD | SYS_GPH_MFPH_PH12MFP_UART13_RXD); + + return; +} + +void nutool_pincfg_deinit_uart13(void) +{ + SYS->GPH_MFPH &= ~(SYS_GPH_MFPH_PH13MFP_Msk | SYS_GPH_MFPH_PH12MFP_Msk); + + return; +} + +void nutool_pincfg_init_uart14(void) +{ + SYS->GPH_MFPH &= ~(SYS_GPH_MFPH_PH15MFP_Msk | SYS_GPH_MFPH_PH14MFP_Msk); + SYS->GPH_MFPH |= (SYS_GPH_MFPH_PH15MFP_UART14_TXD | SYS_GPH_MFPH_PH14MFP_UART14_RXD); + + return; +} + +void nutool_pincfg_deinit_uart14(void) +{ + SYS->GPH_MFPH &= ~(SYS_GPH_MFPH_PH15MFP_Msk | SYS_GPH_MFPH_PH14MFP_Msk); + + return; +} + +void nutool_pincfg_init(void) +{ + //SYS->GPA_MFPH = 0x06666666UL; + //SYS->GPA_MFPL = 0x66666666UL; + //SYS->GPB_MFPH = 0x88888855UL; + //SYS->GPC_MFPH = 0x22200000UL; + //SYS->GPC_MFPL = 0x33440044UL; + //SYS->GPD_MFPH = 0x00000000UL; + //SYS->GPD_MFPL = 0x00555555UL; + //SYS->GPE_MFPH = 0x11888888UL; + //SYS->GPE_MFPL = 0x88888888UL; + //SYS->GPF_MFPH = 0x10000099UL; + //SYS->GPF_MFPL = 0x99999999UL; + //SYS->GPG_MFPH = 0x55555555UL; + //SYS->GPG_MFPL = 0x00000000UL; + //SYS->GPH_MFPH = 0x22330000UL; + //SYS->GPH_MFPL = 0x22220000UL; + //SYS->GPI_MFPH = 0x00000000UL; + //SYS->GPJ_MFPH = 0x00006666UL; + //SYS->GPJ_MFPL = 0x66600000UL; + //SYS->GPK_MFPH = 0x00006660UL; + //SYS->GPK_MFPL = 0x00050000UL; + //SYS->GPL_MFPH = 0x55990000UL; + //SYS->GPM_MFPH = 0x00006666UL; + //SYS->GPM_MFPL = 0x66666606UL; + //SYS->GPN_MFPH = 0x00000000UL; + //SYS->GPN_MFPL = 0x00440044UL; + + nutool_pincfg_init_adc0(); + nutool_pincfg_init_can1(); + nutool_pincfg_init_ccap0(); + nutool_pincfg_init_hsusb0(); + nutool_pincfg_init_hsusbh(); + nutool_pincfg_init_i2c1(); + nutool_pincfg_init_i2c2(); + nutool_pincfg_init_i2c4(); + nutool_pincfg_init_i2c5(); + nutool_pincfg_init_i2s0(); + nutool_pincfg_init_nand(); + nutool_pincfg_init_qspi0(); + nutool_pincfg_init_rgmii0(); + nutool_pincfg_init_rmii1(); + nutool_pincfg_init_sd1(); + nutool_pincfg_init_spi0(); + nutool_pincfg_init_spi2(); + nutool_pincfg_init_uart0(); + nutool_pincfg_init_uart10(); + nutool_pincfg_init_uart12(); + nutool_pincfg_init_uart13(); + nutool_pincfg_init_uart14(); + + return; +} + +void nutool_pincfg_deinit(void) +{ + nutool_pincfg_deinit_adc0(); + nutool_pincfg_deinit_can1(); + nutool_pincfg_deinit_ccap0(); + nutool_pincfg_deinit_hsusb0(); + nutool_pincfg_deinit_hsusbh(); + nutool_pincfg_deinit_i2c1(); + nutool_pincfg_deinit_i2c2(); + nutool_pincfg_deinit_i2c4(); + nutool_pincfg_deinit_i2c5(); + nutool_pincfg_deinit_i2s0(); + nutool_pincfg_deinit_nand(); + nutool_pincfg_deinit_qspi0(); + nutool_pincfg_deinit_rgmii0(); + nutool_pincfg_deinit_rmii1(); + nutool_pincfg_deinit_sd1(); + nutool_pincfg_deinit_spi0(); + nutool_pincfg_deinit_spi2(); + nutool_pincfg_deinit_uart0(); + nutool_pincfg_deinit_uart10(); + nutool_pincfg_deinit_uart12(); + nutool_pincfg_deinit_uart13(); + nutool_pincfg_deinit_uart14(); + + return; +} + +/*** (C) COPYRIGHT 2013-2022 Nuvoton Technology Corp. ***/ diff --git a/bsp/nuvoton/numaker-iot-ma35d1/board/nutool_pincfg/nutool_pincfg.cfg b/bsp/nuvoton/numaker-iot-ma35d1/board/nutool_pincfg/nutool_pincfg.cfg new file mode 100644 index 0000000000..fd9b1bfea2 --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/board/nutool_pincfg/nutool_pincfg.cfg @@ -0,0 +1,299 @@ +/**************************************************************************** + * @file nutool_pincfg.cfg + * @version V1.24 + * @Date 2022/11/01-18:39:49 + * @brief NuMicro config file + * + * @note Please do not modify this file. + * Otherwise, it may not be loaded successfully. + * + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (C) 2013-2022 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ +MCU:MA35D16F787C(LQFP216) +Pin1:nRESET +Pin2:HSUSB0_ID +Pin3:HSUSB0_VBUSVLD +Pin4:HSUSBH_PWREN +Pin5:HSUSBH_OVC +Pin6:SPI0_MOSI +Pin7:SPI0_MISO +Pin8:VDD_OTP +Pin9:RTC_RPWR +Pin10:VBAT +Pin11:RTC_nRWAKE +Pin12:X32_IN +Pin13:X32_OUT +Pin14:VDD_HSUSB1 +Pin15:HSUSB1_D- +Pin16:HSUSB1_D+ +Pin17:VDD_CORE +Pin18:VDD_HSUSB1 +Pin19:HSUSB0_D- +Pin20:HSUSB0_D+ +Pin21:VDD_CORE +Pin22:VDD_HSUSB0 +Pin23:VDD_CORE +Pin24:NAND_DATA0 +Pin25:NAND_DATA1 +Pin26:NAND_DATA2 +Pin27:NAND_DATA3 +Pin28:NAND_DATA4 +Pin29:NAND_DATA5 +Pin30:NAND_DATA6 +Pin31:NAND_DATA7 +Pin32:NAND_RDY0 +Pin33:NAND_nRE +Pin34:NAND_nWE +Pin35:NAND_CLE +Pin36:NAND_ALE +Pin37:NAND_nCS0 +Pin38:VDDIO1 +Pin39:NAND_nWP +Pin40:PG.0 +Pin41:PA.15 +Pin42:PG.1 +Pin43:PG.2 +Pin44:PG.3 +Pin45:PG.4 +Pin46:PG.5 +Pin47:PG.6 +Pin48:PG.7 +Pin49:VDD_CORE +Pin50:I2S0_MCLK +Pin51:I2S0_LRCK +Pin52:I2S0_BCLK +Pin53:I2S0_DI +Pin54:I2S0_DO +Pin55:VDD_CORE +Pin56:UART0_TXD +Pin57:UART0_RXD +Pin58:PD.6 +Pin59:PD.7 +Pin60:PD.8 +Pin61:PD.9 +Pin62:PD.10 +Pin63:PD.11 +Pin64:VDDIO1 +Pin65:CCAP0_SCLK +Pin66:CCAP0_PIXCLK +Pin67:CCAP0_HSYNC +Pin68:CCAP0_VSYNC +Pin69:PM.1 +Pin70:CCAP0_DATA0 +Pin71:CCAP0_DATA1 +Pin72:CCAP0_DATA2 +Pin73:CCAP0_DATA3 +Pin74:CCAP0_DATA4 +Pin75:CCAP0_DATA5 +Pin76:VDDIO2 +Pin77:CCAP0_DATA6 +Pin78:CCAP0_DATA7 +Pin79:CCAP0_DATA8 +Pin80:CCAP0_DATA9 +Pin81:VDD_CORE +Pin82:PJ.4 +Pin83:SD1_nCD +Pin84:VDDIO3 +Pin85:SD1_CMD +Pin86:SD1_CLK +Pin87:SD1_DAT0 +Pin88:SD1_DAT1 +Pin89:SD1_DAT2 +Pin90:SD1_DAT3 +Pin91:SPI2_SS0 +Pin92:SPI2_CLK +Pin93:SPI2_MOSI +Pin94:SPI2_MISO +Pin95:PI.8 +Pin96:PI.9 +Pin97:PI.10 +Pin98:PI.11 +Pin99:PI.12 +Pin100:PI.13 +Pin101:PI.14 +Pin102:PI.15 +Pin103:PH.0 +Pin104:PH.1 +Pin105:PH.2 +Pin106:VDDIO4 +Pin107:PH.3 +Pin108:UART10_nCTS +Pin109:UART10_nRTS +Pin110:UART10_RXD +Pin111:UART10_TXD +Pin112:PC.12 +Pin113:UART12_nRTS +Pin114:UART12_RXD +Pin115:UART12_TXD +Pin116:UART13_RXD +Pin117:UART13_TXD +Pin118:UART14_RXD +Pin119:UART14_TXD +Pin120:VDD_CORE +Pin121:VDDIO5 +Pin122:QSPI0_SS0 +Pin123:QSPI0_CLK +Pin124:QSPI0_MOSI0 +Pin125:QSPI0_MISO0 +Pin126:QSPI0_MOSI1 +Pin127:QSPI0_MISO1 +Pin128:VSS +Pin129:MVDD +Pin130:MVDD +Pin131:VDD_CORE +Pin132:MVDD_DPHYPLL +Pin133:MZQ_SDRAM +Pin134:MZQ_DDRPHY +Pin135:MVDD +Pin136:MVREF +Pin137:VDD_CORE +Pin138:MVDD +Pin139:MVDD_DPHYPLL +Pin140:VDD_CORE +Pin141:MVDD +Pin142:I2C4_SDA +Pin143:I2C4_SCL +Pin144:PC.2 +Pin145:PC.3 +Pin146:I2C5_SDA +Pin147:I2C5_SCL +Pin148:VDDIO6 +Pin149:CAN1_RXD +Pin150:CAN1_TXD +Pin151:VDD_CORE +Pin152:I2C2_SDA +Pin153:I2C2_SCL +Pin154:PN.2 +Pin155:PN.3 +Pin156:I2C1_SDA +Pin157:I2C1_SCL +Pin158:VDDIO7 +Pin159:PN.6 +Pin160:PN.7 +Pin161:PN.10 +Pin162:PN.11 +Pin163:PN.12 +Pin164:PN.13 +Pin165:PN.14 +Pin166:PN.15 +Pin167:PK.12 +Pin168:AVDDL_PLL0 +Pin169:XT1_IN +Pin170:XT1_OUT +Pin171:VDDIO10 +Pin172:AVDDL_PLL1 +Pin173:VDD_PLL1 +Pin174:AVDDH_PLL2 +Pin175:RGMII0_MDC +Pin176:RGMII0_MDIO +Pin177:RGMII0_TXCTL +Pin178:RGMII0_TXD0 +Pin179:VDDIO8 +Pin180:VDD_CORE +Pin181:RGMII0_TXD1 +Pin182:RGMII0_RXCLK +Pin183:RGMII0_RXCTL +Pin184:RGMII0_RXD0 +Pin185:RGMII0_RXD1 +Pin186:RGMII0_RXD2 +Pin187:RGMII0_RXD3 +Pin188:RGMII0_TXCLK +Pin189:RGMII0_TXD2 +Pin190:RGMII0_TXD3 +Pin191:VDDIO9 +Pin192:RMII1_MDC +Pin193:RMII1_MDIO +Pin194:RMII1_TXEN +Pin195:RMII1_TXD0 +Pin196:RMII1_TXD1 +Pin197:RMII1_REFCLK +Pin198:RMII1_CRSDV +Pin199:RMII1_RXD0 +Pin200:RMII1_RXD1 +Pin201:RMII1_RXERR +Pin202:VDD_CORE +Pin203:AVDD_EADC0 +Pin204:SPI0_SS1 +Pin205:SPI0_CLK +Pin206:ADC0_CH2 +Pin207:ADC0_CH3 +Pin208:AVDD_ADC0 +Pin209:AVSS +Pin210:VDD_CORE +Pin211:ADC0_CH4 +Pin212:ADC0_CH5 +Pin213:ADC0_CH6 +Pin214:ADC0_CH7 +Pin215:VDDIO0 +Pin216:VDD_CORE +GPIOpin:143 +GPIOpin:144 +GPIOpin:153 +GPIOpin:154 +GPIOpin:158 +GPIOpin:159 +GPIOpin:160 +GPIOpin:161 +GPIOpin:162 +GPIOpin:163 +GPIOpin:165 +GPIOpin:39 +GPIOpin:47 +GPIOpin:40 +GPIOpin:41 +GPIOpin:42 +GPIOpin:43 +GPIOpin:44 +GPIOpin:45 +GPIOpin:46 +GPIOpin:57 +GPIOpin:58 +GPIOpin:59 +GPIOpin:60 +GPIOpin:61 +GPIOpin:62 +GPIOpin:68 +GPIOpin:94 +GPIOpin:95 +GPIOpin:96 +GPIOpin:97 +GPIOpin:98 +GPIOpin:99 +GPIOpin:100 +GPIOpin:101 +GPIOpin:102 +GPIOpin:103 +GPIOpin:104 +GPIOpin:106 +GPIOpin:111 +GPIOpin:164 +GPIOpin:166 +GPIOpin:81 +SYS->GPA_MFPH = 0x06666666 +SYS->GPA_MFPL = 0x66666666 +SYS->GPB_MFPH = 0x88888855 +SYS->GPC_MFPH = 0x22200000 +SYS->GPC_MFPL = 0x33440044 +SYS->GPD_MFPH = 0x00000000 +SYS->GPD_MFPL = 0x00555555 +SYS->GPE_MFPH = 0x11888888 +SYS->GPE_MFPL = 0x88888888 +SYS->GPF_MFPH = 0x10000099 +SYS->GPF_MFPL = 0x99999999 +SYS->GPG_MFPH = 0x55555555 +SYS->GPG_MFPL = 0x00000000 +SYS->GPH_MFPH = 0x22330000 +SYS->GPH_MFPL = 0x22220000 +SYS->GPI_MFPH = 0x00000000 +SYS->GPJ_MFPH = 0x00006666 +SYS->GPJ_MFPL = 0x66600000 +SYS->GPK_MFPH = 0x00006660 +SYS->GPK_MFPL = 0x00050000 +SYS->GPL_MFPH = 0x55990000 +SYS->GPM_MFPH = 0x00006666 +SYS->GPM_MFPL = 0x66666606 +SYS->GPN_MFPH = 0x00000000 +SYS->GPN_MFPL = 0x00440044 +/*** (C) COPYRIGHT 2013-2022 Nuvoton Technology Corp. ***/ diff --git a/bsp/nuvoton/numaker-iot-ma35d1/board/nutool_pincfg/nutool_pincfg.h b/bsp/nuvoton/numaker-iot-ma35d1/board/nutool_pincfg/nutool_pincfg.h new file mode 100644 index 0000000000..e2db815fca --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/board/nutool_pincfg/nutool_pincfg.h @@ -0,0 +1,90 @@ +/**************************************************************************** + * @file nutool_pincfg.h + * @version V1.24 + * @Date 2022/11/01-18:39:48 + * @brief NuMicro generated code file + * + * SPDX-License-Identifier: Apache-2.0 + * + * Copyright (C) 2013-2022 Nuvoton Technology Corp. All rights reserved. +*****************************************************************************/ + +#ifndef __NUTOOL_PINCFG_H__ +#define __NUTOOL_PINCFG_H__ + +#ifdef __cplusplus +extern "C" +{ +#endif +void nutool_pincfg_init_adc0(void); +void nutool_pincfg_deinit_adc0(void); +void nutool_pincfg_init_can1(void); +void nutool_pincfg_deinit_can1(void); +void nutool_pincfg_init_ccap0(void); +void nutool_pincfg_deinit_ccap0(void); +void nutool_pincfg_init_hsusb0(void); +void nutool_pincfg_deinit_hsusb0(void); +void nutool_pincfg_init_hsusbh(void); +void nutool_pincfg_deinit_hsusbh(void); +void nutool_pincfg_init_i2c1(void); +void nutool_pincfg_deinit_i2c1(void); +void nutool_pincfg_init_i2c2(void); +void nutool_pincfg_deinit_i2c2(void); +void nutool_pincfg_init_i2c4(void); +void nutool_pincfg_deinit_i2c4(void); +void nutool_pincfg_init_i2c5(void); +void nutool_pincfg_deinit_i2c5(void); +void nutool_pincfg_init_i2s0(void); +void nutool_pincfg_deinit_i2s0(void); +void nutool_pincfg_init_nand(void); +void nutool_pincfg_deinit_nand(void); +void nutool_pincfg_init_pa(void); +void nutool_pincfg_deinit_pa(void); +void nutool_pincfg_init_pc(void); +void nutool_pincfg_deinit_pc(void); +void nutool_pincfg_init_pd(void); +void nutool_pincfg_deinit_pd(void); +void nutool_pincfg_init_pg(void); +void nutool_pincfg_deinit_pg(void); +void nutool_pincfg_init_ph(void); +void nutool_pincfg_deinit_ph(void); +void nutool_pincfg_init_pi(void); +void nutool_pincfg_deinit_pi(void); +void nutool_pincfg_init_pj(void); +void nutool_pincfg_deinit_pj(void); +void nutool_pincfg_init_pk(void); +void nutool_pincfg_deinit_pk(void); +void nutool_pincfg_init_pm(void); +void nutool_pincfg_deinit_pm(void); +void nutool_pincfg_init_pn(void); +void nutool_pincfg_deinit_pn(void); +void nutool_pincfg_init_qspi0(void); +void nutool_pincfg_deinit_qspi0(void); +void nutool_pincfg_init_rgmii0(void); +void nutool_pincfg_deinit_rgmii0(void); +void nutool_pincfg_init_rmii1(void); +void nutool_pincfg_deinit_rmii1(void); +void nutool_pincfg_init_sd1(void); +void nutool_pincfg_deinit_sd1(void); +void nutool_pincfg_init_spi0(void); +void nutool_pincfg_deinit_spi0(void); +void nutool_pincfg_init_spi2(void); +void nutool_pincfg_deinit_spi2(void); +void nutool_pincfg_init_uart0(void); +void nutool_pincfg_deinit_uart0(void); +void nutool_pincfg_init_uart10(void); +void nutool_pincfg_deinit_uart10(void); +void nutool_pincfg_init_uart12(void); +void nutool_pincfg_deinit_uart12(void); +void nutool_pincfg_init_uart13(void); +void nutool_pincfg_deinit_uart13(void); +void nutool_pincfg_init_uart14(void); +void nutool_pincfg_deinit_uart14(void); +void nutool_pincfg_init(void); +void nutool_pincfg_deinit(void); +#ifdef __cplusplus +} +#endif +#endif /*__NUTOOL_PINCFG_H__*/ + +/*** (C) COPYRIGHT 2013-2022 Nuvoton Technology Corp. ***/ diff --git a/bsp/nuvoton/numaker-iot-ma35d1/figures/NuMaker-IoT-MA35D1_B.png b/bsp/nuvoton/numaker-iot-ma35d1/figures/NuMaker-IoT-MA35D1_B.png new file mode 100644 index 0000000000000000000000000000000000000000..a9efb6dddf69efe8fa0779ff6d8a2d2ad53cd2a2 GIT binary patch literal 173184 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
i}#db|U@@wDE- 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

DiUWQ;tUl`I$P$jchRY3)6${MiLw}7{8SIi$h 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 literal 0 HcmV?d00001 diff --git a/bsp/nuvoton/numaker-iot-ma35d1/figures/NuMaker-IoT-MA35D1_F.png b/bsp/nuvoton/numaker-iot-ma35d1/figures/NuMaker-IoT-MA35D1_F.png new file mode 100644 index 0000000000000000000000000000000000000000..e690302e47f0210c07cf8dc535cc3fbf136412ab GIT binary patch literal 180404 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 d_E(R|Z6\AppData\Local\Programs\Python\\Lib. +``` + +### [USB Driver for Window](https://github.com/OpenNuvoton/MA35D1_NuWriter/blob/master/driver/WinUSB4NuVCOM.exe?raw=true) + +NuWriter must install **WinUSB4NuVCOM.exe** on the computer. + +## **Double-click Scripts for Windows** + +If your NuWriter_MA35 python running is ready, you can do following batch script files for Window directly. + +### **nuwriter_ddr2_128mb_download_and_run.bat** or **nuwriter_ddr3_512mb_download_and_run.bat** + +Download rtthread.bin binary file into DDR. The address is 0x80400000. + +### **nuwriter_sd_programming.bat** + +Program header, DDR timing setting and rtthread.bin binary file into SD card or EMMC. + +### **nuwriter_spinand_programming.bat** + +Program header, DDR timing setting and rtthread.bin binary file into SPI NAND flash. + +### **nuwriter_nand_programming.bat** + +Program header, DDR timing setting and rtthread.bin binary file into NAND flash. + +## **Troubleshoot** + +### **Fail to create symbolic folder** + +```bash +Create symbolic folder conv failed +``` + +- To switch **Developer Mode** in Window. To enter [Settings], [Update & Security], [For developers], [Developer Mode] page, then set it **On** +- Use **Administrator** permission to install python3, libusb and utilities. + +### **Use NuWriter_MA35.exe** + +Due to the python execution file size and saving network bandwidth, we just only release the python code in this repository. We also provide [NuWriter_MA35.exe](https://github.com/OpenNuvoton/MA35D1_NuWriter/blob/master/EXE/NuWriter_MA35.exe?raw=true) python execution. You can run the packaged app without installing a Python interpreter or any modules. You can use **NuWriter_MA35.exe** and do some modification. + +```bash +To modify "py -3 nuwriter.py" to "NuWriter_MA35.exe" +``` + +For example, the **nuwriter_ddr_download_and_run.bat** modification is as following: + +```bash +:forever_develop +NuWriter_MA35.exe -a ddrimg\enc_ddr3_winbond_256mb.bin +IF %ERRORLEVEL% EQU 0 ( + NuWriter_MA35.exe -o execute -w ddr 0x80400000 ..\rtthread.bin +) +pause +goto :forever_develop +``` + +## **See also** + +[NuWriter Repository](https://github.com/OpenNuvoton/MA35D1_NuWriter) diff --git a/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/UnpackImage.py b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/UnpackImage.py new file mode 100644 index 0000000000..113f6fe307 --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/UnpackImage.py @@ -0,0 +1,65 @@ +# NOTE: This script is test under Python 3.x + +__copyright__ = "Copyright (C) 2020 Nuvoton Technology Corp. All rights reserved" + +import sys +import crcmod + + +class UnpackImage: + + def __init__(self, pack_file_name, nocrc): + self.img_list = [] + try: + with open(pack_file_name, "rb") as pack_file: + self.pack_data = pack_file.read() + except (IOError, OSError) as err: + print(f"Open {pack_file_name} failed") + sys.exit(err) + + if self.pack_data[0:4] != b'\x20\x54\x56\x4e': + print(f"{pack_file_name} marker check failed") + sys.exit(0) + + print("Waiting for unpack Images ...") + if nocrc == 0: + print("check pack file crc32 ...") + crc32_func = crcmod.predefined.mkCrcFun('crc-32') + checksum = crc32_func(self.pack_data[8:]) + if checksum != int.from_bytes(self.pack_data[4:8], byteorder='little'): + print(f"{pack_file_name} CRC check failed") + sys.exit(0) + self.image_cnt = int.from_bytes(self.pack_data[8:12], byteorder='little') + # 1st image descriptor begins @ 0x10 + index = 0x10 + for _ in range(self.image_cnt): + # Put the image length, offset ,attribute in list + self.img_list.append([int.from_bytes(self.pack_data[index: index + 8], byteorder='little'), + int.from_bytes(self.pack_data[index + 8: index + 16], byteorder='little'), + int.from_bytes(self.pack_data[index + 16: index + 20], byteorder='little'), + index + 24]) + index += int.from_bytes(self.pack_data[index: index + 8], byteorder='little') + 24 # 24 is image header + if index % 16 != 0: + index += 16 - (index & 0xF) # round to 16-byte align + + def img_count(self): + return self.image_cnt + + def img_attr(self, index): + if index < self.image_cnt: + # No need to return the last entry, actual offset in image file. + # And should return integers instead of list of integer here + return self.img_list[index][0], self.img_list[index][1], self.img_list[index][2] + else: + print("Invalid image index") + return 0, 0, 0 + + def img_content(self, index, offset, size): + if index >= self.image_cnt: + print("Invalid image index") + return '' + if offset > self.img_list[index][0] or offset + size > self.img_list[index][0]: + print("Invalid offset") + return '' + + return self.pack_data[self.img_list[index][3] + offset: self.img_list[index][3] + offset + size] diff --git a/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/_nuwriter_nand_generate_header_bin.bat b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/_nuwriter_nand_generate_header_bin.bat new file mode 100644 index 0000000000..90242c39c5 --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/_nuwriter_nand_generate_header_bin.bat @@ -0,0 +1,2 @@ +py -3 nuwriter.py -c header-nand.json +pause diff --git a/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/_nuwriter_nand_generate_pack_bin.bat b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/_nuwriter_nand_generate_pack_bin.bat new file mode 100644 index 0000000000..80110b5deb --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/_nuwriter_nand_generate_pack_bin.bat @@ -0,0 +1,2 @@ +py -3 nuwriter.py -p pack-nand.json +pause \ No newline at end of file diff --git a/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/header-nand.json b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/header-nand.json new file mode 100644 index 0000000000..8254d60386 --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/header-nand.json @@ -0,0 +1,36 @@ +{ + "header": + { + "version": "0x20210119", + "spiinfo": + { + "pagesize": "2048", + "sparearea": "64", + "pageperblk": "64", + "quadread": "0x6B", + "readsts": "0x05", + "writests": "0x01", + "stsvalue": "0x02", + "dummy1": "0", + "dummy2": "1", + "suspintvl": "1" + }, + "secureboot": "no", + "entrypoint": "0x80400000", + "image": + [ + { + "offset": "0x20000", + "loadaddr": "0x28030000", + "type": "2", + "file": "ddrimg/enc_ddr3_winbond_512mb.bin" + }, + { + "offset": "0x80000", + "loadaddr": "0x80400000", + "type": "4", + "file": "../rtthread.bin" + } + ] + } +} diff --git a/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/header-sd.json b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/header-sd.json new file mode 100644 index 0000000000..f732fb8098 --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/header-sd.json @@ -0,0 +1,36 @@ +{ + "header": + { + "version": "0x20210119", + "spiinfo": + { + "pagesize": "2048", + "sparearea": "64", + "pageperblk": "64", + "quadread": "0x6B", + "readsts": "0x05", + "writests": "0x01", + "stsvalue": "0x02", + "dummy1": "0", + "dummy2": "1", + "suspintvl": "1" + }, + "secureboot": "no", + "entrypoint": "0x80400000", + "image": + [ + { + "offset": "0x1000", + "loadaddr": "0x28030000", + "type": "2", + "file": "ddrimg/enc_ddr3_winbond_512mb.bin" + }, + { + "offset": "0x4000", + "loadaddr": "0x80400000", + "type": "4", + "file": "../rtthread.bin" + } + ] + } +} diff --git a/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter.py b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter.py new file mode 100644 index 0000000000..60ae52747b --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter.py @@ -0,0 +1,1942 @@ +# NOTE: This script is test under Python 3.x + +__copyright__ = "Copyright (C) 2020~2021 Nuvoton Technology Corp. All rights reserved" +__version__ = "v0.37" + +import os +import sys +import argparse +import json +import crcmod +from Crypto.Cipher import AES +import hashlib +import ecdsa +import binascii +from datetime import datetime +import random +import shutil +from tqdm import tqdm +from xusbcom import XUsbComList +from concurrent.futures import ThreadPoolExecutor, as_completed +from UnpackImage import UnpackImage +from collections import namedtuple +from struct import unpack +import time +import platform +# for debug +import usb.core +import usb.util + +ACK = 0x55AA55AA +TRANSFER_SIZE = 4096 +MAX_HEADER_IMG = 4 +# SPI NOR align for erase/program starting address +SPINOR_ALIGN = 4096 + +# Storage device type +DEV_DDR_SRAM = 0 +DEV_NAND = 1 +DEV_SD_EMMC = 2 +DEV_SPINOR = 3 +DEV_SPINAND = 4 +DEV_OTP = 6 +DEV_USBH = 7 +DEV_UNKNOWN = 0xFF + +# For OTP programming +ACT_LOAD = 1 +ACT_WRITE = 2 +ACT_ERASE = 3 +ACT_READ = 4 +ACT_MSC = 5 + +# Command options +OPT_NONE = 0 +OPT_SCRUB = 1 # For erase, use with care +OPT_WITHBAD = 1 # For read +OPT_EXECUTE = 2 # For write +OPT_VERIFY = 3 # For write +OPT_UNPACK = 4 # For pack +OPT_RAW = 5 # For write +OPT_EJECT = 6 # For msc +OPT_STUFF = 7 # For stuff pack, output could be used by dd command +OPT_SETINFO = 8 # For set storage info for attach +OPT_CONCAT = 9 # For convert, concatenate at the end of encrypted data file +OPT_SHOWHDR = 10 # For convert. Instead of convert, show header content instead +OPT_NOCRC = 11 # For pack. unpack file without crc32 check +OPT_UNKNOWN = 0xFF # Error + + +# OPT block definitions +OPT_OTPBLK1 = 0x100 +OPT_OTPBLK2 = 0x200 +OPT_OTPBLK3 = 0x400 +OPT_OTPBLK4 = 0x800 +OPT_OTPBLK5 = 0x1000 +OPT_OTPBLK6 = 0x2000 +OPT_OTPBLK7 = 0x4000 +OPT_OTPKEY = 0x8000 + +# for key lock +OPT_OTPKEY0 = 0x10000 +OPT_OTPKEY1 = 0x20000 +OPT_OTPKEY2 = 0x40000 +OPT_OTPKEY3 = 0x80000 +OPT_OTPKEY4 = 0x100000 +OPT_OTPKEY5 = 0x200000 + + +# Image type definitions +IMG_DATA = 0 +IMG_TFA = 1 +IMG_UBOOT = 2 +IMG_LINUX = 3 +IMG_DDR = 4 +IMG_TEE = 5 +IMG_DTB = 6 + +# If attach is a must. maybe better for real chip. +# devices = [] +mp_mode = False + +WINDOWS_PATH = "C:\\Program Files (x86)\\Nuvoton Tools\\NuWriter\\" +LINUX_PATH = "/usr/share/nuwriter/" + + +def conv_env(env_file_name, blk_size) -> bytearray: + + try: + with open(env_file_name, "r") as env_file: + env_data = env_file.read().splitlines() + except (IOError, OSError) as err: + print(f"Open {env_file_name} failed") + sys.exit(err) + + out = bytearray(4) # Reserved for CRC + for lines in env_data: + out += bytes(lines, 'ascii') + out += b'\x00' + out += b'\x00' + out += b'\xFF' * (blk_size - len(out)) + + crc32_func = crcmod.predefined.mkCrcFun('crc-32') + checksum = crc32_func(out[4:]) + out[0:4] = checksum.to_bytes(4, byteorder="little") + + return out + + +def get_dpm(dpm) -> int: + return { + 'a35sdsdis': 0x00000001, + 'a35sdslock': 0x00000002, + 'a35sndsdis': 0x00000004, + 'a35sndslock': 0x00000008, + 'a35nsdsdis': 0x00000010, + 'a35nsdslock': 0x00000020, + 'a35nsndsdis': 0x00000040, + 'a35nsndslock': 0x00000080, + 'm4dsdis': 0x00000100, + 'm4dslock': 0x00000200, + 'm4ndsdis': 0x00000400, + 'm4ndslock': 0x00000800, + 'extdis': 0x00001000, + 'extlock': 0x00002000, + 'exttdis': 0x00004000, + 'exttlock': 0x00008000, + 'giccfgsdis': 0x00010000, + 'giccfgslock': 0x00020000 + }.get(dpm, 0) + + +def get_plm(plm) -> int: + return { + 'oem': 0x1, + 'deploy': 0x3, + 'rma': 0x7, + 'prma': 0xF + }.get(plm, 0) + + +def conv_otp(opt_file_name) -> (bytearray, int): + try: + with open(opt_file_name, "r") as json_file: + try: + d = json.load(json_file) + except json.decoder.JSONDecodeError as err: + print(f"{opt_file_name} parsing error") + sys.exit(err) + except (IOError, OSError) as err: + print(f"Open {opt_file_name} failed") + sys.exit(err) + # Bootcfg, DPM, PLM, and PWD 4 bytes each, MAC addr 8 bytes each, sec/nsec 88 bytes each + data = bytearray(208) + + option = 0 + for key in d.keys(): + if key == 'boot_cfg': + cfg_val = 0 + for sub_key in d['boot_cfg'].keys(): + if sub_key == 'posotp': + if d['boot_cfg']['posotp'] == 'enable': + cfg_val |= 1 + if sub_key == 'qspiclk': + if d['boot_cfg']['qspiclk'] == '50mhz': + cfg_val |= 2 + if sub_key == 'wdt1en': + if d['boot_cfg']['wdt1en'] == 'enable': + cfg_val |= 4 + if sub_key == 'uart0en': + if d['boot_cfg']['uart0en'] == 'disable': + cfg_val |= 0x10 + if sub_key == 'sd0bken': + if d['boot_cfg']['sd0bken'] == 'enable': + cfg_val |= 0x20 + if sub_key == 'tsiimg': + if d['boot_cfg']['tsiimg'] == 'enable': + cfg_val |= 0x40 + if sub_key == 'tsidbg': + if d['boot_cfg']['tsidbg'] == 'disable': + cfg_val |= 0x80 + if sub_key == 'bootsrc': + if d['boot_cfg']['bootsrc'] == 'sd' or d['boot_cfg']['bootsrc'] == 'emmc': + cfg_val |= 0x400 + elif d['boot_cfg']['bootsrc'] == 'nand': + cfg_val |= 0x800 + elif d['boot_cfg']['bootsrc'] == 'usb': + cfg_val |= 0xC00 + if sub_key == 'page': + if d['boot_cfg']['page'] == '2k': + cfg_val |= 0x1000 + elif d['boot_cfg']['page'] == '4k': + cfg_val |= 0x2000 + elif d['boot_cfg']['page'] == '8k': + cfg_val |= 0x3000 + if sub_key == 'option': + if d['boot_cfg']['option'] == 'sd1' or d['boot_cfg']['option'] == 'emmc1' or \ + d['boot_cfg']['option'] == 't12' or d['boot_cfg']['option'] == 'spinand4': + cfg_val |= 0x4000 + elif d['boot_cfg']['option'] == 't24' or d['boot_cfg']['option'] == 'spinor1': + cfg_val |= 0x8000 + elif d['boot_cfg']['option'] == 'noecc' or d['boot_cfg']['option'] == 'spinor4': + cfg_val |= 0xC000 + if sub_key == 'secboot': + if d['boot_cfg']['secboot'] == 'disable': + cfg_val |= 0x5A000000 + data[0:4] = cfg_val.to_bytes(4, byteorder='little') + option |= OPT_OTPBLK1 + elif key == 'dpm_plm': + for sub_key in d['dpm_plm'].keys(): + if sub_key == 'dpm': + dpm_val = 0 + for dpm_key in d['dpm_plm']['dpm'].keys(): + dpm_val |= get_dpm(dpm_key) + if dpm_val != 0: + data[4:8] = dpm_val.to_bytes(4, byteorder='little') + elif sub_key == 'plm': + plm_val = get_plm(d['dpm_plm']['plm']) + if plm_val != 0: + data[8:12] = plm_val.to_bytes(4, byteorder='little') + option |= OPT_OTPBLK2 + elif key == 'mac0': + data[12:18] = bytes.fromhex(d['mac0']) + option |= OPT_OTPBLK3 + elif key == 'mac1': + data[20:26] = bytes.fromhex(d['mac1']) + option |= OPT_OTPBLK4 + elif key == 'dplypwd': + data[28:32] = bytes.fromhex(d['dplypwd']) + option |= OPT_OTPBLK5 + elif key == 'sec': + newkey = bytes.fromhex(d['sec']) + newkey += b'\x00' * (88 - len(newkey)) + data[32:120] = newkey + option |= OPT_OTPBLK6 + elif key == 'nonsec': + newkey = bytes.fromhex(d['nonsec']) + newkey += b'\x00' * (88 - len(newkey)) + data[120:208] = newkey + option |= OPT_OTPBLK7 + elif key == 'huk0': + newkey = bytes.fromhex(d['huk0']['key']) + if len(newkey) != 16: + print("HUK0 is 128-bit") + sys.exit(2) + newkey += b'\x00' * (32 - len(newkey)) + # size - 128-bit + newkey += b'\x08\x00\x00\x00' + # key number - 0 + newkey += b'\x00\x00\x00\x00' + # meta - owner: cpu, cpu readable + newkey += b'\x04\x00\x05\x80' + data += newkey + + elif key == 'huk1': + newkey = bytes.fromhex(d['huk1']['key']) + if len(newkey) != 16: + print("HUK1 is 128-bit") + sys.exit(2) + newkey += b'\x00' * (32 - len(newkey)) + # size - 128-bit + newkey += b'\x08\x00\x00\x00' + # key number - 1 + newkey += b'\x01\x00\x00\x00' + # meta - owner: cpu, cpu readable + newkey += b'\x04\x00\x05\x80' + data += newkey + + elif key == 'huk2': + newkey = bytes.fromhex(d['huk2']['key']) + if len(newkey) != 16: + print("HUK0 is 128-bit") + sys.exit(2) + newkey += b'\x00' * (32 - len(newkey)) + # size - 128-bit + newkey += b'\x08\x00\x00\x00' + # key number - 2 + newkey += b'\x02\x00\x00\x00' + # meta - owner: cpu, cpu readable + newkey += b'\x04\x00\x05\x80' + data += newkey + + elif key == 'key3': + newkey = bytes.fromhex(d['key3']['key']) + if len(newkey) != 32: + print("key3 is 256-bit") + sys.exit(2) + newkey += b'\x00' * (32 - len(newkey)) + # size - 256-bit + newkey += b'\x00\x01\x00\x00' + # key number - 3 + newkey += b'\x03\x00\x00\x00' + + if d['key3']['meta'] == 'aes256-unreadable': + newkey += b'\x00\x06\x00\x80' + elif d['key3']['meta'] == 'aes256-cpu-readable': + newkey += b'\x04\x06\x00\x80' + elif d['key3']['meta'] == 'sha256-unreadable': + newkey += b'\x00\x06\x01\x80' + elif d['key3']['meta'] == 'sha256-cpu-readable': + newkey += b'\x04\x06\x01\x80' + elif d['key3']['meta'] == 'eccp256-unreadable': + newkey += b'\x00\x06\x04\x80' + elif d['key3']['meta'] == 'eccp256-cpu-readable': + newkey += b'\x04\x06\x04\x80' + + data += newkey + elif key == 'key4': + newkey = bytes.fromhex(d['key4']['key']) + if len(newkey) != 32: + print("key4 is 256-bit") + sys.exit(2) + newkey += b'\x00' * (32 - len(newkey)) + # size - 256-bit + newkey += b'\x00\x01\x00\x00' + # key number - 4 + newkey += b'\x04\x00\x00\x00' + + if d['key4']['meta'] == 'aes256-unreadable': + newkey += b'\x00\x06\x00\x80' + elif d['key4']['meta'] == 'aes256-cpu-readable': + newkey += b'\x04\x06\x00\x80' + elif d['key4']['meta'] == 'sha256-unreadable': + newkey += b'\x00\x06\x01\x80' + elif d['key4']['meta'] == 'sha256-cpu-readable': + newkey += b'\x04\x06\x01\x80' + elif d['key4']['meta'] == 'eccp256-unreadable': + newkey += b'\x00\x06\x04\x80' + elif d['key4']['meta'] == 'eccp256-cpu-readable': + newkey += b'\x04\x06\x04\x80' + + data += newkey + elif key == 'key5': + newkey = bytes.fromhex(d['key5']['key']) + if len(newkey) != 32: + print("key5 is 256-bit") + sys.exit(2) + newkey += b'\x00' * (32 - len(newkey)) + # size - 256-bit + newkey += b'\x00\x01\x00\x00' + # key number - 5 + newkey += b'\x05\x00\x00\x00' + + if d['key5']['meta'] == 'aes256-unreadable': + newkey += b'\x00\x06\x00\x80' + elif d['key5']['meta'] == 'aes256-cpu-readable': + newkey += b'\x04\x06\x00\x80' + elif d['key5']['meta'] == 'sha256-unreadable': + newkey += b'\x00\x06\x01\x80' + elif d['key5']['meta'] == 'sha256-cpu-readable': + newkey += b'\x04\x06\x01\x80' + elif d['key5']['meta'] == 'eccp256-unreadable': + newkey += b'\x00\x06\x04\x80' + elif d['key5']['meta'] == 'eccp256-cpu-readable': + newkey += b'\x04\x06\x04\x80' + + data += newkey + elif key == 'publicx': + newkey = bytes.fromhex(d['publicx']) + if len(newkey) != 32: + print("IBR publicx is 256-bit") + sys.exit(2) + data += bytes.fromhex(d['publicx']) + data += b'\x00\x01\x00\x00' # 256 bits + data += b'\x06\x00\x00\x00' + data += b'\x01\x06\x04\x80' + elif key == 'publicy': + newkey = bytes.fromhex(d['publicy']) + if len(newkey) != 32: + print("IBR publicy is 256-bit") + sys.exit(2) + data += bytes.fromhex(d['publicy']) + data += b'\x00\x01\x00\x00' # 256 bits + data += b'\x07\x00\x00\x00' + data += b'\x01\x06\x04\x80' + elif key == 'aeskey': + newkey = bytes.fromhex(d['aeskey']) + if len(newkey) != 32: + print("IBR aeskey is 256-bit") + sys.exit(2) + data += bytes.fromhex(d['aeskey']) + data += b'\x00\x01\x00\x00' # 256 bits + data += b'\x08\x00\x00\x00' + data += b'\x01\x06\x00\x80' + + try: + with open("otp_data.bin", "wb") as out_file: + out_file.write(data[0:len(data)]) + except (IOError, OSError) as err: + print(f"Open otp_data.bin failed") + sys.exit(err) + + if len(data) > 208: + option |= OPT_OTPKEY + return data, option + + +def __img_erase(dev, media, start, length, option) -> int: + + nand_align, spinand_align = dev.get_align() + + if (media == DEV_NAND and nand_align == 0) or \ + (media == DEV_SPINAND and spinand_align == 0): + print("Unable to get block size") + return -1 + + if (media == DEV_NAND and start % nand_align != 0) or\ + (media == DEV_SPINAND and start % spinand_align != 0) or \ + (media == DEV_SPINOR and start % SPINOR_ALIGN != 0): + print("Starting address must be block aligned") + return -1 + + cmd = start.to_bytes(8, byteorder='little') + cmd += length.to_bytes(8, byteorder='little') + cmd += ACT_ERASE.to_bytes(4, byteorder='little') + cmd += option.to_bytes(4, byteorder='little') + + dev.set_media(media) + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + return -1 + bar = tqdm(total=100, position=dev.get_id(), ascii=True) + previous_progress = 0 + while True: + # xusb ack with total erase progress. + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") <= 100: + bar.update(int.from_bytes(ack, byteorder="little") - previous_progress) + previous_progress = int.from_bytes(ack, byteorder="little") + if int.from_bytes(ack, byteorder="little") == 100: + break + bar.close() + return 0 + + +# default erase all (count=0) +def do_img_erase(media, start, length=0, option=OPT_NONE) -> None: + global mp_mode + + # devices = XUsbComList(attach_all=mp_mode).get_dev() + _XUsbComList = XUsbComList(attach_all=mp_mode) + devices = _XUsbComList.get_dev() + + if len(devices) == 0: + print("Device not found") + sys.exit(2) + + with ThreadPoolExecutor(max_workers=8) as executor: + futures = [executor.submit(__img_erase, dev, media, start, length, option) for dev in devices] + success = 0 + failed = 0 + for future in as_completed(futures): + if future.result() == 0: + success += 1 + else: + failed += 1 + + print(f"Successfully erased {success} device(s)") + if failed > 0: + print(f"Failed to erase {failed} device(s)") + + +def do_otp_erase(option) -> None: + global mp_mode + + # devices = XUsbComList(attach_all=mp_mode).get_dev() + _XUsbComList = XUsbComList(attach_all=mp_mode) + devices = _XUsbComList.get_dev() + + if len(devices) == 0: + print("Device not found") + sys.exit(2) + + start = 0 + length = 0 + dev = devices[0] + load_otp_writer(dev) + cmd = start.to_bytes(8, byteorder='little') + cmd += length.to_bytes(8, byteorder='little') + cmd += ACT_ERASE.to_bytes(4, byteorder='little') + cmd += option.to_bytes(4, byteorder='little') + + dev.set_media(DEV_OTP) + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + print(f"Failed to erase device(s)") + + # There's no way to tell the progress... + ack = dev.read(4) + data = int.from_bytes(ack, byteorder="little") + if option == 0x100: + data >>= 2 + data &= 0x3 + if option == 0x400: + data >>= 6 + data &= 0x3 + if option == 0x800: + data >>= 8 + data &= 0x3 + if option & 0x8000: + data >>= 16 + #print(f"Erase count state {hex(data)}") + + print(f"Successfully erased device(s)") + +def load_otp_writer(dev) -> int: + try: + with open("otp_writer.bin", "rb") as writer_file: + otp_writer = writer_file.read() + except (IOError, OSError) as err: + print(f"Open {opt_file_name} failed") + sys.exit(err) + + option = 0 + img_length = len(otp_writer) + cmd = b'\x00\x00\xf0\x86\x00\x00\x00\x00' + cmd += img_length.to_bytes(8, byteorder='little') + cmd += ACT_LOAD.to_bytes(4, byteorder='little') + cmd += option.to_bytes(4, byteorder='little') + dev.set_media(DEV_OTP) + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + return -1 + + for offset in range(0, img_length, TRANSFER_SIZE): + xfer_size = TRANSFER_SIZE if offset + TRANSFER_SIZE < img_length else img_length - offset + dev.write(otp_writer[offset: offset + xfer_size]) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != xfer_size: + print("Acked size error") + return -1 + + while True: + # wait TSI update firmware + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") == ACK: + break + + return 0 + +def __otp_program(dev, otp_data, option) -> int: + + img_length = len(otp_data) + + cmd = b'\x00\x00\xf0\x86\x00\x00\x00\x00' + cmd += img_length.to_bytes(8, byteorder='little') + cmd += ACT_WRITE.to_bytes(4, byteorder='little') + cmd += option.to_bytes(4, byteorder='little') + + dev.set_media(DEV_OTP) + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + return -1 + # There's no way to tell the progress... + dev.write(otp_data) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != img_length: + print("Acked size error") + return -1 + + # There's no way to tell the progress... + ack = dev.read(4) + data = int.from_bytes(ack, byteorder="little") + #print(f"Can program count {hex(data)}") + + return 0 + + +def do_otp_program(opt_file_name) -> None: + global mp_mode + + # devices = XUsbComList(attach_all=mp_mode).get_dev() + _XUsbComList = XUsbComList(attach_all=mp_mode) + devices = _XUsbComList.get_dev() + + if len(devices) == 0: + print("Device not found") + sys.exit(2) + + load_otp_writer(devices[0]) + otp_data, option = conv_otp(opt_file_name) + + with ThreadPoolExecutor(max_workers=8) as executor: + futures = [executor.submit(__otp_program, dev, otp_data, option) for dev in devices] + success = 0 + failed = 0 + for future in as_completed(futures): + if future.result() == 0: + success += 1 + else: + failed += 1 + + print(f"Successfully programmed {success} device(s)") + if failed > 0: + print(f"Failed to program {failed} device(s)") + + +def do_otp_read(media, start, out_file_name, length=0x1, option=OPT_NONE) -> None: + global mp_mode + + # devices = XUsbComList(attach_all=mp_mode).get_dev() + _XUsbComList = XUsbComList(attach_all=mp_mode) + devices = _XUsbComList.get_dev() + + if len(devices) == 0: + print("Device not found") + sys.exit(2) + + # Only support one device in read function + dev = devices[0] + load_otp_writer(dev) + + cmd = start.to_bytes(8, byteorder='little') + cmd += length.to_bytes(8, byteorder='little') + cmd += ACT_READ.to_bytes(4, byteorder='little') + cmd += option.to_bytes(4, byteorder='little') + + dev.set_media(media) + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + return + # FIXME: Don't know real length for "read all" + bar = tqdm(total=length, ascii=True) + data = b'' + remain = length + + while remain > 0: + ack = dev.read(4) + # Get the transfer length of next read + xfer_size = int.from_bytes(ack, byteorder="little") + + data += dev.read(xfer_size) + dev.write(xfer_size.to_bytes(4, byteorder='little')) # ack + remain -= xfer_size + bar.update(xfer_size) + try: + with open(out_file_name, "wb") as out_file: + out_file.write(data[0:length]) + except (IOError, OSError) as err: + print(f"Open {out_file_name} failed") + sys.exit(err) + + bar.close() + + +def __pack_program(dev, media, pack_image, option) -> int: + + nand_align, spinand_align = dev.get_align() + image_cnt = pack_image.img_count() + + if (media == DEV_NAND and nand_align == 0) or \ + (media == DEV_SPINAND and spinand_align == 0): + print("Unable to get block size") + return -1 + + for i in range(image_cnt): + img_length, img_start, img_type = pack_image.img_attr(i) + if (media == DEV_NAND and img_start % nand_align != 0) or \ + (media == DEV_SPINAND and img_start % spinand_align != 0) or \ + (media == DEV_SPINOR and img_start % SPINOR_ALIGN != 0): + print("Starting address must be block aligned") + return -1 + time.sleep(1) + dev.set_media(media) + cmd = img_start.to_bytes(8, byteorder='little') + cmd += img_length.to_bytes(8, byteorder='little') + cmd += ACT_WRITE.to_bytes(4, byteorder='little') + cmd += img_type.to_bytes(4, byteorder='little') + + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + return -1 + text = f"Programming {i}/{image_cnt}" + bar = tqdm(total=img_length, position=dev.get_id(), ascii=True, desc=text) + for offset in range(0, img_length, TRANSFER_SIZE): + xfer_size = TRANSFER_SIZE if offset + TRANSFER_SIZE < img_length else img_length - offset + dev.write(pack_image.img_content(i, offset, xfer_size)) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != xfer_size: + print("Ack size error") + return -1 + bar.update(xfer_size) + bar.close() + dev.read(4) + + # FIXME: Added time.sleep(1) to make SPI NAND Pack Program + Verify PASS + time.sleep(1) + + if option == OPT_VERIFY: + dev.set_media(media) + cmd = img_start.to_bytes(8, byteorder='little') + cmd += img_length.to_bytes(8, byteorder='little') + cmd += ACT_READ.to_bytes(4, byteorder='little') + cmd += b'\x00' * 4 + + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + return -1 + remain = img_length + text = f"Verifying {i}/{image_cnt}" + bar = tqdm(total=img_length, position=dev.get_id(), ascii=True, desc=text) + while remain > 0: + ack = dev.read(4) + # Get the transfer length of next read + xfer_size = int.from_bytes(ack, byteorder="little") + + data = dev.read(xfer_size) + dev.write(xfer_size.to_bytes(4, byteorder='little')) + offset = img_length - remain + + # For SD/eMMC + if xfer_size > remain: + xfer_size = remain + data = data[0: remain] + + if data != bytearray(pack_image.img_content(i, offset, xfer_size)): + print("Verify failed") + return -1 + remain -= xfer_size + bar.update(xfer_size) + bar.close() + return 0 + + +def do_pack_program(media, pack_file_name, option=OPT_NONE) -> None: + global mp_mode + + # devices = XUsbComList(attach_all=mp_mode).get_dev() + _XUsbComList = XUsbComList(attach_all=mp_mode) + devices = _XUsbComList.get_dev() + + if len(devices) == 0: + print("Device not found") + sys.exit(2) + + pack_image = UnpackImage(pack_file_name, option) + with ThreadPoolExecutor(max_workers=8) as executor: + futures = [executor.submit(__pack_program, dev, media, pack_image, option) for dev in devices] + success = 0 + failed = 0 + for future in as_completed(futures): + if future.result() == 0: + success += 1 + else: + failed += 1 + + print(f"Successfully programmed {success} device(s)") + if failed > 0: + print(f"Failed to program {failed} device(s)") + + +def __img_program(dev, media, start, img_data, option) -> int: + + nand_align, spinand_align = dev.get_align() + + if (media == DEV_NAND and nand_align == 0) or \ + (media == DEV_SPINAND and spinand_align == 0): + print("Unable to get block size") + return -1 + + if (media == DEV_NAND and start % nand_align != 0) or\ + (media == DEV_SPINAND and start % spinand_align != 0) or \ + (media == DEV_SPINOR and start % SPINOR_ALIGN != 0): + print("Starting address must be block aligned") + return -1 + + img_length = len(img_data) + print(f"image length is {img_length}") + cmd = start.to_bytes(8, byteorder='little') + cmd += img_length.to_bytes(8, byteorder='little') + cmd += ACT_WRITE.to_bytes(4, byteorder='little') + if option == OPT_EXECUTE: + cmd += option.to_bytes(4, byteorder='little') + else: + cmd += b'\x00' * 4 + + dev.set_media(media) + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + return -1 + + # Set ascii=True is for Windows cmd terminal, position > 0 doesn't work as expected in cmd though... + bar = tqdm(total=img_length, position=dev.get_id(), ascii=True, desc="Programming") + for offset in range(0, img_length, TRANSFER_SIZE): + xfer_size = TRANSFER_SIZE if offset + TRANSFER_SIZE < img_length else img_length - offset + dev.write(img_data[offset: offset + xfer_size]) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != xfer_size: + print("Ack size error") + return -1 + bar.update(xfer_size) + dev.read(4) + bar.close() + if option == OPT_VERIFY: + dev.set_media(media) + cmd = start.to_bytes(8, byteorder='little') + cmd += img_length.to_bytes(8, byteorder='little') + cmd += ACT_READ.to_bytes(4, byteorder='little') + cmd += b'\x00' * 4 + + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + return -1 + + remain = img_length + bar = tqdm(total=img_length, position=dev.get_id(), ascii=True, desc="Verifying") + while remain > 0: + ack = dev.read(4) + # Get the transfer length of next read + xfer_size = int.from_bytes(ack, byteorder="little") + + data = dev.read(xfer_size) + dev.write(xfer_size.to_bytes(4, byteorder='little')) # ack + offset = img_length - remain + + # For SD/eMMC + if xfer_size > remain: + xfer_size = remain + data = data[0: remain] + + if data != bytearray(img_data[offset: offset + xfer_size]): + print("Verify failed") + return -1 + remain -= xfer_size + bar.update(xfer_size) + print("Verify pass") + bar.close() + return 0 + + +def do_img_program(media, start, image_file_name, option=OPT_NONE) -> None: + global mp_mode + + # devices = XUsbComList(attach_all=mp_mode).get_dev() + _XUsbComList = XUsbComList(attach_all=mp_mode) + devices = _XUsbComList.get_dev() + + if len(devices) == 0: + print("Device not found") + sys.exit(2) + try: + with open(image_file_name, "rb") as image_file: + img_data = image_file.read() + + except (IOError, OSError) as err: + print(f"Open {image_file_name} failed") + sys.exit(err) + + with ThreadPoolExecutor(max_workers=8) as executor: + futures = [executor.submit(__img_program, dev, media, start, img_data, option) for dev in devices] + success = 0 + failed = 0 + for future in as_completed(futures): + if future.result() == 0: + success += 1 + else: + failed += 1 + + print(f"Successfully programmed {success} device(s)") + if failed > 0: + print(f"Failed to program {failed} device(s)") + + +def do_img_read(media, start, out_file_name, length=0x1, option=OPT_NONE) -> None: + # only support read from 1 device + # devices = XUsbComList(attach_all=False).get_dev() + _XUsbComList = XUsbComList(attach_all=False) + devices = _XUsbComList.get_dev() + + if len(devices) == 0: + print("Device not found") + sys.exit(2) + # Only support one device in read function + dev = devices[0] + + cmd = start.to_bytes(8, byteorder='little') + cmd += length.to_bytes(8, byteorder='little') + cmd += ACT_READ.to_bytes(4, byteorder='little') + cmd += option.to_bytes(4, byteorder='little') + + dev.set_media(media) + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + return + # FIXME: Don't know real length for "read all" + bar = tqdm(total=length, ascii=True) + data = b'' + remain = length + + while remain > 0: + ack = dev.read(4) + # Get the transfer length of next read + xfer_size = int.from_bytes(ack, byteorder="little") + + data += dev.read(xfer_size) + dev.write(xfer_size.to_bytes(4, byteorder='little')) # ack + remain -= xfer_size + bar.update(xfer_size) + try: + with open(out_file_name, "wb") as out_file: + out_file.write(data[0:length]) + except (IOError, OSError) as err: + print(f"Open {out_file_name} failed") + sys.exit(err) + + bar.close() + + +def __attach(dev, ini_data, xusb_data) -> int: + ini_len = len(ini_data) + out = int(ini_len).to_bytes(4, byteorder="little") + out += b'\x00\x00\x03\x28' # Execute address is 0x28030000 + dev.write(out) + dev.write(ini_data) + + in_buf = dev.read(4) + if int.from_bytes(in_buf, byteorder="little") != ini_len: + print("Length error") + return -1 + + in_buf = dev.read(4) + if int.from_bytes(in_buf, byteorder="little") != ACK: + val = int.from_bytes(in_buf, byteorder="little") + print(f"Ack error {val}") + return -1 + + xusb_len = len(xusb_data) + out = int(xusb_len).to_bytes(4, byteorder="little") + out += b'\x00\x00\x00\x87' # Execute address is 0x87000000 + dev.write(out) + for offset in range(0, xusb_len, TRANSFER_SIZE): + xfer_size = TRANSFER_SIZE if offset + TRANSFER_SIZE < xusb_len else xusb_len - offset + + dev.write(xusb_data[offset: offset + xfer_size]) + if offset + xfer_size != xusb_len: # Ignore the ack of last packet + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != xfer_size: + _ack = int.from_bytes(ack, byteorder="little") + print(f"Ack size error {_ack} {xfer_size}") + return -1 + + return 0 + + +def __get_info(dev, data) -> int: + try: + info = dev.get_info(data) + except usb.core.USBError as err: + sys.exit(err) + + _info_struct = namedtuple('_info_struct', + 'page_per_blk page_size blk_cnt bad_clk_cnt oob_size usr_cfg0 spi_id usr_cfg1 quad_cmd \ + read_sts_cmd write_sts_cmd sts_val dummy_byte blk rsv use_cfg2 snand_id snand_page_size \ + snand_oob snand_quad_cmd snand_read_sts_cmd snand_write_sts_cmd snand_sts_val \ + snand_dummy_byte snand_blk_cnt snand_page_per_blk') + info_struct = _info_struct._make(unpack(' None: + global mp_mode + + init_location = "missing" + if os.path.exists(ini_file_name): # default use the init file in current directory + init_location = ini_file_name + else: + if platform.system() == 'Windows': + if os.path.exists(WINDOWS_PATH + "ddrimg\\" + ini_file_name): + init_location = WINDOWS_PATH + "ddrimg\\" + ini_file_name + elif platform.system() == 'Linux': + if os.path.exists(LINUX_PATH + "ddrimg/" + ini_file_name): + init_location = LINUX_PATH + "ddrimg/" + ini_file_name + + if init_location == "missing": + print(f"Cannot find {ini_file_name}") + sys.exit(3) + try: + with open(init_location, "rb") as ini_file: + ini_data = ini_file.read() + except (IOError, OSError) as err: + print(f"Open {ini_file_name} failed") + sys.exit(err) + xusb_location = "missing" + if os.path.exists("xusb.bin"): # default use the xusb.bin in current directory + xusb_location = "xusb.bin" + else: + if platform.system() == 'Windows': + if os.path.exists(WINDOWS_PATH + "xusb.bin"): + xusb_location = WINDOWS_PATH + "xusb.bin" + elif platform.system() == 'Linux': + if os.path.exists(LINUX_PATH + "xusb.bin"): + xusb_location = LINUX_PATH + "xusb.bin" + if xusb_location == "missing": + print("Cannot find xusb.bin") + sys.exit(3) + + try: + with open(xusb_location, "rb") as xusb_file: + xusb_data = xusb_file.read() + except (IOError, OSError) as err: + print("Open xusb.bin failed") + sys.exit(err) + + # devices = XUsbComList(attach_all=mp_mode).get_dev() + _XUsbComList = XUsbComList(attach_all=mp_mode) + devices = _XUsbComList.get_dev() + + if len(devices) == 0: + print("Device not found") + sys.exit(2) + + with ThreadPoolExecutor(max_workers=8) as executor: + futures = [executor.submit(__attach, dev, ini_data, xusb_data) for dev in devices] + success = 0 + failed = 0 + for future in as_completed(futures, timeout=2): + if future.result() == 0: + success += 1 + else: + failed += 1 + + print(f"Successfully attached {success} device(s)") + if failed > 0: + print(f"Failed to attach {failed} device(s)") + if success == 0: + return + + time.sleep(1) + + # devices = XUsbComList(attach_all=mp_mode).get_dev() + _XUsbComListNew = XUsbComList(attach_all=mp_mode) + devices = _XUsbComListNew.get_dev() + + data = bytearray(76) + # assign option file to set media info + if option == OPT_SETINFO: + try: + with open("info.json", "r") as json_file: + try: + d = json.load(json_file) + except json.decoder.JSONDecodeError as err: + print(f"{json_file} parsing error") + sys.exit(err) + except (IOError, OSError) as err: + print("Open info.json failed") + sys.exit(err) + # now generate info from info.json + for key in d.keys(): + if key == 'spinand': + data[48] = 1 + for sub_key in d['spinand'].keys(): + if sub_key == 'pagesize': + data[56:58] = int(d['spinand']['pagesize'], 0).to_bytes(2, byteorder="little") + elif sub_key == 'sparearea': + data[58:60] = int(d['spinand']['sparearea'], 0).to_bytes(2, byteorder="little") + elif sub_key == 'quadread': + data[60:61] = int(d['spinand']['quadread'], 0).to_bytes(1, byteorder="little") + elif sub_key == 'readsts': + data[61:62] = int(d['spinand']['readsts'], 0).to_bytes(1, byteorder="little") + elif sub_key == 'writests': + data[62:63] = int(d['spinand']['writests'], 0).to_bytes(1, byteorder="little") + elif sub_key == 'stsvalue': + data[63:64] = int(d['spinand']['stsvalue'], 0).to_bytes(1, byteorder="little") + elif sub_key == 'dummy': + data[64:68] = int(d['spinand']['dummy'], 0).to_bytes(4, byteorder="little") + elif sub_key == 'blkcnt': + data[68:72] = int(d['spinand']['blkcnt'], 0).to_bytes(4, byteorder="little") + elif sub_key == 'pageperblk': + data[72:76] = int(d['spinand']['pageperblk'], 0).to_bytes(4, byteorder="little") + elif key == 'spinor': + data[28] = 1 + for sub_key in d['spinor'].keys(): + if sub_key == 'quadread': + data[32:33] = int(d['spinor']['quadread'], 0).to_bytes(1, byteorder="little") + elif sub_key == 'readsts': + data[33:34] = int(d['spinor']['readsts'], 0).to_bytes(1, byteorder="little") + elif sub_key == 'writests': + data[34:35] = int(d['spinor']['writests'], 0).to_bytes(1, byteorder="little") + elif sub_key == 'stsvalue': + data[35:36] = int(d['spinor']['stsvalue'], 0).to_bytes(1, byteorder="little") + elif sub_key == 'dummy': + data[36:40] = int(d['spinor']['dummy'], 0).to_bytes(4, byteorder="little") + elif key == 'nand': + data[20] = 1 + for sub_key in d['nand'].keys(): + if sub_key == 'blkcnt': + data[8:12] = int(d['nand']['blkcnt'], 0).to_bytes(4, byteorder="little") + elif sub_key == 'pageperblk': + data[0:4] = int(d['nand']['pageperblk'], 0).to_bytes(4, byteorder="little") + if len(devices) == 0: + print("Device not found") + sys.exit(2) + with ThreadPoolExecutor(max_workers=8) as executor: + futures = [executor.submit(__get_info, dev, data) for dev in devices] + + success = 0 + failed = 0 + for future in as_completed(futures, timeout=2): + if future.result() == 0: + success += 1 + else: + failed += 1 + + print(f"Successfully get info from {success} device(s)") + + +def do_unpack(pack_file_name, nocrc32) -> None: + + now = datetime.now() + pack_image = UnpackImage(pack_file_name, nocrc32) + image_cnt = pack_image.img_count() + + try: + os.mkdir(now.strftime("%m%d-%H%M%S%f")) + except (IOError, OSError) as err: + sys.exit(err) + + for i in range(image_cnt): + img_length, _, _ = pack_image.img_attr(i) + try: + with open(now.strftime("%m%d-%H%M%S%f") + "/img" + str(i) + ".bin", "wb") as img_file: + img_file.write(pack_image.img_content(i, 0, img_length)) + except (IOError, OSError) as err: + print("Create output image file failed") + sys.exit(err) + try: + os.unlink("unpack") + except (IOError, OSError): + pass + try: + os.symlink(now.strftime("%m%d-%H%M%S%f"), "unpack") + except (IOError, OSError): + print("Create symbolic folder unpack failed") + print("Unpack images to directory {} complete".format(now.strftime("%m%d-%H%M%S%f"))) + + +def do_stuff(cfg_file) -> None: + now = datetime.now() + + try: + with open(cfg_file, "r") as json_file: + try: + d = json.load(json_file) + except json.decoder.JSONDecodeError as err: + print(f"{cfg_file} parsing error") + sys.exit(err) + except (IOError, OSError) as err: + print(f"Open {cfg_file} failed") + sys.exit(err) + + try: + os.mkdir(now.strftime("%m%d-%H%M%S%f")) + pack_file = open(now.strftime("%m%d-%H%M%S%f") + "/pack.bin", "wb") + except (IOError, OSError) as err: + sys.exit(err) + + offset = 0 + out = bytearray() + + # Start stuffing image + for img in d["image"]: + try: + with open(img["file"], "rb") as img_file: + data = img_file.read() + except (IOError, OSError) as err: + print(f"Open {img_file} failed") + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + if int(img["offset"], 0) < offset: + print(f"Please place the files in {cfg_file} based on the ascending offset") + sys.exit(4) + elif int(img["offset"], 0) > offset: + out += b'\xFF' * (int(img["offset"], 0) - offset) + offset = int(img["offset"], 0) + out += data + offset += len(data) + pack_file.write(out) + pack_file.close() + try: + os.unlink("pack") + except (IOError, OSError): + pass + try: + os.symlink(now.strftime("%m%d-%H%M%S%f"), "pack") + except (IOError, OSError): + print("Create symbolic folder pack failed") + print("Generate pack file in directory {} complete".format(now.strftime("%m%d-%H%M%S%f"))) + + +def do_pack(cfg_file) -> None: + now = datetime.now() + + try: + with open(cfg_file, "r") as json_file: + try: + d = json.load(json_file) + except json.decoder.JSONDecodeError as err: + print(f"{cfg_file} parsing error") + sys.exit(err) + except (IOError, OSError) as err: + print(f"Open {cfg_file} failed") + sys.exit(err) + + try: + os.mkdir(now.strftime("%m%d-%H%M%S%f")) + pack_file = open(now.strftime("%m%d-%H%M%S%f") + "/pack.bin", "wb") + except (IOError, OSError) as err: + sys.exit(err) + + out = bytearray(b'\x20\x54\x56\x4e' + b'\xFF' * 12) # NVT + CRC32 + image count + 4 reserved bytes + + # Start packing image + img_cnt = 0 + for img in d["image"]: + try: + with open(img["file"], "rb") as img_file: + data = img_file.read() + except (IOError, OSError) as err: + print(f"Open {img_file} failed") + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + + img_cnt = img_cnt + 1 + + img_len = len(data) + out += img_len.to_bytes(8, byteorder="little") + try: + out += int(img["offset"], 0).to_bytes(8, byteorder="little") + except ValueError as err: + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + out += img["type"].to_bytes(4, byteorder="little") + out += b'\xFF' * 4 + out += data + # Always put image start @ 16 byte boundary + pad = 16 - (img_len + 8) & 0xF + if pad != 16: + out += b'\xFF' * pad + + # Fill image count + out[8:12] = img_cnt.to_bytes(4, byteorder="little") + + # Fill CRC field + crc32_func = crcmod.predefined.mkCrcFun('crc-32') + checksum = crc32_func(out[8:]) + out[4:8] = checksum.to_bytes(4, byteorder="little") + + pack_file.write(out) + pack_file.close() + try: + os.unlink("pack") + except (IOError, OSError): + pass + try: + os.symlink(now.strftime("%m%d-%H%M%S%f"), "pack") + except (IOError, OSError): + print("Create symbolic folder pack failed") + print("Generate pack file in directory {} complete".format(now.strftime("%m%d-%H%M%S%f"))) + + +def do_showhdr(cfg_file) -> None: + try: + header_file = open(cfg_file, "br") + except (IOError, OSError) as err: + print(f"Open {cfg_file} failed") + sys.exit(err) + + if unpack(' None: + now = datetime.now() + + try: + with open(cfg_file, "r") as json_file: + try: + d = json.load(json_file) + except json.decoder.JSONDecodeError as err: + print(f"{cfg_file} parsing error") + sys.exit(err) + except (IOError, OSError) as err: + print(f"Open {cfg_file} failed") + sys.exit(err) + try: + os.mkdir(now.strftime("%m%d-%H%M%S%f")) + except (IOError, OSError) as err: + print("Create output directory failed") + sys.exit(err) + + if "header" in d: + out = bytearray(b'\x20\x54\x56\x4e' + b'\x00' * 8) # NVT + CRC + LEN + try: + out += int(d["header"]["version"], 0).to_bytes(4, byteorder="little") + # Fill SPI flash info + out += int(d["header"]["spiinfo"]["pagesize"], 0).to_bytes(2, byteorder="little") + out += int(d["header"]["spiinfo"]["sparearea"], 0).to_bytes(2, byteorder="little") + out += int(d["header"]["spiinfo"]["pageperblk"], 0).to_bytes(2, byteorder="little") + out += int(d["header"]["spiinfo"]["quadread"], 0).to_bytes(1, byteorder="little") + out += int(d["header"]["spiinfo"]["readsts"], 0).to_bytes(1, byteorder="little") + out += int(d["header"]["spiinfo"]["writests"], 0).to_bytes(1, byteorder="little") + out += int(d["header"]["spiinfo"]["stsvalue"], 0).to_bytes(1, byteorder="little") + out += int(d["header"]["spiinfo"]["dummy1"], 0).to_bytes(1, byteorder="little") + out += int(d["header"]["spiinfo"]["dummy2"], 0).to_bytes(1, byteorder="little") + out += int(d["header"]["spiinfo"]["suspintvl"], 0).to_bytes(1, byteorder="little") + out += b'\xFF' * 3 # 3 reserved bytes + out += int(d["header"]["entrypoint"], 0).to_bytes(4, byteorder="little") + except ValueError as err: + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + + out += b'\xFF' * 4 # Reserve 4 bytes for image count + + # Generate key file iff secure boot is enabled + if d["header"]["secureboot"] == 'yes': + + try: + key_file = open(now.strftime("%m%d-%H%M%S%f") + "/header_key.txt", "w+") + except (IOError, OSError) as err: + print("Create key file failed") + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + + if "aeskey" in d["header"]: + try: + aeskey = bytes.fromhex(d["header"]["aeskey"]) + except ValueError as err: + sys.exit(err) + else: + aeskey = ''.join(['%x' % random.randrange(16) for _ in range(0, 64)]) + aeskey = binascii.unhexlify(bytes(aeskey, 'utf-8')) + key_file.write("AES key:\n" + str.upper(aeskey.hex())) + + if "ecdsakey" in d["header"]: + try: + sk = ecdsa.SigningKey.from_string(bytes.fromhex(d["header"]["ecdsakey"]), + curve=ecdsa.NIST256p, + hashfunc=hashlib.sha256) + except ValueError as err: + sys.exit(err) + else: + sk = ecdsa.SigningKey.generate(curve=ecdsa.NIST256p, hashfunc=hashlib.sha256) + key_file.write("\nECDSA private key:\n" + str.upper(sk.to_string().hex())) + + vk = sk.verifying_key + key_file.write("\nECDSA public key:\n" + format(vk.pubkey.point.x(), 'X') + + "\n" + format(vk.pubkey.point.y(), 'X') + "\n") + + key_file.close() + + img_cnt = len(d["header"]["image"]) + if img_cnt > MAX_HEADER_IMG: + print("Can process 4 images in header max") + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(2) + + # Fill image information + for i in range(img_cnt): + img = d["header"]["image"][i] + try: + with open(img["file"], "rb") as img_file: + data = img_file.read() + except (IOError, OSError) as err: + print("Open image file failed") + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + try: + out += int(img["offset"], 0).to_bytes(4, byteorder="little") + out += int(img["loadaddr"], 0).to_bytes(4, byteorder="little") + out += os.path.getsize(img["file"]).to_bytes(4, byteorder="little") + out += int(img["type"]).to_bytes(4, byteorder="little") + except ValueError as err: + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + + if d["header"]["secureboot"] == 'yes': + + # Use CFB and each image is process independently, so call new() for every image + aes_enc = AES.new(aeskey, AES.MODE_CFB, b'\x00' * 16, segment_size=128) + data_out = aes_enc.encrypt(data) + # R & S + out += sk.sign(data_out) + + # Write encrypt image + try: + with open(now.strftime("%m%d-%H%M%S%f") + '/enc_' + + os.path.basename(img["file"]), "wb") as enc_file: + enc_file.write(data_out) + except (IOError, OSError) as err: + print("Create encrypt file failed") + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + + else: + out += b'\xFF' * 64 # Just pack 0xFF if secure boot is disabled + + # Fill header length + out[8:12] = int(len(out) - 8).to_bytes(4, byteorder="little") + # Fill image count + out[36:40] = img_cnt.to_bytes(4, byteorder="little") + # Fill header checksum + crc32_func = crcmod.predefined.mkCrcFun('crc-32') + out[4:8] = crc32_func(out[8:]).to_bytes(4, byteorder="little") + + try: + with open(now.strftime("%m%d-%H%M%S%f") + "/header.bin", "wb") as header_file: + header_file.write(out) + except (IOError, OSError) as err: + print("Create header file failed") + sys.exit(err) + + if "env" in d: + try: + with open(now.strftime("%m%d-%H%M%S%f") + "/uboot-env.bin", "wb") as out_file: + out_file.write(conv_env(d["env"]["file"], int(d["env"]["blksize"], 0))) + except (IOError, OSError, ValueError) as err: + print("Create header file failed") + sys.exit(err) + # Misc images + if "data" in d: + try: + key_file = open(now.strftime("%m%d-%H%M%S%f") + "/data_key.txt", "w+") + except (IOError, OSError) as err: + print("Create key file failed") + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + + if "aeskey" in d["data"]: + try: + aeskey = bytes.fromhex(d["data"]["aeskey"]) + except ValueError as err: + sys.exit(err) + else: + aeskey = ''.join(['%x' % random.randrange(16) for _ in range(0, 64)]) + aeskey = binascii.unhexlify(bytes(aeskey, 'utf-8')) + key_file.write("AES key:\n" + str.upper(aeskey.hex())) + + if "ecdsakey" in d["data"]: + try: + sk = ecdsa.SigningKey.from_string(bytes.fromhex(d["data"]["ecdsakey"]), + curve=ecdsa.NIST256p, + hashfunc=hashlib.sha256) + except ValueError as err: + sys.exit(err) + else: + sk = ecdsa.SigningKey.generate(curve=ecdsa.NIST256p, hashfunc=hashlib.sha256) + key_file.write("\nECDSA private key:\n" + str.upper(sk.to_string().hex())) + + vk = sk.verifying_key + key_file.write("\nECDSA public key:\n" + format(vk.pubkey.point.x(), 'X') + + "\n" + format(vk.pubkey.point.y(), 'X') + "\n") + key_file.close() + + for img in d["data"]["image"]: + try: + with open(img["file"], "rb") as img_file: + data = img_file.read() + except (IOError, OSError) as err: + print(f"Open {img_file} failed") + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + + aes_enc = AES.new(aeskey, AES.MODE_CFB, b'\x00' * 16, segment_size=128) + data_out = aes_enc.encrypt(data) + signature = sk.sign(data_out) + try: + if option is OPT_CONCAT: + # Append the R & S at the end of signed image instead of writing to a separate file. + # The signed image could be used in deployed mode + data_out += signature + else: + with open(now.strftime("%m%d-%H%M%S%f") + '/sig_' + img["file"], "wb") as sig_file: + sig_file.write(signature) # R & S + + with open(now.strftime("%m%d-%H%M%S%f") + '/enc_' + img["file"], "wb") as enc_file: + enc_file.write(data_out) + + except (IOError, OSError) as err: + print("Create encrypt/signature file failed") + shutil.rmtree(now.strftime("%m%d-%H%M%S%f")) + sys.exit(err) + try: + os.unlink("conv") + except (IOError, OSError): + pass + try: + os.symlink(now.strftime("%m%d-%H%M%S%f"), "conv") + except (IOError, OSError): + print("Create symbolic folder conv failed") + print("Generate output image(s) in directory {} complete".format(now.strftime("%m%d-%H%M%S%f"))) + + +def __msc(dev, media, reserve, option) -> int: + + cmd = reserve.to_bytes(8, byteorder='little') + cmd += b'\x00' * 8 + cmd += ACT_MSC.to_bytes(4, byteorder='little') + cmd += option.to_bytes(4, byteorder='little') + + dev.set_media(media) + dev.write(cmd) + ack = dev.read(4) + if int.from_bytes(ack, byteorder="little") != ACK: + print("Receive ACK error") + return -1 + return 0 + + +def do_msc(media, reserve, option=OPT_NONE) -> None: + global mp_mode + + # devices = XUsbComList(attach_all=mp_mode).get_dev() + _XUsbComList = XUsbComList(attach_all=mp_mode) + devices = _XUsbComList.get_dev() + + if len(devices) == 0: + print("Device not found") + sys.exit(2) + + with ThreadPoolExecutor(max_workers=8) as executor: + futures = [executor.submit(__msc, dev, media, reserve, option) for dev in devices] + success = 0 + failed = 0 + for future in as_completed(futures): + if future.result() == 0: + success += 1 + else: + failed += 1 + + print("Successfully {} {} MSC device(s)".format("set" if option == "OPT_NONE" else "eject", success)) + if failed > 0: + print("Failed to {} {} MSC device(s)".format("set" if option == "OPT_NONE" else "eject", failed)) + + +def get_media(media) -> int: + media = str.upper(media) + return { + 'DDR': DEV_DDR_SRAM, + 'SRAM': DEV_DDR_SRAM, + 'SD': DEV_SD_EMMC, + 'EMMC': DEV_SD_EMMC, + 'NAND': DEV_NAND, + 'SPINAND': DEV_SPINAND, + 'SPINOR': DEV_SPINOR, + 'OTP': DEV_OTP, + 'USBH': DEV_USBH + }.get(media, DEV_UNKNOWN) + + +def get_option(option) -> int: + option = str.upper(option) + return { + 'SCRUB': OPT_SCRUB, + 'WITHBAD': OPT_WITHBAD, + 'VERIFY': OPT_VERIFY, + 'EXECUTE': OPT_EXECUTE, + 'UNPACK': OPT_UNPACK, + 'RAW': OPT_RAW, + 'EJECT': OPT_EJECT, + 'STUFF': OPT_STUFF, + 'SETINFO': OPT_SETINFO, + 'CONCAT': OPT_CONCAT, + 'SHOWHDR': OPT_SHOWHDR, + 'NOCRC': OPT_NOCRC + }.get(option, OPT_UNKNOWN) + + +def get_type(img_type) -> int: + img_type = str.upper(img_type) + return { + 'TFA': IMG_TFA, + 'UBOOT': IMG_UBOOT, + 'LINUX': IMG_LINUX, + 'DDR': IMG_DDR, + 'TEE': IMG_TEE + }.get(img_type, IMG_DATA) + +def get_otpblock(num) -> int: + num = str.upper(num) + return { + 'OTP1': OPT_OTPBLK1, + 'OTP2': OPT_OTPBLK2, + 'OTP3': OPT_OTPBLK3, + 'OTP4': OPT_OTPBLK4, + 'OTP5': OPT_OTPBLK5, + 'OTP6': OPT_OTPBLK6, + 'OTP7': OPT_OTPBLK7, + 'KEY0': OPT_OTPKEY0+OPT_OTPKEY, + 'KEY1': OPT_OTPKEY1+OPT_OTPKEY, + 'KEY2': OPT_OTPKEY2+OPT_OTPKEY, + 'KEY3': OPT_OTPKEY3+OPT_OTPKEY, + 'KEY4': OPT_OTPKEY4+OPT_OTPKEY, + 'KEY5': OPT_OTPKEY5+OPT_OTPKEY + }.get(num, OPT_UNKNOWN) + + +def main(): + parser = argparse.ArgumentParser() + + parser.add_argument("CONFIG", nargs='?', help="Config file", type=str, default='') + parser.add_argument("-a", "--attach", action='store_true', help="Attach to MA35D1") + parser.add_argument("-o", "--option", nargs='+', help="Option flag") + parser.add_argument("-t", "--type", nargs='+', help="Type flag") + group = parser.add_mutually_exclusive_group() + group.add_argument("-c", "--convert", action='store_true', help="Convert images") + group.add_argument("-p", "--pack", action='store_true', help="Generate pack file") + group.add_argument("-v", "--version", action='store_true', help="Show version number") + group.add_argument("-r", "--read", nargs='+', help="Read flash") + group.add_argument("-w", "--write", nargs='+', help="Write flash") + group.add_argument("-e", "--erase", nargs='+', help="Erase flash") + group.add_argument("-s", "--storage", nargs='+', help="Export eMMC/SD as Mass Storage Class") + + if len(sys.argv) == 1: + parser.print_help() + sys.exit(0) + + args = parser.parse_args() + + if args.option: + option = get_option(args.option[0]) + else: + option = OPT_NONE + + if option is OPT_UNKNOWN: + print("Unknown option: " + args.option[0]) + sys.exit(0) + # if args.type: + # img_type = get_type(args.type[0]) + # else: + # img_type = IMG_DATA + + cfg_file = args.CONFIG + + if args.attach: + if not cfg_file: + print("Please assign a DDR ini file") + sys.exit(0) + do_attach(cfg_file, option) + + if args.convert: + if cfg_file == '': + print("No config file assigned") + sys.exit(0) + else: + if option == OPT_SHOWHDR: + do_showhdr(cfg_file) + else: + do_convert(cfg_file, option) + elif args.pack: + if cfg_file == '': + print("No config file assigned") + sys.exit(0) + else: + if option == OPT_UNPACK: + do_unpack(cfg_file, 0) + elif option == OPT_NOCRC: + do_unpack(cfg_file, 1) + elif option == OPT_STUFF: + do_stuff(cfg_file) + else: + do_pack(cfg_file) + elif args.read: + # -r spinor all out.bin + # -r nand 0x1000 0x100 out.bin + # -r otp all out.bin (block1 ~ block7) + # -r otp blockno 0x4 out.bin + arg_count = len(args.read) + if arg_count < 3: + print("At lease take 3 arguments") + sys.exit(0) + media = get_media(args.read[0]) + + try: + if media == DEV_UNKNOWN: + raise ValueError(f"Cannot support read {str.upper(args.read[0])}") + if arg_count == 3 and str.upper(args.read[1]) != 'ALL': + raise ValueError("Unknown arguments") + except ValueError as err: + sys.exit(err) + + if str.upper(args.read[1]) == 'ALL': + if media == DEV_OTP: + option |= 0x3fff00 + do_otp_read(media, 0, args.read[2], 352, option) + else: + do_img_read(media, 0, args.read[2], 0, option) + else: + try: + if media == DEV_OTP: + option = get_otpblock(args.read[1]) | option + else: + start = int(args.read[1], 0) + length = int(args.read[2], 0) + except ValueError as err: + print("Wrong start/length value") + sys.exit(err) + + if media == DEV_OTP: + do_otp_read(media, 0, args.read[3], length, option) + else: + do_img_read(media, start, args.read[3], length, option) + + elif args.write: + # -w spinor 0x1000 image.bin + # -w otp otp.json + # -w nand pack.img + arg_count = len(args.write) + if arg_count < 2: + print("At lease take 2 arguments") + sys.exit(0) + media = get_media(args.write[0]) + + try: + if media == DEV_UNKNOWN: + raise ValueError(f"Unknown storage media {str.upper(args.write[0])}") + if option == OPT_VERIFY and media == DEV_OTP: + raise ValueError(f"Do not support verify option on {str.upper(args.write[0])}") + if option == OPT_EXECUTE and media != DEV_DDR_SRAM: + raise ValueError(f"Do not support execution on {str.upper(args.write[0])}") + if option == OPT_RAW and media != DEV_NAND: + raise ValueError(f"Do not support raw write on {str.upper(args.write[0])}") + except ValueError as err: + sys.exit(err) + + if arg_count == 2: + if media == DEV_OTP: + do_otp_program(args.write[1]) + else: + do_pack_program(media, args.write[1], option) + else: + try: + start = int(args.write[1], 0) + except ValueError as err: + print("Wrong start value") + sys.exit(err) + do_img_program(media, start, args.write[2], option) + + elif args.erase: + # -e spinor all + # -e nand 0x100000 0x10000 -o withbad + # -e otp blockno + arg_count = len(args.erase) + if arg_count < 2: + print("At lease take 2 arguments") + sys.exit(0) + media = get_media(args.erase[0]) + + try: + if media in [DEV_DDR_SRAM, DEV_SD_EMMC, DEV_UNKNOWN]: + raise ValueError(f"{str.upper(args.erase[0])} does not support erase") + if arg_count == 2 and str.upper(args.erase[1]) != 'ALL' and media != DEV_OTP: + raise ValueError("Unknown arguments") + if str.upper(args.erase[1]) == 'ALL' and media == DEV_OTP: + raise ValueError("Wrong arguments") + except ValueError as err: + sys.exit(err) + + if media == DEV_OTP: + option = get_otpblock(args.erase[1]) + try: + # only can erase block 1, 3, 4 + if option == OPT_OTPBLK2: + raise ValueError(f"Error block 2, only erase block 1, 3, 4") + if option == OPT_OTPBLK5: + raise ValueError(f"Error block 5, only erase block 1, 3, 4") + if option == OPT_OTPBLK6: + raise ValueError(f"Error block 6, only erase block 1, 3, 4") + if option == OPT_OTPBLK7: + raise ValueError(f"Error block 7, only erase block 1, 3, 4") + if option == OPT_UNKNOWN: + raise ValueError(f"Error key number") + except ValueError as err: + sys.exit(err) + do_otp_erase(option) + else: + if str.upper(args.erase[1]) == 'ALL': + do_img_erase(media, 0, 0, option) + else: + try: + start = int(args.erase[1], 0) + length = int(args.erase[2], 0) + except ValueError as err: + print("Wrong start/length value") + sys.exit(err) + do_img_erase(media, start, length, option) + + elif args.storage: + # -s emmc 0x800000 + # -s emmc -o remove + arg_count = len(args.erase) + if arg_count != 2 and option != OPT_EJECT: + print("Takes 2 arguments. Storage device and reserved size") + sys.exit(0) + media = get_media(args.storage[0]) + try: + if media not in [DEV_SD_EMMC]: + raise ValueError("Only support eMMC/SD") + if option != OPT_NONE and option != OPT_EJECT: + raise ValueError("Unsupported option") + except ValueError as err: + sys.exit(err) + + if option == OPT_EJECT: + do_msc(media, 0, OPT_EJECT) + else: + try: + reserve = int(args.storage[1], 0) + except ValueError as err: + print("Wrong reserve size") + sys.exit(err) + do_msc(media, reserve) + elif args.version: + print('NuWriter ' + __version__) + print(__copyright__) + + +# Here goes the main function +if __name__ == "__main__": + #os.system("start cmd.exe") #Call do it. Will open cmd window in each process + main() diff --git a/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter_ddr2_128mb_download_and_run.bat b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter_ddr2_128mb_download_and_run.bat new file mode 100644 index 0000000000..7db6e016cc --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter_ddr2_128mb_download_and_run.bat @@ -0,0 +1,8 @@ +:forever_develop +py -3 nuwriter.py -a ddrimg\enc_ddr2_winbond_128mb.bin +IF %ERRORLEVEL% EQU 0 ( + py -3 nuwriter.py -o execute -w ddr 0x80400000 ..\rtthread.bin +) +pause + +goto :forever_develop \ No newline at end of file diff --git a/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter_ddr3_512mb_download_and_run.bat b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter_ddr3_512mb_download_and_run.bat new file mode 100644 index 0000000000..93da94d220 --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter_ddr3_512mb_download_and_run.bat @@ -0,0 +1,8 @@ +:forever_develop +py -3 nuwriter.py -a ddrimg\enc_ddr3_winbond_512mb.bin +IF %ERRORLEVEL% EQU 0 ( + py -3 nuwriter.py -o execute -w ddr 0x80400000 ..\rtthread.bin +) +pause + +goto :forever_develop \ No newline at end of file diff --git a/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter_nand_programming.bat b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter_nand_programming.bat new file mode 100644 index 0000000000..6ce69baf47 --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter_nand_programming.bat @@ -0,0 +1,8 @@ +py -3 nuwriter.py -c header-nand.json +py -3 nuwriter.py -p pack-nand.json + +py -3 nuwriter.py -a ddrimg\enc_ddr3_winbond_512mb.bin +IF %ERRORLEVEL% EQU 0 ( + py -3 nuwriter.py -w nand pack/pack.bin +) +PAUSE \ No newline at end of file diff --git a/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter_sd_programming.bat b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter_sd_programming.bat new file mode 100644 index 0000000000..6db4817ef1 --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter_sd_programming.bat @@ -0,0 +1,8 @@ +py -3 nuwriter.py -c header-sd.json +py -3 nuwriter.py -p pack-sd.json + +py -3 nuwriter.py -a ddrimg\enc_ddr3_winbond_512mb.bin +IF %ERRORLEVEL% EQU 0 ( + py -3 nuwriter.py -w sd pack/pack.bin +) +PAUSE \ No newline at end of file diff --git a/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter_spinand_programming.bat b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter_spinand_programming.bat new file mode 100644 index 0000000000..7bfe4b8677 --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/nuwriter_spinand_programming.bat @@ -0,0 +1,8 @@ +py -3 nuwriter.py -c header-nand.json +py -3 nuwriter.py -p pack-nand.json + +py -3 nuwriter.py -a ddrimg\enc_ddr3_winbond_512mb.bin +IF %ERRORLEVEL% EQU 0 ( + py -3 nuwriter.py -w spinand pack/pack.bin +) +PAUSE \ No newline at end of file diff --git a/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/pack-nand.json b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/pack-nand.json new file mode 100644 index 0000000000..eec55d864c --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/pack-nand.json @@ -0,0 +1,21 @@ +{ + "image": + [ + { + "offset": "0x0", + "file": "conv/header.bin", + "type": 1 + }, + + { + "offset": "0x20000", + "file": "ddrimg/enc_ddr3_winbond_512mb.bin", + "type": 0 + }, + { + "offset": "0x80000", + "file": "../rtthread.bin", + "type": 1 + } + ] +} diff --git a/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/pack-sd.json b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/pack-sd.json new file mode 100644 index 0000000000..617827b600 --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/pack-sd.json @@ -0,0 +1,20 @@ +{ + "image": + [ + { + "offset": "0x400", + "file": "conv/header.bin", + "type": 0 + }, + { + "offset": "0x1000", + "file": "ddrimg/enc_ddr3_winbond_512mb.bin", + "type": 0 + }, + { + "offset": "0x4000", + "file": "../rtthread.bin", + "type": 0 + } + ] +} diff --git a/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/xusbcom.py b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/xusbcom.py new file mode 100644 index 0000000000..da14584865 --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/nuwriter_scripts/xusbcom.py @@ -0,0 +1,154 @@ +# NOTE: This script is test under Python 3.x + +__copyright__ = "Copyright (C) 2020~2021 Nuvoton Technology Corp. All rights reserved" + +import sys +import usb.core +import usb.util +import json +import typing + +XFER_LEN_CMD = 0x0012 +GET_INFO_CMD = 0x0005 + + +class XUsbCom: + + def __init__(self, _dev): + self.dev = _dev + self.write_addr = 0x1 + self.read_addr = 0x81 + self.attach = False + self.id = 0 + self.info = b'' + + def write(self, data) -> None: + try: + # Vendor command set transfer length + self.dev.ctrl_transfer(0x40, 0xA0, wValue=XFER_LEN_CMD, wIndex=len(data), data_or_wLength='') + # Actual data + self.dev.write(self.write_addr, data, timeout=1000) + except usb.core.USBError as err: + sys.exit(err) + + def read(self, size) -> bytes: + try: + buf = self.dev.read(self.read_addr, size, timeout=1000) + except usb.core.USBError as err: + sys.exit(err) + return buf + + def set_media(self, media) -> None: + try: + # Vendor command set type + self.dev.ctrl_transfer(0x40, 0xB0, wValue=media, wIndex=0, data_or_wLength='') + except usb.core.USBError as err: + sys.exit(err) + return + + def get_info(self, data) -> bytes: + try: + self.dev.ctrl_transfer(0x40, 0xB0, wValue=GET_INFO_CMD, wIndex=0, data_or_wLength='') + self.dev.ctrl_transfer(0x40, 0xA0, wValue=XFER_LEN_CMD, wIndex=76, data_or_wLength='') + self.dev.write(0x01, data, timeout=1000) + self.info = self.dev.read(0x81, 76, timeout=1000) + # not used + self.dev.read(0x81, 4, timeout=5000) + + except usb.core.USBError as err: + sys.exit(err) + return self.info + + def set_id(self, i) -> None: + self.id = i + + def get_id(self) -> int: + return self.id + + @staticmethod + def set_align(nand, spinand) -> None: + # See if we need to overwrite existing json file. + overwrite = False + try: + with open(".config", "r") as json_file: + cfg = json.load(json_file) + for key in cfg.keys(): + if key == 'nand_align': + if nand != int(cfg['nand_align']): + overwrite = True + elif key == 'spinand_align': + if spinand != int(cfg['spinand_align']): + overwrite = True + except (IOError, OSError, json.decoder.JSONDecodeError) as err: + overwrite = True + + if overwrite is True: + try: + with open(".config", "w+") as json_file: + new_key = {'nand_align': nand, 'spinand_align': spinand} + json.dump(new_key, json_file) + except (IOError, OSError) as err: + print("Write .config failed. Please re-attach") + sys.exit(err) + + @staticmethod + def get_align() -> typing.Tuple[int, int]: + try: + with open(".config", "r") as json_file: + cfg = json.load(json_file) + except (IOError, OSError, json.decoder.JSONDecodeError) as err: + print("Open/parsing .config failed. Please re-attach") + sys.exit(err) + nand_align = spinand_align = 0 + for key in cfg.keys(): + if key == 'nand_align': + nand_align = int(cfg['nand_align']) + elif key == 'spinand_align': + spinand_align = int(cfg['spinand_align']) + return nand_align, spinand_align + + +class XUsbComList: + + def __init__(self, attach_all=False): + vid = 0x0416 + pid = 0x5963 + try: + self.devices = list(usb.core.find(idVendor=vid, idProduct=pid, + find_all=True if attach_all is True else False)) + except TypeError: + # list will raise exception if there's no device + self.devices = [] + return + except usb.core.NoBackendError as err: + sys.exit(err) + + if len(self.devices) != 0 and attach_all is False: + # Object type return on attach_all == False is different + self.devices[0] = self.devices[0].device + + for dev in self.devices: + try: + dev.set_configuration() + except (usb.core.USBError, NotImplementedError) as err: + sys.exit(err) + + for i in range(0, len(self.devices)): + self.devices[i] = XUsbCom(self.devices[i]) + self.devices[i].set_id(i) + + def __del__(self): + if len(self.devices) != 0: + for dev in self.devices: + try: + usb.util.dispose_resources(dev.dev) + # dev.dev.reset() + dev = None + #except (usb.core.USBError, NotImplementedError) as err: + except usb.core.USBError as err: + sys.exit(err) + + self.devices = None + + def get_dev(self): + return self.devices diff --git a/bsp/nuvoton/numaker-iot-ma35d1/preload/SConscript b/bsp/nuvoton/numaker-iot-ma35d1/preload/SConscript new file mode 100644 index 0000000000..73123b415f --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/preload/SConscript @@ -0,0 +1,14 @@ +# RT-Thread building script for component + +from building import * + + +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +src = Glob('*.c') + Glob('*.cpp') + Glob('*.S') +CPPPATH = [ cwd ] + +group = DefineGroup('board', src, depend = [''], CPPPATH = CPPPATH) +Return('group') diff --git a/bsp/nuvoton/numaker-iot-ma35d1/preload/entry_point.S b/bsp/nuvoton/numaker-iot-ma35d1/preload/entry_point.S new file mode 100644 index 0000000000..210a262d4a --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/preload/entry_point.S @@ -0,0 +1,109 @@ +.section ".text.entrypoint" +.globl system_vectors + +ma35d1_start: + .word 0x10000014 + .word 0x9100029f + .word 0xd539f220 + .word 0xb27a0000 + .word 0xd519f220 + .word 0xd53800a1 + .word 0x92400421 + .word 0xb4000141 + .word 0xd503205f + .word 0xd2800900 + .word 0xf2a808c0 + .word 0xf9400001 + .word 0xf100003f + .word 0x54ffff60 + .word 0x91001000 + .word 0xb9000001 + .word 0x14000012 + .word 0xd2800980 + .word 0xf2a808c0 + .word 0xaa1f03e1 + .word 0xb9000001 + .word 0xd282000a + .word 0xd100054a + .word 0xf100015f + .word 0x54000140 + .word 0xd2800900 + .word 0xf2a808c0 + .word 0xaa1403e1 + .word 0xb9000001 + .word 0xd503209f + .word 0x91001000 + .word 0xb9400002 + .word 0xeb02003f + .word 0x54fffea1 + .word 0xd2836000 + .word 0xf2a016e0 + .word 0xd51be000 + .word 0xd2820000 + .word 0xf2aa1000 + .word 0x52800069 + .word 0xb9000009 + .word 0xb9400409 + .word 0x1200112a + .word 0x340001aa + .word 0x9102000b + .word 0x52800009 + .word 0xb8004569 + .word 0xb8004569 + .word 0x5100054a + .word 0x35ffffca + .word 0xd2840001 + .word 0xf2aa1001 + .word 0x52800060 + .word 0xb9000020 + .word 0x52801000 + .word 0xb9000420 + .word 0xd2820000 + .word 0xf2aa1000 + .word 0xd2840001 + .word 0xf2aa1001 + .word 0x52800009 + .word 0xb9008009 + .word 0x52800029 + .word 0xb9010009 + .word 0x52803ce9 + .word 0xb9000029 + .word 0x52801009 + .word 0xb9000429 + .word 0xd2a00600 + .word 0xd5181040 + .word 0xaa1f03e0 + .word 0xb2630000 + .word 0xb2640000 + .word 0xb2690000 + .word 0xb26a0000 + .word 0xb26c0000 + .word 0xb2750000 + .word 0xd5181000 + .word 0xaa1f03e0 + .word 0xb2770000 + .word 0xb2780000 + .word 0xb2790000 + .word 0xb27b0000 + .word 0xb27c0000 + .word 0xd51e1100 + .word 0xaa1f03e0 + .word 0xd2800060 + .word 0xb2780000 + .word 0xb2790000 + .word 0xb27a0000 + .word 0xb27c0000 + .word 0xd51e4000 + .word 0x10000060 + .word 0xd51e4020 + .word 0xd69f03e0 + +.L__aarch32_code: + + nop + nop + nop + nop + ldr r0, =ma35d1_start + mov sp, r0 + ldr pc, =system_vectors diff --git a/bsp/nuvoton/numaker-iot-ma35d1/preload/env_build.bat b/bsp/nuvoton/numaker-iot-ma35d1/preload/env_build.bat new file mode 100644 index 0000000000..57136e7b8e --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/preload/env_build.bat @@ -0,0 +1,7 @@ +@set RTT_CC=gcc +@set RTT_EXEC_PATH=C:\Program Files (x86)\GNU Tools ARM Embedded\8 2019-q3-aarch64-elf\bin +@set RTT_CC_PREFIX=aarch64-elf- +@set PATH=%RTT_EXEC_PATH%;%ENV_ROOT%\tools\gnu_gcc\arm_gcc\mingw\bin;%PATH% + +make +python transcode.py diff --git a/bsp/nuvoton/numaker-hmi-ma35d1/linking_scripts/aarch64.ld b/bsp/nuvoton/numaker-iot-ma35d1/preload/preload.ld similarity index 77% rename from bsp/nuvoton/numaker-hmi-ma35d1/linking_scripts/aarch64.ld rename to bsp/nuvoton/numaker-iot-ma35d1/preload/preload.ld index 2558c052e6..bfe4705d25 100644 --- a/bsp/nuvoton/numaker-hmi-ma35d1/linking_scripts/aarch64.ld +++ b/bsp/nuvoton/numaker-iot-ma35d1/preload/preload.ld @@ -1,12 +1,3 @@ -/* - * Copyright (c) 2006-2021, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * 2017-5-30 bernard first version - */ - SECTIONS { . = 0x80400000; @@ -26,33 +17,6 @@ SECTIONS *(COMMON) - /* section information for finsh shell */ - . = ALIGN(16); - __fsymtab_start = .; - KEEP(*(FSymTab)) - __fsymtab_end = .; - . = ALIGN(16); - - . = ALIGN(16); - __vsymtab_start = .; - KEEP(*(VSymTab)) - __vsymtab_end = .; - . = ALIGN(16); - - /* section information for initial. */ - . = ALIGN(16); - __rt_init_start = .; - KEEP(*(SORT(.rti_fn*))) - __rt_init_end = .; - . = ALIGN(16); - - /* section information for utest */ - . = ALIGN(16); - __rt_utest_tc_tab_start = .; - KEEP(*(UtestTcTab)) - __rt_utest_tc_tab_end = .; - . = ALIGN(16); - _etext = .; } diff --git a/bsp/nuvoton/numaker-iot-ma35d1/preload/transcode.py b/bsp/nuvoton/numaker-iot-ma35d1/preload/transcode.py new file mode 100644 index 0000000000..a918f45245 --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/preload/transcode.py @@ -0,0 +1,41 @@ +# -*- coding: UTF-8 -*- + +import os + +def extract_line(fname, pattern): + with open(fname, "r") as f: + lines = f.readlines() + f.close() + with open("entry_point.S", "w") as f: + counter=0 + f.write(".section \".text.entrypoint\"\n") + f.write(".globl system_vectors\n") + f.write("\n") + f.write("ma35d1_start:\n") + for line in lines: + if pattern in line: + new_line = " .word 0x" + line[6:14] + "\n" + f.write(new_line) + counter = counter+1 + f.write("\n") + f.write(".L__aarch32_code:\n") + f.write("\n") + # Append NOP to align vector table. + counter = (counter+5)*4 + counter_align = (counter+32-1) & ~(32-1) + nop_num = (counter_align - counter) / 4 + print hex(counter), hex(counter_align), nop_num + j = 0 + while j < nop_num: + f.write(" nop\n") + j += 1 + f.write(" ldr r0, =ma35d1_start\n") + f.write(" mov sp, r0\n") + f.write(" ldr pc, =system_vectors\n") + f.close() + +def formatfiles(): + extract_line("preload.txt", ":\t") + +if __name__ == '__main__': + formatfiles() diff --git a/bsp/nuvoton/numaker-iot-ma35d1/rtconfig.py b/bsp/nuvoton/numaker-iot-ma35d1/rtconfig.py new file mode 100644 index 0000000000..81218b47f8 --- /dev/null +++ b/bsp/nuvoton/numaker-iot-ma35d1/rtconfig.py @@ -0,0 +1,77 @@ +import os +# toolchains options +ARCH = 'arm' +CPU = 'cortex-a' +# toolchains options +CROSS_TOOL = 'gcc' + +if os.getenv('RTT_CC'): + CROSS_TOOL = os.getenv('RTT_CC') +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') + +# cross_tool provides the cross compiler +# EXEC_PATH is the compiler execute path, for example, CodeSourcery, Keil MDK, IAR + +if CROSS_TOOL == 'gcc': + PLATFORM = 'gcc' + EXEC_PATH = r'C:\Program Files (x86)\GNU Tools ARM Embedded\6 2017-q1-update\bin' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +#BUILD = 'debug' +BUILD = '' +MAP_FILE = 'rtthread_ma35d1.map' +LINK_FILE = 'linking_scripts/aarch32' +TARGET_NAME = 'rtthread.bin' + +#------- GCC settings ---------------------------------------------------------- +if PLATFORM == 'gcc': + # toolchains + PREFIX = 'arm-none-eabi-' + CC = PREFIX + 'gcc' + AS = PREFIX + 'gcc' + AR = PREFIX + 'ar' + CXX = PREFIX + 'g++' + LINK = PREFIX + 'gcc' + TARGET_EXT = 'elf' + SIZE = PREFIX + 'size' + OBJDUMP = PREFIX + 'objdump' + OBJCPY = PREFIX + 'objcopy' + STRIP = PREFIX + 'strip' + + DEVICE = ' -march=armv8-a -mfpu=neon-vfpv4 -ftree-vectorize -ffast-math -msoft-float' + CFLAGS = DEVICE + ' -Wall -fno-zero-initialized-in-bss ' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -D__ASSEMBLY__' + LFLAGS = DEVICE + ' -nostartfiles -Wl,--gc-sections,-cref,-Map=' + MAP_FILE + ',-cref,-u,system_vectors' + ' -T ' + LINK_FILE + '.ld' + CXXFLAGS = ' -march=armv8-a -mfpu=neon-vfpv4 -std=c++11 ' + + M_CFLAGS = CFLAGS + ' -mlong-calls -fPIC ' + M_CXXFLAGS = CXXFLAGS + ' -mlong-calls -fPIC' + M_LFLAGS = DEVICE + CXXFLAGS + ' -Wl,--gc-sections,-z,max-page-size=0x4' +\ + ' -shared -fPIC -nostartfiles -nostdlib -static-libgcc' + M_POST_ACTION = STRIP + ' -R .hash $TARGET\n' + SIZE + ' $TARGET \n' + #M_BIN_PATH = r'z:\fatdisk\root' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + + POST_ACTION = OBJCPY + ' -O binary $TARGET ' + TARGET_NAME + '\n' + POST_ACTION += SIZE + ' $TARGET\n' + + +def dist_handle(BSP_ROOT, dist_dir): + import sys + cwd_path = os.getcwd() + sys.path.append(os.path.join(os.path.dirname(BSP_ROOT), 'tools')) + from sdk_dist import dist_do_building + dist_do_building(BSP_ROOT, dist_dir) diff --git a/bsp/nuvoton/numaker-m032ki/Nu_Link_Driver.ini b/bsp/nuvoton/numaker-m032ki/Nu_Link_Driver.ini deleted file mode 100644 index 73b252707a..0000000000 --- a/bsp/nuvoton/numaker-m032ki/Nu_Link_Driver.ini +++ /dev/null @@ -1,1038 +0,0 @@ -[Version] -Nu_LinkVersion=V5.14 -[Process] -ProcessID=0x0000b660 -ProcessCreationTime_L=0xe87ebcaf -ProcessCreationTime_H=0x01d74ae4 -NuLinkID=0x18000000 -NuLinkIDs_Count=0x00000001 -NuLinkID0=0x18000000 -[ChipSelect] -;ChipName= -ChipName=M031 -[NUC505] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=NUC505_SPIFLASH.FLM -[NUC4xx] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=NUC400_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x014fb180 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[NUC2xx] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NUC200_AP_128.FLM -[NUC1311] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NUC1311_AP_64.FLM -[NUC126] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=NUC126_AP_256.FLM -[NUC121] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NUC121_AP_32.FLM -[NUC1xx] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NUC100_AP_128.FLM -[NUC029] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NUC029_AP_16.FLM -[NM1820] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NM1820_AP_17_5.FLM -[NM1810] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NM1810_AP_29_5.FLM -[NM1500] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NM1500_AP_128.FLM -[NM1330] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NM1330_AP_64.FLM -[NM1320] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NM1320_AP_32.FLM -[NM1240] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NM1240_AP_64.FLM -[NM1230] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NM1230_AP_64.FLM -[NM1200] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NM1200_AP_8.FLM -[NM1120] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NM1120_AP_29_5.FLM -[TF5100] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=TF5100_AP_64.FLM -[NDA102] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NDA102_AP_29_5.FLM -[Nano103] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=Nano103_AP_64.FLM -[Nano100] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=Nano100_AP_64.FLM -[N576] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=N576_AP_145.FLM -[N575] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=N575_AP_145.FLM -[N572] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=N572Fxxx.FLM -[N571] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=N571E000.FLM -[N570] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=N570_AP_64.FLM -[N569] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=N569_AP_64.FLM -[N512] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=N512_AP_64.FLM -[Mini57] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=Mini57_AP_29_5.FLM -[Mini51] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=Mini51_AP_16.FLM -[M481] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M481_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[M480LD] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M480LD_AP_256.FLM -[M479] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M479_AP_256.FLM -[M451] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M451_AP_256.FLM -[M471] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Bank=0 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M471_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[M251] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=M251_AP_192.FLM -[M2351] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M2351_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[M261] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M261_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[MR63] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=MR63_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[M2354] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Bank=0 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -CheckDPM=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M2354_AP_1M.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[M071] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=M071_AP_128.FLM -[M0564] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=M0564_AP_256.FLM -[M0519] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=M0519_AP_128.FLM -[M0518] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=M0518_AP_64.FLM -[M05x] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=M0516_AP_64.FLM -[M0A21] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=M0A21_AP_32.FLM -[M030G] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -DisableTimeoutDetect=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=M030G_AP_64.FLM -[M031] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Bank=0 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=M031_AP_128.FLM -CheckDPM=0 -DisableTimeoutDetect=0 -[NPCX] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=NPCX_AP_512.FLM -[I96000] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=2 -Program=0 -Verify=0 -ResetAndRun=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x8000 -ProgramAlgorithm= -[I94000] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=I94000_AP_512.FLM -[ISD9300] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=ISD9300_AP_145.FLM -[I9200] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=I9200_AP_128.FLM -[ISD9xxx] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=ISD9100_AP_145.FLM -[ISD9000] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=ISD9000_AP_64.FLM -[AU9xxx] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=AU9100_AP_145.FLM -[Autodetect] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm= -[General] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm= diff --git a/bsp/nuvoton/numaker-m032ki/applications/lvgl/lv_demo.c b/bsp/nuvoton/numaker-m032ki/applications/lvgl/lv_demo.c index 7a04e1804a..ebfbba2273 100644 --- a/bsp/nuvoton/numaker-m032ki/applications/lvgl/lv_demo.c +++ b/bsp/nuvoton/numaker-m032ki/applications/lvgl/lv_demo.c @@ -17,16 +17,15 @@ void lv_user_gui_init(void) #if LV_USE_DEMO_BENCHMARK extern void lv_demo_benchmark(void); lv_demo_benchmark(); -#endif -#if LV_USE_DEMO_WIDGETS +#elif LV_USE_DEMO_WIDGETS extern void lv_demo_widgets(void); lv_demo_widgets(); -#endif -#if LV_USE_DEMO_MUSIC || LV_USE_DEMO_RTT_MUSIC +#elif (LV_USE_DEMO_MUSIC || LV_USE_DEMO_RTT_MUSIC) extern void lv_demo_music(void); lv_demo_music(); + #endif } diff --git a/bsp/nuvoton/numaker-m032ki/applications/lvgl/lv_port_disp.c b/bsp/nuvoton/numaker-m032ki/applications/lvgl/lv_port_disp.c index a86452c5d5..445c4993e1 100644 --- a/bsp/nuvoton/numaker-m032ki/applications/lvgl/lv_port_disp.c +++ b/bsp/nuvoton/numaker-m032ki/applications/lvgl/lv_port_disp.c @@ -16,6 +16,10 @@ #define DBG_COLOR #include +#if !defined(NU_PKG_LVGL_RENDERING_LAYER) + #define NU_PKG_LVGL_RENDERING_LAYER "lcd" +#endif + /*A static or global variable to store the buffers*/ static lv_disp_draw_buf_t disp_buf; static lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ @@ -47,7 +51,7 @@ void lv_port_disp_init(void) rt_err_t result; void *buf1 = RT_NULL; - lcd_device = rt_device_find("lcd"); + lcd_device = rt_device_find(NU_PKG_LVGL_RENDERING_LAYER); if (lcd_device == 0) { LOG_E("error!"); diff --git a/bsp/nuvoton/numaker-m032ki/applications/lvgl/lv_port_disp.h b/bsp/nuvoton/numaker-m032ki/applications/lvgl/lv_port_disp.h deleted file mode 100644 index b11ce3c5b6..0000000000 --- a/bsp/nuvoton/numaker-m032ki/applications/lvgl/lv_port_disp.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2021-10-18 Meco Man The first version - */ -#ifndef LV_PORT_DISP_H -#define LV_PORT_DISP_H - -#ifdef __cplusplus -extern "C" { -#endif - -void lv_port_disp_init(void); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/bsp/nuvoton/numaker-m032ki/applications/lvgl/lv_port_indev.h b/bsp/nuvoton/numaker-m032ki/applications/lvgl/lv_port_indev.h deleted file mode 100644 index bde7176807..0000000000 --- a/bsp/nuvoton/numaker-m032ki/applications/lvgl/lv_port_indev.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2021-10-18 Meco Man The first version - */ -#ifndef LV_PORT_INDEV_H -#define LV_PORT_INDEV_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -extern lv_indev_t *button_indev; - -void lv_port_indev_init(void); -void lv_port_indev_input(rt_int16_t x, rt_int16_t y, lv_indev_state_t state); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/bsp/nuvoton/numaker-m032ki/project.uvprojx b/bsp/nuvoton/numaker-m032ki/project.uvprojx deleted file mode 100644 index bc6c2431a9..0000000000 --- a/bsp/nuvoton/numaker-m032ki/project.uvprojx +++ /dev/null @@ -1,1256 +0,0 @@ - - - 2.1 -

### uVision Project, (C) Keil Software
- - - rtthread-m031 - 0x4 - ARM-ADS - 5060750::V5.06 update 6 (build 750)::ARMCC - 5060750::V5.06 update 6 (build 750)::ARMCC - 0 - - - M032KIAAE - Nuvoton - Nuvoton.NuMicro_DFP.1.3.10 - http://www.nuvoton.com/hq/enu/Documents/KEILSoftwarePack - IRAM(0x20000000,0x18000) IROM(0x00000000,0x80000) CPUTYPE("Cortex-M0") CLOCK(12000000) - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0M031_AP_512 -FS00 -FL080000 -FP0($$Device:M032KIAAE$Flash\M031_AP_512.FLM)) - 0 - $$Device:M032KIAAE$Device\M031\Include\M031Series.h - - - - - - - - - - $$Device:M032KIAAE$SVD\Nuvoton\M031AE_v1.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\build\keil5\ - rtthread - 1 - 0 - 1 - 1 - 1 - .\build\keil5\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 1 - fromelf --bin ".\build\keil5\\@L.axf" --output ".\build\keil5\\@L.bin" - fromelf --text -c ".\build\keil5\\@L.axf" --output ".\build\keil5\\@L.txt" - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - - DARMCM1.DLL - -pCM0 - SARMCM3.DLL - - TARMCM1.DLL - -pCM0 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4103 - - 1 - NULink\Nu_Link.dll - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M0" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x18000 - - - 1 - 0x0 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x18000 - - - 0 - 0x0 - 0x0 - - - - - - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 5 - 3 - 0 - 0 - 0 - 1 - 0 - - - RT_USING_LIBC, __RTTHREAD__, __STDC_LIMIT_MACROS, RT_USING_ARM_LIBC, __CLK_TCK=RT_TICK_PER_SECOND - - applications;.;board;board\NuClockConfig;board\NuPinConfig;..\libraries\m031\CMSIS\Include;..\..\..\components\libc\compilers\common\include;..\..\..\components\libc\compilers\common\extension;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m0;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\libraries\m031\Device\Nuvoton\M031\Include;..\libraries\m031\rtt_port;..\..\..\components\dfs\include;..\..\..\components\dfs\filesystems\devfs;..\..\..\components\finsh;.;..\..\..\include;..\libraries\m031\StdDriver\inc;..\libraries\nu_packages\Demo;..\libraries\nu_packages\TPC;..\libraries\nu_packages\NuUtils\inc;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\posix\io\stdio;..\..\..\components\libc\posix\ipc;..\..\..\components\drivers\usb\usbdevice;..\..\..\components\utilities\utest;..\..\..\examples\utest\testcases\kernel;..\..\..\examples\utest\testcases\utest - - - - 1 - 0 - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\linking_scripts\m031_flash.sct - - - - - - - - - - - Applications - - - main.c - 1 - applications\main.c - - - - - mnt.c - 1 - applications\mnt.c - - - - - board - - - nutool_pincfg.c - 1 - board\NuPinConfig\nutool_pincfg.c - - - - - nutool_modclkcfg.c - 1 - board\NuClockConfig\nutool_modclkcfg.c - - - - - board_dev.c - 1 - board\board_dev.c - - - - - Compiler - - - syscall_mem.c - 1 - ..\..\..\components\libc\compilers\armlibc\syscall_mem.c - - - - - syscalls.c - 1 - ..\..\..\components\libc\compilers\armlibc\syscalls.c - - - - - cctype.c - 1 - ..\..\..\components\libc\compilers\common\cctype.c - - - - - cstdio.c - 1 - ..\..\..\components\libc\compilers\common\cstdio.c - - - - - cstdlib.c - 1 - ..\..\..\components\libc\compilers\common\cstdlib.c - - - - - cstring.c - 1 - ..\..\..\components\libc\compilers\common\cstring.c - - - - - ctime.c - 1 - ..\..\..\components\libc\compilers\common\ctime.c - - - - - cwchar.c - 1 - ..\..\..\components\libc\compilers\common\cwchar.c - - - - - CPU - - - backtrace.c - 1 - ..\..\..\libcpu\arm\common\backtrace.c - - - - - div0.c - 1 - ..\..\..\libcpu\arm\common\div0.c - - - - - showmem.c - 1 - ..\..\..\libcpu\arm\common\showmem.c - - - - - context_rvds.S - 2 - ..\..\..\libcpu\arm\cortex-m0\context_rvds.S - - - - - cpuport.c - 1 - ..\..\..\libcpu\arm\cortex-m0\cpuport.c - - - - - DeviceDrivers - - - hwtimer.c - 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c - - - - - completion.c - 1 - ..\..\..\components\drivers\ipc\completion.c - - - - - dataqueue.c - 1 - ..\..\..\components\drivers\ipc\dataqueue.c - - - - - pipe.c - 1 - ..\..\..\components\drivers\ipc\pipe.c - - - - - ringblk_buf.c - 1 - ..\..\..\components\drivers\ipc\ringblk_buf.c - - - - - ringbuffer.c - 1 - ..\..\..\components\drivers\ipc\ringbuffer.c - - - - - waitqueue.c - 1 - ..\..\..\components\drivers\ipc\waitqueue.c - - - - - workqueue.c - 1 - ..\..\..\components\drivers\ipc\workqueue.c - - - - - adc.c - 1 - ..\..\..\components\drivers\misc\adc.c - - - - - pin.c - 1 - ..\..\..\components\drivers\misc\pin.c - - - - - rt_drv_pwm.c - 1 - ..\..\..\components\drivers\misc\rt_drv_pwm.c - - - - - lptimer.c - 1 - ..\..\..\components\drivers\pm\lptimer.c - - - - - pm.c - 1 - ..\..\..\components\drivers\pm\pm.c - - - - - rtc.c - 1 - ..\..\..\components\drivers\rtc\rtc.c - - - - - serial.c - 1 - ..\..\..\components\drivers\serial\serial.c - - - - - watchdog.c - 1 - ..\..\..\components\drivers\watchdog\watchdog.c - - - - - Drivers - - - startup_M031Series.s - 2 - ..\libraries\m031\Device\Nuvoton\M031\Source\ARM\startup_M031Series.s - - - - - system_M031Series.c - 1 - ..\libraries\m031\Device\Nuvoton\M031\Source\system_M031Series.c - - - - - drv_adc.c - 1 - ..\libraries\m031\rtt_port\drv_adc.c - - - - - drv_bpwm.c - 1 - ..\libraries\m031\rtt_port\drv_bpwm.c - - - - - drv_bpwm_capture.c - 1 - ..\libraries\m031\rtt_port\drv_bpwm_capture.c - - - - - drv_clk.c - 1 - ..\libraries\m031\rtt_port\drv_clk.c - - - - - drv_common.c - 1 - ..\libraries\m031\rtt_port\drv_common.c - - - - - drv_crc.c - 1 - ..\libraries\m031\rtt_port\drv_crc.c - - - - - drv_crypto.c - 1 - ..\libraries\m031\rtt_port\drv_crypto.c - - - - - drv_ebi.c - 1 - ..\libraries\m031\rtt_port\drv_ebi.c - - - - - drv_fmc.c - 1 - ..\libraries\m031\rtt_port\drv_fmc.c - - - - - drv_gpio.c - 1 - ..\libraries\m031\rtt_port\drv_gpio.c - - - - - drv_i2c.c - 1 - ..\libraries\m031\rtt_port\drv_i2c.c - - - - - drv_pdma.c - 1 - ..\libraries\m031\rtt_port\drv_pdma.c - - - - - drv_pwm.c - 1 - ..\libraries\m031\rtt_port\drv_pwm.c - - - - - drv_pwm_capture.c - 1 - ..\libraries\m031\rtt_port\drv_pwm_capture.c - - - - - drv_qspi.c - 1 - ..\libraries\m031\rtt_port\drv_qspi.c - - - - - drv_rtc.c - 1 - ..\libraries\m031\rtt_port\drv_rtc.c - - - - - drv_softi2c.c - 1 - ..\libraries\m031\rtt_port\drv_softi2c.c - - - - - drv_spi.c - 1 - ..\libraries\m031\rtt_port\drv_spi.c - - - - - drv_spii2s.c - 1 - ..\libraries\m031\rtt_port\drv_spii2s.c - - - - - drv_timer.c - 1 - ..\libraries\m031\rtt_port\drv_timer.c - - - - - drv_timer_capture.c - 1 - ..\libraries\m031\rtt_port\drv_timer_capture.c - - - - - drv_uart.c - 1 - ..\libraries\m031\rtt_port\drv_uart.c - - - - - drv_ui2c.c - 1 - ..\libraries\m031\rtt_port\drv_ui2c.c - - - - - drv_usbd.c - 1 - ..\libraries\m031\rtt_port\drv_usbd.c - - - - - drv_uspi.c - 1 - ..\libraries\m031\rtt_port\drv_uspi.c - - - - - drv_uuart.c - 1 - ..\libraries\m031\rtt_port\drv_uuart.c - - - - - drv_wdt.c - 1 - ..\libraries\m031\rtt_port\drv_wdt.c - - - - - Filesystem - - - devfs.c - 1 - ..\..\..\components\dfs\filesystems\devfs\devfs.c - - - - - dfs.c - 1 - ..\..\..\components\dfs\src\dfs.c - - - - - dfs_file.c - 1 - ..\..\..\components\dfs\src\dfs_file.c - - - - - dfs_fs.c - 1 - ..\..\..\components\dfs\src\dfs_fs.c - - - - - dfs_posix.c - 1 - ..\..\..\components\dfs\src\dfs_posix.c - - - - - Finsh - - - shell.c - 1 - ..\..\..\components\finsh\shell.c - - - - - msh.c - 1 - ..\..\..\components\finsh\msh.c - - - - - msh_parse.c - 1 - ..\..\..\components\finsh\msh_parse.c - - - - - cmd.c - 1 - ..\..\..\components\finsh\cmd.c - - - - - msh_file.c - 1 - ..\..\..\components\finsh\msh_file.c - - - - - Kernel - - - clock.c - 1 - ..\..\..\src\clock.c - - - - - components.c - 1 - ..\..\..\src\components.c - - - - - device.c - 1 - ..\..\..\src\device.c - - - - - idle.c - 1 - ..\..\..\src\idle.c - - - - - ipc.c - 1 - ..\..\..\src\ipc.c - - - - - irq.c - 1 - ..\..\..\src\irq.c - - - - - kservice.c - 1 - ..\..\..\src\kservice.c - - - - - mem.c - 1 - ..\..\..\src\mem.c - - - - - mempool.c - 1 - ..\..\..\src\mempool.c - - - - - object.c - 1 - ..\..\..\src\object.c - - - - - scheduler.c - 1 - ..\..\..\src\scheduler.c - - - - - thread.c - 1 - ..\..\..\src\thread.c - - - - - timer.c - 1 - ..\..\..\src\timer.c - - - - - Libraries - - - nu_rtc.c - 1 - ..\libraries\m031\StdDriver\src\nu_rtc.c - - - - - nu_ebi.c - 1 - ..\libraries\m031\StdDriver\src\nu_ebi.c - - - - - nu_gpio.c - 1 - ..\libraries\m031\StdDriver\src\nu_gpio.c - - - - - nu_crc.c - 1 - ..\libraries\m031\StdDriver\src\nu_crc.c - - - - - nu_wdt.c - 1 - ..\libraries\m031\StdDriver\src\nu_wdt.c - - - - - nu_clk.c - 1 - ..\libraries\m031\StdDriver\src\nu_clk.c - - - - - nu_timer.c - 1 - ..\libraries\m031\StdDriver\src\nu_timer.c - - - - - nu_acmp.c - 1 - ..\libraries\m031\StdDriver\src\nu_acmp.c - - - - - nu_usci_spi.c - 1 - ..\libraries\m031\StdDriver\src\nu_usci_spi.c - - - - - nu_fmc.c - 1 - ..\libraries\m031\StdDriver\src\nu_fmc.c - - - - - nu_sys.c - 1 - ..\libraries\m031\StdDriver\src\nu_sys.c - - - - - nu_uart.c - 1 - ..\libraries\m031\StdDriver\src\nu_uart.c - - - - - nu_wwdt.c - 1 - ..\libraries\m031\StdDriver\src\nu_wwdt.c - - - - - nu_bpwm.c - 1 - ..\libraries\m031\StdDriver\src\nu_bpwm.c - - - - - nu_pdma.c - 1 - ..\libraries\m031\StdDriver\src\nu_pdma.c - - - - - nu_qspi.c - 1 - ..\libraries\m031\StdDriver\src\nu_qspi.c - - - - - nu_pwm.c - 1 - ..\libraries\m031\StdDriver\src\nu_pwm.c - - - - - nu_adc.c - 1 - ..\libraries\m031\StdDriver\src\nu_adc.c - - - - - nu_spi.c - 1 - ..\libraries\m031\StdDriver\src\nu_spi.c - - - - - nu_i2c.c - 1 - ..\libraries\m031\StdDriver\src\nu_i2c.c - - - - - nu_usbd.c - 1 - ..\libraries\m031\StdDriver\src\nu_usbd.c - - - - - nu_usci_uart.c - 1 - ..\libraries\m031\StdDriver\src\nu_usci_uart.c - - - - - nu_usci_i2c.c - 1 - ..\libraries\m031\StdDriver\src\nu_usci_i2c.c - - - - - nu_pkgs_demo - - - usbd_cdc_vcom_echo.c - 1 - ..\libraries\nu_packages\Demo\usbd_cdc_vcom_echo.c - - - - - slcd_show_tick.c - 1 - ..\libraries\nu_packages\Demo\slcd_show_tick.c - - - - - usbd_hid_dance_mouse.c - 1 - ..\libraries\nu_packages\Demo\usbd_hid_dance_mouse.c - - - - - rt_usbd - - - usbdevice_core.c - 1 - ..\..\..\components\drivers\usb\usbdevice\core\usbdevice_core.c - - - - - usbdevice.c - 1 - ..\..\..\components\drivers\usb\usbdevice\core\usbdevice.c - - - - - hid.c - 1 - ..\..\..\components\drivers\usb\usbdevice\class\hid.c - - - - - UTest - - - utest.c - 1 - ..\..\..\components\utilities\utest\utest.c - - - - - utestcases - - - mem_tc.c - 1 - ..\..\..\examples\utest\testcases\kernel\mem_tc.c - - - - - pass_tc.c - 1 - ..\..\..\examples\utest\testcases\utest\pass_tc.c - - - - - - - - - - - - diff --git a/bsp/nuvoton/numaker-m032ki/rtconfig.h b/bsp/nuvoton/numaker-m032ki/rtconfig.h deleted file mode 100644 index 4f225b770d..0000000000 --- a/bsp/nuvoton/numaker-m032ki/rtconfig.h +++ /dev/null @@ -1,286 +0,0 @@ -#ifndef RT_CONFIG_H__ -#define RT_CONFIG_H__ - -/* Automatically generated file; DO NOT EDIT. */ -/* RT-Thread Configuration */ - -/* RT-Thread Kernel */ - -#define RT_NAME_MAX 8 -#define RT_ALIGN_SIZE 4 -#define RT_THREAD_PRIORITY_32 -#define RT_THREAD_PRIORITY_MAX 32 -#define RT_TICK_PER_SECOND 1000 -#define RT_USING_OVERFLOW_CHECK -#define RT_USING_HOOK -#define RT_HOOK_USING_FUNC_PTR -#define RT_USING_IDLE_HOOK -#define RT_IDLE_HOOK_LIST_SIZE 4 -#define IDLE_THREAD_STACK_SIZE 512 -#define RT_USING_TIMER_SOFT -#define RT_TIMER_THREAD_PRIO 4 -#define RT_TIMER_THREAD_STACK_SIZE 512 - -/* kservice optimization */ - -#define RT_DEBUG - -/* Inter-Thread communication */ - -#define RT_USING_SEMAPHORE -#define RT_USING_MUTEX -#define RT_USING_EVENT -#define RT_USING_MAILBOX -#define RT_USING_MESSAGEQUEUE - -/* Memory Management */ - -#define RT_USING_MEMPOOL -#define RT_USING_SMALL_MEM -#define RT_USING_SMALL_MEM_AS_HEAP -#define RT_USING_HEAP - -/* Kernel Device Object */ - -#define RT_USING_DEVICE -#define RT_USING_CONSOLE -#define RT_CONSOLEBUF_SIZE 256 -#define RT_CONSOLE_DEVICE_NAME "uart0" -#define RT_VER_NUM 0x40101 -#define ARCH_ARM -#define ARCH_ARM_CORTEX_M -#define ARCH_ARM_CORTEX_M0 - -/* RT-Thread Components */ - -#define RT_USING_COMPONENTS_INIT -#define RT_USING_USER_MAIN -#define RT_MAIN_THREAD_STACK_SIZE 2048 -#define RT_MAIN_THREAD_PRIORITY 10 -#define RT_USING_MSH -#define RT_USING_FINSH -#define FINSH_USING_MSH -#define FINSH_THREAD_NAME "tshell" -#define FINSH_THREAD_PRIORITY 20 -#define FINSH_THREAD_STACK_SIZE 4096 -#define FINSH_USING_HISTORY -#define FINSH_HISTORY_LINES 5 -#define FINSH_USING_SYMTAB -#define FINSH_CMD_SIZE 80 -#define MSH_USING_BUILT_IN_COMMANDS -#define FINSH_USING_DESCRIPTION -#define FINSH_ARG_MAX 10 -#define RT_USING_DFS -#define DFS_USING_POSIX -#define DFS_USING_WORKDIR -#define DFS_FILESYSTEMS_MAX 2 -#define DFS_FILESYSTEM_TYPES_MAX 2 -#define DFS_FD_MAX 16 -#define RT_USING_DFS_DEVFS - -/* Device Drivers */ - -#define RT_USING_DEVICE_IPC -#define RT_USING_SERIAL -#define RT_USING_SERIAL_V1 -#define RT_SERIAL_USING_DMA -#define RT_SERIAL_RB_BUFSZ 64 -#define RT_USING_HWTIMER -#define RT_USING_PIN -#define RT_USING_ADC -#define RT_USING_PWM -#define RT_USING_PM -#define PM_TICKLESS_THRESHOLD_TIME 2 -#define RT_USING_RTC -#define RT_USING_WDT - -/* Using USB */ - -#define RT_USING_USB -#define RT_USING_USB_DEVICE -#define RT_USBD_THREAD_STACK_SZ 4096 -#define USB_VENDOR_ID 0x0FFE -#define USB_PRODUCT_ID 0x0001 -#define RT_USB_DEVICE_COMPOSITE -#define RT_USB_DEVICE_NONE -#define RT_USB_DEVICE_HID -#define RT_USB_DEVICE_HID_MOUSE - -/* C/C++ and POSIX layer */ - -#define RT_LIBC_DEFAULT_TIMEZONE 8 - -/* POSIX (Portable Operating System Interface) layer */ - - -/* Interprocess Communication (IPC) */ - - -/* Socket is in the 'Network' category */ - - -/* Network */ - - -/* Utilities */ - -#define RT_USING_UTEST -#define UTEST_THR_STACK_SIZE 4096 -#define UTEST_THR_PRIORITY 20 - -/* RT-Thread Utestcases */ - -#define RT_USING_UTESTCASES - -/* Utest Self Testcase */ - -#define UTEST_SELF_PASS_TC - -/* Kernel Testcase */ - -#define UTEST_SMALL_MEM_TC - -/* CPP11 Testcase */ - - -/* Utest Serial Testcase */ - - -/* RTT Posix Testcase */ - - -/* RT-Thread online packages */ - -/* IoT - internet of things */ - - -/* Wi-Fi */ - -/* Marvell WiFi */ - - -/* Wiced WiFi */ - - -/* IoT Cloud */ - - -/* security packages */ - - -/* language packages */ - -/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ - - -/* XML: Extensible Markup Language */ - - -/* multimedia packages */ - -/* LVGL: powerful and easy-to-use embedded GUI library */ - - -/* u8g2: a monochrome graphic library */ - - -/* PainterEngine: A cross-platform graphics application framework written in C language */ - - -/* tools packages */ - - -/* system packages */ - -/* enhanced kernel services */ - - -/* acceleration: Assembly language or algorithmic acceleration packages */ - - -/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ - - -/* Micrium: Micrium software products porting for RT-Thread */ - - -/* peripheral libraries and drivers */ - - -/* Kendryte SDK */ - - -/* AI packages */ - - -/* miscellaneous packages */ - -/* project laboratory */ - -/* samples: kernel and components samples */ - - -/* entertainment: terminal games and other interesting software packages */ - - -/* Privated Packages of RealThread */ - - -/* Network Utilities */ - - -/* RT-Thread Smart */ - - -/* Hardware Drivers Config */ - -/* On-chip Peripheral Drivers */ - -#define SOC_SERIES_M032 -#define BSP_USE_STDDRIVER_SOURCE -#define BSP_USING_PDMA -#define NU_PDMA_MEMFUN_ACTOR_MAX 4 -#define NU_PDMA_SGTBL_POOL_SIZE 16 -#define BSP_USING_GPIO -#define BSP_USING_CLK -#define NU_CLK_INVOKE_WKTMR -#define BSP_USING_RTC -#define NU_RTC_SUPPORT_IO_RW -#define NU_RTC_SUPPORT_MSH_CMD -#define BSP_USING_ADC -#define BSP_USING_ADC0 -#define BSP_USING_TMR -#define BSP_USING_TIMER -#define BSP_USING_TMR0 -#define BSP_USING_TIMER0 -#define BSP_USING_TMR1 -#define BSP_USING_TIMER1 -#define BSP_USING_TMR2 -#define BSP_USING_TIMER2 -#define BSP_USING_UART -#define BSP_USING_UART0 -#define BSP_USING_UART1 -#define BSP_USING_UART1_TX_DMA -#define BSP_USING_UART1_RX_DMA -#define BSP_USING_UART2 -#define BSP_USING_UART3 -#define BSP_USING_UART4 -#define BSP_USING_UART5 -#define BSP_USING_UART6 -#define BSP_USING_UART7 -#define BSP_USING_WDT -#define BSP_USING_USBD - -/* On-board Peripheral Drivers */ - -#define BSP_USING_NULINKME - -/* Board extended module drivers */ - - -/* Nuvoton Packages Config */ - -#define NU_PKG_USING_UTILS -#define NU_PKG_USING_DEMO - -#endif diff --git a/bsp/nuvoton/numaker-m2354/Nu_Link_Driver.ini b/bsp/nuvoton/numaker-m2354/Nu_Link_Driver.ini deleted file mode 100644 index aae0ad5cb6..0000000000 --- a/bsp/nuvoton/numaker-m2354/Nu_Link_Driver.ini +++ /dev/null @@ -1,1037 +0,0 @@ -[Version] -Nu_LinkVersion=V5.14 -[Process] -ProcessID=0x00009908 -ProcessCreationTime_L=0xda6c5f90 -ProcessCreationTime_H=0x01d74571 -NuLinkID=0x1800003c -NuLinkIDs_Count=0x00000001 -NuLinkID0=0x1800003c -[ChipSelect] -;ChipName= -ChipName=M2354 -[NUC505] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=NUC505_SPIFLASH.FLM -[NUC4xx] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=NUC400_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x014fb180 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[NUC2xx] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NUC200_AP_128.FLM -[NUC1311] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NUC1311_AP_64.FLM -[NUC126] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=NUC126_AP_256.FLM -[NUC121] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NUC121_AP_32.FLM -[NUC1xx] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NUC100_AP_128.FLM -[NUC029] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NUC029_AP_16.FLM -[NM1820] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NM1820_AP_17_5.FLM -[NM1810] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NM1810_AP_29_5.FLM -[NM1500] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NM1500_AP_128.FLM -[NM1330] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NM1330_AP_64.FLM -[NM1320] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NM1320_AP_32.FLM -[NM1240] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NM1240_AP_64.FLM -[NM1230] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NM1230_AP_64.FLM -[NM1200] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NM1200_AP_8.FLM -[NM1120] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NM1120_AP_29_5.FLM -[TF5100] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=TF5100_AP_64.FLM -[NDA102] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NDA102_AP_29_5.FLM -[Nano103] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=Nano103_AP_64.FLM -[Nano100] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=Nano100_AP_64.FLM -[N576] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=N576_AP_145.FLM -[N575] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=N575_AP_145.FLM -[N572] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=N572Fxxx.FLM -[N571] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=N571E000.FLM -[N570] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=N570_AP_64.FLM -[N569] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=N569_AP_64.FLM -[N512] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=N512_AP_64.FLM -[Mini57] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=Mini57_AP_29_5.FLM -[Mini51] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=Mini51_AP_16.FLM -[M481] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M481_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[M480LD] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M480LD_AP_256.FLM -[M479] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M479_AP_256.FLM -[M451] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M451_AP_256.FLM -[M471] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Bank=0 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M471_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[M251] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=M251_AP_192.FLM -[M2351] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M2351_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[M261] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M261_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[MR63] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=MR63_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[M2354] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Bank=0 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -CheckDPM=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M2354_AP_1M.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -DisableTimeoutDetect=0 -[M071] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=M071_AP_128.FLM -[M0564] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=M0564_AP_256.FLM -[M0519] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=M0519_AP_128.FLM -[M0518] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=M0518_AP_64.FLM -[M05x] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=M0516_AP_64.FLM -[M0A21] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=M0A21_AP_32.FLM -[M030G] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -DisableTimeoutDetect=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=M030G_AP_64.FLM -[M031] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Bank=0 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=M031_AP_128.FLM -[NPCX] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=NPCX_AP_512.FLM -[I96000] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=2 -Program=0 -Verify=0 -ResetAndRun=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x8000 -ProgramAlgorithm= -[I94000] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=I94000_AP_512.FLM -[ISD9300] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=ISD9300_AP_145.FLM -[I9200] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=I9200_AP_128.FLM -[ISD9xxx] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=ISD9100_AP_145.FLM -[ISD9000] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=ISD9000_AP_64.FLM -[AU9xxx] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=AU9100_AP_145.FLM -[Autodetect] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm= -[General] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm= diff --git a/bsp/nuvoton/numaker-m2354/applications/lvgl/lv_demo.c b/bsp/nuvoton/numaker-m2354/applications/lvgl/lv_demo.c index 7a04e1804a..ebfbba2273 100644 --- a/bsp/nuvoton/numaker-m2354/applications/lvgl/lv_demo.c +++ b/bsp/nuvoton/numaker-m2354/applications/lvgl/lv_demo.c @@ -17,16 +17,15 @@ void lv_user_gui_init(void) #if LV_USE_DEMO_BENCHMARK extern void lv_demo_benchmark(void); lv_demo_benchmark(); -#endif -#if LV_USE_DEMO_WIDGETS +#elif LV_USE_DEMO_WIDGETS extern void lv_demo_widgets(void); lv_demo_widgets(); -#endif -#if LV_USE_DEMO_MUSIC || LV_USE_DEMO_RTT_MUSIC +#elif (LV_USE_DEMO_MUSIC || LV_USE_DEMO_RTT_MUSIC) extern void lv_demo_music(void); lv_demo_music(); + #endif } diff --git a/bsp/nuvoton/numaker-m2354/applications/lvgl/lv_port_disp.c b/bsp/nuvoton/numaker-m2354/applications/lvgl/lv_port_disp.c index a86452c5d5..445c4993e1 100644 --- a/bsp/nuvoton/numaker-m2354/applications/lvgl/lv_port_disp.c +++ b/bsp/nuvoton/numaker-m2354/applications/lvgl/lv_port_disp.c @@ -16,6 +16,10 @@ #define DBG_COLOR #include +#if !defined(NU_PKG_LVGL_RENDERING_LAYER) + #define NU_PKG_LVGL_RENDERING_LAYER "lcd" +#endif + /*A static or global variable to store the buffers*/ static lv_disp_draw_buf_t disp_buf; static lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ @@ -47,7 +51,7 @@ void lv_port_disp_init(void) rt_err_t result; void *buf1 = RT_NULL; - lcd_device = rt_device_find("lcd"); + lcd_device = rt_device_find(NU_PKG_LVGL_RENDERING_LAYER); if (lcd_device == 0) { LOG_E("error!"); diff --git a/bsp/nuvoton/numaker-m2354/applications/lvgl/lv_port_disp.h b/bsp/nuvoton/numaker-m2354/applications/lvgl/lv_port_disp.h deleted file mode 100644 index b11ce3c5b6..0000000000 --- a/bsp/nuvoton/numaker-m2354/applications/lvgl/lv_port_disp.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2021-10-18 Meco Man The first version - */ -#ifndef LV_PORT_DISP_H -#define LV_PORT_DISP_H - -#ifdef __cplusplus -extern "C" { -#endif - -void lv_port_disp_init(void); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/bsp/nuvoton/numaker-m2354/applications/lvgl/lv_port_indev.h b/bsp/nuvoton/numaker-m2354/applications/lvgl/lv_port_indev.h deleted file mode 100644 index bde7176807..0000000000 --- a/bsp/nuvoton/numaker-m2354/applications/lvgl/lv_port_indev.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2021-10-18 Meco Man The first version - */ -#ifndef LV_PORT_INDEV_H -#define LV_PORT_INDEV_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -extern lv_indev_t *button_indev; - -void lv_port_indev_init(void); -void lv_port_indev_input(rt_int16_t x, rt_int16_t y, lv_indev_state_t state); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/bsp/nuvoton/numaker-m2354/project.uvprojx b/bsp/nuvoton/numaker-m2354/project.uvprojx deleted file mode 100644 index a60d2e3ce7..0000000000 --- a/bsp/nuvoton/numaker-m2354/project.uvprojx +++ /dev/null @@ -1,2344 +0,0 @@ - - - 2.1 -
### uVision Project, (C) Keil Software
- - - rtthread-m2354 - 0x4 - ARM-ADS - 6100001::V6.10.1::.\ARMCLANG - 1 - - - M2354KJFAE - Nuvoton - Nuvoton.NuMicro_DFP.1.3.10 - http://www.nuvoton.com/hq/enu/Documents/KEILSoftwarePack - IRAM(0x20000000,0x40000) IROM(0x00000000,0x100000) CPUTYPE("Cortex-M23") TZ CLOCK(12000000) ESEL ELITTLE - - - UL2V8M(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0M2354_AP_1M -FS00 -FL0100000 -FP0($$Device:M2354KJFAE$Flash\M2354_AP_1M.FLM)) - 0 - $$Device:M2354KJFAE$Device\M2354\Include\M2354.h - - - - - - - - - - $$Device:M2354KJFAE$SVD\Nuvoton\M2354.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\build\keil5\ - rtthread - 1 - 0 - 1 - 1 - 1 - .\build\keil5\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 1 - fromelf --bin ".\build\keil5\\@L.axf" --output ".\build\keil5\\@L.bin" - fromelf --text -c ".\build\keil5\\@L.axf" --output ".\build\keil5\\@L.txt" - 0 - 0 - 0 - 0 - - 1 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - - - - - SARMV8M.DLL - -MPU - TCM.DLL - -pCM23 - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4101 - - 1 - BIN\UL2V8M.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M23" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 8 - 0 - 1 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x40000 - - - 1 - 0x0 - 0x100000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x100000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x40000 - - - 0 - 0x0 - 0x0 - - - - - - 1 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 0 - 5 - 3 - 0 - 0 - 0 - 1 - 0 - - - RT_USING_LIBC, __RTTHREAD__, __STDC_LIMIT_MACROS, RT_USING_ARM_LIBC, __CLK_TCK=RT_TICK_PER_SECOND - - applications;.;..\..\..\components\net\at\include;..\..\..\components\net\at\at_socket;packages\at_device-latest\inc;packages\at_device-latest\class\esp8266;board;board\NuClockConfig;board\NuPinConfig;..\libraries\m2354\CMSIS\Include;..\..\..\components\libc\compilers\common\include;..\..\..\components\libc\compilers\common\extension;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m23;..\..\..\components\drivers\audio;..\..\..\components\drivers\include;..\..\..\components\drivers\hwcrypto;.;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\spi;..\..\..\components\drivers\include;..\..\..\components\drivers\spi\sfud\inc;..\..\..\components\drivers\include;..\libraries\m2354\Device\Nuvoton\M2354\Include;..\libraries\m2354\rtt_port;..\..\..\components\fal\inc;..\..\..\components\dfs\include;..\..\..\components\dfs\filesystems\devfs;..\..\..\components\dfs\filesystems\elmfat;..\..\..\components\finsh;.;..\..\..\include;..\libraries\m2354\StdDriver\inc;..\libraries\m2354\USBHostLib\inc;..\libraries\nu_packages\Demo;..\libraries\nu_packages\SLCD;..\libraries\nu_packages\TPC;..\libraries\nu_packages\NuUtils\inc;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\posix\io\stdio;..\..\..\components\libc\posix\ipc;..\..\..\components\drivers\usb\usbdevice;..\..\..\components\drivers\usb\usbhost;..\..\..\components\drivers\usb\usbhost\class;..\..\..\components\drivers\usb\usbhost\core;..\..\..\components\drivers\usb\usbhost\include;..\..\..\components\drivers\include;..\..\..\components\net\netdev\include;..\..\..\components\net\sal\include;..\..\..\components\net\sal\include\socket;..\..\..\components\net\sal\impl;..\..\..\components\net\sal\include\dfs_net;..\..\..\components\net\sal\include\socket\sys_socket;..\..\..\components\drivers\sensors;..\..\..\components\drivers\include;..\..\..\components\utilities\utest - - - - 1 - 0 - 0 - 1 - 0 - 0 - 1 - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\linking_scripts\m2354_flash.sct - - - - - - - - - - - Applications - - - main.c - 1 - applications\main.c - - - - - mnt.c - 1 - applications\mnt.c - - - - - AT - - - at_socket.c - 1 - ..\..\..\components\net\at\at_socket\at_socket.c - - - - - at_cli.c - 1 - ..\..\..\components\net\at\src\at_cli.c - - - - - at_utils.c - 1 - ..\..\..\components\net\at\src\at_utils.c - - - - - at_client.c - 1 - ..\..\..\components\net\at\src\at_client.c - - - - - at_device - - - at_device_esp8266.c - 1 - packages\at_device-latest\class\esp8266\at_device_esp8266.c - - - - - at_device.c - 1 - packages\at_device-latest\src\at_device.c - - - - - at_socket_esp8266.c - 1 - packages\at_device-latest\class\esp8266\at_socket_esp8266.c - - - - - board - - - nutool_pincfg.c - 1 - board\NuPinConfig\nutool_pincfg.c - - - - - board_dev.c - 1 - board\board_dev.c - - - - - nutool_modclkcfg.c - 1 - board\NuClockConfig\nutool_modclkcfg.c - - - - - Compiler - - - syscall_mem.c - 1 - ..\..\..\components\libc\compilers\armlibc\syscall_mem.c - - - - - syscalls.c - 1 - ..\..\..\components\libc\compilers\armlibc\syscalls.c - - - - - cctype.c - 1 - ..\..\..\components\libc\compilers\common\cctype.c - - - - - cstdio.c - 1 - ..\..\..\components\libc\compilers\common\cstdio.c - - - - - cstdlib.c - 1 - ..\..\..\components\libc\compilers\common\cstdlib.c - - - - - cstring.c - 1 - ..\..\..\components\libc\compilers\common\cstring.c - - - - - ctime.c - 1 - ..\..\..\components\libc\compilers\common\ctime.c - - - - - cwchar.c - 1 - ..\..\..\components\libc\compilers\common\cwchar.c - - - - - CPU - - - backtrace.c - 1 - ..\..\..\libcpu\arm\common\backtrace.c - - - - - div0.c - 1 - ..\..\..\libcpu\arm\common\div0.c - - - - - showmem.c - 1 - ..\..\..\libcpu\arm\common\showmem.c - - - - - context_rvds.S - 2 - ..\..\..\libcpu\arm\cortex-m23\context_rvds.S - - - - - cpuport.c - 1 - ..\..\..\libcpu\arm\cortex-m23\cpuport.c - - - - - DeviceDrivers - - - audio.c - 1 - ..\..\..\components\drivers\audio\audio.c - - - - - -std=c99 - - - - - - - - - - - - audio_pipe.c - 1 - ..\..\..\components\drivers\audio\audio_pipe.c - - - - - -std=c99 - - - - - - - - - - - - can.c - 1 - ..\..\..\components\drivers\can\can.c - - - - - -std=c99 - - - - - - - - - - - - hw_crc.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_crc.c - - - - - -std=c99 - - - - - - - - - - - - hw_hash.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_hash.c - - - - - -std=c99 - - - - - - - - - - - - hw_rng.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_rng.c - - - - - -std=c99 - - - - - - - - - - - - hw_symmetric.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_symmetric.c - - - - - -std=c99 - - - - - - - - - - - - hwcrypto.c - 1 - ..\..\..\components\drivers\hwcrypto\hwcrypto.c - - - - - -std=c99 - - - - - - - - - - - - hwtimer.c - 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c - - - - - -std=c99 - - - - - - - - - - - - i2c-bit-ops.c - 1 - ..\..\..\components\drivers\i2c\i2c-bit-ops.c - - - - - -std=c99 - - - - - - - - - - - - i2c_core.c - 1 - ..\..\..\components\drivers\i2c\i2c_core.c - - - - - -std=c99 - - - - - - - - - - - - i2c_dev.c - 1 - ..\..\..\components\drivers\i2c\i2c_dev.c - - - - - -std=c99 - - - - - - - - - - - - completion.c - 1 - ..\..\..\components\drivers\ipc\completion.c - - - - - -std=c99 - - - - - - - - - - - - dataqueue.c - 1 - ..\..\..\components\drivers\ipc\dataqueue.c - - - - - -std=c99 - - - - - - - - - - - - pipe.c - 1 - ..\..\..\components\drivers\ipc\pipe.c - - - - - -std=c99 - - - - - - - - - - - - ringblk_buf.c - 1 - ..\..\..\components\drivers\ipc\ringblk_buf.c - - - - - -std=c99 - - - - - - - - - - - - ringbuffer.c - 1 - ..\..\..\components\drivers\ipc\ringbuffer.c - - - - - -std=c99 - - - - - - - - - - - - waitqueue.c - 1 - ..\..\..\components\drivers\ipc\waitqueue.c - - - - - -std=c99 - - - - - - - - - - - - workqueue.c - 1 - ..\..\..\components\drivers\ipc\workqueue.c - - - - - -std=c99 - - - - - - - - - - - - adc.c - 1 - ..\..\..\components\drivers\misc\adc.c - - - - - -std=c99 - - - - - - - - - - - - pin.c - 1 - ..\..\..\components\drivers\misc\pin.c - - - - - -std=c99 - - - - - - - - - - - - rt_drv_pwm.c - 1 - ..\..\..\components\drivers\misc\rt_drv_pwm.c - - - - - -std=c99 - - - - - - - - - - - - lptimer.c - 1 - ..\..\..\components\drivers\pm\lptimer.c - - - - - -std=c99 - - - - - - - - - - - - pm.c - 1 - ..\..\..\components\drivers\pm\pm.c - - - - - -std=c99 - - - - - - - - - - - - rtc.c - 1 - ..\..\..\components\drivers\rtc\rtc.c - - - - - -std=c99 - - - - - - - - - - - - block_dev.c - 1 - ..\..\..\components\drivers\sdio\block_dev.c - - - - - -std=c99 - - - - - - - - - - - - mmc.c - 1 - ..\..\..\components\drivers\sdio\mmc.c - - - - - -std=c99 - - - - - - - - - - - - mmcsd_core.c - 1 - ..\..\..\components\drivers\sdio\mmcsd_core.c - - - - - -std=c99 - - - - - - - - - - - - sd.c - 1 - ..\..\..\components\drivers\sdio\sd.c - - - - - -std=c99 - - - - - - - - - - - - sdio.c - 1 - ..\..\..\components\drivers\sdio\sdio.c - - - - - -std=c99 - - - - - - - - - - - - serial.c - 1 - ..\..\..\components\drivers\serial\serial.c - - - - - -std=c99 - - - - - - - - - - - - qspi_core.c - 1 - ..\..\..\components\drivers\spi\qspi_core.c - - - - - -std=c99 - - - - - - - - - - - - sfud.c - 1 - ..\..\..\components\drivers\spi\sfud\src\sfud.c - - - - - -std=c99 - - - - - - - - - - - - sfud_sfdp.c - 1 - ..\..\..\components\drivers\spi\sfud\src\sfud_sfdp.c - - - - - -std=c99 - - - - - - - - - - - - spi_core.c - 1 - ..\..\..\components\drivers\spi\spi_core.c - - - - - -std=c99 - - - - - - - - - - - - spi_dev.c - 1 - ..\..\..\components\drivers\spi\spi_dev.c - - - - - -std=c99 - - - - - - - - - - - - spi_flash_sfud.c - 1 - ..\..\..\components\drivers\spi\spi_flash_sfud.c - - - - - -std=c99 - - - - - - - - - - - - watchdog.c - 1 - ..\..\..\components\drivers\watchdog\watchdog.c - - - - - -std=c99 - - - - - - - - - - - - Drivers - - - startup_M2354.s - 2 - ..\libraries\m2354\Device\Nuvoton\M2354\Source\ARM\startup_M2354.s - - - - - system_M2354.c - 1 - ..\libraries\m2354\Device\Nuvoton\M2354\Source\system_M2354.c - - - - - drv_bpwm.c - 1 - ..\libraries\m2354\rtt_port\drv_bpwm.c - - - - - drv_bpwm_capture.c - 1 - ..\libraries\m2354\rtt_port\drv_bpwm_capture.c - - - - - drv_can.c - 1 - ..\libraries\m2354\rtt_port\drv_can.c - - - - - drv_clk.c - 1 - ..\libraries\m2354\rtt_port\drv_clk.c - - - - - drv_common.c - 1 - ..\libraries\m2354\rtt_port\drv_common.c - - - - - drv_crc.c - 1 - ..\libraries\m2354\rtt_port\drv_crc.c - - - - - drv_crypto.c - 1 - ..\libraries\m2354\rtt_port\drv_crypto.c - - - - - drv_eadc.c - 1 - ..\libraries\m2354\rtt_port\drv_eadc.c - - - - - drv_ebi.c - 1 - ..\libraries\m2354\rtt_port\drv_ebi.c - - - - - drv_ecap.c - 1 - ..\libraries\m2354\rtt_port\drv_ecap.c - - - - - drv_epwm.c - 1 - ..\libraries\m2354\rtt_port\drv_epwm.c - - - - - drv_epwm_capture.c - 1 - ..\libraries\m2354\rtt_port\drv_epwm_capture.c - - - - - drv_fmc.c - 1 - ..\libraries\m2354\rtt_port\drv_fmc.c - - - - - drv_gpio.c - 1 - ..\libraries\m2354\rtt_port\drv_gpio.c - - - - - drv_i2c.c - 1 - ..\libraries\m2354\rtt_port\drv_i2c.c - - - - - drv_i2s.c - 1 - ..\libraries\m2354\rtt_port\drv_i2s.c - - - - - drv_otg.c - 1 - ..\libraries\m2354\rtt_port\drv_otg.c - - - - - drv_pdma.c - 1 - ..\libraries\m2354\rtt_port\drv_pdma.c - - - - - drv_qei.c - 1 - ..\libraries\m2354\rtt_port\drv_qei.c - - - - - drv_qspi.c - 1 - ..\libraries\m2354\rtt_port\drv_qspi.c - - - - - drv_rtc.c - 1 - ..\libraries\m2354\rtt_port\drv_rtc.c - - - - - drv_scuart.c - 1 - ..\libraries\m2354\rtt_port\drv_scuart.c - - - - - drv_sdh.c - 1 - ..\libraries\m2354\rtt_port\drv_sdh.c - - - - - drv_sdio.c - 1 - ..\libraries\m2354\rtt_port\drv_sdio.c - - - - - drv_slcd.c - 1 - ..\libraries\m2354\rtt_port\drv_slcd.c - - - - - drv_softi2c.c - 1 - ..\libraries\m2354\rtt_port\drv_softi2c.c - - - - - drv_spi.c - 1 - ..\libraries\m2354\rtt_port\drv_spi.c - - - - - drv_spii2s.c - 1 - ..\libraries\m2354\rtt_port\drv_spii2s.c - - - - - drv_timer.c - 1 - ..\libraries\m2354\rtt_port\drv_timer.c - - - - - drv_timer_capture.c - 1 - ..\libraries\m2354\rtt_port\drv_timer_capture.c - - - - - drv_tpwm.c - 1 - ..\libraries\m2354\rtt_port\drv_tpwm.c - - - - - drv_trng.c - 1 - ..\libraries\m2354\rtt_port\drv_trng.c - - - - - drv_uart.c - 1 - ..\libraries\m2354\rtt_port\drv_uart.c - - - - - drv_ui2c.c - 1 - ..\libraries\m2354\rtt_port\drv_ui2c.c - - - - - drv_usbd.c - 1 - ..\libraries\m2354\rtt_port\drv_usbd.c - - - - - drv_usbhost.c - 1 - ..\libraries\m2354\rtt_port\drv_usbhost.c - - - - - drv_uspi.c - 1 - ..\libraries\m2354\rtt_port\drv_uspi.c - - - - - drv_uuart.c - 1 - ..\libraries\m2354\rtt_port\drv_uuart.c - - - - - drv_wdt.c - 1 - ..\libraries\m2354\rtt_port\drv_wdt.c - - - - - Fal - - - fal_flash.c - 1 - ..\..\..\components\fal\src\fal_flash.c - - - - - fal_partition.c - 1 - ..\..\..\components\fal\src\fal_partition.c - - - - - fal.c - 1 - ..\..\..\components\fal\src\fal.c - - - - - fal_rtt.c - 1 - ..\..\..\components\fal\src\fal_rtt.c - - - - - Filesystem - - - devfs.c - 1 - ..\..\..\components\dfs\filesystems\devfs\devfs.c - - - - - dfs_elm.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\dfs_elm.c - - - - - ff.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\ff.c - - - - - ffunicode.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\ffunicode.c - - - - - dfs.c - 1 - ..\..\..\components\dfs\src\dfs.c - - - - - dfs_file.c - 1 - ..\..\..\components\dfs\src\dfs_file.c - - - - - dfs_fs.c - 1 - ..\..\..\components\dfs\src\dfs_fs.c - - - - - dfs_posix.c - 1 - ..\..\..\components\dfs\src\dfs_posix.c - - - - - Finsh - - - shell.c - 1 - ..\..\..\components\finsh\shell.c - - - - - msh.c - 1 - ..\..\..\components\finsh\msh.c - - - - - msh_parse.c - 1 - ..\..\..\components\finsh\msh_parse.c - - - - - cmd.c - 1 - ..\..\..\components\finsh\cmd.c - - - - - msh_file.c - 1 - ..\..\..\components\finsh\msh_file.c - - - - - Kernel - - - clock.c - 1 - ..\..\..\src\clock.c - - - - - components.c - 1 - ..\..\..\src\components.c - - - - - device.c - 1 - ..\..\..\src\device.c - - - - - idle.c - 1 - ..\..\..\src\idle.c - - - - - ipc.c - 1 - ..\..\..\src\ipc.c - - - - - irq.c - 1 - ..\..\..\src\irq.c - - - - - kservice.c - 1 - ..\..\..\src\kservice.c - - - - - mem.c - 1 - ..\..\..\src\mem.c - - - - - mempool.c - 1 - ..\..\..\src\mempool.c - - - - - object.c - 1 - ..\..\..\src\object.c - - - - - scheduler.c - 1 - ..\..\..\src\scheduler.c - - - - - signal.c - 1 - ..\..\..\src\signal.c - - - - - thread.c - 1 - ..\..\..\src\thread.c - - - - - timer.c - 1 - ..\..\..\src\timer.c - - - - - Libraries - - - nu_uart.c - 1 - ..\libraries\m2354\StdDriver\src\nu_uart.c - - - - - nu_keystore.c - 1 - ..\libraries\m2354\StdDriver\src\nu_keystore.c - - - - - nu_fmc.c - 1 - ..\libraries\m2354\StdDriver\src\nu_fmc.c - - - - - nu_timer.c - 1 - ..\libraries\m2354\StdDriver\src\nu_timer.c - - - - - nu_dac.c - 1 - ..\libraries\m2354\StdDriver\src\nu_dac.c - - - - - nu_scuart.c - 1 - ..\libraries\m2354\StdDriver\src\nu_scuart.c - - - - - nu_usci_i2c.c - 1 - ..\libraries\m2354\StdDriver\src\nu_usci_i2c.c - - - - - nu_usci_spi.c - 1 - ..\libraries\m2354\StdDriver\src\nu_usci_spi.c - - - - - nu_fvc.c - 1 - ..\libraries\m2354\StdDriver\src\nu_fvc.c - - - - - nu_qei.c - 1 - ..\libraries\m2354\StdDriver\src\nu_qei.c - - - - - nu_sdh.c - 1 - ..\libraries\m2354\StdDriver\src\nu_sdh.c - - - - - nu_usci_uart.c - 1 - ..\libraries\m2354\StdDriver\src\nu_usci_uart.c - - - - - nu_usbd.c - 1 - ..\libraries\m2354\StdDriver\src\nu_usbd.c - - - - - nu_spi.c - 1 - ..\libraries\m2354\StdDriver\src\nu_spi.c - - - - - nu_lcd.c - 1 - ..\libraries\m2354\StdDriver\src\nu_lcd.c - - - - - nu_eadc.c - 1 - ..\libraries\m2354\StdDriver\src\nu_eadc.c - - - - - nu_timer_pwm.c - 1 - ..\libraries\m2354\StdDriver\src\nu_timer_pwm.c - - - - - nu_bpwm.c - 1 - ..\libraries\m2354\StdDriver\src\nu_bpwm.c - - - - - nu_i2c.c - 1 - ..\libraries\m2354\StdDriver\src\nu_i2c.c - - - - - nu_wdt.c - 1 - ..\libraries\m2354\StdDriver\src\nu_wdt.c - - - - - nu_ecap.c - 1 - ..\libraries\m2354\StdDriver\src\nu_ecap.c - - - - - nu_qspi.c - 1 - ..\libraries\m2354\StdDriver\src\nu_qspi.c - - - - - nu_rtc.c - 1 - ..\libraries\m2354\StdDriver\src\nu_rtc.c - - - - - nu_sys.c - 1 - ..\libraries\m2354\StdDriver\src\nu_sys.c - - - - - nu_acmp.c - 1 - ..\libraries\m2354\StdDriver\src\nu_acmp.c - - - - - nu_crc.c - 1 - ..\libraries\m2354\StdDriver\src\nu_crc.c - - - - - nu_clk.c - 1 - ..\libraries\m2354\StdDriver\src\nu_clk.c - - - - - nu_gpio.c - 1 - ..\libraries\m2354\StdDriver\src\nu_gpio.c - - - - - nu_trng.c - 1 - ..\libraries\m2354\StdDriver\src\nu_trng.c - - - - - nu_ewdt.c - 1 - ..\libraries\m2354\StdDriver\src\nu_ewdt.c - - - - - nu_wwdt.c - 1 - ..\libraries\m2354\StdDriver\src\nu_wwdt.c - - - - - nu_i2s.c - 1 - ..\libraries\m2354\StdDriver\src\nu_i2s.c - - - - - nu_can.c - 1 - ..\libraries\m2354\StdDriver\src\nu_can.c - - - - - nu_dpm.c - 1 - ..\libraries\m2354\StdDriver\src\nu_dpm.c - - - - - nu_sc.c - 1 - ..\libraries\m2354\StdDriver\src\nu_sc.c - - - - - nu_tamper.c - 1 - ..\libraries\m2354\StdDriver\src\nu_tamper.c - - - - - nu_ewwdt.c - 1 - ..\libraries\m2354\StdDriver\src\nu_ewwdt.c - - - - - nu_rng.c - 1 - ..\libraries\m2354\StdDriver\src\nu_rng.c - - - - - nu_pdma.c - 1 - ..\libraries\m2354\StdDriver\src\nu_pdma.c - - - - - nu_epwm.c - 1 - ..\libraries\m2354\StdDriver\src\nu_epwm.c - - - - - nu_crypto.c - 1 - ..\libraries\m2354\StdDriver\src\nu_crypto.c - - - - - nu_ebi.c - 1 - ..\libraries\m2354\StdDriver\src\nu_ebi.c - - - - - m2354_usbhostlib - - - usb_core.c - 1 - ..\libraries\m2354\USBHostLib\src\usb_core.c - - - - - ohci.c - 1 - ..\libraries\m2354\USBHostLib\src\ohci.c - - - - - mem_alloc.c - 1 - ..\libraries\m2354\USBHostLib\src\mem_alloc.c - - - - - nu_pkgs_demo - - - usbd_cdc_vcom_echo.c - 1 - ..\libraries\nu_packages\Demo\usbd_cdc_vcom_echo.c - - - - - slcd_show_tick.c - 1 - ..\libraries\nu_packages\Demo\slcd_show_tick.c - - - - - usbd_hid_dance_mouse.c - 1 - ..\libraries\nu_packages\Demo\usbd_hid_dance_mouse.c - - - - - nu_pkgs_slcd - - - slcd_rhe6616tp01.c - 1 - ..\libraries\nu_packages\SLCD\slcd_rhe6616tp01.c - - - - - POSIX - - - poll.c - 1 - ..\..\..\components\libc\posix\io\poll\poll.c - - - - - select.c - 1 - ..\..\..\components\libc\posix\io\poll\select.c - - - - - rt_usbd - - - hid.c - 1 - ..\..\..\components\drivers\usb\usbdevice\class\hid.c - - - - - usbdevice_core.c - 1 - ..\..\..\components\drivers\usb\usbdevice\core\usbdevice_core.c - - - - - usbdevice.c - 1 - ..\..\..\components\drivers\usb\usbdevice\core\usbdevice.c - - - - - rt_usbh - - - mass.c - 1 - ..\..\..\components\drivers\usb\usbhost\class\mass.c - - - - - hub.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\hub.c - - - - - usbhost.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\usbhost.c - - - - - udisk.c - 1 - ..\..\..\components\drivers\usb\usbhost\class\udisk.c - - - - - usbhost_core.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\usbhost_core.c - - - - - driver.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\driver.c - - - - - SAL - - - netdev.c - 1 - ..\..\..\components\net\netdev\src\netdev.c - - - - - netdev_ipaddr.c - 1 - ..\..\..\components\net\netdev\src\netdev_ipaddr.c - - - - - dfs_net.c - 1 - ..\..\..\components\net\sal\dfs_net\dfs_net.c - - - - - af_inet_at.c - 1 - ..\..\..\components\net\sal\impl\af_inet_at.c - - - - - net_netdb.c - 1 - ..\..\..\components\net\sal\socket\net_netdb.c - - - - - net_sockets.c - 1 - ..\..\..\components\net\sal\socket\net_sockets.c - - - - - sal_socket.c - 1 - ..\..\..\components\net\sal\src\sal_socket.c - - - - - Sensors - - - sensor_cmd.c - 1 - ..\..\..\components\drivers\sensors\sensor_cmd.c - - - - - sensor.c - 1 - ..\..\..\components\drivers\sensors\sensor.c - - - - - UTest - - - utest.c - 1 - ..\..\..\components\utilities\utest\utest.c - - - - - - - - - - - -
diff --git a/bsp/nuvoton/numaker-m2354/rtconfig.h b/bsp/nuvoton/numaker-m2354/rtconfig.h deleted file mode 100644 index e58abe51d0..0000000000 --- a/bsp/nuvoton/numaker-m2354/rtconfig.h +++ /dev/null @@ -1,381 +0,0 @@ -#ifndef RT_CONFIG_H__ -#define RT_CONFIG_H__ - -/* Automatically generated file; DO NOT EDIT. */ -/* RT-Thread Configuration */ - -/* RT-Thread Kernel */ - -#define RT_NAME_MAX 8 -#define RT_ALIGN_SIZE 4 -#define RT_THREAD_PRIORITY_32 -#define RT_THREAD_PRIORITY_MAX 32 -#define RT_TICK_PER_SECOND 1000 -#define RT_USING_OVERFLOW_CHECK -#define RT_USING_HOOK -#define RT_HOOK_USING_FUNC_PTR -#define RT_USING_IDLE_HOOK -#define RT_IDLE_HOOK_LIST_SIZE 4 -#define IDLE_THREAD_STACK_SIZE 2048 - -/* kservice optimization */ - -#define RT_DEBUG -#define RT_DEBUG_COLOR - -/* Inter-Thread communication */ - -#define RT_USING_SEMAPHORE -#define RT_USING_MUTEX -#define RT_USING_EVENT -#define RT_USING_MAILBOX -#define RT_USING_MESSAGEQUEUE -#define RT_USING_SIGNALS - -/* Memory Management */ - -#define RT_USING_MEMPOOL -#define RT_USING_SMALL_MEM -#define RT_USING_SMALL_MEM_AS_HEAP -#define RT_USING_HEAP - -/* Kernel Device Object */ - -#define RT_USING_DEVICE -#define RT_USING_CONSOLE -#define RT_CONSOLEBUF_SIZE 256 -#define RT_CONSOLE_DEVICE_NAME "uart0" -#define RT_VER_NUM 0x40101 - -/* RT-Thread Components */ - -#define RT_USING_COMPONENTS_INIT -#define RT_USING_USER_MAIN -#define RT_MAIN_THREAD_STACK_SIZE 2048 -#define RT_MAIN_THREAD_PRIORITY 10 -#define RT_USING_MSH -#define RT_USING_FINSH -#define FINSH_USING_MSH -#define FINSH_THREAD_NAME "tshell" -#define FINSH_THREAD_PRIORITY 20 -#define FINSH_THREAD_STACK_SIZE 4096 -#define FINSH_USING_HISTORY -#define FINSH_HISTORY_LINES 5 -#define FINSH_USING_SYMTAB -#define FINSH_CMD_SIZE 80 -#define MSH_USING_BUILT_IN_COMMANDS -#define FINSH_USING_DESCRIPTION -#define FINSH_ARG_MAX 10 -#define RT_USING_DFS -#define DFS_USING_POSIX -#define DFS_USING_WORKDIR -#define DFS_FILESYSTEMS_MAX 4 -#define DFS_FILESYSTEM_TYPES_MAX 4 -#define DFS_FD_MAX 32 -#define RT_USING_DFS_MNTTABLE -#define RT_USING_DFS_ELMFAT - -/* elm-chan's FatFs, Generic FAT Filesystem Module */ - -#define RT_DFS_ELM_CODE_PAGE 437 -#define RT_DFS_ELM_WORD_ACCESS -#define RT_DFS_ELM_USE_LFN_3 -#define RT_DFS_ELM_USE_LFN 3 -#define RT_DFS_ELM_LFN_UNICODE_0 -#define RT_DFS_ELM_LFN_UNICODE 0 -#define RT_DFS_ELM_MAX_LFN 255 -#define RT_DFS_ELM_DRIVES 2 -#define RT_DFS_ELM_MAX_SECTOR_SIZE 4096 -#define RT_DFS_ELM_REENTRANT -#define RT_DFS_ELM_MUTEX_TIMEOUT 3000 -#define RT_USING_DFS_DEVFS -#define RT_USING_FAL -#define FAL_DEBUG_CONFIG -#define FAL_DEBUG 1 -#define FAL_PART_HAS_TABLE_CFG - -/* Device Drivers */ - -#define RT_USING_DEVICE_IPC -#define RT_USING_SYSTEM_WORKQUEUE -#define RT_SYSTEM_WORKQUEUE_STACKSIZE 2048 -#define RT_SYSTEM_WORKQUEUE_PRIORITY 23 -#define RT_USING_SERIAL -#define RT_USING_SERIAL_V1 -#define RT_SERIAL_USING_DMA -#define RT_SERIAL_RB_BUFSZ 2048 -#define RT_USING_CAN -#define RT_USING_HWTIMER -#define RT_USING_I2C -#define RT_USING_I2C_BITOPS -#define RT_USING_PIN -#define RT_USING_ADC -#define RT_USING_PWM -#define RT_USING_PM -#define PM_TICKLESS_THRESHOLD_TIME 2 -#define RT_USING_RTC -#define RT_USING_SDIO -#define RT_SDIO_STACK_SIZE 2048 -#define RT_SDIO_THREAD_PRIORITY 15 -#define RT_MMCSD_STACK_SIZE 2048 -#define RT_MMCSD_THREAD_PREORITY 22 -#define RT_MMCSD_MAX_PARTITION 16 -#define RT_SDIO_DEBUG -#define RT_USING_SPI -#define RT_USING_QSPI -#define RT_USING_SFUD -#define RT_SFUD_USING_SFDP -#define RT_SFUD_USING_FLASH_INFO_TABLE -#define RT_SFUD_USING_QSPI -#define RT_SFUD_SPI_MAX_HZ 50000000 -#define RT_DEBUG_SFUD -#define RT_USING_WDT -#define RT_USING_AUDIO -#define RT_AUDIO_REPLAY_MP_BLOCK_SIZE 4096 -#define RT_AUDIO_REPLAY_MP_BLOCK_COUNT 2 -#define RT_AUDIO_RECORD_PIPE_SIZE 2048 -#define RT_USING_SENSOR -#define RT_USING_SENSOR_CMD -#define RT_USING_HWCRYPTO -#define RT_HWCRYPTO_DEFAULT_NAME "hwcryto" -#define RT_HWCRYPTO_IV_MAX_SIZE 16 -#define RT_HWCRYPTO_KEYBIT_MAX_SIZE 256 -#define RT_HWCRYPTO_USING_AES -#define RT_HWCRYPTO_USING_AES_ECB -#define RT_HWCRYPTO_USING_AES_CBC -#define RT_HWCRYPTO_USING_AES_CFB -#define RT_HWCRYPTO_USING_AES_CTR -#define RT_HWCRYPTO_USING_AES_OFB -#define RT_HWCRYPTO_USING_DES -#define RT_HWCRYPTO_USING_DES_ECB -#define RT_HWCRYPTO_USING_DES_CBC -#define RT_HWCRYPTO_USING_3DES -#define RT_HWCRYPTO_USING_3DES_ECB -#define RT_HWCRYPTO_USING_3DES_CBC -#define RT_HWCRYPTO_USING_SHA1 -#define RT_HWCRYPTO_USING_SHA2 -#define RT_HWCRYPTO_USING_SHA2_224 -#define RT_HWCRYPTO_USING_SHA2_256 -#define RT_HWCRYPTO_USING_SHA2_384 -#define RT_HWCRYPTO_USING_SHA2_512 -#define RT_HWCRYPTO_USING_RNG -#define RT_HWCRYPTO_USING_CRC -#define RT_HWCRYPTO_USING_CRC_07 -#define RT_HWCRYPTO_USING_CRC_8005 -#define RT_HWCRYPTO_USING_CRC_1021 -#define RT_HWCRYPTO_USING_CRC_04C11DB7 - -/* Using USB */ - -#define RT_USING_USB -#define RT_USING_USB_HOST -#define RT_USBH_MSTORAGE -#define UDISK_MOUNTPOINT "/" -#define RT_USING_USB_DEVICE -#define RT_USBD_THREAD_STACK_SZ 4096 -#define USB_VENDOR_ID 0x0FFE -#define USB_PRODUCT_ID 0x0001 -#define _RT_USB_DEVICE_HID -#define RT_USB_DEVICE_HID -#define RT_USB_DEVICE_HID_MOUSE - -/* C/C++ and POSIX layer */ - -#define RT_LIBC_DEFAULT_TIMEZONE 8 - -/* POSIX (Portable Operating System Interface) layer */ - -#define RT_USING_POSIX_FS -#define RT_USING_POSIX_DEVIO -#define RT_USING_POSIX_POLL -#define RT_USING_POSIX_SELECT - -/* Interprocess Communication (IPC) */ - - -/* Socket is in the 'Network' category */ - - -/* Network */ - -#define RT_USING_SAL -#define SAL_INTERNET_CHECK - -/* Docking with protocol stacks */ - -#define SAL_USING_AT -#define SAL_USING_POSIX -#define RT_USING_NETDEV -#define NETDEV_USING_IFCONFIG -#define NETDEV_USING_PING -#define NETDEV_USING_NETSTAT -#define NETDEV_USING_AUTO_DEFAULT -#define NETDEV_IPV4 1 -#define NETDEV_IPV6 0 -#define RT_USING_AT -#define AT_USING_CLIENT -#define AT_CLIENT_NUM_MAX 1 -#define AT_USING_SOCKET -#define AT_USING_CLI -#define AT_CMD_MAX_LEN 2048 -#define AT_SW_VERSION_NUM 0x10301 - -/* Utilities */ - -#define RT_USING_UTEST -#define UTEST_THR_STACK_SIZE 4096 -#define UTEST_THR_PRIORITY 20 - -/* RT-Thread Utestcases */ - - -/* RT-Thread online packages */ - -/* IoT - internet of things */ - - -/* Wi-Fi */ - -/* Marvell WiFi */ - - -/* Wiced WiFi */ - -#define PKG_USING_AT_DEVICE -#define AT_DEVICE_USING_ESP8266 -#define AT_DEVICE_ESP8266_INIT_ASYN -#define AT_DEVICE_ESP8266_SOCKET -#define PKG_USING_AT_DEVICE_LATEST_VERSION -#define PKG_AT_DEVICE_VER_NUM 0x99999 - -/* IoT Cloud */ - - -/* security packages */ - - -/* language packages */ - -/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ - - -/* XML: Extensible Markup Language */ - - -/* multimedia packages */ - -/* LVGL: powerful and easy-to-use embedded GUI library */ - - -/* u8g2: a monochrome graphic library */ - - -/* PainterEngine: A cross-platform graphics application framework written in C language */ - - -/* tools packages */ - - -/* system packages */ - -/* enhanced kernel services */ - - -/* acceleration: Assembly language or algorithmic acceleration packages */ - - -/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ - - -/* Micrium: Micrium software products porting for RT-Thread */ - - -/* peripheral libraries and drivers */ - - -/* Kendryte SDK */ - - -/* AI packages */ - - -/* miscellaneous packages */ - -/* project laboratory */ - -/* samples: kernel and components samples */ - - -/* entertainment: terminal games and other interesting software packages */ - - -/* Privated Packages of RealThread */ - - -/* Network Utilities */ - - -/* RT-Thread Smart */ - - -/* Hardware Drivers Config */ - -/* On-chip Peripheral Drivers */ - -#define SOC_SERIES_M2354 -#define BSP_USE_STDDRIVER_SOURCE -#define BSP_USING_PDMA -#define NU_PDMA_MEMFUN_ACTOR_MAX 2 -#define NU_PDMA_SGTBL_POOL_SIZE 16 -#define BSP_USING_FMC -#define BSP_USING_GPIO -#define BSP_USING_CLK -#define NU_CLK_INVOKE_WKTMR -#define BSP_USING_RTC -#define NU_RTC_SUPPORT_MSH_CMD -#define BSP_USING_EADC -#define BSP_USING_EADC0 -#define BSP_USING_TMR -#define BSP_USING_UART -#define BSP_USING_UART0 -#define BSP_USING_UART1 -#define BSP_USING_UART4 -#define BSP_USING_UART4_TX_DMA -#define BSP_USING_UART4_RX_DMA -#define BSP_USING_I2C -#define BSP_USING_I2C1 -#define BSP_USING_SDH -#define BSP_USING_SDH0 -#define BSP_USING_SPI -#define BSP_USING_SPI0 -#define BSP_USING_SPI1 -#define BSP_USING_SPI2_NONE -#define BSP_USING_SPI3_NONE -#define BSP_USING_CRYPTO -#define BSP_USING_TRNG -#define BSP_USING_CRC -#define NU_CRC_USE_PDMA -#define BSP_USING_WDT -#define BSP_USING_SLCD -#define BSP_USING_USBD -#define BSP_USING_USBH -#define NU_USBHOST_HUB_POLLING_INTERVAL 100 -#define BSP_USING_OTG - -/* On-board Peripheral Drivers */ - -#define BSP_USING_NULINKME -#define BOARD_USING_ESP8266 -#define BOARD_USING_STORAGE_SDCARD -#define BOARD_USING_OTG - -/* Board extended module drivers */ - -#define BOARD_USING_SEGMENT_LCD - -/* Nuvoton Packages Config */ - -#define NU_PKG_USING_UTILS -#define NU_PKG_USING_DEMO - -#endif diff --git a/bsp/nuvoton/numaker-m467hj/applications/lvgl/lv_demo.c b/bsp/nuvoton/numaker-m467hj/applications/lvgl/lv_demo.c index 7a04e1804a..ebfbba2273 100644 --- a/bsp/nuvoton/numaker-m467hj/applications/lvgl/lv_demo.c +++ b/bsp/nuvoton/numaker-m467hj/applications/lvgl/lv_demo.c @@ -17,16 +17,15 @@ void lv_user_gui_init(void) #if LV_USE_DEMO_BENCHMARK extern void lv_demo_benchmark(void); lv_demo_benchmark(); -#endif -#if LV_USE_DEMO_WIDGETS +#elif LV_USE_DEMO_WIDGETS extern void lv_demo_widgets(void); lv_demo_widgets(); -#endif -#if LV_USE_DEMO_MUSIC || LV_USE_DEMO_RTT_MUSIC +#elif (LV_USE_DEMO_MUSIC || LV_USE_DEMO_RTT_MUSIC) extern void lv_demo_music(void); lv_demo_music(); + #endif } diff --git a/bsp/nuvoton/numaker-m467hj/applications/lvgl/lv_port_disp.c b/bsp/nuvoton/numaker-m467hj/applications/lvgl/lv_port_disp.c index a86452c5d5..445c4993e1 100644 --- a/bsp/nuvoton/numaker-m467hj/applications/lvgl/lv_port_disp.c +++ b/bsp/nuvoton/numaker-m467hj/applications/lvgl/lv_port_disp.c @@ -16,6 +16,10 @@ #define DBG_COLOR #include +#if !defined(NU_PKG_LVGL_RENDERING_LAYER) + #define NU_PKG_LVGL_RENDERING_LAYER "lcd" +#endif + /*A static or global variable to store the buffers*/ static lv_disp_draw_buf_t disp_buf; static lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ @@ -47,7 +51,7 @@ void lv_port_disp_init(void) rt_err_t result; void *buf1 = RT_NULL; - lcd_device = rt_device_find("lcd"); + lcd_device = rt_device_find(NU_PKG_LVGL_RENDERING_LAYER); if (lcd_device == 0) { LOG_E("error!"); diff --git a/bsp/nuvoton/numaker-m467hj/applications/lvgl/lv_port_disp.h b/bsp/nuvoton/numaker-m467hj/applications/lvgl/lv_port_disp.h deleted file mode 100644 index b11ce3c5b6..0000000000 --- a/bsp/nuvoton/numaker-m467hj/applications/lvgl/lv_port_disp.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2021-10-18 Meco Man The first version - */ -#ifndef LV_PORT_DISP_H -#define LV_PORT_DISP_H - -#ifdef __cplusplus -extern "C" { -#endif - -void lv_port_disp_init(void); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/bsp/nuvoton/numaker-m467hj/applications/lvgl/lv_port_indev.h b/bsp/nuvoton/numaker-m467hj/applications/lvgl/lv_port_indev.h deleted file mode 100644 index bde7176807..0000000000 --- a/bsp/nuvoton/numaker-m467hj/applications/lvgl/lv_port_indev.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2021-10-18 Meco Man The first version - */ -#ifndef LV_PORT_INDEV_H -#define LV_PORT_INDEV_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -extern lv_indev_t *button_indev; - -void lv_port_indev_init(void); -void lv_port_indev_input(rt_int16_t x, rt_int16_t y, lv_indev_state_t state); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/bsp/nuvoton/numaker-m467hj/board/NuPinConfig/nutool_pincfg.c b/bsp/nuvoton/numaker-m467hj/board/NuPinConfig/nutool_pincfg.c index 0114f1ac68..4e02ea2fee 100644 --- a/bsp/nuvoton/numaker-m467hj/board/NuPinConfig/nutool_pincfg.c +++ b/bsp/nuvoton/numaker-m467hj/board/NuPinConfig/nutool_pincfg.c @@ -132,7 +132,8 @@ Pin175:EADC0_CH7 Pin176:EADC0_CH6 ********************/ -#include "M460.h" +#include "NuMicro.h" +#include "rtconfig.h" void nutool_pincfg_init_can0(void) { diff --git a/bsp/nuvoton/numaker-pfm-m487/Nu_Link_Driver.ini b/bsp/nuvoton/numaker-pfm-m487/Nu_Link_Driver.ini deleted file mode 100644 index 13faf63291..0000000000 --- a/bsp/nuvoton/numaker-pfm-m487/Nu_Link_Driver.ini +++ /dev/null @@ -1,870 +0,0 @@ -[Version] -Nu_LinkVersion=V5.8 -[Process] -ProcessID=0x0000961c -ProcessCreationTime_L=0x338f3649 -ProcessCreationTime_H=0x01d61201 -NuLinkID=0x18004d67 -NuLinkIDs_Count=0x00000001 -NuLinkID0=0x18004d67 -[ChipSelect] -;ChipName= -ChipName=M481 -[NUC505] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=NUC505_SPIFLASH.FLM -[NUC4xx] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=NUC400_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x014fb180 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[NUC2xx] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NUC200_AP_128.FLM -[NUC1311] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NUC1311_AP_64.FLM -[NUC126] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=NUC126_AP_256.FLM -[NUC121] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NUC121_AP_32.FLM -[NUC1xx] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NUC100_AP_128.FLM -[NUC029] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NUC029_AP_16.FLM -[NM1820] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NM1820_AP_17_5.FLM -[NM1810] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NM1810_AP_29_5.FLM -[NM1500] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NM1500_AP_128.FLM -[NM1330] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NM1330_AP_64.FLM -[NM1320] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NM1320_AP_32.FLM -[NM1230] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=NM1230_AP_64.FLM -[NM1200] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NM1200_AP_8.FLM -[NM1120] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NM1120_AP_29_5.FLM -[TF5100] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=TF5100_AP_64.FLM -[NDA102] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=NDA102_AP_29_5.FLM -[Nano103] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=Nano103_AP_64.FLM -[Nano100] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=Nano100_AP_64.FLM -[N576] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=N576_AP_145.FLM -[N575] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=N575_AP_145.FLM -[N572] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=N572Fxxx.FLM -[N571] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=N571E000.FLM -[N570] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=N570_AP_64.FLM -[N569] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=N569_AP_64.FLM -[N512] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=N512_AP_64.FLM -[Mini57] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=Mini57_AP_29_5.FLM -[Mini51] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=Mini51_AP_16.FLM -[M481] -Connect=2 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x00004000 -ProgramAlgorithm=M481_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[M480LD] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M480LD_AP_256.FLM -[M451] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M451_AP_256.FLM -[M251] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=M251_AP_192.FLM -[M2351] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M2351_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[M261] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=M261_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[MR63] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=1 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=MR63_AP_512.FLM -TraceConf0=0x00000002 -TraceConf1=0x00b71b00 -TraceConf2=0x00000800 -TraceConf3=0x00000000 -TraceConf4=0x00000001 -TraceConf5=0x00000000 -[M0564] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x2000 -ProgramAlgorithm=M0564_AP_256.FLM -[M0519] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=M0519_AP_128.FLM -[M0518] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=M0518_AP_64.FLM -[M05x] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=M0516_AP_64.FLM -[M031] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=1 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x800 -ProgramAlgorithm=M031_AP_128.FLM -[NPCX] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=NPCX_AP_512.FLM -[I94000] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm=I94000_AP_512.FLM -[ISD9300] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=ISD9300_AP_145.FLM -[I9200] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=I9200_AP_128.FLM -[ISD9xxx] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=ISD9100_AP_145.FLM -[ISD9000] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=ISD9000_AP_64.FLM -[AU9xxx] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -FlashSelect=APROM -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableFlashBreakpoint=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x1000 -ProgramAlgorithm=AU9100_AP_145.FLM -[General] -Connect=0 -Reset=Autodetect -MaxClock=1MHz -MemoryVerify=0 -IOVoltage=3300 -Erase=1 -Program=1 -Verify=1 -ResetAndRun=0 -EnableLog=0 -MemAccessWhileRun=0 -RAMForAlgorithmStart=0x20000000 -RAMForAlgorithmSize=0x4000 -ProgramAlgorithm= diff --git a/bsp/nuvoton/numaker-pfm-m487/applications/lvgl/lv_demo.c b/bsp/nuvoton/numaker-pfm-m487/applications/lvgl/lv_demo.c index 7a04e1804a..ebfbba2273 100644 --- a/bsp/nuvoton/numaker-pfm-m487/applications/lvgl/lv_demo.c +++ b/bsp/nuvoton/numaker-pfm-m487/applications/lvgl/lv_demo.c @@ -17,16 +17,15 @@ void lv_user_gui_init(void) #if LV_USE_DEMO_BENCHMARK extern void lv_demo_benchmark(void); lv_demo_benchmark(); -#endif -#if LV_USE_DEMO_WIDGETS +#elif LV_USE_DEMO_WIDGETS extern void lv_demo_widgets(void); lv_demo_widgets(); -#endif -#if LV_USE_DEMO_MUSIC || LV_USE_DEMO_RTT_MUSIC +#elif (LV_USE_DEMO_MUSIC || LV_USE_DEMO_RTT_MUSIC) extern void lv_demo_music(void); lv_demo_music(); + #endif } diff --git a/bsp/nuvoton/numaker-pfm-m487/applications/lvgl/lv_port_disp.c b/bsp/nuvoton/numaker-pfm-m487/applications/lvgl/lv_port_disp.c index a86452c5d5..445c4993e1 100644 --- a/bsp/nuvoton/numaker-pfm-m487/applications/lvgl/lv_port_disp.c +++ b/bsp/nuvoton/numaker-pfm-m487/applications/lvgl/lv_port_disp.c @@ -16,6 +16,10 @@ #define DBG_COLOR #include +#if !defined(NU_PKG_LVGL_RENDERING_LAYER) + #define NU_PKG_LVGL_RENDERING_LAYER "lcd" +#endif + /*A static or global variable to store the buffers*/ static lv_disp_draw_buf_t disp_buf; static lv_disp_drv_t disp_drv; /*Descriptor of a display driver*/ @@ -47,7 +51,7 @@ void lv_port_disp_init(void) rt_err_t result; void *buf1 = RT_NULL; - lcd_device = rt_device_find("lcd"); + lcd_device = rt_device_find(NU_PKG_LVGL_RENDERING_LAYER); if (lcd_device == 0) { LOG_E("error!"); diff --git a/bsp/nuvoton/numaker-pfm-m487/applications/lvgl/lv_port_disp.h b/bsp/nuvoton/numaker-pfm-m487/applications/lvgl/lv_port_disp.h deleted file mode 100644 index b11ce3c5b6..0000000000 --- a/bsp/nuvoton/numaker-pfm-m487/applications/lvgl/lv_port_disp.h +++ /dev/null @@ -1,23 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2021-10-18 Meco Man The first version - */ -#ifndef LV_PORT_DISP_H -#define LV_PORT_DISP_H - -#ifdef __cplusplus -extern "C" { -#endif - -void lv_port_disp_init(void); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/bsp/nuvoton/numaker-pfm-m487/applications/lvgl/lv_port_indev.h b/bsp/nuvoton/numaker-pfm-m487/applications/lvgl/lv_port_indev.h deleted file mode 100644 index bde7176807..0000000000 --- a/bsp/nuvoton/numaker-pfm-m487/applications/lvgl/lv_port_indev.h +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright (c) 2006-2022, RT-Thread Development Team - * - * SPDX-License-Identifier: Apache-2.0 - * - * Change Logs: - * Date Author Notes - * 2021-10-18 Meco Man The first version - */ -#ifndef LV_PORT_INDEV_H -#define LV_PORT_INDEV_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include - -extern lv_indev_t *button_indev; - -void lv_port_indev_init(void); -void lv_port_indev_input(rt_int16_t x, rt_int16_t y, lv_indev_state_t state); - -#ifdef __cplusplus -} /*extern "C"*/ -#endif - -#endif diff --git a/bsp/nuvoton/numaker-pfm-m487/board/board_dev.c b/bsp/nuvoton/numaker-pfm-m487/board/board_dev.c index 25d3c1cd78..5db43eca5c 100644 --- a/bsp/nuvoton/numaker-pfm-m487/board/board_dev.c +++ b/bsp/nuvoton/numaker-pfm-m487/board/board_dev.c @@ -182,7 +182,7 @@ int rt_hw_max31875_port(void) struct rt_sensor_config cfg; cfg.intf.dev_name = "i2c1"; - cfg.intf.user_data = (void *)MAX31875_I2C_SLAVE_ADR_R0; + cfg.intf.arg = (void *)MAX31875_I2C_SLAVE_ADR_R0; cfg.irq_pin.pin = PIN_IRQ_PIN_NONE; rt_hw_max31875_init("max31875", &cfg); @@ -198,7 +198,7 @@ int rt_hw_mpu6500_port(void) struct rt_sensor_config cfg; cfg.intf.dev_name = "i2c2"; - cfg.intf.user_data = (void *)MPU6XXX_ADDR_DEFAULT; + cfg.intf.arg = (void *)MPU6XXX_ADDR_DEFAULT; cfg.irq_pin.pin = PIN_IRQ_PIN_NONE; rt_hw_mpu6xxx_init("mpu", &cfg); diff --git a/bsp/nuvoton/numaker-pfm-m487/project.uvproj b/bsp/nuvoton/numaker-pfm-m487/project.uvproj deleted file mode 100644 index 4c17d73000..0000000000 --- a/bsp/nuvoton/numaker-pfm-m487/project.uvproj +++ /dev/null @@ -1,2525 +0,0 @@ - - - 1.1 -
### uVision Project, (C) Keil Software
- - - rtthread-m480 - 0x4 - ARM-ADS - - - M487JIDAE - Nuvoton - IRAM(0x20000000-0x20027FFF) IROM(0-0x7FFFF) CLOCK(192000000) CPUTYPE("Cortex-M4") FPU2 - - undefined - - 0 - - - - - - - - - - - SFD\Nuvoton\M481_v1.SFR - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\build\keil4\ - rtthread - 1 - 0 - 1 - 1 - 1 - .\build\keil4\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 0 - 0 - - - 0 - 0 - - - 1 - 0 - fromelf.exe --bin --output "$L@L.bin" "$L@L.axf" - - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - - DARMCM1.DLL - - SARMCM3.DLL - - TARMCM1.DLL - - - - - 1 - 0 - 0 - 0 - 16 - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - - - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - - 0 - 10 - - - - - - - - - - - - - - NULink\Nu_Link.dll - - - - - 1 - 0 - 0 - 1 - 1 - 4101 - - 0 - NULink\Nu_Link.dll - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 1 - 0 - 0 - 8 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x28000 - - - 1 - 0x0 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x28000 - - - 0 - 0x0 - 0x0 - - - - - - 1 - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - --c99 - RT_USING_LIBC, __RTTHREAD__, __STDC_LIMIT_MACROS, RT_USING_ARM_LIBC, __CLK_TCK=RT_TICK_PER_SECOND - - applications;.;..\libraries\m480\CMSIS\Include;..\..\..\components\libc\compilers\common\include;..\..\..\components\libc\compilers\common\extension;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m4;..\..\..\components\drivers\audio;..\..\..\components\drivers\include;..\..\..\components\drivers\hwcrypto;.;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\spi;..\..\..\components\drivers\include;..\..\..\components\drivers\spi\sfud\inc;..\..\..\components\drivers\include;board;board\NuClockConfig;board\NuPinConfig;..\libraries\m480\Device\Nuvoton\M480\Include;..\libraries\m480\rtt_port;..\..\..\components\fal\inc;..\..\..\components\dfs\include;..\..\..\components\dfs\filesystems\devfs;..\..\..\components\dfs\filesystems\elmfat;..\..\..\components\finsh;.;..\..\..\include;..\libraries\m480\StdDriver\inc;..\..\..\components\net\lwip\lwip-2.0.3\src\include;..\..\..\components\net\lwip\lwip-2.0.3\src\include\ipv4;..\..\..\components\net\lwip\lwip-2.0.3\src\include\netif;..\..\..\components\net\lwip\port;..\libraries\m480\USBHostLib\inc;..\libraries\nu_packages\Demo;..\libraries\nu_packages\AudioCodec;..\libraries\nu_packages\TPC;..\libraries\nu_packages\NuUtils\inc;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\posix\io\stdio;..\..\..\components\libc\posix\ipc;..\..\..\components\drivers\usb\usbdevice;..\..\..\components\drivers\usb\usbhost;..\..\..\components\drivers\usb\usbhost\class;..\..\..\components\drivers\usb\usbhost\core;..\..\..\components\drivers\usb\usbhost\include;..\..\..\components\drivers\include;..\..\..\components\net\netdev\include;..\..\..\components\net\sal\include;..\..\..\components\net\sal\include\socket;..\..\..\components\net\sal\impl;..\..\..\components\net\sal\include\dfs_net;..\..\..\components\net\sal\include\socket\sys_socket;..\..\..\components\utilities\utest - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - .\linking_scripts\m480_flash.sct - - - - - - - - - - - Applications - - - main.c - 1 - applications\main.c - - - - - mnt.c - 1 - applications\mnt.c - - - - - Compiler - - - syscall_mem.c - 1 - ..\..\..\components\libc\compilers\armlibc\syscall_mem.c - - - - - syscalls.c - 1 - ..\..\..\components\libc\compilers\armlibc\syscalls.c - - - - - cctype.c - 1 - ..\..\..\components\libc\compilers\common\cctype.c - - - - - cstdio.c - 1 - ..\..\..\components\libc\compilers\common\cstdio.c - - - - - cstdlib.c - 1 - ..\..\..\components\libc\compilers\common\cstdlib.c - - - - - cstring.c - 1 - ..\..\..\components\libc\compilers\common\cstring.c - - - - - ctime.c - 1 - ..\..\..\components\libc\compilers\common\ctime.c - - - - - cwchar.c - 1 - ..\..\..\components\libc\compilers\common\cwchar.c - - - - - CPU - - - backtrace.c - 1 - ..\..\..\libcpu\arm\common\backtrace.c - - - - - div0.c - 1 - ..\..\..\libcpu\arm\common\div0.c - - - - - showmem.c - 1 - ..\..\..\libcpu\arm\common\showmem.c - - - - - context_rvds.S - 2 - ..\..\..\libcpu\arm\cortex-m4\context_rvds.S - - - - - cpuport.c - 1 - ..\..\..\libcpu\arm\cortex-m4\cpuport.c - - - - - DeviceDrivers - - - audio.c - 1 - ..\..\..\components\drivers\audio\audio.c - - - - - --c99 - - - - - - - - - - - - audio_pipe.c - 1 - ..\..\..\components\drivers\audio\audio_pipe.c - - - - - --c99 - - - - - - - - - - - - can.c - 1 - ..\..\..\components\drivers\can\can.c - - - - - --c99 - - - - - - - - - - - - hw_crc.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_crc.c - - - - - --c99 - - - - - - - - - - - - hw_hash.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_hash.c - - - - - --c99 - - - - - - - - - - - - hw_rng.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_rng.c - - - - - --c99 - - - - - - - - - - - - hw_symmetric.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_symmetric.c - - - - - --c99 - - - - - - - - - - - - hwcrypto.c - 1 - ..\..\..\components\drivers\hwcrypto\hwcrypto.c - - - - - --c99 - - - - - - - - - - - - hwtimer.c - 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c - - - - - --c99 - - - - - - - - - - - - i2c-bit-ops.c - 1 - ..\..\..\components\drivers\i2c\i2c-bit-ops.c - - - - - --c99 - - - - - - - - - - - - i2c_core.c - 1 - ..\..\..\components\drivers\i2c\i2c_core.c - - - - - --c99 - - - - - - - - - - - - i2c_dev.c - 1 - ..\..\..\components\drivers\i2c\i2c_dev.c - - - - - --c99 - - - - - - - - - - - - completion.c - 1 - ..\..\..\components\drivers\ipc\completion.c - - - - - --c99 - - - - - - - - - - - - dataqueue.c - 1 - ..\..\..\components\drivers\ipc\dataqueue.c - - - - - --c99 - - - - - - - - - - - - pipe.c - 1 - ..\..\..\components\drivers\ipc\pipe.c - - - - - --c99 - - - - - - - - - - - - ringblk_buf.c - 1 - ..\..\..\components\drivers\ipc\ringblk_buf.c - - - - - --c99 - - - - - - - - - - - - ringbuffer.c - 1 - ..\..\..\components\drivers\ipc\ringbuffer.c - - - - - --c99 - - - - - - - - - - - - waitqueue.c - 1 - ..\..\..\components\drivers\ipc\waitqueue.c - - - - - --c99 - - - - - - - - - - - - workqueue.c - 1 - ..\..\..\components\drivers\ipc\workqueue.c - - - - - --c99 - - - - - - - - - - - - adc.c - 1 - ..\..\..\components\drivers\misc\adc.c - - - - - --c99 - - - - - - - - - - - - pin.c - 1 - ..\..\..\components\drivers\misc\pin.c - - - - - --c99 - - - - - - - - - - - - rt_drv_pwm.c - 1 - ..\..\..\components\drivers\misc\rt_drv_pwm.c - - - - - --c99 - - - - - - - - - - - - lptimer.c - 1 - ..\..\..\components\drivers\pm\lptimer.c - - - - - --c99 - - - - - - - - - - - - pm.c - 1 - ..\..\..\components\drivers\pm\pm.c - - - - - --c99 - - - - - - - - - - - - rtc.c - 1 - ..\..\..\components\drivers\rtc\rtc.c - - - - - --c99 - - - - - - - - - - - - block_dev.c - 1 - ..\..\..\components\drivers\sdio\block_dev.c - - - - - --c99 - - - - - - - - - - - - mmc.c - 1 - ..\..\..\components\drivers\sdio\mmc.c - - - - - --c99 - - - - - - - - - - - - mmcsd_core.c - 1 - ..\..\..\components\drivers\sdio\mmcsd_core.c - - - - - --c99 - - - - - - - - - - - - sd.c - 1 - ..\..\..\components\drivers\sdio\sd.c - - - - - --c99 - - - - - - - - - - - - sdio.c - 1 - ..\..\..\components\drivers\sdio\sdio.c - - - - - --c99 - - - - - - - - - - - - serial.c - 1 - ..\..\..\components\drivers\serial\serial.c - - - - - --c99 - - - - - - - - - - - - qspi_core.c - 1 - ..\..\..\components\drivers\spi\qspi_core.c - - - - - --c99 - - - - - - - - - - - - sfud.c - 1 - ..\..\..\components\drivers\spi\sfud\src\sfud.c - - - - - --c99 - - - - - - - - - - - - sfud_sfdp.c - 1 - ..\..\..\components\drivers\spi\sfud\src\sfud_sfdp.c - - - - - --c99 - - - - - - - - - - - - spi_core.c - 1 - ..\..\..\components\drivers\spi\spi_core.c - - - - - --c99 - - - - - - - - - - - - spi_dev.c - 1 - ..\..\..\components\drivers\spi\spi_dev.c - - - - - --c99 - - - - - - - - - - - - spi_flash_sfud.c - 1 - ..\..\..\components\drivers\spi\spi_flash_sfud.c - - - - - --c99 - - - - - - - - - - - - watchdog.c - 1 - ..\..\..\components\drivers\watchdog\watchdog.c - - - - - --c99 - - - - - - - - - - - - Drivers - - - startup_M480.s - 2 - ..\libraries\m480\Device\Nuvoton\M480\Source\ARM\startup_M480.s - - - - - system_M480.c - 1 - ..\libraries\m480\Device\Nuvoton\M480\Source\system_M480.c - - - - - nutool_modclkcfg.c - 1 - board\NuClockConfig\nutool_modclkcfg.c - - - - - nutool_pincfg.c - 1 - board\NuPinConfig\nutool_pincfg.c - - - - - board_dev.c - 1 - board\board_dev.c - - - - - drv_bpwm.c - 1 - ..\libraries\m480\rtt_port\drv_bpwm.c - - - - - drv_bpwm_capture.c - 1 - ..\libraries\m480\rtt_port\drv_bpwm_capture.c - - - - - drv_can.c - 1 - ..\libraries\m480\rtt_port\drv_can.c - - - - - drv_clk.c - 1 - ..\libraries\m480\rtt_port\drv_clk.c - - - - - drv_common.c - 1 - ..\libraries\m480\rtt_port\drv_common.c - - - - - drv_crc.c - 1 - ..\libraries\m480\rtt_port\drv_crc.c - - - - - drv_crypto.c - 1 - ..\libraries\m480\rtt_port\drv_crypto.c - - - - - drv_eadc.c - 1 - ..\libraries\m480\rtt_port\drv_eadc.c - - - - - drv_ebi.c - 1 - ..\libraries\m480\rtt_port\drv_ebi.c - - - - - drv_ecap.c - 1 - ..\libraries\m480\rtt_port\drv_ecap.c - - - - - drv_emac.c - 1 - ..\libraries\m480\rtt_port\drv_emac.c - - - - - drv_epwm.c - 1 - ..\libraries\m480\rtt_port\drv_epwm.c - - - - - drv_epwm_capture.c - 1 - ..\libraries\m480\rtt_port\drv_epwm_capture.c - - - - - drv_fmc.c - 1 - ..\libraries\m480\rtt_port\drv_fmc.c - - - - - drv_gpio.c - 1 - ..\libraries\m480\rtt_port\drv_gpio.c - - - - - drv_hsotg.c - 1 - ..\libraries\m480\rtt_port\drv_hsotg.c - - - - - drv_hsusbd.c - 1 - ..\libraries\m480\rtt_port\drv_hsusbd.c - - - - - drv_i2c.c - 1 - ..\libraries\m480\rtt_port\drv_i2c.c - - - - - drv_i2s.c - 1 - ..\libraries\m480\rtt_port\drv_i2s.c - - - - - drv_pdma.c - 1 - ..\libraries\m480\rtt_port\drv_pdma.c - - - - - drv_qei.c - 1 - ..\libraries\m480\rtt_port\drv_qei.c - - - - - drv_qspi.c - 1 - ..\libraries\m480\rtt_port\drv_qspi.c - - - - - drv_rtc.c - 1 - ..\libraries\m480\rtt_port\drv_rtc.c - - - - - drv_scuart.c - 1 - ..\libraries\m480\rtt_port\drv_scuart.c - - - - - drv_sdh.c - 1 - ..\libraries\m480\rtt_port\drv_sdh.c - - - - - drv_sdio.c - 1 - ..\libraries\m480\rtt_port\drv_sdio.c - - - - - drv_softi2c.c - 1 - ..\libraries\m480\rtt_port\drv_softi2c.c - - - - - drv_spi.c - 1 - ..\libraries\m480\rtt_port\drv_spi.c - - - - - drv_spii2s.c - 1 - ..\libraries\m480\rtt_port\drv_spii2s.c - - - - - drv_timer.c - 1 - ..\libraries\m480\rtt_port\drv_timer.c - - - - - drv_timer_capture.c - 1 - ..\libraries\m480\rtt_port\drv_timer_capture.c - - - - - drv_tpwm.c - 1 - ..\libraries\m480\rtt_port\drv_tpwm.c - - - - - drv_trng.c - 1 - ..\libraries\m480\rtt_port\drv_trng.c - - - - - drv_uart.c - 1 - ..\libraries\m480\rtt_port\drv_uart.c - - - - - drv_ui2c.c - 1 - ..\libraries\m480\rtt_port\drv_ui2c.c - - - - - drv_usbd.c - 1 - ..\libraries\m480\rtt_port\drv_usbd.c - - - - - drv_usbhost.c - 1 - ..\libraries\m480\rtt_port\drv_usbhost.c - - - - - drv_uspi.c - 1 - ..\libraries\m480\rtt_port\drv_uspi.c - - - - - drv_uuart.c - 1 - ..\libraries\m480\rtt_port\drv_uuart.c - - - - - drv_wdt.c - 1 - ..\libraries\m480\rtt_port\drv_wdt.c - - - - - Fal - - - fal_partition.c - 1 - ..\..\..\components\fal\src\fal_partition.c - - - - - fal.c - 1 - ..\..\..\components\fal\src\fal.c - - - - - fal_rtt.c - 1 - ..\..\..\components\fal\src\fal_rtt.c - - - - - fal_flash.c - 1 - ..\..\..\components\fal\src\fal_flash.c - - - - - Filesystem - - - devfs.c - 1 - ..\..\..\components\dfs\filesystems\devfs\devfs.c - - - - - dfs_elm.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\dfs_elm.c - - - - - ff.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\ff.c - - - - - ffunicode.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\ffunicode.c - - - - - dfs.c - 1 - ..\..\..\components\dfs\src\dfs.c - - - - - dfs_file.c - 1 - ..\..\..\components\dfs\src\dfs_file.c - - - - - dfs_fs.c - 1 - ..\..\..\components\dfs\src\dfs_fs.c - - - - - dfs_posix.c - 1 - ..\..\..\components\dfs\src\dfs_posix.c - - - - - Finsh - - - shell.c - 1 - ..\..\..\components\finsh\shell.c - - - - - msh.c - 1 - ..\..\..\components\finsh\msh.c - - - - - msh_parse.c - 1 - ..\..\..\components\finsh\msh_parse.c - - - - - cmd.c - 1 - ..\..\..\components\finsh\cmd.c - - - - - msh_file.c - 1 - ..\..\..\components\finsh\msh_file.c - - - - - Kernel - - - clock.c - 1 - ..\..\..\src\clock.c - - - - - components.c - 1 - ..\..\..\src\components.c - - - - - device.c - 1 - ..\..\..\src\device.c - - - - - idle.c - 1 - ..\..\..\src\idle.c - - - - - ipc.c - 1 - ..\..\..\src\ipc.c - - - - - irq.c - 1 - ..\..\..\src\irq.c - - - - - kservice.c - 1 - ..\..\..\src\kservice.c - - - - - mem.c - 1 - ..\..\..\src\mem.c - - - - - mempool.c - 1 - ..\..\..\src\mempool.c - - - - - object.c - 1 - ..\..\..\src\object.c - - - - - scheduler.c - 1 - ..\..\..\src\scheduler.c - - - - - signal.c - 1 - ..\..\..\src\signal.c - - - - - thread.c - 1 - ..\..\..\src\thread.c - - - - - timer.c - 1 - ..\..\..\src\timer.c - - - - - Libraries - - - nu_sdh.c - 1 - ..\libraries\m480\StdDriver\src\nu_sdh.c - - - - - nu_dac.c - 1 - ..\libraries\m480\StdDriver\src\nu_dac.c - - - - - nu_clk.c - 1 - ..\libraries\m480\StdDriver\src\nu_clk.c - - - - - nu_trng.c - 1 - ..\libraries\m480\StdDriver\src\nu_trng.c - - - - - nu_eadc.c - 1 - ..\libraries\m480\StdDriver\src\nu_eadc.c - - - - - nu_ccap.c - 1 - ..\libraries\m480\StdDriver\src\nu_ccap.c - - - - - nu_ebi.c - 1 - ..\libraries\m480\StdDriver\src\nu_ebi.c - - - - - nu_bpwm.c - 1 - ..\libraries\m480\StdDriver\src\nu_bpwm.c - - - - - nu_sys.c - 1 - ..\libraries\m480\StdDriver\src\nu_sys.c - - - - - nu_usbd.c - 1 - ..\libraries\m480\StdDriver\src\nu_usbd.c - - - - - nu_sc.c - 1 - ..\libraries\m480\StdDriver\src\nu_sc.c - - - - - nu_pdma.c - 1 - ..\libraries\m480\StdDriver\src\nu_pdma.c - - - - - nu_qei.c - 1 - ..\libraries\m480\StdDriver\src\nu_qei.c - - - - - nu_crypto.c - 1 - ..\libraries\m480\StdDriver\src\nu_crypto.c - - - - - nu_i2c.c - 1 - ..\libraries\m480\StdDriver\src\nu_i2c.c - - - - - nu_emac.c - 1 - ..\libraries\m480\StdDriver\src\nu_emac.c - - - - - nu_rtc.c - 1 - ..\libraries\m480\StdDriver\src\nu_rtc.c - - - - - nu_timer.c - 1 - ..\libraries\m480\StdDriver\src\nu_timer.c - - - - - nu_timer_pwm.c - 1 - ..\libraries\m480\StdDriver\src\nu_timer_pwm.c - - - - - nu_usci_spi.c - 1 - ..\libraries\m480\StdDriver\src\nu_usci_spi.c - - - - - nu_spim.c - 1 - ..\libraries\m480\StdDriver\src\nu_spim.c - - - - - nu_uart.c - 1 - ..\libraries\m480\StdDriver\src\nu_uart.c - - - - - nu_scuart.c - 1 - ..\libraries\m480\StdDriver\src\nu_scuart.c - - - - - nu_fmc.c - 1 - ..\libraries\m480\StdDriver\src\nu_fmc.c - - - - - nu_gpio.c - 1 - ..\libraries\m480\StdDriver\src\nu_gpio.c - - - - - nu_wwdt.c - 1 - ..\libraries\m480\StdDriver\src\nu_wwdt.c - - - - - nu_epwm.c - 1 - ..\libraries\m480\StdDriver\src\nu_epwm.c - - - - - nu_ecap.c - 1 - ..\libraries\m480\StdDriver\src\nu_ecap.c - - - - - nu_acmp.c - 1 - ..\libraries\m480\StdDriver\src\nu_acmp.c - - - - - nu_can.c - 1 - ..\libraries\m480\StdDriver\src\nu_can.c - - - - - nu_crc.c - 1 - ..\libraries\m480\StdDriver\src\nu_crc.c - - - - - nu_wdt.c - 1 - ..\libraries\m480\StdDriver\src\nu_wdt.c - - - - - nu_usci_uart.c - 1 - ..\libraries\m480\StdDriver\src\nu_usci_uart.c - - - - - nu_spi.c - 1 - ..\libraries\m480\StdDriver\src\nu_spi.c - - - - - nu_usci_i2c.c - 1 - ..\libraries\m480\StdDriver\src\nu_usci_i2c.c - - - - - nu_qspi.c - 1 - ..\libraries\m480\StdDriver\src\nu_qspi.c - - - - - nu_hsusbd.c - 1 - ..\libraries\m480\StdDriver\src\nu_hsusbd.c - - - - - nu_i2s.c - 1 - ..\libraries\m480\StdDriver\src\nu_i2s.c - - - - - lwIP - - - api_lib.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\api_lib.c - - - - - api_msg.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\api_msg.c - - - - - err.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\err.c - - - - - netbuf.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\netbuf.c - - - - - netdb.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\netdb.c - - - - - netifapi.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\netifapi.c - - - - - sockets.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\sockets.c - - - - - tcpip.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\tcpip.c - - - - - ping.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\apps\ping\ping.c - - - - - def.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\def.c - - - - - dns.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\dns.c - - - - - inet_chksum.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\inet_chksum.c - - - - - init.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\init.c - - - - - ip.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ip.c - - - - - autoip.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\autoip.c - - - - - dhcp.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\dhcp.c - - - - - etharp.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\etharp.c - - - - - icmp.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\icmp.c - - - - - igmp.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\igmp.c - - - - - ip4.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\ip4.c - - - - - ip4_addr.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\ip4_addr.c - - - - - ip4_frag.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\ip4_frag.c - - - - - memp.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\memp.c - - - - - netif.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\netif.c - - - - - pbuf.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\pbuf.c - - - - - raw.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\raw.c - - - - - stats.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\stats.c - - - - - sys.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\sys.c - - - - - tcp.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\tcp.c - - - - - tcp_in.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\tcp_in.c - - - - - tcp_out.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\tcp_out.c - - - - - timeouts.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\timeouts.c - - - - - udp.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\udp.c - - - - - ethernet.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\netif\ethernet.c - - - - - lowpan6.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\netif\lowpan6.c - - - - - ethernetif.c - 1 - ..\..\..\components\net\lwip\port\ethernetif.c - - - - - sys_arch.c - 1 - ..\..\..\components\net\lwip\port\sys_arch.c - - - - - m480_usbhostlib - - - mem_alloc.c - 1 - ..\libraries\m480\USBHostLib\src\mem_alloc.c - - - - - usb_core.c - 1 - ..\libraries\m480\USBHostLib\src\usb_core.c - - - - - ehci.c - 1 - ..\libraries\m480\USBHostLib\src\ehci.c - - - - - ohci.c - 1 - ..\libraries\m480\USBHostLib\src\ohci.c - - - - - ehci_iso.c - 1 - ..\libraries\m480\USBHostLib\src\ehci_iso.c - - - - - nu_pkgs_demo - - - usbd_cdc_vcom_echo.c - 1 - ..\libraries\nu_packages\Demo\usbd_cdc_vcom_echo.c - - - - - slcd_show_tick.c - 1 - ..\libraries\nu_packages\Demo\slcd_show_tick.c - - - - - usbd_hid_dance_mouse.c - 1 - ..\libraries\nu_packages\Demo\usbd_hid_dance_mouse.c - - - - - nu_pkgs_nau88l25 - - - audio_test.c - 1 - ..\libraries\nu_packages\AudioCodec\audio_test.c - - - - - acodec_nau88l25.c - 1 - ..\libraries\nu_packages\AudioCodec\acodec_nau88l25.c - - - - - rt_usbd - - - hid.c - 1 - ..\..\..\components\drivers\usb\usbdevice\class\hid.c - - - - - usbdevice_core.c - 1 - ..\..\..\components\drivers\usb\usbdevice\core\usbdevice_core.c - - - - - usbdevice.c - 1 - ..\..\..\components\drivers\usb\usbdevice\core\usbdevice.c - - - - - rt_usbh - - - mass.c - 1 - ..\..\..\components\drivers\usb\usbhost\class\mass.c - - - - - hub.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\hub.c - - - - - usbhost.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\usbhost.c - - - - - usbhost_core.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\usbhost_core.c - - - - - udisk.c - 1 - ..\..\..\components\drivers\usb\usbhost\class\udisk.c - - - - - driver.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\driver.c - - - - - SAL - - - netdev.c - 1 - ..\..\..\components\net\netdev\src\netdev.c - - - - - netdev_ipaddr.c - 1 - ..\..\..\components\net\netdev\src\netdev_ipaddr.c - - - - - dfs_net.c - 1 - ..\..\..\components\net\sal\dfs_net\dfs_net.c - - - - - af_inet_lwip.c - 1 - ..\..\..\components\net\sal\impl\af_inet_lwip.c - - - - - net_netdb.c - 1 - ..\..\..\components\net\sal\socket\net_netdb.c - - - - - net_sockets.c - 1 - ..\..\..\components\net\sal\socket\net_sockets.c - - - - - sal_socket.c - 1 - ..\..\..\components\net\sal\src\sal_socket.c - - - - - UTest - - - utest.c - 1 - ..\..\..\components\utilities\utest\utest.c - - - - - - -
diff --git a/bsp/nuvoton/numaker-pfm-m487/project.uvprojx b/bsp/nuvoton/numaker-pfm-m487/project.uvprojx deleted file mode 100644 index 647b6ef0cb..0000000000 --- a/bsp/nuvoton/numaker-pfm-m487/project.uvprojx +++ /dev/null @@ -1,2520 +0,0 @@ - - - 2.1 -
### uVision Project, (C) Keil Software
- - - rtthread-m480 - 0x4 - ARM-ADS - 0 - - - M487JIDAE - Nuvoton - Nuvoton.NuMicro_DFP.1.3.13 - https://github.com/OpenNuvoton/cmsis-packs/raw/master/ - IRAM(0x20000000,0x28000) IROM(0x00000000,0x80000) CPUTYPE("Cortex-M4") FPU2 CLOCK(12000000) - - - UL2CM3(-S0 -C0 -P0 -FD20000000 -FC1000 -FN1 -FF0M481_AP_512 -FS00 -FL080000 -FP0($$Device:M487JIDAE$Flash\M481_AP_512.FLM)) - 0 - $$Device:M487JIDAE$Device\M480\Include\M480.h - - - - - - - - - - $$Device:M487JIDAE$SVD\Nuvoton\M481_v1.svd - 0 - 0 - - - - - - - 0 - 0 - 0 - 0 - 1 - - .\build\keil5\ - rtthread - 1 - 0 - 1 - 1 - 1 - .\build\keil5\ - 1 - 0 - 0 - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 0 - 0 - - - 0 - 0 - 0 - 0 - - - 1 - 0 - fromelf.exe --bin --output "$L@L.bin" "$L@L.axf" - - 0 - 0 - 0 - 0 - - 0 - - - - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 3 - - - 1 - - - SARMCM3.DLL - - DARMCM1.DLL - - SARMCM3.DLL - - TARMCM1.DLL - - - - - 1 - 0 - 0 - 0 - 16 - - - - - 1 - 0 - 0 - 1 - 1 - 4103 - - 1 - BIN\UL2CM3.DLL - "" () - - - - - 0 - - - - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 1 - 1 - 0 - 1 - 1 - 0 - 0 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 1 - 0 - 0 - "Cortex-M4" - - 0 - 0 - 0 - 1 - 1 - 0 - 0 - 2 - 0 - 0 - 0 - 8 - 0 - 0 - 0 - 0 - 3 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 0 - 0 - 0 - 0 - 1 - 0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x28000 - - - 1 - 0x0 - 0x80000 - - - 0 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x0 - - - 1 - 0x0 - 0x80000 - - - 1 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x0 - 0x0 - - - 0 - 0x20000000 - 0x28000 - - - 0 - 0x0 - 0x0 - - - - - - 1 - 3 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 1 - 1 - 1 - 1 - 0 - 0 - 0 - - --c99 - RT_USING_LIBC, __RTTHREAD__, __STDC_LIMIT_MACROS, RT_USING_ARM_LIBC, __CLK_TCK=RT_TICK_PER_SECOND - - applications;.;..\libraries\m480\CMSIS\Include;..\..\..\components\libc\compilers\common\include;..\..\..\components\libc\compilers\common\extension;..\..\..\components\libc\compilers\common\extension\fcntl\octal;..\..\..\libcpu\arm\common;..\..\..\libcpu\arm\cortex-m4;..\..\..\components\drivers\audio;..\..\..\components\drivers\include;..\..\..\components\drivers\hwcrypto;.;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\include;..\..\..\components\drivers\spi;..\..\..\components\drivers\include;..\..\..\components\drivers\spi\sfud\inc;..\..\..\components\drivers\include;board;board\NuClockConfig;board\NuPinConfig;..\libraries\m480\Device\Nuvoton\M480\Include;..\libraries\m480\rtt_port;..\..\..\components\fal\inc;..\..\..\components\dfs\include;..\..\..\components\dfs\filesystems\devfs;..\..\..\components\dfs\filesystems\elmfat;..\..\..\components\finsh;.;..\..\..\include;..\libraries\m480\StdDriver\inc;..\..\..\components\net\lwip\lwip-2.0.3\src\include;..\..\..\components\net\lwip\lwip-2.0.3\src\include\ipv4;..\..\..\components\net\lwip\lwip-2.0.3\src\include\netif;..\..\..\components\net\lwip\port;..\libraries\m480\USBHostLib\inc;..\libraries\nu_packages\Demo;..\libraries\nu_packages\AudioCodec;..\libraries\nu_packages\TPC;..\libraries\nu_packages\NuUtils\inc;..\..\..\components\libc\posix\io\poll;..\..\..\components\libc\posix\io\stdio;..\..\..\components\libc\posix\ipc;..\..\..\components\drivers\usb\usbdevice;..\..\..\components\drivers\usb\usbhost;..\..\..\components\drivers\usb\usbhost\class;..\..\..\components\drivers\usb\usbhost\core;..\..\..\components\drivers\usb\usbhost\include;..\..\..\components\drivers\include;..\..\..\components\net\netdev\include;..\..\..\components\net\sal\include;..\..\..\components\net\sal\include\socket;..\..\..\components\net\sal\impl;..\..\..\components\net\sal\include\dfs_net;..\..\..\components\net\sal\include\socket\sys_socket;..\..\..\components\utilities\utest - - - - 1 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - 0 - - - - - - - - - 0 - 0 - 0 - 0 - 1 - 0 - 0x00000000 - 0x20000000 - - .\linking_scripts\m480_flash.sct - - - - - - - - - - - Applications - - - mnt.c - 1 - applications\mnt.c - - - - - main.c - 1 - applications\main.c - - - - - Compiler - - - syscall_mem.c - 1 - ..\..\..\components\libc\compilers\armlibc\syscall_mem.c - - - - - syscalls.c - 1 - ..\..\..\components\libc\compilers\armlibc\syscalls.c - - - - - cctype.c - 1 - ..\..\..\components\libc\compilers\common\cctype.c - - - - - cstdio.c - 1 - ..\..\..\components\libc\compilers\common\cstdio.c - - - - - cstdlib.c - 1 - ..\..\..\components\libc\compilers\common\cstdlib.c - - - - - cstring.c - 1 - ..\..\..\components\libc\compilers\common\cstring.c - - - - - ctime.c - 1 - ..\..\..\components\libc\compilers\common\ctime.c - - - - - cwchar.c - 1 - ..\..\..\components\libc\compilers\common\cwchar.c - - - - - CPU - - - backtrace.c - 1 - ..\..\..\libcpu\arm\common\backtrace.c - - - - - div0.c - 1 - ..\..\..\libcpu\arm\common\div0.c - - - - - showmem.c - 1 - ..\..\..\libcpu\arm\common\showmem.c - - - - - context_rvds.S - 2 - ..\..\..\libcpu\arm\cortex-m4\context_rvds.S - - - - - cpuport.c - 1 - ..\..\..\libcpu\arm\cortex-m4\cpuport.c - - - - - DeviceDrivers - - - audio.c - 1 - ..\..\..\components\drivers\audio\audio.c - - - - - --c99 - - - - - - - - - - - - audio_pipe.c - 1 - ..\..\..\components\drivers\audio\audio_pipe.c - - - - - --c99 - - - - - - - - - - - - can.c - 1 - ..\..\..\components\drivers\can\can.c - - - - - --c99 - - - - - - - - - - - - hw_crc.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_crc.c - - - - - --c99 - - - - - - - - - - - - hw_hash.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_hash.c - - - - - --c99 - - - - - - - - - - - - hw_rng.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_rng.c - - - - - --c99 - - - - - - - - - - - - hw_symmetric.c - 1 - ..\..\..\components\drivers\hwcrypto\hw_symmetric.c - - - - - --c99 - - - - - - - - - - - - hwcrypto.c - 1 - ..\..\..\components\drivers\hwcrypto\hwcrypto.c - - - - - --c99 - - - - - - - - - - - - hwtimer.c - 1 - ..\..\..\components\drivers\hwtimer\hwtimer.c - - - - - --c99 - - - - - - - - - - - - i2c-bit-ops.c - 1 - ..\..\..\components\drivers\i2c\i2c-bit-ops.c - - - - - --c99 - - - - - - - - - - - - i2c_core.c - 1 - ..\..\..\components\drivers\i2c\i2c_core.c - - - - - --c99 - - - - - - - - - - - - i2c_dev.c - 1 - ..\..\..\components\drivers\i2c\i2c_dev.c - - - - - --c99 - - - - - - - - - - - - completion.c - 1 - ..\..\..\components\drivers\ipc\completion.c - - - - - --c99 - - - - - - - - - - - - dataqueue.c - 1 - ..\..\..\components\drivers\ipc\dataqueue.c - - - - - --c99 - - - - - - - - - - - - pipe.c - 1 - ..\..\..\components\drivers\ipc\pipe.c - - - - - --c99 - - - - - - - - - - - - ringblk_buf.c - 1 - ..\..\..\components\drivers\ipc\ringblk_buf.c - - - - - --c99 - - - - - - - - - - - - ringbuffer.c - 1 - ..\..\..\components\drivers\ipc\ringbuffer.c - - - - - --c99 - - - - - - - - - - - - waitqueue.c - 1 - ..\..\..\components\drivers\ipc\waitqueue.c - - - - - --c99 - - - - - - - - - - - - workqueue.c - 1 - ..\..\..\components\drivers\ipc\workqueue.c - - - - - --c99 - - - - - - - - - - - - adc.c - 1 - ..\..\..\components\drivers\misc\adc.c - - - - - --c99 - - - - - - - - - - - - pin.c - 1 - ..\..\..\components\drivers\misc\pin.c - - - - - --c99 - - - - - - - - - - - - rt_drv_pwm.c - 1 - ..\..\..\components\drivers\misc\rt_drv_pwm.c - - - - - --c99 - - - - - - - - - - - - lptimer.c - 1 - ..\..\..\components\drivers\pm\lptimer.c - - - - - --c99 - - - - - - - - - - - - pm.c - 1 - ..\..\..\components\drivers\pm\pm.c - - - - - --c99 - - - - - - - - - - - - rtc.c - 1 - ..\..\..\components\drivers\rtc\rtc.c - - - - - --c99 - - - - - - - - - - - - block_dev.c - 1 - ..\..\..\components\drivers\sdio\block_dev.c - - - - - --c99 - - - - - - - - - - - - mmc.c - 1 - ..\..\..\components\drivers\sdio\mmc.c - - - - - --c99 - - - - - - - - - - - - mmcsd_core.c - 1 - ..\..\..\components\drivers\sdio\mmcsd_core.c - - - - - --c99 - - - - - - - - - - - - sd.c - 1 - ..\..\..\components\drivers\sdio\sd.c - - - - - --c99 - - - - - - - - - - - - sdio.c - 1 - ..\..\..\components\drivers\sdio\sdio.c - - - - - --c99 - - - - - - - - - - - - serial.c - 1 - ..\..\..\components\drivers\serial\serial.c - - - - - --c99 - - - - - - - - - - - - qspi_core.c - 1 - ..\..\..\components\drivers\spi\qspi_core.c - - - - - --c99 - - - - - - - - - - - - sfud.c - 1 - ..\..\..\components\drivers\spi\sfud\src\sfud.c - - - - - --c99 - - - - - - - - - - - - sfud_sfdp.c - 1 - ..\..\..\components\drivers\spi\sfud\src\sfud_sfdp.c - - - - - --c99 - - - - - - - - - - - - spi_core.c - 1 - ..\..\..\components\drivers\spi\spi_core.c - - - - - --c99 - - - - - - - - - - - - spi_dev.c - 1 - ..\..\..\components\drivers\spi\spi_dev.c - - - - - --c99 - - - - - - - - - - - - spi_flash_sfud.c - 1 - ..\..\..\components\drivers\spi\spi_flash_sfud.c - - - - - --c99 - - - - - - - - - - - - watchdog.c - 1 - ..\..\..\components\drivers\watchdog\watchdog.c - - - - - --c99 - - - - - - - - - - - - Drivers - - - startup_M480.s - 2 - ..\libraries\m480\Device\Nuvoton\M480\Source\ARM\startup_M480.s - - - - - system_M480.c - 1 - ..\libraries\m480\Device\Nuvoton\M480\Source\system_M480.c - - - - - nutool_modclkcfg.c - 1 - board\NuClockConfig\nutool_modclkcfg.c - - - - - nutool_pincfg.c - 1 - board\NuPinConfig\nutool_pincfg.c - - - - - board_dev.c - 1 - board\board_dev.c - - - - - drv_bpwm.c - 1 - ..\libraries\m480\rtt_port\drv_bpwm.c - - - - - drv_bpwm_capture.c - 1 - ..\libraries\m480\rtt_port\drv_bpwm_capture.c - - - - - drv_can.c - 1 - ..\libraries\m480\rtt_port\drv_can.c - - - - - drv_clk.c - 1 - ..\libraries\m480\rtt_port\drv_clk.c - - - - - drv_common.c - 1 - ..\libraries\m480\rtt_port\drv_common.c - - - - - drv_crc.c - 1 - ..\libraries\m480\rtt_port\drv_crc.c - - - - - drv_crypto.c - 1 - ..\libraries\m480\rtt_port\drv_crypto.c - - - - - drv_eadc.c - 1 - ..\libraries\m480\rtt_port\drv_eadc.c - - - - - drv_ebi.c - 1 - ..\libraries\m480\rtt_port\drv_ebi.c - - - - - drv_ecap.c - 1 - ..\libraries\m480\rtt_port\drv_ecap.c - - - - - drv_emac.c - 1 - ..\libraries\m480\rtt_port\drv_emac.c - - - - - drv_epwm.c - 1 - ..\libraries\m480\rtt_port\drv_epwm.c - - - - - drv_epwm_capture.c - 1 - ..\libraries\m480\rtt_port\drv_epwm_capture.c - - - - - drv_fmc.c - 1 - ..\libraries\m480\rtt_port\drv_fmc.c - - - - - drv_gpio.c - 1 - ..\libraries\m480\rtt_port\drv_gpio.c - - - - - drv_hsotg.c - 1 - ..\libraries\m480\rtt_port\drv_hsotg.c - - - - - drv_hsusbd.c - 1 - ..\libraries\m480\rtt_port\drv_hsusbd.c - - - - - drv_i2c.c - 1 - ..\libraries\m480\rtt_port\drv_i2c.c - - - - - drv_i2s.c - 1 - ..\libraries\m480\rtt_port\drv_i2s.c - - - - - drv_pdma.c - 1 - ..\libraries\m480\rtt_port\drv_pdma.c - - - - - drv_qei.c - 1 - ..\libraries\m480\rtt_port\drv_qei.c - - - - - drv_qspi.c - 1 - ..\libraries\m480\rtt_port\drv_qspi.c - - - - - drv_rtc.c - 1 - ..\libraries\m480\rtt_port\drv_rtc.c - - - - - drv_scuart.c - 1 - ..\libraries\m480\rtt_port\drv_scuart.c - - - - - drv_sdh.c - 1 - ..\libraries\m480\rtt_port\drv_sdh.c - - - - - drv_sdio.c - 1 - ..\libraries\m480\rtt_port\drv_sdio.c - - - - - drv_softi2c.c - 1 - ..\libraries\m480\rtt_port\drv_softi2c.c - - - - - drv_spi.c - 1 - ..\libraries\m480\rtt_port\drv_spi.c - - - - - drv_spii2s.c - 1 - ..\libraries\m480\rtt_port\drv_spii2s.c - - - - - drv_timer.c - 1 - ..\libraries\m480\rtt_port\drv_timer.c - - - - - drv_timer_capture.c - 1 - ..\libraries\m480\rtt_port\drv_timer_capture.c - - - - - drv_tpwm.c - 1 - ..\libraries\m480\rtt_port\drv_tpwm.c - - - - - drv_trng.c - 1 - ..\libraries\m480\rtt_port\drv_trng.c - - - - - drv_uart.c - 1 - ..\libraries\m480\rtt_port\drv_uart.c - - - - - drv_ui2c.c - 1 - ..\libraries\m480\rtt_port\drv_ui2c.c - - - - - drv_usbd.c - 1 - ..\libraries\m480\rtt_port\drv_usbd.c - - - - - drv_usbhost.c - 1 - ..\libraries\m480\rtt_port\drv_usbhost.c - - - - - drv_uspi.c - 1 - ..\libraries\m480\rtt_port\drv_uspi.c - - - - - drv_uuart.c - 1 - ..\libraries\m480\rtt_port\drv_uuart.c - - - - - drv_wdt.c - 1 - ..\libraries\m480\rtt_port\drv_wdt.c - - - - - Fal - - - fal_flash.c - 1 - ..\..\..\components\fal\src\fal_flash.c - - - - - fal_rtt.c - 1 - ..\..\..\components\fal\src\fal_rtt.c - - - - - fal.c - 1 - ..\..\..\components\fal\src\fal.c - - - - - fal_partition.c - 1 - ..\..\..\components\fal\src\fal_partition.c - - - - - Filesystem - - - devfs.c - 1 - ..\..\..\components\dfs\filesystems\devfs\devfs.c - - - - - dfs_elm.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\dfs_elm.c - - - - - ff.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\ff.c - - - - - ffunicode.c - 1 - ..\..\..\components\dfs\filesystems\elmfat\ffunicode.c - - - - - dfs.c - 1 - ..\..\..\components\dfs\src\dfs.c - - - - - dfs_file.c - 1 - ..\..\..\components\dfs\src\dfs_file.c - - - - - dfs_fs.c - 1 - ..\..\..\components\dfs\src\dfs_fs.c - - - - - dfs_posix.c - 1 - ..\..\..\components\dfs\src\dfs_posix.c - - - - - Finsh - - - shell.c - 1 - ..\..\..\components\finsh\shell.c - - - - - msh.c - 1 - ..\..\..\components\finsh\msh.c - - - - - msh_parse.c - 1 - ..\..\..\components\finsh\msh_parse.c - - - - - cmd.c - 1 - ..\..\..\components\finsh\cmd.c - - - - - msh_file.c - 1 - ..\..\..\components\finsh\msh_file.c - - - - - Kernel - - - clock.c - 1 - ..\..\..\src\clock.c - - - - - components.c - 1 - ..\..\..\src\components.c - - - - - device.c - 1 - ..\..\..\src\device.c - - - - - idle.c - 1 - ..\..\..\src\idle.c - - - - - ipc.c - 1 - ..\..\..\src\ipc.c - - - - - irq.c - 1 - ..\..\..\src\irq.c - - - - - kservice.c - 1 - ..\..\..\src\kservice.c - - - - - mem.c - 1 - ..\..\..\src\mem.c - - - - - mempool.c - 1 - ..\..\..\src\mempool.c - - - - - object.c - 1 - ..\..\..\src\object.c - - - - - scheduler.c - 1 - ..\..\..\src\scheduler.c - - - - - signal.c - 1 - ..\..\..\src\signal.c - - - - - thread.c - 1 - ..\..\..\src\thread.c - - - - - timer.c - 1 - ..\..\..\src\timer.c - - - - - Libraries - - - nu_sys.c - 1 - ..\libraries\m480\StdDriver\src\nu_sys.c - - - - - nu_i2c.c - 1 - ..\libraries\m480\StdDriver\src\nu_i2c.c - - - - - nu_wwdt.c - 1 - ..\libraries\m480\StdDriver\src\nu_wwdt.c - - - - - nu_clk.c - 1 - ..\libraries\m480\StdDriver\src\nu_clk.c - - - - - nu_sdh.c - 1 - ..\libraries\m480\StdDriver\src\nu_sdh.c - - - - - nu_fmc.c - 1 - ..\libraries\m480\StdDriver\src\nu_fmc.c - - - - - nu_can.c - 1 - ..\libraries\m480\StdDriver\src\nu_can.c - - - - - nu_qspi.c - 1 - ..\libraries\m480\StdDriver\src\nu_qspi.c - - - - - nu_acmp.c - 1 - ..\libraries\m480\StdDriver\src\nu_acmp.c - - - - - nu_gpio.c - 1 - ..\libraries\m480\StdDriver\src\nu_gpio.c - - - - - nu_epwm.c - 1 - ..\libraries\m480\StdDriver\src\nu_epwm.c - - - - - nu_wdt.c - 1 - ..\libraries\m480\StdDriver\src\nu_wdt.c - - - - - nu_sc.c - 1 - ..\libraries\m480\StdDriver\src\nu_sc.c - - - - - nu_rtc.c - 1 - ..\libraries\m480\StdDriver\src\nu_rtc.c - - - - - nu_dac.c - 1 - ..\libraries\m480\StdDriver\src\nu_dac.c - - - - - nu_crypto.c - 1 - ..\libraries\m480\StdDriver\src\nu_crypto.c - - - - - nu_ccap.c - 1 - ..\libraries\m480\StdDriver\src\nu_ccap.c - - - - - nu_spi.c - 1 - ..\libraries\m480\StdDriver\src\nu_spi.c - - - - - nu_trng.c - 1 - ..\libraries\m480\StdDriver\src\nu_trng.c - - - - - nu_hsusbd.c - 1 - ..\libraries\m480\StdDriver\src\nu_hsusbd.c - - - - - nu_ecap.c - 1 - ..\libraries\m480\StdDriver\src\nu_ecap.c - - - - - nu_i2s.c - 1 - ..\libraries\m480\StdDriver\src\nu_i2s.c - - - - - nu_emac.c - 1 - ..\libraries\m480\StdDriver\src\nu_emac.c - - - - - nu_timer.c - 1 - ..\libraries\m480\StdDriver\src\nu_timer.c - - - - - nu_bpwm.c - 1 - ..\libraries\m480\StdDriver\src\nu_bpwm.c - - - - - nu_eadc.c - 1 - ..\libraries\m480\StdDriver\src\nu_eadc.c - - - - - nu_usci_spi.c - 1 - ..\libraries\m480\StdDriver\src\nu_usci_spi.c - - - - - nu_crc.c - 1 - ..\libraries\m480\StdDriver\src\nu_crc.c - - - - - nu_spim.c - 1 - ..\libraries\m480\StdDriver\src\nu_spim.c - - - - - nu_usci_uart.c - 1 - ..\libraries\m480\StdDriver\src\nu_usci_uart.c - - - - - nu_usci_i2c.c - 1 - ..\libraries\m480\StdDriver\src\nu_usci_i2c.c - - - - - nu_qei.c - 1 - ..\libraries\m480\StdDriver\src\nu_qei.c - - - - - nu_pdma.c - 1 - ..\libraries\m480\StdDriver\src\nu_pdma.c - - - - - nu_uart.c - 1 - ..\libraries\m480\StdDriver\src\nu_uart.c - - - - - nu_timer_pwm.c - 1 - ..\libraries\m480\StdDriver\src\nu_timer_pwm.c - - - - - nu_ebi.c - 1 - ..\libraries\m480\StdDriver\src\nu_ebi.c - - - - - nu_usbd.c - 1 - ..\libraries\m480\StdDriver\src\nu_usbd.c - - - - - nu_scuart.c - 1 - ..\libraries\m480\StdDriver\src\nu_scuart.c - - - - - lwIP - - - api_lib.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\api_lib.c - - - - - api_msg.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\api_msg.c - - - - - err.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\err.c - - - - - netbuf.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\netbuf.c - - - - - netdb.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\netdb.c - - - - - netifapi.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\netifapi.c - - - - - sockets.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\sockets.c - - - - - tcpip.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\api\tcpip.c - - - - - ping.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\apps\ping\ping.c - - - - - def.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\def.c - - - - - dns.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\dns.c - - - - - inet_chksum.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\inet_chksum.c - - - - - init.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\init.c - - - - - ip.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ip.c - - - - - autoip.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\autoip.c - - - - - dhcp.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\dhcp.c - - - - - etharp.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\etharp.c - - - - - icmp.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\icmp.c - - - - - igmp.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\igmp.c - - - - - ip4.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\ip4.c - - - - - ip4_addr.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\ip4_addr.c - - - - - ip4_frag.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\ipv4\ip4_frag.c - - - - - memp.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\memp.c - - - - - netif.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\netif.c - - - - - pbuf.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\pbuf.c - - - - - raw.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\raw.c - - - - - stats.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\stats.c - - - - - sys.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\sys.c - - - - - tcp.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\tcp.c - - - - - tcp_in.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\tcp_in.c - - - - - tcp_out.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\tcp_out.c - - - - - timeouts.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\timeouts.c - - - - - udp.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\core\udp.c - - - - - ethernet.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\netif\ethernet.c - - - - - lowpan6.c - 1 - ..\..\..\components\net\lwip\lwip-2.0.3\src\netif\lowpan6.c - - - - - ethernetif.c - 1 - ..\..\..\components\net\lwip\port\ethernetif.c - - - - - sys_arch.c - 1 - ..\..\..\components\net\lwip\port\sys_arch.c - - - - - m480_usbhostlib - - - ehci.c - 1 - ..\libraries\m480\USBHostLib\src\ehci.c - - - - - ehci_iso.c - 1 - ..\libraries\m480\USBHostLib\src\ehci_iso.c - - - - - mem_alloc.c - 1 - ..\libraries\m480\USBHostLib\src\mem_alloc.c - - - - - usb_core.c - 1 - ..\libraries\m480\USBHostLib\src\usb_core.c - - - - - ohci.c - 1 - ..\libraries\m480\USBHostLib\src\ohci.c - - - - - nu_pkgs_demo - - - usbd_cdc_vcom_echo.c - 1 - ..\libraries\nu_packages\Demo\usbd_cdc_vcom_echo.c - - - - - slcd_show_tick.c - 1 - ..\libraries\nu_packages\Demo\slcd_show_tick.c - - - - - usbd_hid_dance_mouse.c - 1 - ..\libraries\nu_packages\Demo\usbd_hid_dance_mouse.c - - - - - nu_pkgs_nau88l25 - - - audio_test.c - 1 - ..\libraries\nu_packages\AudioCodec\audio_test.c - - - - - acodec_nau88l25.c - 1 - ..\libraries\nu_packages\AudioCodec\acodec_nau88l25.c - - - - - rt_usbd - - - usbdevice_core.c - 1 - ..\..\..\components\drivers\usb\usbdevice\core\usbdevice_core.c - - - - - usbdevice.c - 1 - ..\..\..\components\drivers\usb\usbdevice\core\usbdevice.c - - - - - hid.c - 1 - ..\..\..\components\drivers\usb\usbdevice\class\hid.c - - - - - rt_usbh - - - hub.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\hub.c - - - - - usbhost.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\usbhost.c - - - - - udisk.c - 1 - ..\..\..\components\drivers\usb\usbhost\class\udisk.c - - - - - usbhost_core.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\usbhost_core.c - - - - - mass.c - 1 - ..\..\..\components\drivers\usb\usbhost\class\mass.c - - - - - driver.c - 1 - ..\..\..\components\drivers\usb\usbhost\core\driver.c - - - - - SAL - - - netdev.c - 1 - ..\..\..\components\net\netdev\src\netdev.c - - - - - netdev_ipaddr.c - 1 - ..\..\..\components\net\netdev\src\netdev_ipaddr.c - - - - - dfs_net.c - 1 - ..\..\..\components\net\sal\dfs_net\dfs_net.c - - - - - af_inet_lwip.c - 1 - ..\..\..\components\net\sal\impl\af_inet_lwip.c - - - - - net_netdb.c - 1 - ..\..\..\components\net\sal\socket\net_netdb.c - - - - - net_sockets.c - 1 - ..\..\..\components\net\sal\socket\net_sockets.c - - - - - sal_socket.c - 1 - ..\..\..\components\net\sal\src\sal_socket.c - - - - - UTest - - - utest.c - 1 - ..\..\..\components\utilities\utest\utest.c - - - - - - - - - - - - - - - - - - -
diff --git a/bsp/nuvoton/numaker-pfm-m487/rtconfig.h b/bsp/nuvoton/numaker-pfm-m487/rtconfig.h deleted file mode 100644 index b6b55e368a..0000000000 --- a/bsp/nuvoton/numaker-pfm-m487/rtconfig.h +++ /dev/null @@ -1,411 +0,0 @@ -#ifndef RT_CONFIG_H__ -#define RT_CONFIG_H__ - -/* Automatically generated file; DO NOT EDIT. */ -/* RT-Thread Configuration */ - -/* RT-Thread Kernel */ - -#define RT_NAME_MAX 8 -#define RT_ALIGN_SIZE 4 -#define RT_THREAD_PRIORITY_32 -#define RT_THREAD_PRIORITY_MAX 32 -#define RT_TICK_PER_SECOND 1000 -#define RT_USING_OVERFLOW_CHECK -#define RT_USING_HOOK -#define RT_HOOK_USING_FUNC_PTR -#define RT_USING_IDLE_HOOK -#define RT_IDLE_HOOK_LIST_SIZE 4 -#define IDLE_THREAD_STACK_SIZE 1024 - -/* kservice optimization */ - -#define RT_DEBUG -#define RT_DEBUG_COLOR - -/* Inter-Thread communication */ - -#define RT_USING_SEMAPHORE -#define RT_USING_MUTEX -#define RT_USING_EVENT -#define RT_USING_MAILBOX -#define RT_USING_MESSAGEQUEUE -#define RT_USING_SIGNALS - -/* Memory Management */ - -#define RT_USING_MEMPOOL -#define RT_USING_SMALL_MEM -#define RT_USING_SMALL_MEM_AS_HEAP -#define RT_USING_HEAP - -/* Kernel Device Object */ - -#define RT_USING_DEVICE -#define RT_USING_CONSOLE -#define RT_CONSOLEBUF_SIZE 256 -#define RT_CONSOLE_DEVICE_NAME "uart0" -#define RT_VER_NUM 0x40101 -#define ARCH_ARM -#define RT_USING_CPU_FFS -#define ARCH_ARM_CORTEX_M -#define ARCH_ARM_CORTEX_M4 - -/* RT-Thread Components */ - -#define RT_USING_COMPONENTS_INIT -#define RT_USING_USER_MAIN -#define RT_MAIN_THREAD_STACK_SIZE 2048 -#define RT_MAIN_THREAD_PRIORITY 10 -#define RT_USING_MSH -#define RT_USING_FINSH -#define FINSH_USING_MSH -#define FINSH_THREAD_NAME "tshell" -#define FINSH_THREAD_PRIORITY 20 -#define FINSH_THREAD_STACK_SIZE 2048 -#define FINSH_USING_HISTORY -#define FINSH_HISTORY_LINES 5 -#define FINSH_USING_SYMTAB -#define FINSH_CMD_SIZE 80 -#define MSH_USING_BUILT_IN_COMMANDS -#define FINSH_USING_DESCRIPTION -#define FINSH_ARG_MAX 10 -#define RT_USING_DFS -#define DFS_USING_POSIX -#define DFS_USING_WORKDIR -#define DFS_FILESYSTEMS_MAX 8 -#define DFS_FILESYSTEM_TYPES_MAX 4 -#define DFS_FD_MAX 32 -#define RT_USING_DFS_MNTTABLE -#define RT_USING_DFS_ELMFAT - -/* elm-chan's FatFs, Generic FAT Filesystem Module */ - -#define RT_DFS_ELM_CODE_PAGE 437 -#define RT_DFS_ELM_WORD_ACCESS -#define RT_DFS_ELM_USE_LFN_3 -#define RT_DFS_ELM_USE_LFN 3 -#define RT_DFS_ELM_LFN_UNICODE_0 -#define RT_DFS_ELM_LFN_UNICODE 0 -#define RT_DFS_ELM_MAX_LFN 255 -#define RT_DFS_ELM_DRIVES 8 -#define RT_DFS_ELM_MAX_SECTOR_SIZE 4096 -#define RT_DFS_ELM_REENTRANT -#define RT_DFS_ELM_MUTEX_TIMEOUT 3000 -#define RT_USING_DFS_DEVFS -#define RT_USING_FAL -#define FAL_DEBUG_CONFIG -#define FAL_DEBUG 1 -#define FAL_PART_HAS_TABLE_CFG - -/* Device Drivers */ - -#define RT_USING_DEVICE_IPC -#define RT_USING_SYSTEM_WORKQUEUE -#define RT_SYSTEM_WORKQUEUE_STACKSIZE 2048 -#define RT_SYSTEM_WORKQUEUE_PRIORITY 23 -#define RT_USING_SERIAL -#define RT_USING_SERIAL_V1 -#define RT_SERIAL_USING_DMA -#define RT_SERIAL_RB_BUFSZ 128 -#define RT_USING_CAN -#define RT_USING_HWTIMER -#define RT_USING_I2C -#define RT_USING_I2C_BITOPS -#define RT_USING_PIN -#define RT_USING_ADC -#define RT_USING_PWM -#define RT_USING_PM -#define PM_TICKLESS_THRESHOLD_TIME 2 -#define RT_USING_RTC -#define RT_USING_SDIO -#define RT_SDIO_STACK_SIZE 2048 -#define RT_SDIO_THREAD_PRIORITY 15 -#define RT_MMCSD_STACK_SIZE 2048 -#define RT_MMCSD_THREAD_PREORITY 22 -#define RT_MMCSD_MAX_PARTITION 16 -#define RT_USING_SPI -#define RT_USING_QSPI -#define RT_USING_SFUD -#define RT_SFUD_USING_SFDP -#define RT_SFUD_USING_FLASH_INFO_TABLE -#define RT_SFUD_SPI_MAX_HZ 50000000 -#define RT_USING_WDT -#define RT_USING_AUDIO -#define RT_AUDIO_REPLAY_MP_BLOCK_SIZE 4096 -#define RT_AUDIO_REPLAY_MP_BLOCK_COUNT 2 -#define RT_AUDIO_RECORD_PIPE_SIZE 2048 -#define RT_USING_HWCRYPTO -#define RT_HWCRYPTO_DEFAULT_NAME "hwcryto" -#define RT_HWCRYPTO_IV_MAX_SIZE 16 -#define RT_HWCRYPTO_KEYBIT_MAX_SIZE 256 -#define RT_HWCRYPTO_USING_AES -#define RT_HWCRYPTO_USING_AES_ECB -#define RT_HWCRYPTO_USING_AES_CBC -#define RT_HWCRYPTO_USING_AES_CFB -#define RT_HWCRYPTO_USING_AES_CTR -#define RT_HWCRYPTO_USING_AES_OFB -#define RT_HWCRYPTO_USING_DES -#define RT_HWCRYPTO_USING_DES_ECB -#define RT_HWCRYPTO_USING_DES_CBC -#define RT_HWCRYPTO_USING_3DES -#define RT_HWCRYPTO_USING_3DES_ECB -#define RT_HWCRYPTO_USING_3DES_CBC -#define RT_HWCRYPTO_USING_SHA1 -#define RT_HWCRYPTO_USING_SHA2 -#define RT_HWCRYPTO_USING_SHA2_224 -#define RT_HWCRYPTO_USING_SHA2_256 -#define RT_HWCRYPTO_USING_SHA2_384 -#define RT_HWCRYPTO_USING_SHA2_512 -#define RT_HWCRYPTO_USING_RNG -#define RT_HWCRYPTO_USING_CRC -#define RT_HWCRYPTO_USING_CRC_07 -#define RT_HWCRYPTO_USING_CRC_8005 -#define RT_HWCRYPTO_USING_CRC_1021 -#define RT_HWCRYPTO_USING_CRC_04C11DB7 - -/* Using USB */ - -#define RT_USING_USB -#define RT_USING_USB_HOST -#define RT_USBH_MSTORAGE -#define UDISK_MOUNTPOINT "/mnt/udisk/" -#define RT_USING_USB_DEVICE -#define RT_USBD_THREAD_STACK_SZ 4096 -#define USB_VENDOR_ID 0x0FFE -#define USB_PRODUCT_ID 0x0001 -#define _RT_USB_DEVICE_HID -#define RT_USB_DEVICE_HID -#define RT_USB_DEVICE_HID_MOUSE - -/* C/C++ and POSIX layer */ - -#define RT_LIBC_DEFAULT_TIMEZONE 8 - -/* POSIX (Portable Operating System Interface) layer */ - -#define RT_USING_POSIX_FS -#define RT_USING_POSIX_DEVIO - -/* Interprocess Communication (IPC) */ - - -/* Socket is in the 'Network' category */ - - -/* Network */ - -#define RT_USING_SAL -#define SAL_INTERNET_CHECK - -/* Docking with protocol stacks */ - -#define SAL_USING_LWIP -#define SAL_USING_POSIX -#define RT_USING_NETDEV -#define NETDEV_USING_IFCONFIG -#define NETDEV_USING_PING -#define NETDEV_USING_NETSTAT -#define NETDEV_USING_AUTO_DEFAULT -#define NETDEV_IPV4 1 -#define NETDEV_IPV6 0 -#define RT_USING_LWIP -#define RT_USING_LWIP203 -#define RT_USING_LWIP_VER_NUM 0x20003 -#define RT_LWIP_MEM_ALIGNMENT 4 -#define RT_LWIP_IGMP -#define RT_LWIP_ICMP -#define RT_LWIP_DNS -#define RT_LWIP_DHCP -#define IP_SOF_BROADCAST 1 -#define IP_SOF_BROADCAST_RECV 1 - -/* Static IPv4 Address */ - -#define RT_LWIP_IPADDR "192.168.1.30" -#define RT_LWIP_GWADDR "192.168.1.1" -#define RT_LWIP_MSKADDR "255.255.255.0" -#define RT_LWIP_UDP -#define RT_LWIP_TCP -#define RT_LWIP_RAW -#define RT_MEMP_NUM_NETCONN 8 -#define RT_LWIP_PBUF_NUM 16 -#define RT_LWIP_RAW_PCB_NUM 4 -#define RT_LWIP_UDP_PCB_NUM 4 -#define RT_LWIP_TCP_PCB_NUM 4 -#define RT_LWIP_TCP_SEG_NUM 40 -#define RT_LWIP_TCP_SND_BUF 8196 -#define RT_LWIP_TCP_WND 8196 -#define RT_LWIP_TCPTHREAD_PRIORITY 10 -#define RT_LWIP_TCPTHREAD_MBOX_SIZE 8 -#define RT_LWIP_TCPTHREAD_STACKSIZE 1024 -#define RT_LWIP_ETHTHREAD_PRIORITY 12 -#define RT_LWIP_ETHTHREAD_STACKSIZE 1024 -#define RT_LWIP_ETHTHREAD_MBOX_SIZE 8 -#define LWIP_NETIF_STATUS_CALLBACK 1 -#define LWIP_NETIF_LINK_CALLBACK 1 -#define SO_REUSE 1 -#define LWIP_SO_RCVTIMEO 1 -#define LWIP_SO_SNDTIMEO 1 -#define LWIP_SO_RCVBUF 1 -#define LWIP_SO_LINGER 0 -#define LWIP_NETIF_LOOPBACK 0 -#define RT_LWIP_USING_PING - -/* Utilities */ - -#define RT_USING_UTEST -#define UTEST_THR_STACK_SIZE 4096 -#define UTEST_THR_PRIORITY 20 - -/* RT-Thread Utestcases */ - - -/* RT-Thread online packages */ - -/* IoT - internet of things */ - - -/* Wi-Fi */ - -/* Marvell WiFi */ - - -/* Wiced WiFi */ - - -/* IoT Cloud */ - - -/* security packages */ - - -/* language packages */ - -/* JSON: JavaScript Object Notation, a lightweight data-interchange format */ - - -/* XML: Extensible Markup Language */ - - -/* multimedia packages */ - -/* LVGL: powerful and easy-to-use embedded GUI library */ - - -/* u8g2: a monochrome graphic library */ - - -/* PainterEngine: A cross-platform graphics application framework written in C language */ - - -/* tools packages */ - - -/* system packages */ - -/* enhanced kernel services */ - - -/* acceleration: Assembly language or algorithmic acceleration packages */ - - -/* CMSIS: ARM Cortex-M Microcontroller Software Interface Standard */ - - -/* Micrium: Micrium software products porting for RT-Thread */ - - -/* peripheral libraries and drivers */ - - -/* Kendryte SDK */ - - -/* AI packages */ - - -/* miscellaneous packages */ - -/* project laboratory */ - -/* samples: kernel and components samples */ - - -/* entertainment: terminal games and other interesting software packages */ - - -/* Privated Packages of RealThread */ - - -/* Network Utilities */ - - -/* RT-Thread Smart */ - - -/* Hardware Drivers Config */ - -/* On-chip Peripheral Drivers */ - -#define SOC_SERIES_M480 -#define BSP_USE_STDDRIVER_SOURCE -#define BSP_USING_PDMA -#define NU_PDMA_MEMFUN_ACTOR_MAX 2 -#define NU_PDMA_SGTBL_POOL_SIZE 16 -#define BSP_USING_FMC -#define BSP_USING_GPIO -#define BSP_USING_CLK -#define NU_CLK_INVOKE_WKTMR -#define BSP_USING_EMAC -#define NU_EMAC_PDMA_MEMCOPY -#define NU_EMAC_PDMA_MEMCOPY_THRESHOLD 128 -#define BSP_USING_RTC -#define NU_RTC_SUPPORT_MSH_CMD -#define BSP_USING_TMR -#define BSP_USING_UART -#define BSP_USING_UART0 -#define BSP_USING_I2C -#define BSP_USING_I2C1 -#define BSP_USING_I2C2 -#define BSP_USING_SDH -#define BSP_USING_SDH0 -#define BSP_USING_SPI -#define BSP_USING_SPI_PDMA -#define BSP_USING_SPI0_NONE -#define BSP_USING_SPI1_NONE -#define BSP_USING_SPI2_NONE -#define BSP_USING_SPI3 -#define BSP_USING_I2S -#define NU_I2S_DMA_FIFO_SIZE 2048 -#define BSP_USING_QSPI -#define BSP_USING_QSPI0 -#define BSP_USING_QSPI0_PDMA -#define BSP_USING_CRYPTO -#define BSP_USING_CRC -#define NU_CRC_USE_PDMA -#define BSP_USING_WDT -#define BSP_USING_USBD -#define BSP_USING_HSUSBH -#define NU_USBHOST_HUB_POLLING_INTERVAL 100 - -/* On-board Peripheral Drivers */ - -#define BSP_USING_NULINKME -#define BOARD_USING_IP101GR -#define BOARD_USING_NAU88L25 -#define BOARD_USING_STORAGE_SDCARD -#define BOARD_USING_STORAGE_SPIFLASH -#define BOARD_USING_USB_D_H -#define BOARD_USING_HSUSBH_USBD - -/* Board extended module drivers */ - - -/* Nuvoton Packages Config */ - -#define NU_PKG_USING_UTILS -#define NU_PKG_USING_DEMO -#define NU_PKG_USING_NAU88L25 - -#endif