From e6ec715e5cf18429670c73e7c7b733b58d24eedc Mon Sep 17 00:00:00 2001 From: chunyexixiaoyu <834670833@qq.com> Date: Thu, 31 Mar 2022 17:16:40 +0800 Subject: [PATCH 01/38] Ubiquitous/RT-Thread_Fusion_XiUOS/: solve the bug that phy chip io has been configured emc cs. --- .../aiit_board/xidatong/board/board.c | 235 ++++++++++-------- 1 file changed, 127 insertions(+), 108 deletions(-) diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/board.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/board.c index cf8ee12c7..80ddbfa0c 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/board.c +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/board.c @@ -211,7 +211,7 @@ void imxrt_uart_pins_init(void) #ifdef BSP_USING_SDRAM void imxrt_semc_pins_init(void) { - IOMUXC_SetPinMux( + IOMUXC_SetPinMux( IOMUXC_GPIO_EMC_00_SEMC_DATA00, /* GPIO_EMC_00 is configured as SEMC_DATA00 */ 0U); /* Software Input On Field: Input Path is determined by functionality */ IOMUXC_SetPinMux( @@ -331,13 +331,35 @@ void imxrt_semc_pins_init(void) IOMUXC_SetPinMux( IOMUXC_GPIO_EMC_39_SEMC_DQS, /* GPIO_EMC_39 is configured as SEMC_DQS */ 1U); /* Software Input On Field: Force input path of pad GPIO_EMC_39 */ - IOMUXC_SetPinMux( - IOMUXC_GPIO_EMC_40_SEMC_RDY, /* GPIO_EMC_40 is configured as SEMC_RDY */ - 0U); /* Software Input On Field: Input Path is determined by functionality */ - IOMUXC_SetPinMux( - IOMUXC_GPIO_EMC_41_SEMC_CSX00, /* GPIO_EMC_41 is configured as SEMC_CSX00 */ - 0U); /* Software Input On Field: Input Path is determined by functionality */ - + /* + the both io has been as mdio for phy driver + */ +// IOMUXC_SetPinMux( +// IOMUXC_GPIO_EMC_40_SEMC_RDY, /* GPIO_EMC_40 is configured as SEMC_RDY */ +// 0U); /* Software Input On Field: Input Path is determined by functionality */ +// IOMUXC_SetPinMux( +// IOMUXC_GPIO_EMC_41_SEMC_CSX00, /* GPIO_EMC_41 is configured as SEMC_CSX00 */ +// 0U); /* Software Input On Field: Input Path is determined by functionality */ + IOMUXC_SetPinConfig( + IOMUXC_GPIO_AD_B0_12_LPUART1_TX, /* GPIO_AD_B0_12 PAD functional properties : */ + 0x10B0u); /* Slew Rate Field: Slow Slew Rate + Drive Strength Field: R0/6 + Speed Field: medium(100MHz) + Open Drain Enable Field: Open Drain Disabled + Pull / Keep Enable Field: Pull/Keeper Enabled + Pull / Keep Select Field: Keeper + Pull Up / Down Config. Field: 100K Ohm Pull Down + Hyst. Enable Field: Hysteresis Disabled */ + IOMUXC_SetPinConfig( + IOMUXC_GPIO_AD_B0_13_LPUART1_RX, /* GPIO_AD_B0_13 PAD functional properties : */ + 0x10B0u); /* Slew Rate Field: Slow Slew Rate + Drive Strength Field: R0/6 + Speed Field: medium(100MHz) + Open Drain Enable Field: Open Drain Disabled + Pull / Keep Enable Field: Pull/Keeper Enabled + Pull / Keep Select Field: Keeper + Pull Up / Down Config. Field: 100K Ohm Pull Down + Hyst. Enable Field: Hysteresis Disabled */ IOMUXC_SetPinConfig( IOMUXC_GPIO_EMC_00_SEMC_DATA00, /* GPIO_EMC_00 PAD functional properties : */ 0x0110F9u); /* Slew Rate Field: Fast Slew Rate @@ -738,79 +760,74 @@ void imxrt_semc_pins_init(void) Pull / Keep Select Field: Keeper Pull Up / Down Config. Field: 100K Ohm Pull Down Hyst. Enable Field: Hysteresis Enabled */ - IOMUXC_SetPinConfig( - IOMUXC_GPIO_EMC_40_SEMC_RDY, /* GPIO_EMC_40 PAD functional properties : */ - 0x0110F9u); /* Slew Rate Field: Fast Slew Rate - Drive Strength Field: R0/7 - Speed Field: max(200MHz) - Open Drain Enable Field: Open Drain Disabled - Pull / Keep Enable Field: Pull/Keeper Enabled - Pull / Keep Select Field: Keeper - Pull Up / Down Config. Field: 100K Ohm Pull Down - Hyst. Enable Field: Hysteresis Enabled */ - IOMUXC_SetPinConfig( - IOMUXC_GPIO_EMC_41_SEMC_CSX00, /* GPIO_EMC_41 PAD functional properties : */ - 0x0110F9u); /* Slew Rate Field: Fast Slew Rate - Drive Strength Field: R0/7 - Speed Field: max(200MHz) - Open Drain Enable Field: Open Drain Disabled - Pull / Keep Enable Field: Pull/Keeper Enabled - Pull / Keep Select Field: Keeper - Pull Up / Down Config. Field: 100K Ohm Pull Down - Hyst. Enable Field: Hysteresis Enabled */ + + // IOMUXC_SetPinConfig( + // IOMUXC_GPIO_EMC_40_SEMC_RDY, /* GPIO_EMC_40 PAD functional properties : */ + // 0x0110F9u); /* Slew Rate Field: Fast Slew Rate + // Drive Strength Field: R0/7 + // Speed Field: max(200MHz) + // Open Drain Enable Field: Open Drain Disabled + // Pull / Keep Enable Field: Pull/Keeper Enabled + // Pull / Keep Select Field: Keeper + // Pull Up / Down Config. Field: 100K Ohm Pull Down + // Hyst. Enable Field: Hysteresis Enabled */ + // IOMUXC_SetPinConfig( + // IOMUXC_GPIO_EMC_41_SEMC_CSX00, /* GPIO_EMC_41 PAD functional properties : */ + // 0x0110F9u); /* Slew Rate Field: Fast Slew Rate + // Drive Strength Field: R0/7 + // Speed Field: max(200MHz) + // Open Drain Enable Field: Open Drain Disabled + // Pull / Keep Enable Field: Pull/Keeper Enabled + // Pull / Keep Select Field: Keeper + // Pull Up / Down Config. Field: 100K Ohm Pull Down + // Hyst. Enable Field: Hysteresis Enabled */ } #endif #ifdef BSP_USING_ETH void imxrt_enet_pins_init(void) { - CLOCK_EnableClock(kCLOCK_Iomuxc); /* iomuxc clock (iomuxc_clk_enable): 0x03u */ - - IOMUXC_SetPinMux( + CLOCK_EnableClock(kCLOCK_Iomuxc); /* iomuxc clock (iomuxc_clk_enable): 0x03u */ + IOMUXC_SetPinMux( IOMUXC_GPIO_AD_B0_03_GPIO1_IO03, /* GPIO_AD_B0_09 is configured as GPIO1_IO09 */ 0U); /* Software Input On Field: Input Path is determined by functionality */ - IOMUXC_SetPinMux( + + IOMUXC_SetPinMux( IOMUXC_GPIO_AD_B0_10_GPIO1_IO10, /* GPIO_AD_B0_10 is configured as GPIO1_IO10 */ + 0U); /* Software Input On Field: Input Path is determined by functionality */ /* Software Input On Field: Input Path is determined by functionality */ + IOMUXC_SetPinMux( + IOMUXC_GPIO_B1_04_ENET_RX_DATA00, /* GPIO_B1_04 is configured as ENET_RX_DATA00 */ 0U); /* Software Input On Field: Input Path is determined by functionality */ - IOMUXC_SetPinMux( - IOMUXC_GPIO_AD_B0_09_GPIO1_IO09, /* GPIO_AD_B0_09 is configured as GPIO1_IO09 */ - 0U); /* Software Input On Field: Input Path is determined by functionality */ - IOMUXC_SetPinMux( - IOMUXC_GPIO_AD_B0_10_GPIO1_IO10, /* GPIO_AD_B0_10 is configured as GPIO1_IO10 */ - 0U); - IOMUXC_SetPinMux( - IOMUXC_GPIO_B1_04_ENET_RX_DATA00, /* GPIO_B1_04 is configured as ENET_RX_DATA00 */ - 0U); /* Software Input On Field: Input Path is determined by functionality */ - IOMUXC_SetPinMux( - IOMUXC_GPIO_B1_05_ENET_RX_DATA01, /* GPIO_B1_05 is configured as ENET_RX_DATA01 */ - 0U); /* Software Input On Field: Input Path is determined by functionality */ - IOMUXC_SetPinMux( - IOMUXC_GPIO_B1_06_ENET_RX_EN, /* GPIO_B1_06 is configured as ENET_RX_EN */ - 0U); /* Software Input On Field: Input Path is determined by functionality */ - IOMUXC_SetPinMux( - IOMUXC_GPIO_B1_07_ENET_TX_DATA00, /* GPIO_B1_07 is configured as ENET_TX_DATA00 */ - 0U); /* Software Input On Field: Input Path is determined by functionality */ - IOMUXC_SetPinMux( - IOMUXC_GPIO_B1_08_ENET_TX_DATA01, /* GPIO_B1_08 is configured as ENET_TX_DATA01 */ - 0U); /* Software Input On Field: Input Path is determined by functionality */ - IOMUXC_SetPinMux( - IOMUXC_GPIO_B1_09_ENET_TX_EN, /* GPIO_B1_09 is configured as ENET_TX_EN */ - 0U); /* Software Input On Field: Input Path is determined by functionality */ - IOMUXC_SetPinMux( - IOMUXC_GPIO_B1_10_ENET_REF_CLK, /* GPIO_B1_10 is configured as ENET_REF_CLK */ - 1U); /* Software Input On Field: Force input path of pad GPIO_B1_10 */ - IOMUXC_SetPinMux( - IOMUXC_GPIO_B1_11_ENET_RX_ER, /* GPIO_B1_11 is configured as ENET_RX_ER */ - 0U); /* Software Input On Field: Input Path is determined by functionality */ - IOMUXC_SetPinMux( - IOMUXC_GPIO_EMC_40_ENET_MDC, /* GPIO_EMC_40 is configured as ENET_MDC */ - 0U); /* Software Input On Field: Input Path is determined by functionality */ - IOMUXC_SetPinMux( - IOMUXC_GPIO_EMC_41_ENET_MDIO, /* GPIO_EMC_41 is configured as ENET_MDIO */ - 0U); /* Software Input On Field: Input Path is determined by functionality */ - IOMUXC_SetPinConfig( - IOMUXC_GPIO_AD_B0_09_GPIO1_IO09, /* GPIO_AD_B0_09 PAD functional properties : */ - 0xB0A9u); /* Slew Rate Field: Fast Slew Rate + IOMUXC_SetPinMux( + IOMUXC_GPIO_B1_05_ENET_RX_DATA01, /* GPIO_B1_05 is configured as ENET_RX_DATA01 */ + 0U); /* Software Input On Field: Input Path is determined by functionality */ + IOMUXC_SetPinMux( + IOMUXC_GPIO_B1_06_ENET_RX_EN, /* GPIO_B1_06 is configured as ENET_RX_EN */ + 0U); /* Software Input On Field: Input Path is determined by functionality */ + IOMUXC_SetPinMux( + IOMUXC_GPIO_B1_07_ENET_TX_DATA00, /* GPIO_B1_07 is configured as ENET_TX_DATA00 */ + 0U); /* Software Input On Field: Input Path is determined by functionality */ + IOMUXC_SetPinMux( + IOMUXC_GPIO_B1_08_ENET_TX_DATA01, /* GPIO_B1_08 is configured as ENET_TX_DATA01 */ + 0U); /* Software Input On Field: Input Path is determined by functionality */ + IOMUXC_SetPinMux( + IOMUXC_GPIO_B1_09_ENET_TX_EN, /* GPIO_B1_09 is configured as ENET_TX_EN */ + 0U); /* Software Input On Field: Input Path is determined by functionality */ + IOMUXC_SetPinMux( + IOMUXC_GPIO_B1_10_ENET_REF_CLK, /* GPIO_B1_10 is configured as ENET_REF_CLK */ + 1U); /* Software Input On Field: Force input path of pad GPIO_B1_10 */ + IOMUXC_SetPinMux( + IOMUXC_GPIO_B1_11_ENET_RX_ER, /* GPIO_B1_11 is configured as ENET_RX_ER */ + 0U); /* Software Input On Field: Input Path is determined by functionality */ + IOMUXC_SetPinMux( + IOMUXC_GPIO_EMC_40_ENET_MDC, /* GPIO_EMC_40 is configured as ENET_MDC */ + 0U); /* Software Input On Field: Input Path is determined by functionality */ + IOMUXC_SetPinMux( + IOMUXC_GPIO_EMC_41_ENET_MDIO, /* GPIO_EMC_41 is configured as ENET_MDIO */ + 0U); /* Software Input On Field: Input Path is determined by functionality */ + IOMUXC_SetPinConfig( + IOMUXC_GPIO_AD_B0_03_GPIO1_IO03, /* GPIO_AD_B0_09 PAD functional properties : */ + 0xB0A9u); /* Slew Rate Field: Fast Slew Rate Drive Strength Field: R0/5 Speed Field: medium(100MHz) Open Drain Enable Field: Open Drain Disabled @@ -818,9 +835,10 @@ void imxrt_enet_pins_init(void) Pull / Keep Select Field: Pull Pull Up / Down Config. Field: 100K Ohm Pull Up Hyst. Enable Field: Hysteresis Disabled */ - IOMUXC_SetPinConfig( - IOMUXC_GPIO_AD_B0_10_GPIO1_IO10, /* GPIO_AD_B0_10 PAD functional properties : */ - 0xB0A9u); /* Slew Rate Field: Fast Slew Rate + + IOMUXC_SetPinConfig( + IOMUXC_GPIO_AD_B0_10_GPIO1_IO10, /* GPIO_AD_B0_10 PAD functional properties : */ + 0xB0A9u); /* Slew Rate Field: Fast Slew Rate Drive Strength Field: R0/5 Speed Field: medium(100MHz) Open Drain Enable Field: Open Drain Disabled @@ -828,9 +846,9 @@ void imxrt_enet_pins_init(void) Pull / Keep Select Field: Pull Pull Up / Down Config. Field: 100K Ohm Pull Up Hyst. Enable Field: Hysteresis Disabled */ - IOMUXC_SetPinConfig( - IOMUXC_GPIO_B1_04_ENET_RX_DATA00, /* GPIO_B1_04 PAD functional properties : */ - 0xB0E9u); /* Slew Rate Field: Fast Slew Rate + IOMUXC_SetPinConfig( + IOMUXC_GPIO_B1_04_ENET_RX_DATA00, /* GPIO_B1_04 PAD functional properties : */ + 0xB0E9u); /* Slew Rate Field: Fast Slew Rate Drive Strength Field: R0/5 Speed Field: max(200MHz) Open Drain Enable Field: Open Drain Disabled @@ -838,9 +856,9 @@ void imxrt_enet_pins_init(void) Pull / Keep Select Field: Pull Pull Up / Down Config. Field: 100K Ohm Pull Up Hyst. Enable Field: Hysteresis Disabled */ - IOMUXC_SetPinConfig( - IOMUXC_GPIO_B1_05_ENET_RX_DATA01, /* GPIO_B1_05 PAD functional properties : */ - 0xB0E9u); /* Slew Rate Field: Fast Slew Rate + IOMUXC_SetPinConfig( + IOMUXC_GPIO_B1_05_ENET_RX_DATA01, /* GPIO_B1_05 PAD functional properties : */ + 0xB0E9u); /* Slew Rate Field: Fast Slew Rate Drive Strength Field: R0/5 Speed Field: max(200MHz) Open Drain Enable Field: Open Drain Disabled @@ -848,9 +866,9 @@ void imxrt_enet_pins_init(void) Pull / Keep Select Field: Pull Pull Up / Down Config. Field: 100K Ohm Pull Up Hyst. Enable Field: Hysteresis Disabled */ - IOMUXC_SetPinConfig( - IOMUXC_GPIO_B1_06_ENET_RX_EN, /* GPIO_B1_06 PAD functional properties : */ - 0xB0E9u); /* Slew Rate Field: Fast Slew Rate + IOMUXC_SetPinConfig( + IOMUXC_GPIO_B1_06_ENET_RX_EN, /* GPIO_B1_06 PAD functional properties : */ + 0xB0E9u); /* Slew Rate Field: Fast Slew Rate Drive Strength Field: R0/5 Speed Field: max(200MHz) Open Drain Enable Field: Open Drain Disabled @@ -858,9 +876,9 @@ void imxrt_enet_pins_init(void) Pull / Keep Select Field: Pull Pull Up / Down Config. Field: 100K Ohm Pull Up Hyst. Enable Field: Hysteresis Disabled */ - IOMUXC_SetPinConfig( - IOMUXC_GPIO_B1_07_ENET_TX_DATA00, /* GPIO_B1_07 PAD functional properties : */ - 0xB0E9u); /* Slew Rate Field: Fast Slew Rate + IOMUXC_SetPinConfig( + IOMUXC_GPIO_B1_07_ENET_TX_DATA00, /* GPIO_B1_07 PAD functional properties : */ + 0xB0E9u); /* Slew Rate Field: Fast Slew Rate Drive Strength Field: R0/5 Speed Field: max(200MHz) Open Drain Enable Field: Open Drain Disabled @@ -868,9 +886,9 @@ void imxrt_enet_pins_init(void) Pull / Keep Select Field: Pull Pull Up / Down Config. Field: 100K Ohm Pull Up Hyst. Enable Field: Hysteresis Disabled */ - IOMUXC_SetPinConfig( - IOMUXC_GPIO_B1_08_ENET_TX_DATA01, /* GPIO_B1_08 PAD functional properties : */ - 0xB0E9u); /* Slew Rate Field: Fast Slew Rate + IOMUXC_SetPinConfig( + IOMUXC_GPIO_B1_08_ENET_TX_DATA01, /* GPIO_B1_08 PAD functional properties : */ + 0xB0E9u); /* Slew Rate Field: Fast Slew Rate Drive Strength Field: R0/5 Speed Field: max(200MHz) Open Drain Enable Field: Open Drain Disabled @@ -878,9 +896,9 @@ void imxrt_enet_pins_init(void) Pull / Keep Select Field: Pull Pull Up / Down Config. Field: 100K Ohm Pull Up Hyst. Enable Field: Hysteresis Disabled */ - IOMUXC_SetPinConfig( - IOMUXC_GPIO_B1_09_ENET_TX_EN, /* GPIO_B1_09 PAD functional properties : */ - 0xB0E9u); /* Slew Rate Field: Fast Slew Rate + IOMUXC_SetPinConfig( + IOMUXC_GPIO_B1_09_ENET_TX_EN, /* GPIO_B1_09 PAD functional properties : */ + 0xB0E9u); /* Slew Rate Field: Fast Slew Rate Drive Strength Field: R0/5 Speed Field: max(200MHz) Open Drain Enable Field: Open Drain Disabled @@ -888,9 +906,9 @@ void imxrt_enet_pins_init(void) Pull / Keep Select Field: Pull Pull Up / Down Config. Field: 100K Ohm Pull Up Hyst. Enable Field: Hysteresis Disabled */ - IOMUXC_SetPinConfig( - IOMUXC_GPIO_B1_10_ENET_REF_CLK, /* GPIO_B1_10 PAD functional properties : */ - 0x31u); /* Slew Rate Field: Fast Slew Rate + IOMUXC_SetPinConfig( + IOMUXC_GPIO_B1_10_ENET_REF_CLK, /* GPIO_B1_10 PAD functional properties : */ + 0x31u); /* Slew Rate Field: Fast Slew Rate Drive Strength Field: R0/6 Speed Field: low(50MHz) Open Drain Enable Field: Open Drain Disabled @@ -898,9 +916,9 @@ void imxrt_enet_pins_init(void) Pull / Keep Select Field: Keeper Pull Up / Down Config. Field: 100K Ohm Pull Down Hyst. Enable Field: Hysteresis Disabled */ - IOMUXC_SetPinConfig( - IOMUXC_GPIO_B1_11_ENET_RX_ER, /* GPIO_B1_11 PAD functional properties : */ - 0xB0E9u); /* Slew Rate Field: Fast Slew Rate + IOMUXC_SetPinConfig( + IOMUXC_GPIO_B1_11_ENET_RX_ER, /* GPIO_B1_11 PAD functional properties : */ + 0xB0E9u); /* Slew Rate Field: Fast Slew Rate Drive Strength Field: R0/5 Speed Field: max(200MHz) Open Drain Enable Field: Open Drain Disabled @@ -908,9 +926,9 @@ void imxrt_enet_pins_init(void) Pull / Keep Select Field: Pull Pull Up / Down Config. Field: 100K Ohm Pull Up Hyst. Enable Field: Hysteresis Disabled */ - IOMUXC_SetPinConfig( - IOMUXC_GPIO_EMC_40_ENET_MDC, /* GPIO_EMC_40 PAD functional properties : */ - 0xB0E9u); /* Slew Rate Field: Fast Slew Rate + IOMUXC_SetPinConfig( + IOMUXC_GPIO_EMC_40_ENET_MDC, /* GPIO_EMC_40 PAD functional properties : */ + 0xB0E9u); /* Slew Rate Field: Fast Slew Rate Drive Strength Field: R0/5 Speed Field: max(200MHz) Open Drain Enable Field: Open Drain Disabled @@ -918,9 +936,9 @@ void imxrt_enet_pins_init(void) Pull / Keep Select Field: Pull Pull Up / Down Config. Field: 100K Ohm Pull Up Hyst. Enable Field: Hysteresis Disabled */ - IOMUXC_SetPinConfig( - IOMUXC_GPIO_EMC_41_ENET_MDIO, /* GPIO_EMC_41 PAD functional properties : */ - 0xB829u); /* Slew Rate Field: Fast Slew Rate + IOMUXC_SetPinConfig( + IOMUXC_GPIO_EMC_41_ENET_MDIO, /* GPIO_EMC_41 PAD functional properties : */ + 0xB829u); /* Slew Rate Field: Fast Slew Rate Drive Strength Field: R0/5 Speed Field: low(50MHz) Open Drain Enable Field: Open Drain Enabled @@ -928,6 +946,7 @@ void imxrt_enet_pins_init(void) Pull / Keep Select Field: Pull Pull Up / Down Config. Field: 100K Ohm Pull Up Hyst. Enable Field: Hysteresis Disabled */ + } #endif @@ -943,14 +962,14 @@ void rt_hw_board_init() imxrt_uart_pins_init(); #endif -#ifdef BSP_USING_SDRAM - imxrt_semc_pins_init(); -#endif - #ifdef BSP_USING_ETH imxrt_enet_pins_init(); #endif +#ifdef BSP_USING_SDRAM + imxrt_semc_pins_init(); +#endif + #ifdef BSP_USING_DMA imxrt_dma_init(); #endif From e6101ab1d4c7d8f3eb9eac6d53f59ee64f9ee1a5 Mon Sep 17 00:00:00 2001 From: chunyexixiaoyu <834670833@qq.com> Date: Thu, 31 Mar 2022 17:22:11 +0800 Subject: [PATCH 02/38] Ubiquitous/RT-Thread_Fusion_XiUOS/:add a test about ethernet transmission rate base phy chip 8720A --- .../xidatong/test/iperf_test_base_8720A.png | Bin 0 -> 214510 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/test/iperf_test_base_8720A.png diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/test/iperf_test_base_8720A.png b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/test/iperf_test_base_8720A.png new file mode 100644 index 0000000000000000000000000000000000000000..b11159d90865c13bfc5e1b2c66b4626d29d59200 GIT binary patch literal 214510 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
GYANzC@S^+Ay2$oFW>K^`B9#q%x;6`Asbm9TO z;b=W1wvsbg8+D*@!~Ug;A?)Z=;jiktd9>CpB4LkF-(mN$P;}#2yIJgXvEg=4$+RYx zIL=#)5bRH(a&dPt72QqOrqR0fm#!zDJiKnWc)Rc_cS)qFjs@+Z`9ctPgmMkPH8F^8 zm?$uEh3bMp$Vl2F&Q?qr#f}xqezGHn)7a6?pVrOJ_HPSD#q(IA z4I1dYe~C=ZSUXCc$2@WB^*GhJFU5ug5MFPJ+_mp0Zo?I-L+Aq^LZS^ts@yoa>DSh2 zQ%2rC&bk{6;3upqPM@BCXA+=G6BaTXB>r2Si=ws~QOEH;xw9Tp3GVC`ZMBx^@ikKH z%~}0mD52T`WAa%sLnxYtP^K&3H84UN7NoH(MhHtnIEbFHb6Y!OXqjR)}j zR6rBR63+aXAM0()Qj3wCG6)W&P-)=ii7_*Q0D7%!0fSxTRflD@8D0El?{7x)6b}$_ z&Z?g~>X2jyB&TbwS8onlESU*b(WtmV^AXVO41f=y*;ydqEdhFk&G~@=kN0XVVpv^J zG`xom{!anj22KF$xvaSA_ok-%PeiaVSwKID<$>>kobssU5wX8^S0-E-F^2y||BkV` zJygv5o%NUs7~`OpG6uVo7^)z-*wNgrrhM%C^aDx$ z?s=N_xzjodGNT{!N~DpecJK)8ql>54{mqBr?}9Nfm;WrJc%mA8=h4C+`Ah8uqWEeN z$h5O_s6bm0KAydVu=QH1hpkqHwOPYjz zNK@PtS_|9$NpOl_y?ucgPTQwASczia&ILywpHnidL-WGYz~!pxD0p-XuzZ-X7>VldcR?c`-V+jP*8Z*CtB6=H_`f# za@tp_<)p{MH7$30dvi4xXJ_~!U0~W}LvAi*&sqZPAJct)L~s7*LfMK~-z59INqsTC zV==*JdE;Vq8Y);_Jy#G#e3XB>7^-odT3AG*V-KFpPOM=W&lzyCJ|6O^7 zz}QMOD&hURZ(u*UpkOIT*H+K?{Yyw~(rOIaBYMR-V+6Z^Z8PNYI?mx`$nrJ;x1}P+ zBT#iwo##U3ep3Ivz9mgoZQfXNc1L=xRKiBq zc+OiiBad&}@@1Kqpc*TNnL0e3_aTGw^3bv?VJkE)L~0b#YNchf|G)2PARu_2w6B8fD5?iPAYeAH;d_TP0pKWj5yK z=GNK(2?UMG@yQ9cy7$+qoynrUT7-$ItE($SH3r(BE3+2w&B03>cClEQ*MwD*dK$tv z3;AOB1Rtm&@TY$$BVOj@dVcVY6|}D8 zdQc%k@9s4yJ<5TCok&Ptimk-`nsia^VMCF%ue)#4jp9aqJ%Ve4L4(DpkSzr!=fpOc zmUMB(rDu5VSkV6{g(*<859*YNx>+wr72f5>`IP_b+f;!vU!F(QjuiiVI;zMa0zB$t z^$8EG)q@N@vs98Jw6Knmg7YWVph$9ijtEMK=W^_zVf0K9Y9|6L!ekf&7Z-wyM z!LI|qqvf0Xb3)t_Qd5GvYn4T=S+}yaiI&^bDD8!__VbBFq>=-`A$xe|+*@R9jSgw! zyC2rIT$Xd6-m?(nq?q3=PPwRi0!dF_GwF;>0@ZIl-v~2I~T!pQN zSu*ES2j6oCgtBVWI#1lTogDZ}bSk3C-2BRK6}_dvQNP&JZaD$s>A0=QB^=Ug%0<@$ zo+OKBDdm8}yjXBtx}A`Dnc~*W-ZL_BC2@Yc#up(ueP6T0?)mF>H>Lp;huU{rI~h~- zcc(dgN$XS-6BA(SHoM#9;pbP)?3|pO0EPR|6JFwZw*%;BG``zI?O*HKKyK2Na#jGG zr4)QuJs{7jvR>^<;&S9Y9TrLxig~47TwMGNAD@vR1SDi=pc_nh4+*rD*_V($f~!J@ z+`oj~|0etYzd7o9o6e?)#aD=Fke&(8yR8HBrE2p8yf?DGZ@g0P6L6jZj(Xs}8&weY zuG#}%fr@3LdeO!A_BEwu-j=uzyufLfb5x2yr3|?-Q4Gz~c!EI&yOI4d(lQvDUYLv(_{s zH@|;npe9HHNgqe=&KgfLxx#ux@}hf%qa1JwJV8Al9G{J20)k0#lm}>6u6qp%U>2ce zQlh^%RMzskrSWFJ!PZ_{gMJD;n4(*AkMrFbpltNy;zeG2(^F2{hmnQ#9H?7T!%2I} z3*AB#U2H5HFK}8_4wjbrE-eRrTE4>+YZDVT3^#8wLkiV1G;MNF{vmIPMB8y_l#Qa0 zsUs)*3(czX_XNOwEh+T|a5Kr>S?VhZI|R#tLKr1ze9geOHdVPRXgw*ImPu|tHc{HsF* z+dLJ8+3Qh;`*_Z)SC}tfS<-(|qIqyAm4BTJ9Nur=zQyBodFOE*HOZuMK=UfBOUqnG znp=X6ySC8T^TvIsvGGkLxqCjcQjIU7*6g?4RZl&dq3buOo8%i{MT4y!dw07EPAEPP zZUfn?io%kTR~r{)+iMAk23+I+Fkh|twPX67+K*%-z-NDuMaI93@Z)o0Bn!;Ic%g^+ zA&3;e37D>o6l9t(m_J)-2*SPGHUwEa?*5wu;Kj>&$$D)CNWK+@1)l-?36o|MC@WhF z2~57@x|vK2ipOU#n47YTHU}+^9K3-t&-`gu(~iBRuwCPC^i24)HT&NbW7)H=4a1xq zTV!%!=KnGomDAqb{rVnQ1Cf=D>lGZXSK`*_oS2yZeqIN3JK7NX+mm_~R$L|Cc~`6Z zqpVk!i-+U!DUG*oXkI|0!5vp*mU#Ya$l=1xr)p@It?~Yq)cxr*FO;Dc`(A$S|D zn69L%N5oIfcppRF-P|2)mAhjy+7>^xKrL?m(ScHHwc@;TL&rk%pUMxF%CoJ{1Fv>@ z3$-hR@7wNAddn9)6+8_46PH?!e8T;1Zf|yyEv|@zP!tu94r`j5J({EsrAcM+I&utA ziJBoAPMxJUmc0j$JopDjqJ&5qpTrQWbDZ6@eOgC5xVT*@&bN0QFke%qIN>s|HSqc) zhC)ILHH74miUF813Th}TK3$Z5e*5AF9RwCpv8V^QQlU)K`>{$h`?Mcr0Zrq{*DiLX zp zYx5T+o`j>BBCdnOMtA_WSy38Sm(yaxs**#kg)x*-0(r+t3K=7ma+*P9u0l;UP$}n( zhlm3>#OZ(AsVBB@B($!)TimbYk}S#~WQsVgnoFR;wSD<>#6#y4Bj@#!{qLx6PI?uJ z`5)|$##TgI7&%=vcwcx8?Sv#$WUWW3Wqq+!>Z|eLB!3~TsHXGzmq;JYQp-y&l=7j# zLR!f>jS<`S81L2}ybuXCGu7&EY%KUD=^;vZCq?Y(20!zEP>X0QS^anv#X)5|RiEFm z!P~y_0q+lBp}FvAtfuSBL}zD_Tb-qYK$u8((~15~TxRytBwg=C4jo&=&n=$cEcT6 z9QVxXIQfdNGEg-Agj%`Qyv%dC==YWNAHJSgXdM-j4t-K=T2cAN&<8)Me)b2(YHbzy zu!vc){e^?GT~+6Xe686qzIDb%_HXAKr_ooy%8wt8j1k5Q!x{(!X%!%m@^I}|`hp+By=0_HEFJts*((3q?}|SL@{bcr! z%lt-9bVlAN-5$Yl!oQ4Ux4PJiEuB!`f-~Vn7^j0i(^X){g8E+KYa1ea_ufMUp%sMs zSzTKx3seZ8ogVl~ix@QzXevWZVUL79QZBx$%X{KgpTLd6l=oVLVm>rqTQ!2mMb?^v zr=zdc zHWomK3!wx`HdYO}43anDnO0-`&+%{%uiU~(v#2gu8CTB7tWp3MvtotO{%6jib8S45 z5;2{!H!`iHtVdG~)sW=>51(1VfAyJF`pX&F3kT2Y@G9c38w@%xz}bI^&mE{@Q7 zYODF5h%HI_)zUu^+qSOvv6c1kK{wFa^IhaSb#$-6ZK@J~#KU7}3Xlzw*V^~R$!MI2 zWxv|TS>sx|8U%;{0+2FOdA|zdIe+&*nU4g}eO&LD&Oz6(gfrN5ytSv{WhOVNA$!~GP3n~gKD%fy1tsxLAmn*u-@T#fduyzpgwI^ zr_1ybSj}M%fk%l4jFlw_*#Js0g2(rmNII8)FnA)RKR01k4YE%-I{h~y55-IT$KL$k zx)22^qi+e5$zyh3>64J!t$@++<8K`lBC44)o9OD^Lf?M?FL(K=m-$y z4pu&`{v#AuVPp+XVcI^y>;?7xE}Phw)JG2Vv_pg5-RoYXC|lKJqT>VXTT@#OT<_l% z!>8}C0~8*gdbzTzFoAv^7}1V8Y_-?~h#-fL4t9u@wUn`N19oylbF7-gx#Q7)!WgWNUu!R*$*CsgAT7z8XetuLaU*7e?@ZWm-tww5d6JA) zpaoXj!d!xn$g^wdY%&l5gt0oifh_|J2?3@b2&>ujVK?6|#2d640;ZH4qLXupdh+=LmwP6bkPL*R{i{_zE@`f4vMB0Qy1ItE(jx# z0NoX;-%UA$7H+z{6bURvzM58JtwSv4lnUhGtnAO!<;*N->CE6DHMY0M-fflDNrQ3D z6aV2KlM}=9nqy@iUKh~$T%ps>|38Zw(n2k+cs3^Ip8`wSvr7MS6A5PCO?%8ARTsts z(Y>)Z{%{u~rCGI^a#x~F893_W$u{H)`liol3mtrH*`IdF76wO>z&?Q&*lLZ^7mJQ^ zQ(s4+$chZWuzav@UT+7!WN`NiDA2LvYzn4wo@(2pwEqdt7swcqbh%R)QzV5&A&jwR zM;V;vABf%d{(llL{G)4z;uJiC${qcVPKlDajnC1yok2k`MW|80Tc|_1in#OgCieq5 zY5U60qWARHpv}U3zHFR02tTUfWUArt0`JN{{1#`4g=c4HgZ_#Y<>ffP6spiB#oFujJeD-w#l$c~sR2Aa)xvTP%&(B<- z4)jT?`_0wi>#lZ%EG#VaKKqOeFkrPxO5gBl@0rcdalhM^{9A_(QrS3UpXbOxGV;3F zbjH{7{+iZM-V1ipbDA;CguRBe;(+H78y{2qe7!8x^WX6v1}Y?hC{@3M9=fy&;&0^? z`!!OAx)%VI9Kl%M&_L|G_7#{+4Al@n|8a4qrUJs1(&SA@ZqM!1#!bpJ3A!xur*@f@ zn3bHvp2NOFxl4UX@xx0JIj5n<Wq4;oHJ_CpuE_3+HyQ3eTiLo~oDo^IZ30{#4> z`lr4{5f3E3ye!*aI(%b4=1Nf;A{-zJ_X}{ZtgCYQj(LK!RVEY zFka+V9fo1V(Grj3Keqc3gvg4MefrcQrTA8sKl|{Kam7~~m3gg~8WT95Sfr^u*=AL0 z`e#o;>m(6OmPPWcoMb(kl;b1fi>Zqb z?GrVZ>@}u3Y-iCdHI#h4JqRj}MH8j&x@@0iC%@keg`%dR{d9|Fg*laskAaXjM4K18EIHaIMTUDH8KqCFFH@c7vgO9i47eq zW|9`nSi_Q94_1*Y3AN*|8em>zRv(&Gy?; z5iJrJy}~s&io`rK$rV^Gl9W|q2$G^c!=aHKTAssHZSxt$?tI+yBYSqN!sh5;p?Rx% zbCWMpoqJA&Jnb}&Dwg5g?O-uqNrC}p=v}1dbFd!~KVe5zh8RuKwWe;{wy9@-wjQ)! zXk(F*5?D>N9b}PGAe=`qP9%?7@7|2*t{8GNAIa-!m{~6gbl?x5NUVInF>Y`-v{_n_=Z5*H7S-x+s>d`1O zy=x{f?jSC~OPD1csa#vLl6j>+tsc9<)ijGcFNkPN_}ZX97Boe^ysG}CK_8PpHo#F* z(3Jw?_Af0!0m?KXF78D;KtF$7?*QtS-V3O;!MGa8<#FGuhmY{khn*)2RVxezbb~{l z@u&^J?<}>n6jj4~<3{M)1E#`GZiJvctWQ#R0;MwCSaW&k31lRaF>`wkb$;)oP|Y1J zyj?KqG0(`QW7!WMggVDiy>_>?Aq$o*h|aT-c+)%G~cY zpoyuWMncs>No;a%E^NI#7{JjuA{9u)K{>-Wo@Xn9Gen;&xb<2Aompjy&6SPnK5hOn z%v&27c)7``m*6If&K=53vBuTIKlfvhQot5Iv{aG7*Fz1=P{@(4FLsS)Y1q8FOY3qu zzi{W9!;K|7nxaWttZ|=EQejage1Cbk0=&M>+Cr)xx7+=*K9x=W#vRnz6F8ave7uEC z{{Bi46oGhYv|!8heB_wx9hDdhkXnkYsAMf+qQmXfkHCb9T+dP3h{}pVsFsvA6X5py z_AM=5`u#cT_Ce#t(8G2+C-6VlSS%1+Z6TmOy`1+62R*HDY2Tq=$w9yX6{9DDeqtM- z?PYaosTH8!^twZnnDm1@pX?QsG`no{$JNZ+NGL^Z2G#@xf%%%j;3!#aas@~I_wpar zy(_FV8xCVFo}RAK@_+B$xoI;(Jj!aL8IJ0a3=z-EmB6+=`QFI2ZwIC=WA=1|BYE8% zO&)g%3FMNosm|6k{b-Fl(v?B?adJ$QuSLWWm;FAKgl1^*iy}H9FJD`lu9K;!^dj-Z z8p2n+kkqYssDw}~rmVz3eN_?INM`Cjl#eV-Cet?GdwfgULZ1~e9Yp&%t3#YF(1P8* zUO!Kj-tQXnDYyc=A<)wZPc-ZI;q*m7`I;h393g|&9n>Tm=>!QW| z`czKD9UQK&4Y+0H%G9Tr2l4e18PBr6BE8SAt3eI)Wz5cBg8gXM<~T=_z}ED_)@GVM zfja+-#tI;SlsdDea$zxGGS@ZLRrN<;dlxZAh3%T0J+H8Ep_=>4$}#DJyu7-rjRd8P zYpXUumX6n0F7=8JZPMZE0fi6n(n^Yp&w?NKY)X5nH?4+eZiD^r=fKMPSF~{mEkcrK z@?u29U)`z^)a}m4K*|l9VKKYpfp3LasB)y`>x{qNyeU#*wUK4|5*d~7^+?jV*@Qlc z8R>1B%Ikt#vySg|QCDJ+d}X>Bug~pW3B30EyK8H5xn|!hLT7oZxcS_-=fC#gXAm$I zE5T ztz`BhT(#yIhCHHCBI6*(L(&JCk?qVYNpN6iJ?>z5B#M8sYun|FdgeXUhR$n zAJt@W^O#+euhACK85y1S_bUzAZuDOboo*!v_s=M^a*T{2M1H%uc=RPALZQ5#VV#eI zgM$n*iX6T14XDf7pqq+ZCOHu?6TS-k1W-#en3jcNr0AIe%&f0c-8%vv`#wao$oW3& zWsdo@`tc(y^-43s1oH1|?hfj~h zu0A7#=+X-D^l834iGXC{Dh(1v?Z%NLHVEVR;|r|o&0s-Z+S-b+y0_an|02ysJq%7> zGbUDN=$#7vYD<$fF+Xz(jX|E#`f{ylZUcsk)=juJCP!rEFH1^95W!-+Sq?T%+=(wX zCdkCvCSFkj@^ruV<0xsf_Fw@r4lQ0&sH2#ezCHmY$52v5QT1d5x0FIiLDStBvPsMf zk6RnFf}*0{uoM;6y5|FP6tB(p{39cufL7<-Ra3Coi(gS>qlx)wJ?eU4AJ%|i*HH1t z(|VZwU_1|VGtoNRl+kl;e!1>#!EK7g^|%7p&;5k%01j%Z77YZMu}UMU-d8coLj;az zq%LEheGCRzMPG$SBfZ~|g_T+ODVA~KM{t4lgKsBVz6KgvyVJ9$n7W>4p$m$)u}?9h zW=oJ{M#>{XzJ%L8TUF{4{H{7{x5#X$cA`+wvo)oQSuCZ3@*)yDU%zJ**`#Km?bKNx zht3Zja#ujzhcy57vc{KdB4_J>4pqckpXJ_2B+!UwgxH!iv;q zi!#>a{No9gm}veZGvMyQD>b(l{pXn<<}D^Vh9&r|c7N|{#y!vRou_H&FP&I}Sd02> zGCQuK8~hx{0|%FePGMdDzix=gH~gtuLqR${N%1Y$0xCa-M2$vU*3=VrGFgQA!I={Er zo+DAZ#pfS4HP|Cb?N$$$Ab$KhMyuBNw)Aof!k{}?UH;}dN3K7*;B3mDcK~`j^JA(k z^niGnCqgAnXJH0sIeE3Djay?mH`Qp*xQ%8u0hwu1Vg=Ug7u1*I7X#nLWJ1(IpJE8Q zVEsbCmv)9nB!1!xOkI-DyTRa^z+PAAQ10nV%|-aUbmZPSeyKQhL@=3Zpn=GVweJK| zP?YP>%TU&qnDn_B!$ov?Stho=pCoFF2}+BjKOq*r9Pvl!JvfO5J#K}$kJ4tpf9<-TALYzCXgXK&jv zf)zoPRlJjEOQjT#TNK^o4*cBerj+0-qh?sU-_N!3m%Z()E}LOxkTn}Aw>5ijHCUI8 z^j;jP>s?_7GzCK>p?HAMg%|NfUbKhjwN(~+d`Fsf@y25QqmoGZvC0UG2_`|rt!1-> z<j^0D{=Nl@-R!HuNC)F; z3|)Ack@eX-sG7(t4h=jfwlLtZ5&XC}{ih#yMT~?DLM1gODJpuHW#KL%2A5+^t{NpxBMJQ{j8{NS8EYzTdkN9@6e7-?Y6D>jVZ$aFB^>(vj!FmyRR(gWuNMxp2Z zuQJrO_`hQCT$jOL_j$0)pCn5WMcgW6@iiv&wZ2TIA(LO?F3a1(`=QGtjxlFN1~ang zc`;@S344|cu_UR{Sb();+(zs?%4^2O^LIA>Z)He)CQdNAPqQz^@0U|vPKks6&{Uum zORm?y=a6?kn3QCKQQW&HzYf+}8SbCXT)IbHc!nDMh+}UazVa>wjo1)fwHz1h%?Y3@ zN$@+>AcIuQT#+#d;K8<%FO_K>G7NnSR5CnB!RTrTe|8pTRFj#fLJ!s|f zfS&`c6WC@9K@Y4w^uJy-ub){;#l30YiUA>TV>z)v7kPUx`;<1GW+DLH2fXMPR2`7n zfU0bz|p|w!G zDjT2DRRVDf9okhQm#WgT@u&;z?~ViHu{xnYm!g=0vDxoqvt7{KsS9GxhTKo)H_uW~ zKJr?-ldhrt2weS9>-CdpYVM1$zUKPL5;t+IX+eBUul%Nx|FfDN)UQU&q7#jZU3dx1 zCHOBzob8`<3JIF5&q;#?YKI=5y;VPmk12?kO(HqQ>>u{ZwU1*nQDFhdv%8n=IQ`Kf z(2DZ)Z81X4Dy!>>J>ZY6yT}PMx(bgNNFd*k@y*o7S;SLvYaeRPuZ?OMC9nS10&7pV_`4LD1)_Tx5>IKruWv?8iK`~^(OuJdI)v| z%QIgiYqU1}3G2agIV8-qF}%uc>lq;6xGwnoJlQA@SIEM`f?uyI)JHrn#&1-N)>&RW z?Fmd6P8?HM~@1`wnqvw zgxH4Ic1evvmes3*o%06e#q$&S5w{?q^A4NC?mGyWfCSheWa#CCz(Q*CNOBV@*=2u9 zqVg3n&t!3k-IO7(a_d3)NnqjE@;%$Kftu}~)G>DWqn84=hgCN_L)*Mu2G4HVZdV?j z1nO;+E!a1-ur%KZ-0FySkZBf#6^Gh44(Rn2Nc5_|%A)N(wk%L<%H(zo5KqXKp~F*Z zOlSVlB-*Qf;H;lzxUMVmR%t9S6Zgud@^Lq$^-E-zt!V;YcRbx+SM)6NaC~jFHk->% zYK+}5{(3ql+nO(*Pu~){m94Fhesq4$iUh$Vp3AY=M3I;haZ!JU!^=F!tF7x_2cNmw zU*{^Pg_%W%Rl|ay=wQ0@97uw}cw1ow{P_T}jFH^<7y^L+cD4K4m6Wq|j}+6C-YWO? zUnVC<0|}v)vvzJ{8>`ic`SnR1k7TO6%sGY&h4$sf5ra zt(np$t#N5pxjd9hS$s7lV_+t4{H=!cy5Qu^l9gui35&a2vylAeKmwL=$b4_odY$Ux zyoY=*dW)M$ge&OINBN9}mz(eB-;?^`cd9#f* zPIxb*tMw(x%#~1Ml<8jj*^z?MVQ03AMz7HIV!uGSNIqoSvTRv1Itj$(FB{?V^%`dZ z??tK9)h<|@M3r%NzZ*5&nq*d6EP*7$;Zn%)ZIY_IxT>nx?XFj_!SS-(Iu{L0s$FNOT!x}YDajKg z2uQ3=Z5Z=Y%T-^;syo?t;?tCK<3_2Q9g(3n=YpmEAi4h+%{%$0?-P}%u~P4WBiM%NV+U15FH!93x*6^$Ab$&t2#x&F9>mQ$~HRX2AAA}zpti50oqY_GAERfDRE>@-CE{VuS zlPjrOBg3So8(k4|er?kiQ&=2il&Dj5nEnEUI8Jh^EGqCmw%xo|3goQFRE@;5;n~K> zBZrD;eDkTly!)ztXCUY{)L#T`vL_>S03dXRK%ex@tw2C&Ktd`x^2O(%HGKAINQ&Oo%w9=LOCivS0!f4+jH6uP zW=Hh*sy9{=1QUkVhwYJ&kTjjoM>+tbsPMCOhbfS18!jPf{BpS)}rTHDs_11+9u=4i0 zxqIetOjahaODO5YWdhY4i@6=8ToiDllK(<6w7zowEYnSWp3Xm(gTo!Y%Tan7=Z2-2 zU2uCJjuf?X(tgm{IBqCEc_YnXBB+n?W&9gS81`l{lH`K2k`ftNUdc*kFj!tB-NxcH zjk(awGW65y;+^_zV~8IXweb#}Ckhprp5#Ei5?N!e4J^sp+Ej(1%vN`KCvO=UDQV%m zvh?C&i-W}`;Do6v(mnAs!3!wTZMfbpaNM8YvZ-^}own}8R+*+KZS#F-xlmsPz8W;G z;Bh?pbK2GPg)1Wwe;D^cIh9bk`-pd;80 zSHL*>c`csgswde69seDs(~OivZ=#pY(Dgg9I852l=ol&f&n5J@G~+B}n`o+-a!m`T z>AgNg$^I?nj3mdqZt{yXix225bf%lcoJ$^g6p}~}EtUoFs;o< zWeT?zH2ORAkT4GZc#67^W*cIvp%-i%zhU(=m{EyAV2oLFYGPqm=ipt1@eg53n-|x0p zHMNU54RpKv^*i)AV?f7oF_^-~r|jLfofQ=m6B7}EiHpnTdcHen*|MNq22%@Q>_w;5 z5HJIXEx=n9bXMD!Ya(@R})URXTz*U10OJE~^>+D*IZ_3#YS98Nkp-UMUv4cYOdidmv}#M#UW4cRtbLypOO-#IA1F>Jkk zOtteudtvG5_1a*3Q9^qf>-eRk&wQnz2;`(PQCPuy5RSogLu6d*^{R+g2S=?2(h%Bc{!(}~6I7ULrgA+F>qMSsaPag;oNGelMNmyuTA2Ve@Jbb{ZIl4x z&68}4C=nOl7nxQJ-9N`fv?tHXZBK3IN6kf7HSXs7>a`p?w^Y8Bv6FQ6YrVb;%LjQ{ zW8AvA-i!Kz&&m^x<6@6zZi0U(zjH3qGgoJi-5Nfp9gcGC+cvT5I~%hlah*d zq-b$wvwgJHq;nLS_|OH}lgc!5#*g*yM`orSO5KcIxoiJ1*wtd&W6Q ztN>_x2XF9yarM=4QFT$f14ySJT@r$TbVx`D2#6psl(dL~bazTCARr*pBHhi@;heM2I(zR`&$AX~k}?$bwJhl3^L?cu9z26F;jtuyNJM5s z=<$Bafnf8h0Dg}Py=gymG_f+DpQnZ8{&Mze^ZtuX!*e(qg|gN}XX z`lVOXu5j0nDa32Xi9;Wq4<*?}e1B0*Y~x_>a3jSBHkbf)${q+L{4kDQ_@r|0uYa;F z%~=eQBCTJcikDWv?ysH1mBLDg!lbcIL)@=SX!sa@3f;N^K7t-hZq|3c<--8y!#s&n z&sKkQYjVx4eBieHf}+EIe)_ZwrYlJ8sc~|}b8vBSRjaWz)jLgD!*15)CF=n4%Y;@9 zjdbev<_cNyRZCm@Y-X7AYSw}}lUz#Lh&lhn8)PXhWH$JEJ-@dm; zX}s4-oWj-fy0Eg#@?eD6C_>CXmhVBH?+u|mZC$@$5lFm{aqARcENER@1bX1~S014U zmxGYR-vEL&2q26ZxEh>Gq@|u8ckCG!<`(c|VN02LeByt%s6)cN>7};ylL~Y^ADJMV zaRCcICpKD=@}T2`cd)slZJZv1QaevA+*x@kISH9HWcPUC3|xeqz)zoWsze=t@*6Q5 z5765tnabBJu&G(VfXIXp%z#7+SfzGg*UcZ8?9{Te%4a76EknKXD8=ra!l`XRmuIn* ze&r;gMv(g`!@<+yE<*Ccfq5t;CkF?C3oFtj?>n6?z-9!k(5`?WHSpA7Uq1j%h({}W zuLT&FO}CepdL5>Ky}06ydqRs`I*EP)$|R*P=!8~%hA-p?($22My7n644`)5u_KK7Z zucqAxQUr9WW3D!>!fb$B7p49wc92KeIMJqk$Dv-y7>7a07*&Qzqjza7AS=-Ts78+cB4!tdD={p}pZ?kcr2l_L$oj7Y zPQmIs0o=>-a;S5tCL^D4X_8HyIdIO{*w~QeCKr&Vz&4X`HP77LVd55Gt1_^;zW}BT zk+g0Qn-T~Y#X?EtehX_`F5@r^Q+=1lii2y$U?Z)W%+@?r5oGxDV_@uI+taSjX2~B~ zvfGdEubedBM*M5~N0HSXf1%ghoy{_*f-nSua26;)EZ9$}u4BNK<>AQ|_`Mbx(g!zu z6-^}V$7?Vo40}QMPt4Eh{ie~S$Qo2pAy>Aj*iu?Sb63k*)m$G=fpjvFXO-R0x|0d7 zE#6{%y6XZa>c7FqKtKL|!3cW-w)^)3RnxZklwi6gy$g1^)5W@P5|PofzxVr+vbYFx z2-yoRouc2!(mk;LelG+roSg>(ZyN*#kAcggiLD>QyXquLOMq$8%Yz4-QjR0}D;}&e zmaKcys8C?#zo8}gI~xJyUlK)4hp|sE0l-qff zNr<6vQ7Ysxh#a7=fyI)&k=Q+$Zw}iZZAbr3<-K#auhClorqWJAxi5C@s?$^yr`4F% zp{2@AxhR{Dld$s9pCC$0#Xr*Kz>iFOeA6{U1Wnh-!ft=mr22FR|9~{?*ru{IjPqft zOC$9tF9znEKMLm~Z$uK72U0ix3^)q@NRV7cC~@xR3Ctxuo3^t8N#|JGfWM+4f+Qp) zSjc>nRy3ywMlM0f=$7vhpf!zs}xF)s{nGnQcXw4+DQL(>s zmz+Guo-0rwDDRXH?qs07$D9>gq%YEXcw2opv~!ZKv8x7!jOi$_PujLNHTK6S3kA!U>ENbpSS=IY^+hF$nyX;h-ZzeNpN zQ`od~Dy7>iD^vL$t4`>Jw5M;0t{Kk-U$V@iepPoh;TUvFj8?T&lN0W3y(|CQO82XKBjlvK^@k~4 z55~VVunGE4G2tc?4IaF@J;}S(wJsWX2bfP192{H0)Hb0Wfj}GGAhilGiF6;(NpDNx zuw@MkD7(s@q$d28P}Kd+HQ_2ZRETln7hX1MG6N#%+%y#NBRdlc%P{_==+&Qze<%#( zgcs@h#B1Kce$|<9u*T{YJ|mwsw1;)L|ESqt>a;l3*cPsrho#}Y*mbr!>+gSQ13Tz* zt*U1y+&$O6ND%ip*-h#-cOYV5Wit9Cbl+e~H&4%CjNbS905rU;ejA14`~!@dZmmO> zF+~wEDFZJngUFibT3xmpy53(I53L+KZxp!jB7L%Ecg{lPvi9&Grt&z~r3yu`}4 zvrtPHIvl77S*P9L+Pc{}R6EO-%%VHB5wM+p@2c|^_cfVbpRo3F7W1P$xlE>NrR5Hi z!d*F4slEoayX2#xcG@-hl%0_y8oQIJJ|kHso!4%!5x_D^fe6!h?4_C+IA3(YW_VVQ zxg6F`BUm0NgKW_G>arr+Ud__y$;nA3`Ok0Py)yuD4$#UWsAr`P7_b^4fq{XbifD~~ zF)+4Rn3?Z{J8l)hiuG#`L4pdx$HxZ{HO3TRCvRT-#L-40@w&y2R?KC1bQCm-Ktb|T zfhl0ycrxlzV<$a{iMHqzQoI!vH5*xqoa!KGLkv|^$5Q_Wb<^rxNjA?9_t$lOsyK9f z56XilV+&)8w^n;~zngc;uFaHM3DZWcls8#@s@F2S_)umlw6CZ9BT1JysTe#vV%^=w z)o5sS20`m{yJ0c4@Vn$9&G;SSywc(8JaFl|{hDOmiO90li6q_l4An zS0`JKfkh9<-SCbM6gPmC01&D3m3X7ips+IlngELTZ6|mdU<;{Rcy@duh0VB30T7BP zI4KC1oPb7{XLvzH;^M8b@j@rPZv%iT0tz|A4TvfGWr{9HC(M$oC`?5`{hums2u)|3 z`;?o|uThN&L;#H+&f8ymId?^G7S5Y(s>V|}d&m8+TpR{pCxg~Pe7jw<`8mX>P#lJu zHG>C7kKUYy_Wd<>nXRozK`tzPs(pFQ^>H*?dqm;7^nVd6zL)2*bJ|BuBQP5%t*qpsA-ojG;3 zm5rPG*cq!^}yv|Y5 zaM+4Te{OOA72Pd>hyssdrun5bkTr$S%Q%^L+4Ra56EGE__I3w|RO$&TdZyGEyY#-4?QC`-t z2pX8CUqtjRY|oLbZ){H$GUzP@AnwM0DZOQYA6DH}qu?9`8^6~1r^mDQ%fH3~p#4YU z20A|H8NR-09>%ap7q4cA8)GA}HLLMwT~}wj1cK}g%gotOn4;avL`A>o3y+J#QVHPg zWZ9qqdo&HyctMKCVfh!Rdrq^uKcpflJ}=7^-?NcPdatWX2Bf>PAp!<#RGMFr`4B9I zA}IxwmUNIMZWkDql~*1Tb#~aSuSKqv5FRkub_D&eXF$m|$arAc@vj zdLPT11*6ZRj{2Jk9Aor81=l=&_IasY)iPY`jm2Ji^>C0b!vbI_DtdZ)i#_0~FD))= zpq_z!$=uvL`DlB48$hPcc4x$f7eK_r*V%yZo2Q<(_Lz{ilmecea*UsGA}Vw#QI~4` z>@|LK8%){pAFEEmE!6`HWC-i!`h`uB3oy^(l=n{}U+-Ga-+M84M3P1?t60*%*%jAb zzw~-WqQK`vK-KGPv*jV%0E|NSiz1TfRE{^+VtLgcxAMKMBSutyaekYjx!~%V=!;fq zwl3mn3p>ZX>mh0v*r~Tu-avgfjm0j0$~yO5H-V2HqN{&TbJOK$7xDRp_)&aD|Mhak z9-)t3iHE4zhV-{|%m;zVKLB{%3$!OjIX@}!Z3MtozeakW^97`lQVoI^3DMCEfw{%S zr^*#oPp(0np>ZLY8iSDT`eH4u;OoEGH)~(Pz)F(1GC_RcIXD`infMS2_$U&3{0^Wy z{*EcW{*=%|_B1NB?MMFocp1)^El#hTZWaZ$85@`}g)~+px;h>Sot`jFxoNP6kX6fR zyq~ovXt0F^xvsq8mJ~T8gE;x_cA#iOuCx(m(++WxJIRt)ZONcLSnBzOV)Fuqf!JI7 zV3L-)c%e1xKDvE5pg;=CbrPbR8K(6<5@ju@D=#^WR*Mb+0p~0NdhO{%dYQ z$o^7b8KO`J9fIwv3ucZtYq>r<6Ye)KXv7@j2-4KS=ecN%1}VJx@K5=e~XB zsf7mNlVdKN$iz@_ySzY=ysEqW+DWj30a;t746r@-u+3+G$oquB+fkVf!u;e!|BXei zy05zT)zSzlWWHgkwY7QY!=W~8wmHk#S8;Wod@%X^Y?j0DQ2);{o1j!%a_z^A+eX)8 zX%%K4XWI|9O^L^EogYAi9rvi6ZYHW!W-88Tn;ltl2rqj^UP7qJY?Br^+$Sr{y2RH` z%{TjHS+hB6s}yimXio%1X)Zt3T>|67+rugGy2lXwcUa=-`CM^KLR>U2)%gTtZ9!u4 zdDz#x4i+Bk=^=)`Hz!~-bN~&)Nm!Jy#_KIc@_}y&aFb*$oUrLb;C&V8*Fv$P9FtW@;#ZQvNe8C(mXEsShz1rJ)%)GQU|cNh zAV-200X!K+wr8w4F(|>tiPAiKh7cRrlz?)-drdbsmKvVlh3`x8*Pm8OQKpO(-PWrI z<}Q~NI-F&y&4e3oEDZI1P}gs#!?5>eZZE|2wjB6~>Aa2av-mU-ryQA`O&5;a@Ey=llMQHcvWy>CA9 zIREX~F_J+~ReHe0LWGqZ6lk{jS|V*lcdl_rCBJm!A>1@7)kbI9Yg_Td3NI=0I4o=(AG_2zmQv1D@6{&K9iC3S@1*_d`dNA&*r zP5&3xf-rLLlM2s)#=XdoHD-HacB`{vjtF(nIkp>%_K_R;^2x|*RE2LhR)}a66b#=l zlFOFudpe#hItk7PcQAf^=b@syu14i9OK>J-wjd`JE%r zil~Fl4A`A_vp~jgF2)R0B$?n<^jHkmEcZ#4JvZlUYP~`D*Rr^lWw;cVoNKz#({&(K z9K=ll^i=rmuP8r)uOWLA6>I*uT>IiXp!ot|ZGg6J{KX+eo=f2ybuyf%mNobo1HSm? zx&^~U+%Q~Z{2OS}WT(oIjEm?_ugVtK4#F|{j(X5NC1XW4jg>nPsD~C0+Hcv@YV={ioNXRAuWHu|C*aoIJBSesHGsggFnMlDzB}M+w zG*Pm>-H+x^#iR-=(T&)kfoN!rdH=CbGoNXkW(L)nveMx=1Rgq+$ z$W!Q$&K|McoO(mig}QZ|{D;a^xnU8T*NCX}aoTm>~F8@1VtA zn0IeMeCyiP$NLAd6ktX`)|1CETcQaSRWwl7XGDIW4@t}%Es33Z4ZmHE_>?}{%TQQ7lNgA4J$kpe|)t_`m8O^?XwBqk|p5?8K?^q1q^VLdgylToXalIOAL?==`JFV!J zads}|9}s1|o&ZpW@xiPYdSB|$qf$~DL1c0CQwY&ilyqXY07@xQBu_n~x7V@MrZR4` z)rIg5qEuxWlk8>Pdffxehj{;^68}_3u7h%iLd<3(%W}#?PRe6W24l{1$9m7O{zpOpM3r zO+0Lu(;|DiY{lQm@LacUNbIKC@r~_#Pom^C`WoV}EqD>T@K0tZ(jJS;X|nDUkAWpi z?zU4YaMlOFKV1k@_v77qPL31)=c3w z>tZ{jH>^}&!18W;KIkdG-Ho)}?djLlJxN1@x_m0TS^F0%%_7x;X9FmHmV@3A{kOnP z5F8?B6fxO<2*G!@wWLdi9v$g%)gl-n{aY2DKKpM^#4Phs%xq3;z2^%&^^WGnQ*Zfq zTTOhQz>HKH)GsGAvmkyi7O6*6UPt@vH~--$Q-!o39&T;G`b4#d3xmrF35~tms^8;% zL?I@S&!Jm8cDJ3$Nic8MoY9-Rwa+uluY=8vUhlWo`DWoYjUVlaXow;MgyxiNfm1se z^S=f9VCS~&0#lJ|5y^#Q(&rtHr0Tw-{pQ0vp-%?y2P~TR?^ySL zWJJU;db`RfUhJtnK9zt?jl>gb($}+A;#Iqm-nut^LM?jda%dMC@7VkqhZ7S_{_;uO)n>g$<$Te?e1v)Bjkqb|qBeeE%TqF)J$l6Or8S2(*Azi32LXFuGTW#l9O92>5nAd!;D`Kk3~`QA2tpXq1#; z^XPm#FFMr*{U*%!z;L(F7j2Bp*Ijb=>iMo^L?q4}itv8hj%3=2EhNAF-Fus5O!A1U zIo4_cg2Dq$rOgVj@xo^A)bY+scB+a{*7@LGMUOXH?WHPjMh6OPuD1Jcnw7oxs8n+Q zo>tY2C7dxABv6VoyBIZZ^MMo7u;yk>6NVl^bly>3Q-E}SH*z&*g_JhQ{19T|nx|R{ zD6PXD@4}yQs;<5`1Zk8ZjS4izzS-b!8sk4UU<@9xx7u4~N0YDH%q>-j2+DdKTpWSJ zSH%DE&rHPWaB}UemMfDIYtK`e%Bsou!Ns`YBE2(u{3~-=bjtUaNIQBERT_tZd8`I5 z(4yzl%U^MN$c9c*++F{g)aRzRy3==a;$&e+CROFp&0>sCc$v5D?Wvgx3!TTj1BO*X zy;--Ut9Zl>_w?ye!(;i9hNd}86@5FBPlPu|4v=x43T?w@c16R4sWtQ2`5RjZcgG*j zJ$2@ibWU>(1}c$v(5ib4cx)z$WxPj~uk3C1R+@eKJnPWY-pUUe?-`Mo%e&BSW(4;& z+E&_*V=>Jk+6q}Q`le2*pV5(Nik@A{uL^`?$vdXAOMIP9d@rgciVE&98E+@rZPlZ1F8E|Z2?Ni>-a$y)Vj2f1^T zIzG%wJ1;c9`rspO=grrz?<|9c|{cAwZvk6 zP{^rVZbL6q;?g(COdD}>IY;oKt;En!@<{RYK#ZdlePgZf2y-X{emoN-yG5hM_hKw4}{kx z^Wq`e)oa&y=RX~9l@>IwIX&-k^F*Ks^NA#2Rv``{){~+GyXO|Uqpz#N#^yPJAB`$(63&R{`+4Tn6Ti1kP_+`;z}G)UrZA* zAjS5|Vv7rrzF-`2kyY!Vrq!KjGWfU>cj`KYLoq!$f0#pL2@zVtW zSD^x_qYtZSDh#w5IeXAtL%AuD^EjOskWymW?m;21wIU^&4G#ZA(2IK>a1Q8KA$&0O zpB(Llv8ImY?(P`QmA$_%Km@N0sYdvO5UOmC@nj=PTc;L8x4D~~dzF;9=NiQBUWM7x zs(<{Rk@)Gld!xP}$7GLs?2M+&`ds{}h(4K9?24va;O9<dq;__+eUk1{DQU6 zjmW@c8+a49W79`OimLmgA( z$OiEOmuXd)j(C}eb>Qu%DnOO|$uoLTscurx?6Hx90`A4EyNMHK{wJ@0P$ElN)5tj&-15BWRoblw7H0BAigIXnA#K2`ad&wS8h zi8tZ+=Q~Mh)BILPvuG&f?bN|I-lX`Cmav-`Zrk}*r!FUUB7Zow7Gx=0rJ+20lG5B=qX1L!_U9$BMK#o@Nl9^YXTXNsML$W>X_uUG5Xb$5+aUNG4PsGPwf$qY;i z;&pB0t#3(Tt%67gkTxK;xQ@hcIr&ApR>XeO(QXpIcZ+Rtjnj|KZ<;lTOR)1H5^npM zV7CotSitma+8+sEk6%lB8sy
9Sgw|wdtkJ7U5N#B5N>F-NbV*&T9a4eQMgFc4%`k^xV`nAk>5P`{s7M@owmtuCvC2Gy;Z4z(qZr%UnT|T-%lcSM?AkV z6kQvfLV=7mmz{j_qqidF9-z4GoEk6?vO3j!;UJ?QM8D%?FM)THm!4eg33#&Z;R&* zq0&VrrT~86-9urbzPgJmxSMu(>tfts8eN^5H(CFk8-d=;DS(Ft^=IJX`ivrN$Dp)PG`*SRhU@n~8S(k>4FXIv z{cqXqQgX=0l~%yz3E ziyl7>7(Hi>d0p{Vcq=g5QTi#D=9BH=!nSTaRjm|j7L%NP|DU7e@xAXNuV1PPTD1pnxUu!~NU*Wz@mFg@P@Ejj>l7){jazDQo?S z%<}MDRb`eXZsm&(>S?MPvkyo~&uMF_FLlv$1kfzkG<65>dUA`+zLQ z@3|E3{YIT0{rjNhE+1rLj9vl{6q5* zir4IRj!UilA0DGXI;7sMKeA|HHtNX$B_i-uNrmzoewD)n4gj)ZTM;YWlBy*rDym$~ ze-swf!ZIiH_ho{?`GY|K$GQ(-_ErX+b1|Gx0HNvXf}!Q!;ip(W#;!OHmA1A$DyK2nJ-OL z4T=>}NO7qS3u_pK`EI&LxCXK}6T?tQY&oyM)c;6|-LBZf)cGG4fTtnh6{5i^R0Q_l z99CY?4+w-i^`$$)@rQVn*#bkuhBE!w06%c^CX)!N7=vUn3BemCdIf#3_2a6%D(nZI zw={oncx|B(cSl1o;MraJdX{oLbMz?eLYw49&9(eHUp~CCCB>pQ3PTKRZ)hc~`+bCc z^#-&5C)N^PvLgmV!ksT3E+f}=91+BI|BXW{Fe)3oubFH;ENnk}mcX}omi z_RiMx!7xnVm9#>EsKyYR5NmZ|^1M3UJ;8n-QM z3=omUCtkacZMx_(3nNywa4oI zZ6UGbk)#ATnhP~CckY`-4$ih!o)b_AF_2M2?cHdyVSJlo`tB(8qTFZz-`G=Ekw8?d z>O3brpmT!A35v+@ijUcw>3{F_tmA3?Mp}gODIGCUx&?Ns8};?=HTM$t&V3L98KWo=iImr&E619*w3FN*RVCCvQ-GTlL zxr}wt3)`8_6pMRjSAHJLfz?e5LkT@a?47PVejsF0oKKkW< z`YzG?AX5Mj77JAtJ{qYzxd$ixku@>Z7*yL+GNYyU6$@D@V)vQu8%uo|ev^lViBCj| zW(KBi%_4W=h>7L)JMRECnWd#AV6}I4VpaxjK1Z&OuW)z$9AUvThS9RWuRSW}j!CKt zCGKConyRB!ZMOT@w&+1$wjeUimk$j-TMlWq332XCnwIbnQ+2N@mxQ*Oo7kO>8?rI< zeLt*d)zN)$U;9NK5~)$$Aw1@sVvj@yBel?=E`>=lKcKGz#{|pvRBI`*cnet;$8No@ zm`oSa!f^NSPwXdUau!dsDV9rR+@eQHVUdw49MfCwyLmg4zlo-QSd0o;;7YJd>G*hE zpA*N1+v-2A-l)JNBuPt4+uK>je$d?O_}z8c&;HQ>-J#+Qs?}i~W5eLD;(}gVv_CUu z4qvd3b*J}g?9Zv zGi2_s# zq874xmD@-Rn7hF2T<2=%%(|Ct{w8d(f0|&;j571JB&`6-b2NaU*_ml=654WKCZ*fJFb*O^M!PsS3a_)zEApq zBukC2j}}d#qh0X=v{$3CY1!w{zmv}i0){RVgRPGZ0ksBrZ9rgI6IB}r(0XqSU5fe`dyX+$O^9Sx_utP~E=$AshZXDbg91AeNb2RbP(+*S=DR}|69pG^$ zC#~I|D+fchv`ibB+U!vmKQ6QT57@Y8Jt*jbytXwq4wdM;cc^bnpkuH&W3l1Q!W>v) z%{J-^_GX1nz~5|7N8?e>=(|OU{X53wCmNeVZepPVco|Jiv({AMPr*EK<>^OJVAH(e zYUk0=ZhWvOOTtQSl$5<{y$a?A(JYjBmhz~ro|kEzD0#72ur=@z7pEfbtq%r8^F zl1NH4-J#$$(@Pi;_QXY2kGbbmx35jbo(eH{cTA-tqmN8Zril$77%1cny_ATFd9HV} zpYY|&pd6EY&JTaGOJJ=IGU5?Q<0$kC|7+JVEL;p$fx;M;78qRW0`RPU6l@;sJeDaw zZk4fX$sqkgi{04Uw4DN667`b6%ZDX!!*2giYs7-W9P`+-%+!h@D6dYrBT* zH?Fb#v(;t+q|s%yCVVu$7~d@)P;M3nj&3zHYm)%_C)rV1T9GXHr;u!G=w9QUG{e){l(TLfbLgQBizqM_z#jZaXzg8U;T^>k{LT&S!4y+ zexySJCqj{vr=Z4!CGHzqz;gxfy^Nmi0h&Owpzptc)qBas_;D?9&_t*ro3g1x1V6|Y zh4Y`U06*_e3q{8EKRI6pG7b1w{(cHGjkABCu$4IQ%)r<-4HES48+D+lhY8;PBhU#q z3Yt%h1B?>H!0ZjYI&SvNA0a-FE^dyd;WSzWtA9*&6dZfsb2 zEUCRaB%mcV=gC)7>o65FIe0SAKU}iC5~;wMd9b|G>b7I0PK8 zWfZ$8nHXg#igt04pSMXY!tStr3=#~^%wI(%xD2{8w8(SEB{lHk9s4Psv*8;rJ8W5uaNZ@|3!VBsIb}AGDwx*} zxtaiIb-kIOQ3ZLfmxS5Ng<`ZDjT9o1)Gpdwl+T0Oo9YId<8;B5oL@6%^-`kt*n%5D zzOwKxmGi8`8wg4=WWplDj0B5EEH#A(-1k*mZtl-l8;2zKBHlVW*TEX|H7ZGHKU9E zfWZ+JVwE(!sPCHdX{=7HevM3B)+3acY%t6)itbIJq+FSg)}h)%jbAmYFE}9(zn$;) z%HpMRf$QJ{1R_9U@~Bym3q}-eOtH1K1$Y#oF@-xc_7C7Mtw_!;o>sYNy=xIS z`f{ul+1YKmUKfXEY|Lg&el(Lw27yTN=gFF6R-?!*-a!uZJq{b?5>+UIt9f% zLyBPIWxSKGdEq$Bd5e;eQiR4u_v0(QJ%Tx^$` zB<36J&0OdwZDqQi$?dm)c$aviJf(~V|(?hBV ztw*EcqGDSG^~fiR;e}^K)#?+tlOUhydupJWfGJ)aBfPB}&Lr~Jaj2y+DZKcj z*Uodh$bGxGCW*L6vTbq)_PPO3K~a z+EMHao=GCd1k1z_nvXf5J41-P(>Qr%Y_M^zQ9?(j=1;Am%Ed3x?$x!%2wBFotLZf) zX|%+9$5I|tbG4gq0T^0PskfvN@Kc&kEt`>G`fL~$sk5x4_Gj8xNGBe|k-ay#0f<0vg7INqYYwtb`z@_n zXXwbUPO+b74o+GSbhe^l(t_BG@Vwpo&uascSKC7>V`F2EWJrrpIFY9DW~=#j>+zgd zOz7@x<5kL@*VA+1bLMh*bB`JmSM|y&lOEyy+ zL$}f$TO+sFKGTYcg!Illyy(Yo$bL!G-MT>zfCzw0vD zbfK&<-^K5H8)gZCXdHI2rd8H~hbTRx5% z!)>iLre*jiuokN!su`a@f7WsZS3XSzt)T8TkMu%{jVXR;8h~{O@w<^-jbT+_s~r~L zdO+F6L%yslLL#8dkC$!y@V|m|WdD-KbwCiO+jM5xf*cHAJ zjw_pe$CqFcgd8}e8h0s~f&@x|`seQpd++a6tOu`M{VfpEKKty-$>rZTm$j^7bY2vtM@CO1M6k*{f!L&98b)NY}t(r|8o{ep-fdfAW4e zM+pre`gqP=&8A&o$#>*wi+og{mKf-1`w)!5=UGL1@TIUQU^qKmCdM6E_zY#Z}A?@$m z>EMsq@rmj0D7d3Q#p&JI5hzjb47Gd!4v?9~xOLSfq`V!9HV!!z{5`vOWKw zBE=jjEkkrhV(Hv<>ll7kqUiR8^Hb1~4)pXs0;uM>bNJ)S%gd&N2wQ-&I!gk@%E6D; z048X9T~z88`*8es}us(IOH{~ugvutTZ50IHtWTnaF7g_%${GjzS3uPy#LhM zAx)Bknt!T`zHltK$9T$JuPOH;&3kh%9BPoB2jwk-QOexq&O3t;0V~FHqyX9*BZ2hl6d2vaQtT z**|(;7KqfzM5N8w|98{Eu^e(ip3$sOkO6Ox5}kbS8d8?RJ{@YCAAn` z<<@9kd?_!N3Mx=F-1DkgRA@_xkY!QHInT~cER(4*HClx6Q`xHlH;ZaFH7non&^K1; z=XSi}!}LtLq34*GVr+b58MO~DG^;4WR^)YZHzg#`$x^s$?<#V=U%@U*t4kDg;~vp1 z_mY0Y&>RjObIa#1meUY^8kE4DMpR$6b@1x9kq~zM0hl8A!-SSqeA2{iFyyrOeWxQ` zk0FyeVXhOor@pdx(^l+i^G(fjDn39sSsiTTXi|y2zg`3oX5~$hmfK@ch$!Vc@p@?U zg{H)g=xJ^Ao_G=T^|d7J)rN|%uBW5XB-w-FH9n{)2nQPQZ6ln$Ib9bL6 zf{URO4IJ#Y+pG}jdmT%c_yxQ&m@T(uLA}_`XU=l~3j8q_lf5k8o3JKr;D7UL6jhvs$^xMIBd)&;S{`#fQ97qmMS=U z;1frdEFBtToNIT#5N~gCs5SL<(NZ6GNlryluX=3yo&mpExu*mJX_rj4_I?OyffznI?`}6-3{woWM*04Zg2|ksElPSmQU!VD zdxEMT)xxqpBCK+<%z^hA+j(*yV%i+Ja{irV<5g`7x@pT%P|yxCnI{UEsNhJHOZ;df zvZOyW?4So0BSmmo6Y@yySvj1rt!2(XCWLHDYBn97kD>wXlOqii#IOTlF@{i3PMe5$ z9H}Ry_?KP5W83%t!dp}P0!6pOmw9H>2m4nQa|bSdx8_9AM<&T4LLIiY&R_i9l;7jP zYqQPSTZ<~c(d&G?cZlnd6&pH>yk5&~JmHueV>G@z`+~kB%@YOL+T;&r8pzRpX9Li4 zM|dqTjjPs2@fP?%(pAi^CEc8$zc!XR(5bSn{dd&z41HA{?ueTaV&<=IgM60?vSEr= z;Iy=*WQuTf--kT!q9FV03rPXa;ON*`A8i*X07@cFB@!^ai4r0+Bz!lo7aL0a1LirK zWF*;)R#aG2G@{obRNm0j-lut=7$3a+u@&tZs5OdyJJ9~d3JlCbTu3SVWk*5z07c>_ zg_%-T?E}W6`z!H_ikifK^m0d7)4ZUb3&8Q!y8Lx=Xe*c@CdPhrWK@k*_mJOFi@&Y2 zn5eOgRk`B%9i*2P7(M>lGJUPJa?F~gTEM%WPe#^JNTUAw{P|lJsMN7b+IZXKIH$0~ zvI1uZ=s#Rt&sxg*?@IphT3XIqSyO0 z0#45RET>FY@{{ax+7!`(vKdjf2QhzMNsgS%9pCZz)ueQ?nV(kgOonnQY)m2hQ&9QM z&OZ(l8q*t)W5YM55Rn)wCfGH%dvwJg*D5K76VsibphYS^86 zMBz{Q!F~vJn?{C$K-p0^${G*6FG!+{cvhi( zf9UXNO|UT*TM&cB;FQ;M23an%Z7^FCuuFzEoJ8BZy5(KM-nzM-7LX0>B3=&*9I16c z*`4%mslInjr_4Bp<;e}a5!ba@;a-o(?DC>%1TOAv1YxS)N@2h=cfwwEoiz=!A79L- z!su$|ELAG5+B)nV(gw^PyErOQhnP!tX$T};WJL6O^_Xfza)%oUwf71}Ha--WO%CI!wQzlWj80F!&}oG;`YRQ{|8O)7%|c=Ety^V~G!M?S~)8)=0%;kfqQLC|NO55kLQU>HEz4&TrK43F%2R z-6kvlLWzOvePCj z1SDkH|sKMv&SeNZD^T(XAO4&q6H*cZvz>>dT?x;+^%_HGe@m_Ac_gB*^>9GJ#K zDs%)XNBQh`OKze$1tj@pW%#>{$G+yBTQ=RYhQ~RT|w?+a_Z&p94 zy1G>>o>#3V%&9%)SKW%#dtqQnUr!gQgW{7m7v6h$Jp*DPvASNamoG)V*D{vYI9PH@ z3ka)PBmND3V9KLaBP?1emd8FsO}NUefdLA*4$8#?<{ zbfzo?n+&FRxEjY=v@5gpnJ^rmhL!P$*%{(ArX*S1@OVPedh@-tV7;8>gl2stfyflQ zmfr0|h81m*#wq9rnhy{7&FAri?0C;@ydP)WT7Ne8u#)VYi}0n9Mjm7~{m8V{DKnn8 z3eRB)+TCciG`>ZVjda9e>x-)&2`y4C$o4M+%G}f>LO6}yq&0h9zGSA`VyIIWbi;+z z`%OMwyf8~sQ$yuLK8GJ?jP$C*m(ZF7wpOLM*Vb?4F4l_@o}_0r_9fBSiKaaL^dQ8* zR4Bl%eEpee+m;i7QvMs#&qOOj^B$~x7s*%)neL^j!#EvlWqji=mE2xHAH`;RVX?*- zC*2Zd2@Ow*rOqH)eKY0|qY3R(6QMmT-A_^mObv>ER1G9}f>m<1(M!!bbtppm6?cR5 z{YC5WaAP>T&`FE_hk7A|k9l3t3T9HyYaTokP?N;DirKB9uC5MLD>&4q|E=he>$~O; z^N=md;QTbGCQ4kGC^JmkBq;37OI#~stH*XvO8=JiH8v284dvugK6wQKl!h8mTZk9%knd;F7LN6d!xF-5T z0*vf4;z+vy@_H*UR$9R^1UaQ$d6M_&MZ71=%-BVGOggn0m3mALi_Q9 zym;ZQP}*w->Vrwz{|z6^`4A`na$}m>;jq!bb3RTqU| z%=auwRhL8uiG8GJA@5C!#FsJ>)TVy#L{ARSMh&??ygFtRNqN?(Z-(}vg|ZHDdreh! zhTdOCkaFoDrsg>}p`LU7LBe7WcbVkToy*COp`)vNlH#j`cTh`A_X=L^91exE6Ja&j zmk&}IDi2LgO;t=-N%+;*)g|_sPEAdX_~!4Z0DFt`l29F}-FluNCq{9N@z}gHV!h{1 zx(CUt1nQeiq;kgwbVjNlm6uXXA*1BV&JlU~Ipmre)oum3_3 z;Rcz14pLwF0*7fR%b+Kb!!nr^ZYa?kwZlx}Ue}9l8h(;Q?YqG+HIZw%>T1J&=-vFz zlsDIYTeP;l!t_s=07dUWeog_aFqMmE-7HlvW*9tb=szrg?T(yo`XxN6x_bv7g1?Z= zuPo-a-vR<7KyLYqx@tQU%Rf7HxV{ZXfW%u=q0*aKBARW>I z(%nd>C?F`^-5pX&N_T@aNOwy~cXxM7OW(EOegEe>_xsL0m*J2Yu=n$5xMO7Reiw`D5Boy+RK+V(=DxU<$$E(xQJQIpg&&hI z_mxUxD?=OC)H%(5S@{`eh=?qI(l&c3W}@t-tF0M5iw}iIl7+UrD-z^iV*GG0u=;@7 zCQri^KVxuiMu4!Jg)WsP&FOOA;`@Sue5jnG8V!HMjaI~#TH)C|VUC=payK?}JY5!z zgzuuH`tg+srySTGF<7QEZ(SC^z@Ax{V^^v#Ww?5rbn^xeLB8 z?9V8vnA&o8Z<}QVe>R&e`%HUiKHJUGxezK>SU2#j=O+ULLv?kvLgL9#nu6g1=d@Tw zRrbWfz+m+mER0*ljn+;}S*^&VhBXv++U$mj&0JxYHZK&E6Ep%zN^vnuC4B6EVJ(Bu zH)&j9$ViKL7g!LOTT*6kWaLi?*Sc92E5D$iO!PvQ zn@Ud8BZ|P`gMrQ}`U5L7o-myjzgL?$;3Y{z{hpp>nXclU2rDbbv{j14%%1jNwevZ+ zNLH@x%y=_$<`b_`mjw?av2`gc$D|Yjt9K(qG82gvg_YPsb)9e>9nVZ&JAyiHU!WY3 z(q=0!n+AtW9PXw{6*^}&?)ioDr_4)hI^s|{o*0}LYV*09*zl@);UazOanm?dUo_#K0aK%@YCr369NgS}Q}1wMzi2rt zrV^VvlJC~OjVfh2OYoYu1oyW&zz14SI;On7!DS9T)p-QzZ-=lc?f8{I%Tpal1U`JAwe70H^idw-@&?8XD>2~wACRz6qx?aHw#esfnZ^aQVRnWws7l-^P!g-E3UX+a zxWbdz45sEsqY1t8e85w(Ka>_CUZ(0Ro+dCw?^cz(!UouE9-w~JdDtlg2z8(`52$U= zdD2)_kcc5RRrMHsf3-faikoGSloYvKjNj_qoz@zw3QO zoLaU)Ohv{hejT_}YmE?|+|ytwiI~^vJv=~L{+xy;&_ycVrZ~Pmu7Q=+*WMRri{|#& zJLQ|)khfxZ(^1pWuaBN|G~oc@nxW3&YzLW12WoN4K9;I>NWR!qgMTZEpRjEB8prn7(AVeGAf<>S!lHE>O2Y}rcE4nyK3aF+kb#=^@g6n+t^(|gE+2trkf2%#JU89` zs+TViS%HZaSwI+C>-sq*#3Yp~*U0eOHc+U<#s4KW;;9O8oF9-*sI#I1T4wMT-#7mK zgp8g)BR#_|BI1&p{llIRdEftgY=+vhjZ#fQG@L#b()Q)3nOUtQ)BT3gmPQ$kGTmoq zAsX3lL?%wYr}$*^8QPAzRM1n45CMcS{Yio_;_%J^ZTUZ6Q-*ir^Hd#uU(#XK4IM@Cv%_mjA&fTN>cgCEMMrKLqtQSy|z zO?R)O)z9oQCwbZHoJvjl3eO{=@pOXDI@u2mz}1E!#H zH`VWZu#+owMEN~R1X4(CB4=YmiMPj$eXdXcw*D>5RUMD87mwTfnR6&Jxw-h}& zxl2FLYwM@n4|iR?VdA3N%0d%xAFHK51f)dPP(mFpl$w5jq{{S7nP4Ni3P#71sl0N3 zGW7&d0X0$b`_vE1bm(=*arkFY?0=lX=e+<2q}Gy5Ve?0QG{~gCxw<4Y(g!`z7ig-& z*VTzEieSRGC`VV3R%0_L{6@kl5LKzMVzBCX6i7A#(9eQ$Xo{CB3|09mIVbm(H?18V z2IGgtcq(JfN>VF1M7AZ04fO`TC>YUraK^nZ`28koUMLk28H?VpFg@4B#kl49hiuR( zY~_}WX=aE*6?CyHZCCvM$7Xwc-SR#Bp8L^2y8p@a;lA zueSXs#XglD^~kIMv!Ua-c}I=55KRalA#Nb7xPBS~kNY?1J!FuF0t(cKMBV#5td=48 z=%E;<7rw6mmq(J-2h2qJV`XY2Pj&l9RL4F{*+PmE&LDxTp^6dlqF9f7-1+Gb@u~M^ zVKjqg$o3*WV(!uhp62AxKDPUDFoV}2bpfYn^=W?je(z~t z*AgV2(%FSue9r%gEsk|7FZR*9m_wegYI1y>1$17b?F?m6sR(Jm`pkd6OKBsXbqc7? zGxP^&D+NRYQu+ME+bn3E`hRHK06ulT(i)<(O9|Ao&evPTDl-m3+0+zS^)+Y5?emvp zSs3!xd)qvttnQ|x5wlKUyk16d>dH%HoOZH4tltY5blIw_rrhIVe~FtO{Lk&CWT@@afhsEy9Vkm_$yWzjJTuH$t3ZDgev ziLkx5mx3Q)PxV3(9z-m>fd^=d>qT1R`$+YYO{G(xm$}hC#-YvTNDh%WJkQ1g1H#Zxgj+MU>}F)}agomfIdgpP#v+)TkN{M9GGT^faBrRf=UT z?iM3qh_9rb1L>KSD&mz(j6zE&>AmKxxM)g0@8Rm4nK5l{@1*@$tXgb$^ym4aeWXL4 z95Qz>V-`#I@SJAqr@9(5W7?&t^($PtY32*$P)K@l7F!n`PrMg{BU%7-7D5}$F!=Qr_cuyd|76P<3&0<+wd>^bjmot<6 zdMHP>_8+Djkm>Uxc@tmwQZN) zhJx*`sSWIb`Du0P)6Xt`5RmQ48;HGEjJu%Gqv*|j9 zPO#CcayFi+kXdKZBF;9^JZCu17cd!dBQk5(-md;@%J7MjPY6KA(e-8Y#)O>1AaFw3 z1RddUOz(>H1@4YQ^Rb;EG0Vd13U9=DjYgL

l)jdwU2#&(S41;o8#@QtBn%0p^9h zkNV#Nu2Ki83J*{QLws>`FOzf1E!Y6^b?9rp!^UkM81&e>cP+vu&*@T)1cYbi{|2d)=$)*FBBa$jN^jO+@ zx_a@lW~A0a!-0DDkH>YV{ee~fZCtlrzxDW3sML*{=I%3H;k!KY9P`OF}a#TC@8as>#@dIY)0mmEQ zGLoqNbL)lOg?0D-y0Q3rY$M;?+`Mz1LEzrw-iKwt|JNUZ`+BeY6I3`jI5wo}w(ntQ zfAJyfd{6o8ZYij9_5Py&i0ZyXLIkvrVbR7hnWtL~Drl%~AD-PPZY)%0-Xn;sScqFz zcqvUsKuxbe(wgv`2aX61hV^XNXP2r-jU+#+o^0qtn@3iiZzPLc60w;Zj;MMzfUSVo zv9DN=YPuw*4<=*?rgLYtwN1MonW{z^6=%s{A%3}1O@XIrSr5>YhHsZW`;a(l_JRIZ z7dp+Jqr+CzeQ=~XGCOqPI)Iu94!=ygx3%Pk#=p+B9;+Dn^YHS_?(jqHQ3qLf1Z0ws zuarRUX$VthUsVhQ@VJI}l9ED*we%8nRh90}3DlS>)1OJx|9|@}UL{p{2u5|A3Y9owdbsXt&W0BBFz^%jyWC18qO{;0 z9W56^x$whMKrL8_?!@!qty{YZzer@kgJoc6E#0-2X;reI{QaP$LI4!%6 zBB~q~juv@cPX9xlZ!O+bUl02GZ(wgd{EXghJ+kSec$M77LStW=f~ExnKQriwnK}UI zs$c-X_Ez+Cf374#T)!%x=VpyO|_3rM^5n?i@&FLCKH0SakOQPGg zBg7B9Pfpf|6;Nk=ze)m;Rx*BwZAcwBp? z9gfM-VPQInWcc`$J{8rod)#j`c`OB2t-}Gmq7gE_sRnB7yUx|AkCiWXBD=VYdL9jTGiw1y0 zDAoNu9@B{)IO+g}AR`sui!0=R6Tb4aM&vintdFUs`Y$BRF_yMA`gFa&l%k|;^b+xgPv(hEi{GzjDZ`0R?#BsJ={$Opg*q zw|3IlB@#I3Q&Nt!wQ1NmCh@!R#Sl1*W8_$5uRgigHn6jc^7jvMUmt1KPH%e>dv^)P zA$~7Lcsa3*$X2Y;sB&`-A_~<*(d$?_2;EqDE@bCGmsokcP?gMUyLbC{?B}l8kAjus zV;fgjo=PrMLT>vFu&avz=ZuI*@5za|o0lLloj{yRiJCpS#Sx;Kw*}Z>UdaL7Ls71v zvW@{V0wu*pNl4VWdxqIPsjss7{OlZsPuW?P3FF8UP91oqQ0o2F+DefY6b5KB%P69- zbDP(>4z0tl=eTwSA%_=vy5#2CkPQ0@+oGKBp#Gp6qhw^{yM%5r-$njq-t`7%R#uV7 zC(Gc-pES8YJrkG2Mi0N38$v_A9&n~<_fb#5K!sC`J*i}`dMDDIs7%D43EoL0r&s_l zyR5WIC%=64iLUOGEI*Xg%ZVx6>k(K`jH?&Usv4_K-Q9{oILg`Tjn&?E#`wqYyG=i$ zU#9md`uYQ=OzBNEm@!2;(<^f|<^#e&tH8BMMy^ocZ@!lJxNAygl998+2hNa11HKP{ zKGQ*Z0!GHuO;U>b`P(2uE2E(OR`ChQ@Ms-s15W}-E@IY(FFT&K85mE8j%L?Z7Pag* zD~S$`!Y;{i5Tqr~{#a`i$j{(%Natcq7$QRY67Te<98J#r{FGw9p9#^NMJC|PH0);= zu;Jsp#?NnPReR;O$A7I9Aed7v!Y5_Y!1W-SJ+p>rQ&XORpc}3E#)D#lm;Okau_m!l zb6Qh-zv1rU+64J}-cl()j8#rDs*4-XRYnI9>Xn2MFxaahC%qV5?)-p(R^tDl->b1T zvO$f#dJJmJVRFH00BoUuWgRW#MoTOusJ(|+2XM$bI2mpx6nky*oD5mgDH%v>R1-JY z5wDe9HD95@E6S=O)z4@N72Z_~RRfBMu1p2LI9&DMb z!P&4ZI6mWJF){jHJ1KFpI3tbl!;wu?Ile*gc)tz_pGQLQM-F3GL-YGaMZoc}rTO8d zkU(5cuZ60i5+lidFxyQ@Ay)@gC9_`fQb^@GB3#8%Iw)_;+#R-vCRDunJfO-vTjg_} ztZ5F61Ji8>fVl0p82>kN$NnYeZm78iu#vNwhSF;k5Ghp}zb16{voI$xX#0oZ$(&~d z;d~(FSCNX6C`u{10d!dVV^MuliMK2(sqh`_^#|J$dQ>nCJT?p;Q^I=Kdax=cIY>Y>PSQYyUbZw z?3wB)Bd|dN`{VPr_k*4z2UC^L@s1Zfnnri%$EY5SC?!Z+N5CsL93i~j^}?qR6G<9r zJ~jvgwmL41&qxSQNpys_SYVi)bI<}NwMKbYb!pdhn zZ*4(TP|hH%kIfzNek1B~Exxf=RM(HgAtTXVnnR{rx|I9oRKL@b(X-KuX~T-sUm~na zp!R_u9pZdh3XCZcGR(oO(WuJp<|pwOnZQhRV7@TvQ9Z7nJD9S|X!ZnHJ#@jF#yoQy zam-~gYm}rLXct>Spw7tjn`-a6yb=;YRw^Faj3A?l``Adr2iTQ<_Vr;q2qhr&(-ufQ z9Exb~QPne5K7 zwpx?RJ?Vq{uu(y3yZ_kJ`hd9))VFD9qHZEhh3`Mn#OM&(-np=KH1=#|g-Dlf3Lq`Nbl;TFp*Z8w}w7!qN1}CQ5&rHS#~E zS}a-Gn+7}J0#m?+3=xhljqTUym$4*=bWnSYnu=1}p_WrN)PRtZ{wmnwjfiL-@#ROv zvwX{?z#imd^n5AgZD9N4pc~l?q|9BMyX+xM`6#<{G&Se%2MoG^o-aL;*Y!b@V^9nKX}PQfeywwBJw#%#Zf=#s`gx!Ta8E z%C@wH%6P7q4*EQ95DqCJ8$CSgt3TQ!MV<{QxE>SQ^Yb2Fsq>^hW_=Wt)`X-yC_Sp` zf7#s(>p1mua`Fwejdwq5B`WhZRt$}<=hc%W>Zb*>>A{9s4vQ)gTvX{KQ$VkGnAZ?Q zE8>CuDu7p=5A$^Py#6nWwI9P9V8j^>pH)xXFVp8BIe(mU1uM~%dZv3F7ES8YAq!ei zuD)0EZ!#IZy_O!aGc1`--%VaO*WkT4_GgHht?#ynlZsTt5?ZTsD{a9a7jAU5G(tkj z#JZ>^^ZMpTWm_as=s4lP&qf#Sk^BjKrQ8&ig1YiZH({4tv{4yxQWp%o5n-D24S?aE zp5=42Ll4-I=e|2Qfz#DB;JN&EHey6w9zpcu$2iepxopikNkT5F;j&Aa^P#33$54=OL7? z=Pk&v_0|g_ND#J-qsBZAG=EtM{S6d8NFqDjUx;bA&QNkp!_%wvk$<2<*o8zyTD%Kl zJ~ji+Y%0I!8AjOwn+G7a936iCnvDQp6R_*+<;4@@VML+rI!v^(7J$64ftgCcKenTD zI=;s{#FfjVYyC1jCeNUIyE9dA#_CEspcsn?SN)c-ts;+LClsAd>XU0@d#K2%8MP!gB9*_P( zN_Ip#yZ`tH-($Za1Ot{E0J>dzUu9s#KW6<BWUXvQGh1m|UOjyj6p|oa(InavlavZD ziZ8+yQ}bYJ3-|T{U*kIXMiw53(D5h4U*?)XzpSJ4fanV)mW&n~jq4K+ilnFSr`;zI zmzNC)>vqgj&`60J?JLenb{@oU5K)6ze#{gPgys#ZT*?Nmt~))#XDZ310fgo%9&?0V zD2}xCAHRhfhEyH^F<)F=Y#Nz(Zpq?wn!+8&yDGM+ zr%}QS0EK(vNmASH?(S5g{UyVMJl6z4L|b84zl|`Z2znrVbgPA!S}1K;p`n{zl4&h; z^`Q;7&ARw9=XC--y}WXWPM`8?H3M%C$jdQvFvyK}D;QZ5S^roOeYJ}BYkH^TI2(Ad zf^S>8_bqc84+{d-46kR5=@Ka>r#%O;Id>sf_i9N%G}OIHt@dE%=1a63WOgO^Fq!;I zp$OoRks2^Xl82EqJN8yefx7V7#{Gk?^)FFVGrLdLw8?TL1f2hdjfl{b9&6NvF>6|6 zto75%4Im$;-0gWsw~kDK+Q*Fcp##sZW;h50)(RSq9WD(+%Q_R#weCRYmb1%2k6$t0 zz`OoQ*9Ja6-5}e7h6lwK97mtKEdj3ZAqU;-BBDexu@aG$N8uaN!6 zvi0EA8XFt?rr*<)32{7LF#ntydtwU<2JreH|6{x%Q(!E?Y!_otbaXUe5LUi{Dz&t< zw7%M`9tHIx(ZyfNo6dmbc8M)X(ioq!8=RSF#qEi$!95aaiP3Dpxk__pZgK0Je+}7V zpsv5iPfVm4t6}(pd_<5F_c`Ap0KD|s*_rwg<|pya?apdT1#v(7SI#Fr0r6(+iOFeR zRuK*1dl|bqa!zUoAwlQPpv0drO`?AE6`fF*Q>MiXaw;&5JxdFSzZ?s{b zslK7MP;Olos-iiWnXzMt-;>ojQD?f~V+VfeKv@680&%$#6Uc-C+yJq%$Xz zn@skzq~js#ru(VU6>sFet zp+pnY2p`_Ue%=(cij)*}W|%zPcO!dC$OF)7dO!Wb8&kgPMoN`b2hz;kIDtFYX6fMj zR$-^37tsi8YA5$naNm$8umGdTB#5iEb=wkie#0z^VrAzF4-Mn5duKqve!I5ZMw^rL zZnJr~`R;Yx z==6lc@yEK0AFRRViKDd%>SUxQ_s69<7n_q{J}MYyaqg)&*q?p)Vq&tR(eZN}oAbQl zsz;TS26>6puKxBEfAkym%RyPYP&LJt0@llZU3tomPKHD;4ZhzUb@ISe{^RZ{Ly>)a zG~97(qGMtoMB4`Y!|gv|&GE|!{{?ncM!g^m+b<(h2@xb|At^ShH(g zVIPagHhNRk3U1X!6ypA%kUOiC4G&IkZiqu$S(SFp;oGoYHrEs0I z^4o`onD+%qS3nrSu?=3kttbIB_@^*;4Ato9bb}8@E66lfOKx$Ib>OsT#ZEky&)Lj7VRCj`9qf8VW#uWh4#0pfcjs|$*+vdE8ND6(zF9q}N zOj+ToHnWPfWE~H#y+B_>{m)LN<)gZqGh+W63iViT&YEt*Ckte&uC#ZEtvN?ho}?(^ zCSg0RC_)&v4En_P#M6Xxk`;a=WQ_-7%=$LTbtPFcfdHNg$<*?jbf=sgic_1%7O%Yz_gs|wv6W3T|6oC{ ztq|R3dv3Y;UuX(xpC_&MTFveM7|e(&R{WdOh2MktUR#lEgF$J zzF;{BS$=C)80?=L+;?%oOrMy0_>9IgaA-edWL3ZS4j3fLLNa3^{s`3pYAw~q*N90P zD)3jd;@-e3FrQ3Quzs)y>d?(+rn0xqsR*}E<9tu-A*R>JR+01drvc6g@qKw|X~%-6 z@QFon2L}f!sxnzvpC1enW6^7Gx|$@#U2u0pKNK{rOzpogFw++^W3b-GE((!WGZu>J zyNlI4L)NW`5BshwC*Gmc0tl@~BgBr<=5Ji4)|m&l_0+S34#I?Q*7U%l)dsW{>v*ZO zW-iByDi7eVb>O@oP<7f5)++~zX?4z#{;!Yk(a=BK8F3Zw8)hM|DWAEFn{L7ZuVE~3 zsD+(1tyg}3w?}89yPC&wC}-}+&T~W$>5&S&h8A>o(jxnS^-R5FzVDehR&c2-<}?+W z?dE`?%IonegGqcl=K!}&GC_<)saIh)t$BrF?_0M)4&-Hd?8x^NoUzJ~lU;88_)5*(DG? z55WPWHbeeOnB@DFe;2lFuwz!MHZgj436YMq$9A3Bzy1o^iOzow750u!O2`75Odgqb z5EBX@fjTVBRc!D9vB4)A78Y@Q4fB{2=+D%F1Aq#|gohih7F&B}Pfby6l#q?J#V+7- zJ!4wTcAM0{+Guy13J`=HKZJpH@r?ME91%XIY5*@B6=OyD6(%gMK) zob11y$u8p`*`-S3wV@~g(mbN^$x zKzZ5L4-$}9%jQc>aajw@6Z4dmOh#w&Jk@1T*GKhsjy_3}(^hgStBtt156vt~hIa0t z7)~os3IhR^`^E71{Y4Db;hUe2e1bV-yDlN&%Oo`c^sUVMCKm;QB^mLrJ8S$NjO+$g zkpiEJkz?DcPO5m-E#qU^fF=K?^}i7cZWA#7i%>9QDBbrl{qrJ!<^RKQVKS=;Qnprw zs_Hl(M`sB`ZYA`Djq26u=peuAotji07ewR)+1+TQu`C(YL8VxmjXr#9Tf-TJ2QYi~ z|7V{?J}@wpe(LMdm}N=%nS|R+m_mpQGGnHdcTIAOv?r#*a!gwyHE+iMN4Lc}5?r+~ z_sA}8JXtzUAh4YE1r=B-FzDKfj58z={r{jE20(ree>NpWTv#;KZ}%M&Ls!}fTfZ^I z|5r|HP3)e*g2SWR;;qLt`CbP|>*aVKNa!yiMdD**?+6(aEzoQgWbXjqZU>v6Fh&Fu zsZJ}JJR(RJlmIatOGg0Cb-)<^hW~24_=kJQ1=MB7_0^#TXIU?gn&{;x zlmC|aYIz?UnvePS&g1R^l677A_qHkNX8l;6li*-$3+MWve^{VC>i#vcZqFvOxx}5F z=n;+6hb=%q9&Nd|0TMIN4r!6t$;)gRwQ}*gPVP3?UR8D0dXQ;#aUwHHjNb8dkdKoOI-LvvF~ELySet0`f3HytF$w84wOozr-hhiQ5Kp z(t^hM*(w5gvuM6aZ6j~MFjSYFj1MHCoIh2k>!N$}U$bD-%lKKul57L|5FleW^c+YW zY|&RrQhCN3aD`}XTOBuDt%u}eT z*8?iOT>oe{&nH;ah2SH8b5T*AxUR)mCV4(0eoy3%xDK|WypO02|Bz~K67X*e*0>l* z5O=K*9=TX3Re33$-vJmIWo&4WJA#sJ#_1KejE@(68zW{}3jL%R30Bh?An+Lp>a4H` z>4BQx#6KXvH}w26sw&Bv*^zFQ#xtKEO=vB4krWWP;KP#-RGH{-c^CF(59Yy>JcOoH zMnXS2<-1<}oi&pt=-=zBJa75L@tj&^9vkv!Q<^y8tZg+kA7N%o^l`~5Z>qY7XCbX@ zV{{;PYm0iQ5~P0;8U9<+C_|lH<^}0|Yc;|Tkkz`XhEqG|f+GFk!oKr3Uts6{x!ZSf zbLb{Dm8@a>vKFVkcK$_#Pk{G_=cU_Bqh8X&+DN<_uP4)I2Y%-kTY4{F2{9ReA(IP4 zod`ZMsS|z+kE72^H+M0EOUokf3XP{Q#F`n~h~?0X{t7mq6x#F!2g7_+L`bph`1IhH zsm&zrkM{5Kq-YvjP6EH?pHDLkx^v~cyWQm)H24nV1&`*S^^~Wl@MWH~)b@l`Kad|y;WLKnm($%G1FRl?hDZ=BT^9;XPm8Nx4n-iBr{A@dXfj%5=f612e zVJ_zkT`DwbID;hdlb)o~%qP4Av@bbifk~@eLW_k;?5CV(dR0mF`v@I|-(A_)3^NW9 zyL(ocUb*|Yum?GNyEs^=5A}@DwXF$JBjQj{c;O1ckLq2h`a%j^;AC^Y9wi3_ZnU3* z@`AyFf>H>t;$?O)Zzrx$BNNly(zFIa}%R=XDX;1 z@ekRXsqBB@;>zw{l>kkePWDN?Mr!@TT)DlaPB?|q_QYKhuI)5#Aa4d=sO@_}VGQp< zJEt&HUhzHGTQ9PHr~&mL=qI;_(EWV50)pZR!)DZX;t8|j2^XKpnbBd2CoxUE?Cq~# z2O6#lymB8S?y@mrFcZ`Xud=PB1oAtwS7sE8L0_1BP*UQ<-S}#YecijYik8o2uFRoB z*Edtz;9P$9%LN}9PT>WsedwJ)N{oMvL-9A-!_UIqI}v5{)D^Qm5tJ8aPvxHjNHZA>f` z3Ueub^x$!I2+5tt8W|E<<|EWt!x{W?g|ZYb{%0cX(;g|`vA_74>8+1+PV^nG3NCGm zf*PTFtc_$o8RiAarsvwQ;@c-9<+k~ae{p<|MB&q9C^8#%59+g6DQ5{DAJj&b=c~-8 zKP0x{)kQKvRRY;8OfzR?q?*hQ5*s0}=g4!5xS@{hX?ZL}hYcQD@HjJ*bK_R*M4_Fl z$+Fnbd_CX)?m-i{KK2o_OlHH}HWTVxHd@a%GQ>#W&Pb#Yx8TDpO$;gKN{U_RWt91_ zwLM^S9VklQ`Yu47w_0nVIae1kNO3O1o&!8Ay0{$u!X0NMo1F%CWU2Aa%gen~%gZv^_$^!#2blFFO4S)| zm6nSN0sO+TRI3e`qko9P0%LBc%TtEML!poMUEhpMEbN6OFfJnnX=lU5lz$6@CPRb& zW6%VN{M#61(8GlAS{XCZ(Y!nz(BHp`eCkaSE$0(|)1X!E8l)l%OHTY1Hy2(~W3JTxE1F)uc;|xkB`-iRNQTiefIF&lCV7qe{u%3gZg}L z#@>6&bN}jR+ZzHagwE+FD|~j&Ebh|7PX?i#r5(FJ^3I-28VY{7CgM588gXxq`vcp- zI0{F%lwiOdE+bP#_c$1R=3XzUL4|W;oL8^qp`IH*g@JBkw8MlQWqli_bG*9XE0h-G zSQ@&JDlmBtW_(3A|H3fN^Jmz=XTXi)%Hc8f@H1gV!6uU_Pa~P5XvoYO3fp7Q(mN<>jr0}h3jS1_6Fx7R-S{x z{DCWTHub6(v#Gsr2BD7#>b~OSWNmqEdVVVBN|?C4N@-M|7GYrYjps*uDx<$3MIM2m zWQqH*HsV&a5~Qe2SDCXU{G>qeO+i87t8KJB!73|L4e|@QK?Nt?6zO_cw1hyS&D}!6 zZ_8%F%C>jf=t*733}4n%Y3i=qFO$J9Ed+E}DT-@3{avRcd4;+C<#N58EWVr3k^9Uv zakhSbP>0y1m$1y%qMvM&KIATbFZ{b<)qy6j!_gcWn=O)QZjNhyOhW}^>(-`+k?He>9EyYQ@(EZAMSf#R~Y)PV*gj2`|J2suezjjp}c>SWakpYZI~vqZ_yFZA=+0F9d(J6E^lqAf}9c4hz)w3ydqm1SGQkdwWo-1dkMHh3V z7Ha(oY~_mioompbQNPi2W}1#aD}7mPOMQ&U0dHY!VW^UE%Aak|p;t!RCh2(9V`9=$ z^&-X{MYW(KJSojEzpYr+S$S1rncqXB9m(W&e&VjSXe-}mcDlUfT%fHAuLk@q)`HzDm_6qGa)AJ{u zQ9?*HAuhC_uPCTK!zQc1+q8=9{?hH9=i_ZGfB*2v^OM+egMOPFNNvn-sQg{#i^8aU zb~k^mm0O2?4Ygt~!V$S&nkl*#&QKfe1c?g~;g(si8;hT`hH4CzA{FR0MGTj$^5!Q> z70Xa@A1<-K#ddSLbs^w|=V8M`K{h+846h}twO$qLFlH{g+1XI%3YqAuy%uO<;%JbC&4e!cWqW8%GA3pmMlt7(;0f4A!hiJ4GTcDFgHBN2UtRX_hp*PUa2oU&Sk!{70N?WZde_0C!&_2zEeXk2r1IH${(@`X@4;cT zz%%(2?RDL-k3uaq-eMFj1y37%w8*M67P9EdQI`ak^JF+poon^zfp!C$_I8Z+8xY{h zJM}1a${8I(9-|z?1N{Zc*>o_8-r@8kQ0jqDMJ_(arNYP8C@G=Bs_v}f@E}qeXlJC z!sGMy#f8m|Cx0Q2_{3LU3J(+)h02PO|E`AP`$6xFosYaV`CBL|!{b_FF)y`9Ps5ZE zEm&ZFybMu6zX@hp3_TqAX~(2&44c3%gtS-CPbsZknSHe>q50P#`!S`ZH`)tkEgXX8 zn8%@`CKd9OhzALMP{tpWL60uGE_#w5913xW*8l9^I0ijwsY;Q)@cy1?Hf8<)L~<5z z@Stey+gHrd2!ePMh1pRf2yXf4U+{Y%XFvFtf)*~HE&tTh?LVi$j|);H9QlwpeJ{|j z|GnfODm@ws3Ha`JsE>aoV?9(mvH!{|F|~3 zL!nb=K~&HP5FcYkj6}`KoH@w2;>_1rXK?zmJZE|Pr%E64=aJYVX!1C|tT52f|2dL$ zmcDmWoOb9znRTjWDTv)d1h3I4sBM2hJm?KOb^TOGv?>EaHR+S zck5j-7GN)K)sZAO(BGMUrDnEeEj0^Qkh$}xUPQ!BPu)G(5K|64@J+YW32icSxu@@l z3#&XbEGsL?-*@8ddD}AO{Ha8rodJ><*Q??cn#Bm5RH3n25&L9+_hd!+r(s*1c&_2* z1Z?4(dFH;ZxNIp(jHvaepn=50m1PK;=*LLFlOQ9^?oM!<=t4%%OVD#1APmZ&lw`|7 z{GrKAGNda04Ei;8X(B#E(7UOxk`3mc^PPE0o2W2()=J5MHo&Ipe9|=hz z!QgV={+01l9_Z3sIqRG5s}?_l3t@f2>B#i#`Dqgz>&1^dC_-bgayEy55d^O_6!0Uy zf|3+@tN4H>RA}s0#MB@+rAgYG)>r}^AUZR!o}lHcO#niQI(yn{boPIj3ER~$JqdH0 zEdog<(gJU+c3eQ_ohO<8M6tPhu?G~?&)r>f=W@7{y;Z*XO^3#!MWMLj!1JSSQhxG@9O zGsTIz`9C#HXx3Eh&DK_Wc)w|HHvNv2T=PYVPz)!G_YIwqAV6}J*UgMU3_^l<@`wn< z_@@6}ENnJVtg`c%Z=Q%?al6S_TRQhL`*y>HpzXhvyQo#4MaiUSC&fmu5`Lrh5Y9hi zs&-S_6e3Gy8qsx-F&^CAtPDRf9UNEjtL7@Mm(L)PLr{(M3w+Y1U=~qhC zZ9Aza23nI`^KA~p2cs8?>4QV-0T-CqBmKO}gg4LDbo9D+3J;z8>%@s!p8c*qER|4o zwWZA}NO_2JVfU|oWTI>3z&+k+_UqRG`A|Snc*_HQ6oI<(Q@*Gwi8sbOZJ8aqPcb@i z;Y-9^Wm}N<ICsTT_t136gFC=4Tl>^ToUs z+fcdof$HwFt$C9lhTo>9F^I-}t&K;SzMA8M6?_r9ot*{C`H&wJBr)n z7P_bTLqQq7l+XKIlT9uXJN+76H_mFeEc2(U(B=L@`KjX_!OF1|$hOzx0j@P(p4Ln5el>Wxd8;^O6dY8y3xJfd@z(kF3qxeUNu>(UXTTnUy04`j;K}%QCxWnkX5)Jyl;;Ln)UNaK&Y#`gn5~9> z@m#G`fyEUEs96VV`c8Lga099w@FYoF`LJw?gznJN-cG1w_^FPx3Ok26<0WiM&}n67A(Y{xa&;{;&j!E^WiI1KiMQToh(fB zlThVZ;PI?+FZ(+fNv-ulm0gBKNgW2+?Rk>dpno3H~epFOcI9RM3HeDLZBQ|5-|2Xcp zyqT`E-+hk1E!r_(r8OM;5OQr)Wxs!!^$_AV-EFN5!a_kqqj|kKQi8Tx{A6M|2i0Nt z#P?)#(9zK`mB-P-$*HEI!mi~jEU1U)w&VrZk;UYzeQXGGp_YfzB)v?nO2|T2GOt8< zp<*DT=(p(RSZ1yjx9v-4`zBuIT^02|YkJ>vH`aX?X>um-d5O9;8+YU1a15Ezn-)}e zD^S%M6ezR-9UH)1HGl&&p2hHP!}2aWJzZxsTh zy@2BMzhX$Fxs^gsOeo2Hx83;0zq1S?q~Z0T#bs=9dpFnS^$w6qGP1_8jvn+9=Iqo-WdnH+s2Qh076N~ zp78JuCM>DE)P1TTIly7mnSDwMSy5hsKf0>ZKy71>i?v9(jjli7e+Ng$dIh2I0ZP_F zgfyE`Bv}Bt8qfkB8NkqDE`k}3wY6=KHEO8&YpClAfC0#>vm8iJKM{j!t!qm$vwgh3 zxY?&8t%a-JrWu&=+03#E#^%^)LYSW$`D{1(i0_t(!P^Z9qn@3gZ>Xvp_1_ewq>)aw zKVB-M4@p*(FNybiV5(Tq?s|MZoa|SxU-Cc?4cB3MNl+Iq$UhTZ5PU-v>H+FMcZHMS zJioh|Y@+|saUt*>IvQ$d7-tV^XbcxMxLxF*V5a-YsA8rdVm88g!@q&}6KGFQ(8%!p zcPQvj`0yPH$x~2_$4G@4X+z&6rJ~}EG^0wCfd)L}% zpX((h^n6MF*_Pvmb>{0FXh!j4sr7x7UYEJlTP?Sa=Ey;2f;+DJ)oAL(`1rc& z`~zdMC{Hl@&v5Ysg3{-fd(mjnPh09^m>wTsdmC$XR4e0ilBei`nbqBuS*l2%Py20w zTLWU+{6u|Nqa~F`eE+u-td)Ll8*RYP;?;zuaF31p_+Is_By{~Vps*{B9{-cXvXh;DLp1QPP?Pqi8z8DOaq#eo%Z@#}&wy${iU3sNUKiOZJAY02x9ERBv~ zwcV#>sTF(EQB26+_ggUGmJ#6j+)st<6et)g7{;c&LOO={7g~a}J0wCBQpm0#_Ym~| zFm)9`ac#?XAP_vbLvR@g65QQ2cyI{r7Tn!}1@{mb2<~nHg1fuB2Y2{~d*6HYr=}=i zI5UU6d$+7!-A!n?sz5I;_WwdXNy#y$8ne>eT%L(iZA}KpEf^3XFjv0bZneJcsuVbx z=RmQkB{Lo%V}egWo7=}t5)D;V>xCL{vlM_V^Cc2R{Mn2n>irj^!!w0OgT8;8rdnqO z{jV%`eS;{h&sS zT3%T?0Bo}3^7~(rL1sk^OIShI0Gm+D)6BPKwj4_sK>u&~U6HkFh9#S(r9@?b+Y^N& z{;%YI+*mHV9;0%kdd9cdNjh@xu)m^kDBoVS2#Ujgo|AwNj5nv zKcYd07$yLCFvX9s*O=^8j`Q)*pwOU2_84%iTh+nDsL6fGc30ZhuQvPj^%M9d$K$Yx z(wC<@qwMOu1tN}+)OBolZ2TTP}C6M(2+7sClIuHY+@9~PDEG5|~@!@>Of z>#lFGgWKv--$~ad6)}}#;ibBO(p<4TBWkobG#J0>#eK2MTSe-{Ae|s}F9r&e2tqz6 z;~0d0uAPL1wx#+GP5$W%d`C>le-3FQ7ohGtgOQvHxQrX#!UG~A0#8mA#D+|t1dU$l z!8`1Bei)-DL=RZtV4O2dOM3bf;%e^6#GFAA#X5w4cJ14Hu=5}7T*^<-A02)Evm)<$ z8D_KiJ!e=^(NpuGVE`EcWG*-s!|z=ph1^j!ZVW6)*UuWJD|fff@ZO@KiLqrkt$JSt$5Is2tWiy>MsBgqb+ z-}FU4&|BhaM?IH=W4%pI!$?Q7iyQSAPyhFiZ*zE!XOu8tpT90LXuL z9^g^L+x&A5vEaO$t?4kOSE~O5bm8OI&z6>dwQ7bp2ab`{V6CzYIWW71MSjo|2P48>g}}!o@xF|^Snx=ZCzGZQ{jW%z3nMjfx7gMy6klnR zE9d<{iv{)^D6sx~h8fnk5MsDtO`>m`vDEx9H{DdQKw#C%dg)xJmy+$yCRx}vGQ;T^ zm)pr3eY{w2#DmzNp+Nk|+;APb8@EagDacr$~*N zm1J<3mgPP<{ixtO{`;!|MK!VzT1?Z4o4pc~!=&ZRPxX#TO%CT;O7blG zTj1v1NY~}#L^C;4pL=Or{)W>(l~(5`KkIpG3vH~eJd13Y<&*r2G``*ma z3-S_@sCh1&)!hoTwm%))UC03~5)AQ7wJtQt&*p()Qnt%7bpHeK$b|q+Ma?dchVUB% zw51k;hK7enk7fBG>I!CmcCdTd-_%bWN_hbLq4IM0!v8oSG9ud5Qhpd@_p|*{#|P|8=<9dVzNC3Sutp-s+tH-@yo%413HLR7}0&u zZ^xP$yc%@)`v=W0CvYat5!BUc=bGKRk63SzDCPkl^0ikxhEMZq4qTXD^-=x;CO@{c2-U7U9T9VUF;OftDWs>Le#^A+bDo48Jjj24#YYPci`N zYH=VxjNC;^Zjy#sWtE!n7Q{DKvn%)k8bm38e;rQwU@)2WQn3d}ppU)Rat}Zz`T^`r zmEDo`U03r6$g(PexBG0IV3vE`7=^|AUe%=)F>&6H<5$-sTC zh(Nx{YGE@wzNe8X&+uq=y$x?t)@fu*D6KOUYZ)Gi*B!M#?XT|GKFp?VcRW~w(8~_; zZv%691_lSqbsC|CkQxAN6tEFPHsM&E%#_k(K%EBER~HugAW}OFv+wg!U#jZ~;MX7FdtEe7XFpQMfnskz#NqtmsK!!uUy=~GHP_Ov zf4MfXH66{$RIGc{{ThhvWPd%8Vbb9yK^Zh*@OKAd_ycQOKlNh0efF0hn`czIsqWr`a|w5Z8kY7wT80VDpvy-JH?Q_1ghKeP}z* z)e>b}VCsjZ)iEB@NnJ{%5&<$f-Uo40ti^S=rD#uWt$OQ`#br1Scwa0-(`t9v) zT9lEDM*Dfd1pNN{ml>q9f6SoUf(-6FZ(GSFnqh`D z1^WG@?tfgSeq8A9{dtD5&p)#HJ?kiz4{&W+bR7P-7G4gvc)?@-_R>_rerV)q@SsmJ zRDgE?{VAajp>|LsYwl^;?gr$%I(J7p;#|`&eyv_ryX$mjV~fh9-f?o zc6IC@9yY6HPJNnp>7AW#D>l~x%S%c#^>5a6i`$!i9L?}+ak+e1uzmj9QLymr&ETi0 z2|0OVI?Cu-ZFCX(%d_a1p5$qD)xDatxbz|Nqn-+qnZ1_hc(i-gi~9(`5LfbVXnXu-ndU|HyU`=5D$Ct`s@jS>F+I|lu_)9sc@0%_bQd}p(nBf7*Y*0cVbsq~kp z&G7&$>E0SY3HQ}(^padII$LkxH9b0*chA}`HLPb)WBx9;T}j+DAI@mbekrdc!oPkN zcg`uc8hwtADc4!5G?EmCqkd=Uq}SZ>L80QsqhL^0nZ435EL{i!wLoh83Y|@*Sy^1Ja`3@ z%q-vi>X!quN95k4*3e}H$2x>143N|b)Xlm9SX$PIX5;o(7@@Oa8n@Hq)A z@zPb%(iZS!;d1fQix$!r7W;jvJ$}(%9zbm1U=wVJw=?ppSNk&8qoW9hm{m{!FpGL# z0ey4vGaJzo_vz4hl-lMZAm*F>YtL$tO$1(}TjpGDZt{E>X$Hl3rfD5!h)!?@NHx$R zAQ35eLpq4uWX(@!1Zb(aHrPa-KLNWWPBbd&@Z1OZO^;{951fYaYG~XF?gEFY;Lhz? z0=n0SmV#Uzl}gh8V-xn*P!VL^LTy>3htMj^039LT=8>~Lt!=+t96A9O)%WGb_eB=y ze2YtBN0LTFh#!Jab4kIG>%b!8bAfy-uw!^QIqfw^~emM$vTUr1Wq>Ic=sfp9g?KV)!txCPesky`}U6)7Ncp#qhd^6GuJ_J+=AnOjWs*B zezsRn=U1;L`aEsvm1B*zSh(p@<{I*nUC|{j%k-Td@Zj`80YQGh7)z=g9fW8WYLYEc z88mm}l6JQFvO8v+{t1+Wt)FgMl zzOnh0IgmWKAs<`$IQW?H5k!OpuA3+EO0yAJ9|^@Re2I9AP8tM{2c_cn+;ex?LGRlL z3@cT9OlEpg^wslz@;svX!(0zHZeM{8aGcldyNjS~7l`5e=n$ z!FLr9hF8SMn|I_-jAiml$5Sy5ER##VfGiG^#4K+hq3-+kzz0{ChQnp*WyruSoziDoKKhsfm|9&M}YPVDx+|SR?N5?#ij4Z%C?fc7rZPi+7*PGgKqFeT7 zW5eQ`*%x8An4Uj)GsfjXX9TRc7D!(9FGb?Gvq7J*&!vX`*x4vj=17^TRGc+F#k^ns z3>l5<<{c3eNg7|An{`DTTb;j`uv?zAv0dZ$EkuYFKf7XJXR2`#@-AsSFFm zay~xu{J*c_J#UWq8|Meodgs~k*;PSR`P!}7dP{a1^=JcfdkI8*_Qb@<(X94f8y9fZ5>!i^&?^c5m z79#pa6h11uVz-7Jz}H&J1wuo(YV7o_C-X&49VIm^tL#E{$11*jmo{W@=)NxDaY>xBnMIl8OU~{krReVv- zQ6r3zpw62%Z>Y@ehxC(UaTCZu3Z?>qjpSu&f}LFm3295>ACFQP?{ICZFp^Y})zA_L zp=nJ9WmXCY6)8W-K->vUrCrADC0F6YL7%iUm7+8b-3kuBPI8n=gmRpIZrQVE!)O|% zuk0fU%@SQt{rsu6E%#$wNbn4sA)n9u4OvqGq>l9>tA};m*G7>|t9==B8L!dq#ff3g zAtV=D9(>Qcx>xGiR64F?W<`))udjc~8w%@N_0w80#LLQIvQ!hyoPn2KR{MRg9@V(@^3 z&amY$?M!`Yb3-Xa*^649^H(9mK*C~f?KzV;a(8(bOUk=#&T0K#Dm`z^2AZa>in|-#O1a%t!df{xw#+rJQ4(UEy_YaSZd-# z=ga)1xlY*=T-B~SUp1kx_M=*vSy8zV(mg$kpOsYcobJ(Z{b8ciF-ZGTY~}yiHAPtp zDE);YuOg>5eguWY*5)w)+fj+`|rofcF_LW8^H`e82^;#{$XGfK(Cirt#R&uxR7) zwovQknave*yss^@Fmt(NHgW^itBue7n2OUXGP8~aDkz-d*Z00B;F~NlP{>f6+f=u|Jd)*D69c(=&9=?+ZDL@*D{D4lv9GWH6f=1@ZaU67W|$Y6a|2c~T4iy6ZeSavZnOHF zF(aMX0867qpx4ajoV#thm^$A)n54Ninq|cSZ_e3(Z$Q0qKyR&CVHWpZ(Q0 z&)C-ujEpV@%{I>-jhOam?w6U+Ce#`?5X5-Wc?c@0->+6NO)at3Sg7bh9512O*FvOP zFgtn}GopHp)_>^p`NuuHmqFq^Hm%{ z-B5y!2>E2_n>w#V5r?gn<@|n7+>@7{l8&0Rlwq9&A^$mtj*nsvNpTIjBv?4}sn{;ln z(58*~vvfO`ikPevt9HjhV0&a`8K8(Z<)wJhopetKSgbbph4KdAb9IA5mklKHU%c$* z1BP!vLc?#I?Hb4_b@=NFuJB?J{nF!$qRLP9w5IU%F!fcWE+}+$FSY=99E8KDW8R7j zEfPD?{2`VUjWi>)mBo%vvo+K9H8P_4k+{CTE)wZRH>jdxn+5tjZb}`2S>CFCbySW0 z8IaM!gAj;TvQAs>rnz{qI!m@5?2j+oOQP$u>JrSKO&%KF^^9b=8(DPAx?~|}*a1z? zpZKtkuFtmz>$>-i7gMKsL2gY(#!&bB!=vh?*g1yGE<1z8bRbplyPeC6LBsulB0=mNW1Tll7(+{sxgUXOW7^xi@H-O`5p4U}38$A^;$6bYtlcI&bx)VVta zEM0TATEv-C>;)2D&)r636&nPrKVpkq*|o=J1S-BLe%6>(+KjeF zqK^&0u?t3n7VGrJ13>z-bxX3XUjiFEIyDZG#1M zOjYkx`I_$rnHY2liXFxJiw?vi>i}&9@EHaRveLh;hSRGHM2q&;?9*uJ5nqn$RUZ$X zEbmop8R@)#YBdj;DuQP!Y#_{%Q(-T1lKNhwn~sir1QpZ7%r|q;|#U!r9!59P0DJ zpRxx9kdU~CQ^{2>PSrQ&vRVrp>Yg$^74;-v?)0Ykmv{btCH5G-iK#;;7R<@*a(^)o z{8RXa|XG98nFM{y7#gX{k7ig}Sa_xjWk zLA{!yVC%trVmfDe2Dt+z9cL})SB4tsNpTUWm|V+VLFer%td&oBm{A=D6?b2byNIJA zHB7Mkr)N6LLaybn)h(Fx0j@w`=s3*oO8)(GDDT&w7l}WMx$$&vHy&}nR(i?0*W0m^ zpjf4MDT$%F{-9tb(7J|qzvi#8gHKG?8$(A99R7v6tx-M8Wp=~X>a5|mdilG70@;Vn zdNFV;Dfw)p)1J)<`Guu@+#n+2iYWc+t9JCa#Nkyt(ZdZp5;%3A)44me0*|bXzbpz+H{z_=>oLV>`r=aSOMDJGi)t zyd6rJ@PEq$7%dBHoAy?mZB$z>GWab=x=yl6b1gTEuMK$K9A$o1<%>F#Bf9wXE!pt7 z!Nmkoe2KoFJq1utYc;jpI@7r*TsFQFsx~D88Cvh+Vqf5qd+w`l6fflDs)wCy9v1eo z25T&l#kwN36bh#7XYDPX6zq7^`z%JV(mj*-SFgX$SMrzQ?2@D`G zTo2`{<>5Uf)+lV>auFm_)y^!KgPnK<49}{p0Of z=z9)Qv}1&2<2%^3U)KsA zoSs%gQ^6aiA(lNz@R|o4f1?*8UH<4=^5=^??3dy)#?JWQp+D8YoDu+kwx}vK=#d~R z@B)TWh>FzcHQ31F$&1R`R(thrsH}@hV%OK78HDwK&Qg!&ts0Ki&aIup0wGFh&~*j z;x2671-KKE%C%>-z5^Eje4ObAKtaBh zm07m0jKkjH2am*VvdN0J5%i;}37c!H9R;Dtx_?txt^^UW%){FKTV~nIEb^1yv_=JM z%=gi`%gzn#@U_8<;hq9!?*m%9;7E{})O%9N@Z<~(~ZD%`kr^!=>QSHzo~%02^+r|U_+|FDI!B94$d-l7Y5RVFne+UO>tsI zbpBxmeB|iB%9Nt~PPXhg_exCI8SxjAk%9*QmYcQA?5hKi&e!KAH7_uoXA6dmvgEc- zOzfmtCfV2T;tLTu4VH|}riybb?#}ENoacsG^|C@rQTJFAl8!zEA0>x)5C zO?QB-U9=$tpVR+ee*lkUPR0NPh+x_)uw)O{Y-KvcXSPrZTc;zc#+ z()py-wqR7N&UXG69g*Ta&#IVi=0#myWvPvi*S*k`Cg5ujLE(N_R(MNcYsYSq+Li=RrMb|A zh2e$boF9fF08DuZ%S_Aqo{iyK#)(|7a8@)&Oq#>N5lqbbT$-$kbub!t)?u306$ftZ z#o)DGL*>wH)J$^KJm%pUfFMs7H@qE!{?zQ%A$_>5npb{tYG&vDoQ2s+F<3jRTvplr zdUG@tUfxNccv<&O-95L>%r>14yigVSUUTcOghkHmKZ|b|)~depo&jZJU#jHss3vC} zfqmgLexfHO4brK%%~ZGJC$?J#bMrZ|+73I{9bs*u8*%1#50Q^xy5BeZSKJ#Rjiaq- z)tnd{FhI$0pI^ZzVHsBsDi63F8xMNL9V8f)E!TJ_EY0h5PmXsdV4-z}2MUWwc~T~- zWS7Y`3r($}2S2p|`qp~G%cvT`}H zX~=wPn0%1MpFELqjW|Fb)}btnlhd}{l2O2RU8sKtKO3IJaXF(V2484HQ`LiyCMK3Q zF=*^Mz)b-ldDVYL7=xe;<)hK0q7>xgkkvE&oevyyfosY{cJ;JFTwx_nWEUpKY=~X9=t#E34LQU}}b_v$q z4A1D%*bD2M9j3RwDx^-IkBjf@#ugWfjhKxKraBPmU&3p z{<85ZDx0>@9voH>3sCiOb%QOh>(M_uK5Surx$DtPDKTgfrBN{0>8#y8NeC2mSqdsy zL;R)FPV}mu@OaFL!Ens4r*=NQ%pOTyT22i9EkO0xZN@=bLjF=OK zQEv-|9Q87=wi{}_p@r~gfv;lWNlgl?UEZQ)2zll!d;G|QKngJo`;c2@%aJ7|Cv)k7 z6GG4e0Me!$s|B7vkm@AAKbk51V^(jv>fePz$lmz->1ikv)YZtBl|gb$TqPgluMb>#ejL}CsDMNc&kOamB0kBqO}|Ox zF)n3McG2#{NGNd~ahxfR!2*B!%?uMno+t-&iwCM=nW6Jj<(6ddLe_sB_$BJo=c?z5 z;3*%3C|4tB&(~-LkRg-Pk^|+&hEfQ>Um1Fzp=pQm5QJnb2KBEktWYC7nS--*p~z#E zBNF^-t1{PJ6oauu_8=xtE1PW_+=BFT9zjp^!MSf2J(%`2#~T5b9%e=F?956n^4{k- zrE2GEc&G__1+e%8JRaK2{JQ#?0XP7Zz#`2ZpG6I)U2VlgYxuHb_+l)2f?O!G)Xge| zk9df&g(2-MLyFeNb&&R~^qs7chb74f0R)B^Nk|}?l*eBxW;dHApn+dgSkdNXQgMa8 zG5*YXIliY#BXp8QZ=3I%O_!+ha!^P$imxr!cnFt`4xT^R3q0x|y486cJ`XwKy0(*& zPqHm@g65S=9s-B#wpe>s5;M#31V?r-brwBG%AHR82}ciqL)*38|vmyiy|Dj>O#S$15g^Qw+N8M0UOH%I^&J&x1QAns`8mv!j*JA3lqR0D)p! zwaXJGL_?uus z?u+!mf_QO>x4X?vX8a?r3hmS%h)^b#@t45r@;)wTarWNyGd!{a-lNo_Ss_p2Q_Jet zez!gk7)igVRKCM&vP4J)*Mol4g0+z=sspeP-iT33#gemtq!=3ErKHG$(X^BU(3B&D zeu%+C#TF(60W4SGP+-6dN00_pO;MFL!ZS#x7+Wr@`3ABgi@FAf{jkQDZ5GAwH=vde zrUb*1i!%q|EdG##74~DRv9erf>ifP@%R~qkP6Ek_@x)_=kVE8R$-B_N!Ac+&NT@bX zLPbJ7<#%Oxu!?0kr3FgswpB@9LO!_)7#x%k!iLOhVQCVdK&4L|FD-eaq*bmokmfB%U2GYaz_ z^JiP;Tf0Sy=PzK?Yx21~AVboI{SqKYmgPDNRgZB!Zh3?oEFM0Y&llluQe}GPt++{vllIvGw%D-e1 z&+fj9x(v;@vtoD;RgBUf9>_wErQtxS|BOLunfV(YD@9F~;GHuiSe;k4H8agP2`YZO z2=C3(XWh-PX|#MQI?vB?GD#ykcLfkeB{E8uIwA2{-bS%qKJ9#4r;F*$MMUl_l$+nC z*%85-tQ*8qCo28bol8C6My9@PZ+)|WXT*15b`zc7bb9;`ag2$nW~#(^e6zR zInX;^UiLr+9qedd0R~Z4>zLQw@tUP{&NelZ^?(r|;66}1?qAe$FAxaU^dOUpR%9^; zbWBW~!#MzqCAQL9HoO*h3p`r!JB=MLx2pP$@U>A!*ks15GGi{Ei=9t59o3*u+;G6_ z6IWc$f7imp7aoTIo|gd-4*{$PTUoyL9FwKbW)I$6`;F~Z9fy%BS*veqJJanrA1w#> zhZ2+4_FM&e8iuclVvkN^x1gW(;~$N6B)`4=upXpSg#^+@n|h9m#@AvFPO|M+H6|s6 zpuMH6>B)zsQ1*+RKx=2+v=vW~T9H|jkqZ0$%?}&Y5gV?J07gWPYl&awEP2^MM8h4??k zz%oU7K`9Qix~$Ny0IOX&uST${Y)p2F)bnI?47>AZ~e9S+*wx6oh45_ybO15c7 z)3p)K9~1h?mYb07A+q3FsC(g{DMy)?-;UO-^5UfA;xZkn_*GQyhK)WHlVz8q??^4^ z814w}GvY#O3Z&8f6C58`ogFm1V4CTK#b8!PWz1IiA5QWPeV3I!R9$S5ZYl_Y6Wc%R zE!nxHrB#Z3{Em~oiOJn8LSrUy*bBB5E4yV@6kiAj9Xep&73S#>@QKjCg<`IH3N#4}^SB zK=DgoIsC}e-jQzjWm2~}}=`xr5`9hURZLWpY(A*iJhjw|Bi0HSqi01#&*(@&K zCit4Hhthb44yv#m+Vk1=wlb7zbL<|U1ai_Rmygo9Z4V>@gO?Hjr%xVhnh z$}X>y7=ckx;IfPXtdL%$dcVQ{Sdt{;Uxax5xD+o;+$s@AcJTY57e#-<-^89#vG$T0 z`$EnhEE6nZv@0Do_Ud{qJAHf>rD+0`14v;C#Y6~1z@jpr7k*%gC8#1&3wNR^qXR^v z*s7mfh(o$N?4Rj?oFl z24DsJQ0)X<4=RapghZ({j80l5N+Gm7xp)wyrkH^gCJ!JJ=j1UET7e10NHI)Vpvdyj zKUHKoCx?)QC6KdPAd&%njZRF{_|p8@kZ+h!T(~xBRzWO2cT$nCB`i33DoP7<7)^9t zq(Ga7Dk+&Jdq}#eGU1Om!YTR6Kx7y~7T=#|5t?)U?Y~@r0QeBHV|T}+*;CaMR`I+} z_TLUpE}{Eh6{PF$C0=|z?MADXt1`lMf!48gLzGp*br^;c`^W;fxNclO+L;Z+@87(U zq2Uh4;$nUW(>a119ptbv6ppuk_vQ_aJ)NPweUE8E)V0sav@`dwq7yxmnFnugHDIb3gKLkH#-;^_7fOj*%}kk9DhPKLF&W!iWUt|o_kCqX)1M** z(j;NLcerVB6>0wdQ1NPQMAkTHHpX#p@(?Xhu>@wjEguBe+y123J`F|R5lIc3aq*tI zP0^xBy^I-+&CuC%cI$X$mBinM*LevOs9mn)_Ta^HS>MVbJhb87n32uRBfz)~hH!~# zd!!P=VTBb#4QsJc2#>C)1%3*Wyp+94&f#4)!I#8h61b}<0Mes&DGHPhUrg##)|_{r z>cVzybmIj6hzeNu*IOPiynQ-4o|WHrb}wt6#eTYz@S%PZ6|#GoAAMO{eVosJ+F+V2 zu(^+X+Gg?z&wg6ZejZ$fdTxKY7=77D{>}9A*zR^h=yHd6J5Lf48R&a`A$ZH_dmX92 zW+wQ6?{kOyvMBg6nf=lZtMkl4Jgh)lowerr-0l0I|KvW`^?Zc-a+&=y4dTpx$bZUw zd35!?!nF{2X!iZv`(kcDYZm;6t}Qbo&FG?<13a*`fZkgh(djCFIO( zezQ%^_ngL;1+-KiX!~;N`=H^A@_5z$RN#B5__DM5biBIZ`y%*E^7!DJ{m$m>LGUHF z)6w_A?B(k8MZQ7t7tPDQ@Aa(jRr@2m&&#gwrT!OC%L}8xgPjlIt<9tS!p6pp@AIE8 zH;V-z`!fXfE0ufjQ-Y6-AS8Q2ai7HE9!-zv%RTGfb*+21+8bX}14j`w0r0(kZWM!I z+X(5NcWRKJKSEi>soG+T%ep0FP1{q#+gf9f>+lWRlV$qR=9ZIKR|Mv!)JlBgxQ^xZ zg=No|n70vMSgYS^ot~hEo*s}}%otF2dg5uNjo<2edM?)0bFO;!EbjA*2$8k&LcV!kt^4#xxqr&|2RTc^^tswf3hl0-!wwrybR|c~Z=`o}MmmLoaz&*R|HxAM;ub z58b!9o_;4NwMp0X^!1IAIt(LKw24$qtL=T*^!7b^5IvEoF0}zV^FKd5pso;;My=d1 zJH$7TJAWrvz=~pUzWs=TiA|C6@fSuA#<{J)l9683<_Qp!X;RYxeNvjtrAD-mI*ytPofjpz6&0t!o{p-9K}Ksn}_) zw*ka=nctxIbY%s^cl~rWH$1k$aUT$Do~zIGGoJnZFLZixqP0S{dp)x10h&|gP6Ty4 zmH17gBz+V==9RQ4H`Qf+pPM!~tk){%lZUpOlhWGLHcwB!_wY-rNjnG^>bDmC-<-9U z4Ffj64424yuL1;*iF4JHB>z1e+UpZPGl=LppDk2Rce6S!1QT@i5uT5oZ+=vHiYKN% zDsFIjapoIGahWlZ0vA>fo1WhpkIWmp=!2f=6ZW?ns3f!}i;LP=p2YE@T@tco(+p4C zg8lnsnps?oedAUz2N6!oJ1yQm(B}%-zoPMboS5>O_m(_Q7wdF!y4`1uSRjth3^zU; z{-~kYZqWw2wB30RIphn-tZs|TwL_IC(Zz3bW2^>y7eyscJ`I|=EyYpXEzDznx_$g@ zI^&obJ-a{OB3Qh~=F0SUUdl>V;zD7{b78eSxE*i$3XXnx#+hn!v8`S2Q~hxZP(@;4NWUrrkSrEYEen z_~aRVN<|Dk@9Y)hh5>W38W_}pqTbzi9f|Iyi^Y(^uTFA;k}h%%`7DWqZfac=ME)`8 znGeETEy@eK+E(M|bK$1E5`~9k{SG_tE_lSM?RnXa<9GtT`E=u{dPb`{HW<~MKaIbo z&J}kQ#a&u%ZoZk5veNlnDKDw<qicJUsO$(cMme?jk`U2+pRwb*!ynzvP)JNI=ha{5d_Cyl<7nei@m}5 zUm1glyzjpu`>6;8u0Mij{_HI~y-Q+GUP|$8{GFG|*^coZQu z3_?d=YQ$fyo6%woc^?o4OGxsWmNrG>LBx@vIFUPY{OPZMkWOPDHgZUhd1Bt=)a-zB z`F=BDTpo2?&5ls{kAn50VaTVWfS_D&(M?sxD93J`!!OZM)N#{;9dBut&0^v!DN(Rc zKkv)Nn^*Vz91?ynd-Czi1m#J`(?)b(%@dUEumTd24_av;C%%pOBa#MMRF zZV@fb(#{7KVy_6d&~(*D*Q~|KB=HSm?|&&Zj#SvUSoTmRl4%p)UO0@|axLX#AG)Lk zIuG#AeWd2pGuy3*Su%fj7{A8XpEQf&nOZ~Bd7V=;e;6}Cx4Yb??~^&dLhg;;+r*gr z)qF7{;(&T5$?NH4u|TcPCn*czOhfuf9Ghgu@u7decUSh-_)cGA$31$MO_uPBCikz_ zhds^X(VlA;#GesnMGO0jWCu$Mc(dE7XhTcepEn3V4WI&>##CNPxcfFc%BHCTFN5g+O!A&w53%AGnhJR|)bn)7>=eyvS7Z&Cmv=k)~p8KHMwObL7b_l*FSy7+7 zkyOk+`g92-?0tUZM=y~YmiIqvP2YAsprXi{eRW$S31cefOmk27fyCWCkSHMu?J*`*#G;Zu#V9?$sCjHZE-QAV>!pWTbfM76r0 z94$+y#|(#=U25i+i|1JXCU^Dl4sx5*_qGvLo4K=Ni(>Gc;}GwB<)`KCgSQg@4!6K7 za5>>Hl=ZRJ@D1M~f87pi^Ltc2I$xd9;;(qi(vC)Z>h|_mA`huGO&kJei}THCCs$Xcl;8YNqUY1dx;~7^BPX=JP0q`*SpqF~<= zD?#rlJ%SJ_KD1A!N?UI^tRr=l@Q zG*5aAV;)-D3O!|RIk))xw>-_@;5`dM=2+s+NZLRx=;htdz2l=n62t*iQQHB(s8Su} zF6-llKiDEGFKnQ7E<5hDj^ovzBR){9Pl$T_HVD!*s9NA>3oBi3?uqiUdZc;Tsz0*H ztxUC%pn%8E5UZ}Mm5^9M``Wwm@bG;597^Kjwz^8v)@)ECVO4u%2$Oa;Tv9s>at{?F z7+!Nk7poSQ|JhB&;&HnCFtZRQqdkP$NvX(rek|xN6?4=3fO;C!DhRwtQr7C}no!Pj zC^D)Yty-kaVH!%g<+NTV@^SEQZW3KoIGikl2jN`4aYEu;Scbi+940tQyg`gYdWaJj z3+_sIC%S4m+Nh;X1>jlprUCP>zq%$;Xg_45D9nw>K+JtS2qK?I$2Mp zYnn(K|9~R*y@&MX_?Tg;)R38S3!*@vZPj(EhMGAhHR0*DHu*UVBO(TN>V0||3|Gr( z+s%q+)^l&hXI3Wk6w{Bt;zGO8v^K-eSW>zdXLR->2FatLX=z9BBg8+}rEO%Z9F@(- zgb0D32@pco6J5>y;?{4N*zn#!!LF)U)Co5UFl+aRsuG$xLbiG_Qt-HBJ>?a=K6!rs zd|sRrxg8!H8rg?G)A9>`E$q|SKG;z8!;P8DX6x%)+YYkViGUG+qqFFB_i*ZlRyYa#*8|)S$hV z{D!`I51h@uqqd=CtY*is{yU4tVZv|f9(_4f7X{mR3*@n11`>(A@7aVN>v&fA2k9y; zyiOGa-(!1^%fXZ`+%NNXgv=gIpp+Qaybegoj5*#Qy^DH*m*GdT|a3udy?oB|%Su1fSufuCc7htfICsxZM3NpGc=4?DH?>pDRzrJZ_u+)shCjPyZ`uV1}xdAwaCN{yiy zy*@?dI-NIgNzVpci~fF{rcu#{W@8F;-eLJE~F5YD=j_Ss@6fcox8Q=V<_U^ zSafTFFR1s!^lY788PrY3kIlQy|H(1LlSpgVCnsKd?Z{_pJdM~jeUbofDeyF3&#aqY zjPR9xeI`9?^J~U_s)gj1P!W+1m?RL5aWN<&kf!voPJC+t>CzR}TVx#hmP#D0Gg!Ye zK`9J!gaSum0q0?tvOS@6q)iTb?*z561%#U_O=7DdxxkDROetp(W}7vpW;#r+1g3|n z(Bee63cc;tXvWq+G;4+e!|GN}eAR56g<_+jwE7&@*07OapcU4;E3{l2y9f5Y%ME!+ z%3!ToINC1@KLi?4B524(kh#gm5n%&Z#)*61y;rNOkRv5?-Yg=S(iQP=Yj{D`PQ1$Bkins7A2t}_rj7bA{s0MkC!Z_1j-lj=d_W6_QaNA4v$8==-nF+jQiv1=z| zD6$4aGqcv*#W+TA2SkRPT4-;Lz>t(7rLkHfH|v^C8Z5xjN`)rE60k6s7=A*nHH2wo zQf$cCX_kt_G)N-)8g7bQ-36#q3@k&IwyGU~ivAL));uVZ}W* zvp3`0*68ZJBQ7Vl7K%^enG8iu)@<8o*5q9PH>>EstVx6v%TQhF4ypg({{4G@|Kai2 zdsyjoVRsbILQo(aNDOT{XbY;I(SJ#>u?%T*`cj{X%Z4-%hEW0|P_CCI#hme=jxptR z;$$RSGYMrQtD%~5@a`-geZhqyo(N2~r6a#YYK#5_w;+htkP4U4OkLIqR!6L52$saJ z<-3b!ZHoi0xH}m>#k|V=^94Ob```&x+ zKH`tKBX_yjVf9_|p0F?y7I#4-jE=DJ|0obHf8u5@X~!LVY7LIH{d zOtp^Z#loP82sT1BYXqbigc1KnJvK@j%n3`uG7U zrU68%BF7u7S)7%^z1NzedbKB|hiMuU{h!e>xcm<_U6{N$9&tR)c`F{zlCEOp7X(lx z1+h9i7FzP#RY>~)x}9?b&U+1`aih?9RANE=Hr2hMQOdfX-X^JtiibV%s^_c)<+dD^ z@pRehxUtro7u`P9^+GiNq}0A@q-M7IslS!HZ-w%c5U*p9;xCoppS4`NSTKE*MoZSl zA2Q&E%5qOwwHiCn<;+&a=Du^+u9Gr}6qu)GK3=Ul@JXjSy}JGCToIoU(%Jz@vr7V2 zmzP3av4PQspH1w&k1hmI8k9}N>0sC$j;GP4pZkn$<&YGlDh?cu*2hRYfCwUHWY<7T~Gr#3Bo5K*xGdEL? zlVl9qtJ2IYRr{qoSy(Zqwb&GQmYgR}`D{}d?BW!n?UsSG*21N=u$y;yndIzH>SV?#MH z@b%#NL{aPTuC+|fHaNneCHJ`qK()3+9ToBz~PUhc#^ zYs`3}MdDi5pq6uj*ZuvXbfW6phTZ1BHvZYGPZqn5)orEMzF%84hU+>#&7~)ZL>UnX<;b^AcD!l z(WUNPeE+St?Yr%5Yk7AkhK&_bloAc&N>3U1q|Ial84?5FQrY~6F{lLu;Ju63+Sax= zf)UF#Eaq~bXZIdEYd3+LS!mJlo>o|)tHu9W+nPH)jVnopaV!XIZHxH1kh=HB9x)cI zwU(Z12sk8kY47SWrUb2RVOs?g;Br?4f(#R0b2{C-_Y6|n+Tfz{&cs#CkZ$HP!f(y3 z_qruLY;;rxcL2fybZ+G2syc8=qAZ&>l_(yi2C~DXN2X#Kdr82Ymp#VieNRbo=y;Oi zikV!SwbqPK4+m$&7NK>Cjp*qVENH!>tOaw?nn2?QBy{6L4F}SYnXqQz+zgL>SMPB= zu~}S6LyFBISOWpkk7I?grmXg`IO+(S%`uLNFMCO-(+n@>fq9`zP39syWbl1NA`Ujk zM3<0&6}2@0&M+NeV(NM2&INQxfI6&qB4UZ!*3_(%Y~)+(Z*Lo|egAiV7vs_0zklrC z|IpueIKl5=%{uXr?|bwE*0>ArUG{j$0f|JTvtxHjJ*>y0e@3;&ZR55zlFb?%twgT8 zG3RihckO$BxE}6*xBu|o^^m-K(p`|9AtAgH9a?*XrC2Nk(5A78og{%p5m1PNjBw0F zc#23JW$y?NFAin!oZJ&q*oNjLh5?Q{h99;G8rKao0ps?+d-$x#)1~*W$M-+%uHX7j z-@Uz&jWCxhtf~vG?yej+w!rAxw#mIe_V>r*eSfsJy=@ztx!fHck{s^6``&wZ-?mLg z@BYINKe&tF+nafMg6l@I+1s|cOa73n_g%o-n+e#HrrEu}_g+vo%*DOGzdu|~AS_;U zKpC?pAaJb#eCH)li4FnA4W*VDfx1k>z^MsH=FW<$0{37&!SOcc)aLRYCaq*N2@cIG zxlHxWy+hXHx(YC(iKl!?vK7n7GuMjSkN_rxyeg44sL6>~_-5&mtVLVr3=9R0!w4jg zdob)bQD;rvJK$iV&lI60+;8yNQ0%OcC_^_#jdmZWWh7ZFJKKjT>}nX0&ZASLbG@TO-)}vgBCR4c=MXPG;~RabYYM!mJqvj?c`4WI03XnO4m))GnZR zq!so8jcK;+3b0M8jjgb}RSqS^>S&-~5X2?!6qic|j7@3C+(`x1>$U2$?l+)(6bFim z>wsc(xS)@zK(Wm0F4Fxh{qX0Lqy+@TQMnpFR?DDOfq5ospQPujI`m8@!7@arJUr^s zFKS;iKWpBzS6`j-h`Qyf@enPQre|^Weql5v#2Yqycj+YZ2em7?UUC@ z^T%B9BY9BpI$vW}ZH?qCj;QNCVS#;5X0&$!u(pMKQ=Ahn{P4a@0@E_hdK2n~vsq(8_} zMI7;nsZ%9i4Vjl57~G`dd3ys0H(<)!PAi>H$)kJ734>G!*xu#ezlW7f@zkmDM43KL z5p3Rs9gRPM0`u6j)}y3-->bX{raVh42V-b&(qSDP+c4B%Aa|NEK!*W9eOPGs?HQj= zPlRQf5>XwOC)SP(_B){GQ@_^jFYn)M%@n$=)c4rs(lm`^n8=S!`sgDyZu+~=3vR%& z-!0qR-gjVFZec3L*s1X&MrP!>QX_y^bZa5Q8h35U3%v5f*&HMA$-wEn!1vecf+U{h87Tkjw!Id9 zP-8e4)V07DO}#DrdV}iJ?AJoqHUB4b;z$@L`Db)+VAijTiVQ1Jy+|7qOA|nAY@rM= zP&8DqKr$>^SqftXbQIIjLe#SF=SkhL?pn0x8*wn(eHn}Krw=m+GB!U9o{-0PiWVE` zjSTI!AeB_)02i4TN>d?W9N`Z4OsOfVclGAGtL5HIj2&HpbA~5}96teYSV_sFJ07@2 zjDhl>WEmjCvjmZ>y9;tlS5*r;NS!uB4?rn)OJ!LkiP+t{ywL#CY%2e8qo4A<1J;^F z77)FAmJV!UdYod)8flFthZM)@BE3&5f{72166gp@$1s2Hsll zqk9RBOp7+68bneq53|aFsFj7*Dz}hs2&3L4mION%jVVUMix!c{ED@GwB~#`Icx9_7 zy(~W>F6VUS5d$1ozg3NyfRDg%gi#GvL0bV@Wlp777Ka?*_`h<%=ArXQmMh3x*AVkI z)3!Oy9`6sANbAu1?(bcDjVW_2TNw2=&^j9!t%obD;;b&;7j&8bF~Yj6b9;!!X8zt` zTWiL)wK!eryZ7Gr{n7W{rHAA1cD)O8V8+NKT?kOw^N=+?l_Q}Rq`jU-TIWA$xg*Zc zNKEGnDw|sg;GpO#e(rKPGZ|_kUB-wMS^xkb07*naRLSLGOpRZ08A#PNSS(9xit6zV z9qIinCw916hg89f;RGNP!#1{7)5PeImr0JxI0>Y#AkkCZpC9>2(Ta|9^gO-F$K`*=%m>|msk>Pf|I_rD><7wyndvD%n}6x>=j=jFYyPg07pBkCb@v}%kLx};a=Cd|Rbyl{`5cyV zPIRcH8613Jbm82=;u1PjEOB8;*N6|D+DR&!O>ngr~)B}pOG9ht!tOUAO& z_0R5Hy7HG9o^FNCp$7SU%A|iW%6RauJzt>&f9FKaeLjKPo{0#Ebe;} zQnOY!Q^FTMWs*d}U~WQQ=uC~a@SuTBN^N3c9Rq6xUl%OKOM6 zD;foehM)VnH-r?@%Pm5e)6CF7z#79NRelMA1`BmB@8N{y9@vG)?m%}FjVf(Q%a~)^#Ckt zV`DlI8=8H&9E=Xed`#4KihDfLdamAa*(d$@XJoU&*BcZ~Xpk%|IRuYt+Hp^TZ zgq7FiBS)K^3_lt1=y1AQS~R(YeXzK<98vNdl4zvj@-#@u<`$xKP6A};q-70E5QCJ( zjc$i1L&9(wM8Za!b3BQVLe2ujTnP%FARw0m$hUc0HzqD~>~eWwDop9(T7RCJ_Ynha6VR&`hiaY<%$1jS-DaqPx(g4)$1kWpxf% zkN6ovI0T8v$KmQkKsuu>QFCZVc{AS?Ei(51_~_ea+t%K;H={v%?E7Qi``*>P3r>4D zA7C$XF_M}Qd&S~H17Tz0cqC{Zei@=U@_AdWj?;zkm+Er)mMn{DVws#GScOCIUN~F0 zS19JHO&-Tfj#afQ=$=@8zbau2veoX9qcLb`jMP5Jp6nKKVG_O3u{xK zjpuJBjoMFFR=-%K`7q1V3|c7oQ}d-SN83jl%T{H!Hp)D$-1!2ftSl2(`31oJm8xHY z^s6DwovR#Bj+U$f!!wO^)U~wgK8^NtYiKN)phX#>lMUH9D6$~}E@`{VQJN^*lqt_NeMJ>~P& zeUcSC8{u{0u4@yQ5qnYQ^~2lDx3lw^X1|!$XH~3(r*dn4+pjO`%d@n7_qGw17b}dL z+1|OkN0gsXWlEfn%l!r*eFdf}z+|iASif`|d^BG1&8-r)YC7lV8s=vM`4UOA3}6<{ zmx!`IwR9=SVO~CHX*sIV_>VC_5_zX}Gj7(})>=hrlNezNB1@b3}S1Oe<{^0$hcTD?KsPDKwN9 zARPHZ&2L=MKkJL*)L4@DL5<4R4p*>qyz9YnlUp%r9=^y2Qf@3mGQv=Qqr&hLETJWA zQ!-Zp+Dp>BHd0Mp;DQuZa}>mkCe{HDj~DhO3+nHz+M^7=h5MAMHBg#u(3tpBnYglG1c!bKmmPw zFUV@!B=qzaYGGj~6QnM6fq>H*8MfTgY#zA|Uo(E|#&Q?%L0Sd87xR!FJcR7M_@B|Tk z&l&C!iw)^tIOq+^iwTn889g^zbwr<#ls-_MWQ%dLbZ_;IOVX1cx_fokHsro79p+-$2L|Vx+jBVxpeR66KzLrgWb$Zsv-`xKG_m@sf^~dY%W{E&3Y9VQP$v1F? zY23p=i*odh;qy`oL!a^!l+fONZ5k3&s=BWQ;_Uq82~N}u42B($mOQ-ohG#~B^s+R} zgUZ4WLxxl8wqD*-B$K+FVgL??O=uZ?2O;`J3|Be2qfEmTPAdbCDsQCOWszPnkw$C7 zi=7mvdi5rNjDVUFw#eVhT^_TBnh}}EMzc+dFaqA_ASLg6-W|_4LHqt*gD5GG4ANZi zy{oS4AMw%>{TUjn3K2-6DWfAPup5GAMIg(}PQ+ONbUce5h_OPr?+Hn8-Psc^!Bj8{ zkWFt#p11pR=nGZh@MthW77TcGf+>T?DZ}H;RNkjVx@pi zBLrgG-auGft4G-YX2XNRw16?p)o3*qS(l)=q+gCS590(!cd5ZdED@y|z%dA@c@>mq z!hn{O!UWvePakuVrqXX+=NSC_f?P$)RnAuA!z;RiO3qF%Bz2s7P&LI(2!d)#K zy}G;712RzN!#N!y*&Vw?gei2g**-=v1}H}<=UwguWdZC17nNyv_qFhe_Ar5B|dHG|}&jFeVQ<2N&6Dz9?Vw+p-*qlbs%7S<5QZo(y zGx)8Bl2#XB)+ID(oWK!3zmoXXmH$M;0X|lY3G~O-og~apObX_EP@OG^F%NWru4ZIlPn+{wWFrGhi=KDI`PSd#dH#QC)Ve1cj z{mI1@d51QG8v+MPyZ#nnbeP7a)C4&V!M;quxw>{dlIH-E1=V>2@@2s9RnNZRjvG zx()|Ymyn7e6q9fOc;IY9wFK14dT||-r96kXmPRT@$h}`k9}`3gOKlg_$Boo{_lI3 z4rUZsGtj6A$nLA(Rt!imG;spqlWPqcND|-@x|D#~1_T_P&SeJ@I*=ww!}kz#Gz?PD z3u996aBuC66&+wG>=Y1zc*|{&k(RCu^7ePsK_*g`b_$Z>!z8HF-Q+o6n6-_+axHZ4 zVYw`&EoY#&VRPwnl5hijAOR=VPvnuoK@OP&_el24Q)txxc zILiQB)}#mv;KN01*k6=?QxIxZ1)1RTIwx_5iX8O;49CTy+_GH(M&#{u#@`w^PYj}a z@4KhzDA}wvGn!4;ptM>5%&AILc4^I`>>#TGXAmk$8Gji_&mfX|_wF5%fsICn%Z~!Q zRRmu$PL^8!*T$P9*tvLfQf3&Fi>k&Wae6tXuJEtwVG0X+x?>d`RG()x0KkZ-S6&|C z+CU(GR*|9@!&P6U)Yv^7Ybd;R3u+b~JmRnoHhcz-xDN4RlDj0@a)=SNxI7QRmVG6A zsyyQ<@~C;zWC%0&O9^Ail|x2y+LA7kCzJBVbS+&V}GL6~+vt(7Dhd{3y?#y0y~hkXcV} zasGVe-yb*~do7+p*>2F}scN&lL3NcHm)|H_Kev3%yvkyH z0tZG+fr~Dh{p9IJpPC?f7XB zUJUFg`IN?6Ng0!6NhfCusu)viQ?G4HA!jM)w3@hh@L2cO6SZ8K|BJ5S`J#|u13Gv< zhPN#7)Vu4Kw+EKD+v~b6jAtF@qCeUOx%f+Tq}AuP#^M^ z+vlgRp2?YOS}pOfqr~*<3TcnDG}xej3%&bbqNZ z^GU|L^<8pr5l6er_g$&lF}D)cm3Gq28Tawi0<F3|Qo6*8$A3)@_lwKZ8NOnIfmI4ysFhS{+zANuNrlFxTJgaUkJ=(oL9-GRx8YwQTHp@3#BMN!JJ5;F}g&Flp*d@=k#&hm{^#6A|zS~n@81{m=TvwV{jagAeU3O z@<+Nx4JE>XpqRzCS)lnyucd+G17MK?Kx6M6gr{TEF8no#K`jq zJ?s#)yQ?B3SwqVX2|Y0GTn+Ml59h0B#&E8kUQbx97{|E2@}cg5O4DH$CcM*+L@o&< zh2imeyt9UuHlgmlNASUAi05pPiNj_Ap?TH4g=JAkbgeu=@DP~1D}m3(>W3sq=%w{p ztwB$<&c?lLWo{gkUjBJ_C1tqVxh`@w&W~pWNjA)e1k`JB@IzXQth<*_nlPHKU>_=v z4r9V{`OXPBjxVq-vUq+ce_;7a0Qb0lF}7qP!(a#HYAzOqFt1uaS_&m>BaLCuf5Q#( zlB-J@_$y~WM@(5k?k2+(@#3q!giqvNvjn{q%D+L<`DvQJP+mT4qRIbt7`>TeKKW4K zn4EJyDlZTK7S1Z1sOnVfM`_>p7t%z{&NmPTKa`wah>2?||^HGQxo6M4~Xd{5p=~Wi}vD4@2`7>$t zMSI0BB#oo&ia{&3=&ASg36+QMA8rpP8Q?|0@z)?x=$$4E8gDTp7jV{vR5i%^*$f` zFJc|*(A^U4n&(tSJZZxj<8LIrpp$RNGe6uAUsKN4)wt5wEv)v*Lay4uTGR_xfY0^l zw5+aVe|jDe`IX6he)LYX_Zg7=nyw@BqlzfkRkJ?-$GpG)14(T&1xBOTg(ug;@gthb#qx>{Jd<0)GiESXGm%`||%d3Z6CCuaXuVujV@} z+dQu4gM{R$=xt$P8y{FY#s?=tBx0SuF(T`<&ELyK_r;UrX!Bso`TIk?_q2bnym-t@ zn5*>~tHjo>!G4o>t&RJm#*ou?qhjINew`ncXvzk`}4~rni%PTGqP; z0G19EgLu6r>PYCMt>Bv^$;w5KyjKJ^<9OQl+(7`1DlwT6XTneOZW2n1B;hZ3VZT7M; zuFlV0&?1!as&-Ask@G@(g{Xo6^>7*x#}4CAH0ga{^csQ4c<8OrT05879XNlSBdkQ^R!1?w}}r+ zIMwwTads8HZ#DBf~Y3kFq-9CTTlGmE&RTuiOqHD`vZ1ih7ff278 z|3c^aQPrUrNk@aM_;G6dRhwF8_Veh;w@M$Xn%}&-Z_>eM`ajM~au9IVzGiz?_JNHK zed5boINOu0d762wvfIV@0=szu0leg&=`#KhZ7B;}Be^|oYW+T}_tzX|e0Z|w9siz) ze=LX9!}z+auB_%-*Z4}uQ=;2FV)-_Ito{w|x<6ZvWoh3MXS}`k{Z{cgZ7ZKAzp%VM zHC4y7Hu#ooMjJk??nI*3*}0|9<&{p0;;R?hiynPNY2){4iRpsBCBIJNSZ~ zK3j1gHv7ffZ@$Y99)in)di~++edLo><7JOt6#k6Qf0(w$usF3^0V1uLz3+R1hGTgL zc;NE7{|}LxTzjbOOa+YuNR#Gm??ecOeUa+!H>aJ{btqXn-^8zk2@|NmCQ^YsBrJed zA%x=kZ9oFN?A!xwh$t*H$gDpo~LC z5LQk(4;$W*+ExK2{n`l(PFbxz6H|=T_+JA3WSUlzrtnSx!3a0di6Qs#@O_1}sdBRX z7?CK`R?2j#h;~fCutdxT*t%HGmZ2FL&pR?eRwJMYeb=2Bo((wTAP1Ue%TNn(<=y+@ zCo6~qEyk}-1`=8I3T31P^dT8mx8-j{2m|UEP>Kcf7!&EPTj)Z8dO>u7Pa7QMu=6Vd z$lGT{>q#evnM~tu4Z(A&)43G=gSeXPpYoK`37>VnDq)e9Dm{mLJh0YYhk! z=XB6)d4DNM!aXp?2)-6BYGTeA!x5k4ArQ0Um{A-@D~iiursIQv{o??EiyPy_V3Q1F z3fd@!U=}`)0T z1cf;P;pQXF_ceAG1SZb7r+LtUJ<2GqSB`3Gb&|PT&CvlArowZ1owbF@7|(+}|Fq>V z`Pe828%vNhBIeDxGFh0Kn;|0f0Weh%z7w+=V6m8v7C7?^0vQ`i*dLdbI0kl*jjBy0 zM(u!sXFSH7O^v!ocQ~HZKA*<**}geSOc{Y3?$$9#FiK+{nv8vVEbEADLuS`%H0Bhn zvvVt-RclZ3=-d$QWPMi0Vo@J*E!|fU-q-~uH=46G$ZxXAQCa3;E$nN1PU)n%P3l-A zbsHi2fHASC0mm{ROFNeT)KXic3SCw1&*+e^KR-#dw?g^n6PG3b;*Q~0=p=d)#`;;W zzq!WptYM$5>(|j(zB)Y{u@lka!!CSD+Xp|qd_Q^OXVSG{S4DB?7dN`hg|_dSidbhl zv!?mg+?1ZE_d~oKOlPIllg7UOctT59W#VNKjjeNao);n`dAjc`kx1`tDaqvh$ZIc# z=saa;tiN)cbwm@^UaYTl47om@pW=FrZ%5`KBF3w6*?g^$Pa+X53Z?*T+jh+`+Jkg? zH0@Yd-RepwYo5~p=C}*1k?-N{GFIcy6*68*GeD=Dr)Hd6K!y1+Lcm&wBbvPA+N0${VKNFBsH^rL8|s z^n5Mm*&yGN#6)jH1^@sAOG!jQR7%?;_c6Q=&vQ;zB*-lF}9yf zC(^oY#*1EmCT*K-s7O_fn>Bz55}c@wg_i{`n1JkI&l(a%iXSeuRCtDxu;g6?3jot% zcJ!@0{YME$o|n)=X+Nl(05KhD+);0ivRQkx} zK%)T})jh_maobv>nS0;&-Mwc}pW^~}krEqN#xBt2cpJ*CuhSnl(cuE#xS^!Xh0daB z)@aRWXjW+NEnP1}lM!?{2tabcp1>055|oI0n=+Q=%R|SUHCW26;q0FLrbsq(b+y%yb~yHtudJ z`e>k$yE@!yXwlpBLmJCN2(VFe#26AgkUo?{ViZUdK}$Q{XwsyAOPE65BZS!)P4qFm z0L?0JmIY43@T)4i6SmyUo^CZ%LDSZOR%5taAbi5*Wu(a(vS3n%7N}OxXBK22u#sTJ zg9_djoWp^P#HQ9-vATqvnaC(7+0h`Cqw(mQ<#4J_Ul0i6IO8I$1wj|}1+u%$_R2R$ z#lT7r19K}XAs|bZq#(38bP9S8ZcsI6n*=~~@8w`4qey4@M{%Uqi~uCDhNpza_O`u& z2#*>Jo(GFbXSO-2q?Qq>S_I|!*oym+!%cw{Uboj>EJh*Bz(Hv8)p!m|xG-a*DTYTF zYXQ^j8q>&`W6rp~!!iH^wViP299S6c0&Pd})2~BOQ#D}hx0;KeIbs0ffOU@1YUZ3g zX6~I_D$TPYy^)#B|rx=o4f96_SgOtVl zIrG=8ti+i?9^+dr#a~6PQGU#ZP)?ROd5UT_bZF_NT;7fBp@QY@Gqvj3Hhn8KX5P8$ z+%-?vN9(h>3+Ahrt$HSpewg8!bNu;C2^{J6BJ&Fj;zeDbY2jyzIz9YWD$ut|zrMQi z73rClSQ`6}+@!m8_Zv%t8lUKmWjs@iKi^IUJUGPQ6UpI^XKgn=cGpV3aFBD8S@`Oi z8ys_fSor9IE)NH*T6k6_`;a_F2M2<=LLuYH3t!K-Xv;0kbY0Y^wmosj~tZ8@h|e%-1S$GpB>f26tbKEU v@{?(Bn@`T>kJN@2Z$INT_{XUC*G&IEJ=k#rJQ);000000NkvXXu0mjfkzXKj literal 0 HcmV?d00001 From da9ff9a53a58e614088aa7f153d86eadbe2b672b Mon Sep 17 00:00:00 2001 From: yl1185 <1182784652@qq.com> Date: Sat, 2 Apr 2022 09:51:33 +0800 Subject: [PATCH 03/38] Ubiquitous/RT-Thread/:add atti-arm32-board bsp 1.Modify the peripheral interface of the development board 2.Complete configuration files and build files 3.GCC is supported --- .../aiit_board/aiit-arm32-board/.config | 380 ++++++ .../aiit_board/aiit-arm32-board/.gitignore | 243 ++++ .../aiit_board/aiit-arm32-board/Kconfig | 29 + .../aiit_board/aiit-arm32-board/README.md | 124 ++ .../aiit_board/aiit-arm32-board/SConscript | 15 + .../aiit_board/aiit-arm32-board/SConstruct | 92 ++ .../aiit-arm32-board/applications/SConscript | 12 + .../aiit-arm32-board/applications/main.c | 51 + .../aiit-arm32-board/applications/uart_test.c | 43 + .../board/CubeMX_Config/.mxproject | 17 + .../board/CubeMX_Config/CubeMX_Config.ioc | 441 +++++++ .../board/CubeMX_Config/Inc/main.h | 91 ++ .../CubeMX_Config/Inc/stm32f4xx_hal_conf.h | 442 +++++++ .../board/CubeMX_Config/Inc/stm32f4xx_it.h | 84 ++ .../board/CubeMX_Config/Src/main.c | 920 +++++++++++++++ .../CubeMX_Config/Src/stm32f4xx_hal_msp.c | 1025 +++++++++++++++++ .../board/CubeMX_Config/Src/stm32f4xx_it.c | 218 ++++ .../CubeMX_Config/Src/system_stm32f4xx.c | 761 ++++++++++++ .../aiit_board/aiit-arm32-board/board/Kconfig | 64 + .../aiit-arm32-board/board/SConscript | 31 + .../aiit_board/aiit-arm32-board/board/board.c | 59 + .../aiit_board/aiit-arm32-board/board/board.h | 50 + .../aiit-arm32-board/board/drv_dcmi.c | 243 ++++ .../aiit-arm32-board/board/drv_dcmi.h | 37 + .../board/linker_scripts/link.lds | 159 +++ .../aiit-arm32-board/board/ports/I2c/Kconfig | 13 + .../aiit-arm32-board/board/ports/can/Kconfig | 11 + .../board/ports/ch438/Kconfig | 39 + .../aiit-arm32-board/board/ports/gpio/Kconfig | 4 + .../aiit-arm32-board/board/ports/spi/Kconfig | 46 + .../aiit-arm32-board/board/ports/uart/Kconfig | 21 + .../aiit-arm32-board/board/ports/usb/Kconfig | 15 + .../aiit_board/aiit-arm32-board/rtconfig.h | 226 ++++ .../aiit_board/aiit-arm32-board/rtconfig.py | 151 +++ 34 files changed, 6157 insertions(+) create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/.config create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/.gitignore create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/Kconfig create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/README.md create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/SConscript create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/SConstruct create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/SConscript create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/main.c create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/uart_test.c create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/.mxproject create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/CubeMX_Config.ioc create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Inc/main.h create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Inc/stm32f4xx_it.h create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/main.c create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/stm32f4xx_it.c create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/system_stm32f4xx.c create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/Kconfig create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/SConscript create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/board.c create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/board.h create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/drv_dcmi.c create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/drv_dcmi.h create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/linker_scripts/link.lds create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/I2c/Kconfig create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/can/Kconfig create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/ch438/Kconfig create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/gpio/Kconfig create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/spi/Kconfig create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/uart/Kconfig create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/usb/Kconfig create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/rtconfig.h create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/rtconfig.py diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/.config b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/.config new file mode 100644 index 000000000..aa3ade701 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/.config @@ -0,0 +1,380 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# +CONFIG_ROOT_DIR="../../../.." +CONFIG_BSP_DIR="." +CONFIG_RT_Thread_DIR="../.." +CONFIG_RTT_DIR="../../rt-thread" + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_BIG_ENDIAN is not set +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_ALIGN_SIZE=4 +# 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_USING_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +CONFIG_RT_USING_TIMER_SOFT=y +CONFIG_RT_TIMER_THREAD_PRIO=4 +CONFIG_RT_TIMER_THREAD_STACK_SIZE=512 + +# +# kservice optimization +# +# CONFIG_RT_KSERVICE_USING_STDLIB is not set +# CONFIG_RT_KSERVICE_USING_TINY_SIZE is not set +# CONFIG_RT_USING_ASM_MEMCPY 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_MEMHEAP=y +CONFIG_RT_USING_MEMHEAP_AUTO_BINDING=y +# CONFIG_RT_USING_NOHEAP is not set +# CONFIG_RT_USING_SMALL_MEM is not set +# CONFIG_RT_USING_SLAB is not set +CONFIG_RT_USING_MEMHEAP_AS_HEAP=y +# CONFIG_RT_USING_USERHEAP is not set +# CONFIG_RT_USING_MEMTRACE 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_INTERRUPT_INFO is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" +# CONFIG_RT_PRINTF_LONGLONG is not set +CONFIG_RT_VER_NUM=0x40004 +CONFIG_ARCH_ARM=y +CONFIG_RT_USING_CPU_FFS=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 +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 + +# +# C++ features +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Command shell +# +CONFIG_RT_USING_FINSH=y +CONFIG_RT_USING_MSH=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=80 +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 + +# +# Device virtual file system +# +CONFIG_RT_USING_DFS=y +CONFIG_DFS_USING_WORKDIR=y +CONFIG_DFS_FILESYSTEMS_MAX=4 +CONFIG_DFS_FILESYSTEM_TYPES_MAX=4 +CONFIG_DFS_FD_MAX=16 +# CONFIG_RT_USING_DFS_MNTTABLE is not set +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=2 +CONFIG_RT_DFS_ELM_MAX_SECTOR_SIZE=4096 +# 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=y +# CONFIG_RT_USING_DFS_RAMFS is not set + +# +# Device Drivers +# +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_PIPE_BUFSZ=512 +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 is not set +CONFIG_RT_SERIAL_RB_BUFSZ=64 +CONFIG_RT_USING_CAN=y +# CONFIG_RT_CAN_USING_HDR is not set +# CONFIG_RT_USING_HWTIMER is not set +# 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 is not set +# CONFIG_RT_USING_DAC 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_RTC=y +# CONFIG_RT_USING_ALARM is not set +# CONFIG_RT_USING_SOFT_RTC is not set +# CONFIG_RT_USING_SDIO is not set +CONFIG_RT_USING_SPI=y +# CONFIG_RT_USING_QSPI is not set +CONFIG_RT_USING_SPI_MSD=y +CONFIG_RT_USING_SFUD=y +CONFIG_RT_SFUD_USING_SFDP=y +CONFIG_RT_SFUD_USING_FLASH_INFO_TABLE=y +# CONFIG_RT_SFUD_USING_QSPI is not set +CONFIG_RT_SFUD_SPI_MAX_HZ=50000000 +# CONFIG_RT_DEBUG_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 is not set +# CONFIG_RT_USING_SENSOR is not set +# CONFIG_RT_USING_TOUCH 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_WIFI is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# POSIX layer and C standard library +# +CONFIG_RT_USING_LIBC=y +CONFIG_RT_USING_PTHREADS=y +CONFIG_PTHREAD_NUM_MAX=8 +CONFIG_RT_USING_POSIX=y +# CONFIG_RT_USING_POSIX_MMAP is not set +# CONFIG_RT_USING_POSIX_TERMIOS is not set +# CONFIG_RT_USING_POSIX_GETLINE is not set +# CONFIG_RT_USING_POSIX_AIO is not set +CONFIG_RT_LIBC_USING_TIME=y +# CONFIG_RT_USING_MODULE is not set +CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8 + +# +# Network +# + +# +# Socket abstraction layer +# +# CONFIG_RT_USING_SAL is not set + +# +# Network interface device +# +# CONFIG_RT_USING_NETDEV is not set + +# +# light weight TCP/IP stack +# +# CONFIG_RT_USING_LWIP is not set + +# +# AT commands +# +# CONFIG_RT_USING_AT is not set + +# +# VBUS(Virtual Software BUS) +# +# CONFIG_RT_USING_VBUS is not set + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set +# CONFIG_RT_USING_VAR_EXPORT is not set +# CONFIG_RT_USING_RT_LINK is not set +# CONFIG_RT_USING_LWP is not set + +# +# RT-Thread Utestcases +# +# CONFIG_RT_USING_UTESTCASES is not set +CONFIG_SOC_FAMILY_STM32=y +CONFIG_SOC_SERIES_STM32F4=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_STM32F407ZG=y +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_UART1=y +# CONFIG_BSP_USING_UART2 is not set +# CONFIG_BSP_USING_UART3 is not set +# CONFIG_BSP_USING_UART4 is not set +# CONFIG_BSP_USING_I2C1 is not set +# CONFIG_BSP_USING_SPI is not set +# CONFIG_BSP_USING_CH438 is not set +CONFIG_BSP_USING_USB=y +CONFIG_BSP_USING_STM32_USBH=y +CONFIG_USB_BUS_NAME="usb" +CONFIG_USB_DRIVER_NAME="usb_drv" +CONFIG_USB_DEVICE_NAME="usb_dev" +# CONFIG_BSP_USING_RNG is not set +# CONFIG_BSP_USING_UDID is not set + +# +# MicroPython +# +# CONFIG_PKG_USING_MICROPYTHON is not set + +# +# More Drivers +# +# CONFIG_PKG_USING_RW007 is not set +# CONFIG_DRV_USING_OV2640 is not set + +# +# APP_Framework +# + +# +# Framework +# +CONFIG_TRANSFORM_LAYER_ATTRIUBUTE=y +CONFIG_ADD_XIZI_FETURES=y +# CONFIG_ADD_NUTTX_FETURES is not set +# CONFIG_ADD_RTTHREAD_FETURES is not set +# CONFIG_SUPPORT_SENSOR_FRAMEWORK is not set +# CONFIG_SUPPORT_CONNECTION_FRAMEWORK is not set +# CONFIG_SUPPORT_KNOWING_FRAMEWORK is not set +# CONFIG_SUPPORT_CONTROL_FRAMEWORK is not set + +# +# Security +# +# CONFIG_CRYPTO is not set + +# +# Applications +# + +# +# config stack size and priority of main task +# +CONFIG_MAIN_KTASK_STACK_SIZE=1024 + +# +# ota app +# +# CONFIG_APPLICATION_OTA is not set + +# +# test app +# +# CONFIG_USER_TEST is not set + +# +# connection app +# +# CONFIG_APPLICATION_CONNECTION is not set + +# +# control app +# + +# +# knowing app +# +# CONFIG_APPLICATION_KNOWING is not set + +# +# sensor app +# +# CONFIG_APPLICATION_SENSOR is not set +# CONFIG_USING_EMBEDDED_DATABASE_APP is not set + +# +# lib +# +CONFIG_APP_SELECT_NEWLIB=y +# CONFIG_APP_SELECT_OTHER_LIB is not set +# CONFIG_LIB_USING_CJSON is not set +# CONFIG_LIB_USING_QUEUE is not set +# CONFIG_LIB_LV is not set +# CONFIG_USING_EMBEDDED_DATABASE is not set diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/.gitignore b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/.gitignore new file mode 100644 index 000000000..331082a3e --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/.gitignore @@ -0,0 +1,243 @@ +# this +*.map +*.dblite +*.bin +*.axf +*.old +*~ +*.o +*.bak +*.dep +*.i +*.d +*.uimg +GPATH +GRTAGS +GTAGS +JLinkLog.txt +JLinkSettings.ini +DebugConfig/ +RTE/ +settings/ +*.uvguix* +cconfig.h + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# Prerequisites +*.d + +# Object files +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.con diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/Kconfig new file mode 100644 index 000000000..32ee87ce8 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/Kconfig @@ -0,0 +1,29 @@ +mainmenu "RT-Thread Configuration" + +config ROOT_DIR + string + default "../../../.." + +config BSP_DIR + string + default "." + +config RT_Thread_DIR + string + default "../.." + +config RTT_DIR + string + default "../../rt-thread" + +config APP_DIR + string + default "../../../../APP_Framework" + +source "$RTT_DIR/Kconfig" +source "$RTT_DIR/bsp/stm32/libraries/Kconfig" +source "board/Kconfig" +source "$RT_Thread_DIR/micropython/Kconfig" +source "$RT_Thread_DIR/app_match_rt-thread/Kconfig" +source "$ROOT_DIR/APP_Framework/Kconfig" + diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/README.md b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/README.md new file mode 100644 index 000000000..fcabc4687 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/README.md @@ -0,0 +1,124 @@ +# STM32F407最小系统板说明 + +## OV2640 menuconfig 配置: + +​ More Driver-------->ov2640 driver (勾选) 保存即可 + + + +## RW007 menuconfig 配置: + +​ More Driver-------->rw007:SPI WIFI rw007 driver + +​ example driver port (rw007 for stm32)---->rw007 for stm32 + +​ (30000000) SPI MAX Hz + +​ (spi1) RW007 BUS NAME + +​ (7) CS pin index + +​ (19) BOOT0 pin insex (same as spi clk pin) + +​ (7) BOOT1 pin index (same as spi cs pin) + +​ (87) INT/BUSY pin index + +​ (88) RESET pin index + +**上述引脚根据电路实际而定,另外涉及到相关的Lwip wifi framwork已经默认配置并匹配** + +## 以下为引脚硬件的连接表 + +## **RW007(SPI1 )** + +| 引脚 | 作用 | 引脚序号 | RW007板子 | +| ---- | --------- | -------- | --------- | +| PB3 | SPI1_SCK | 19 | SCK | +| PB4 | SPI1_MISO | 20 | MISO | +| PB5 | SPI1_MOSI | 21 | MOSI | +| PF6 | CS/BOOT1 | 86 | CS | +| PF7 | INT/BUSY | 87 | D9 | +| PF8 | RESET | 88 | D8 | + +PF6 (PA7) + +## uart2 串口2PC2 + +| PA2 | UART2 TX | +| ---- | -------- | +| PA3 | UART2 RX | + + + +## SPI2 SD卡文件系统 + +| PC2 | SPI2_MISO | +| ---- | --------- | +| PC3 | SPI2_MOSI | +| PB13 | SPI2_SCK | +| PB12 | SPI2_CS | + +## OV2460(DCMI接口) + +| PD6 | SCCB_SCL | +| ---- | ---------- | +| PD7 | SCCB_SDA | +| PB7 | DCMI_VSYNC | +| PA4 | DCMI_HREF | +| PA6 | DCMI_PCLK | +| PG15 | DCMI_RESET | +| PG9 | DCMI_PWDN | +| PA8 | DCMI_XCLK | +| PE6 | DCMI_D7 | +| PE5 | DCMI_D6 | +| PB6 | DCMI_D5 | +| PC11 | DCMI_D4 | +| PC9 | DCMI_D3 | +| PC8 | DCMI_D2 | +| PC7 | DCMI_D1 | +| PC6 | DCMI_D0 | + +## SRAM(FSMC接口)Pin + +| PF0 | FSMC_A0 | +| ---- | --------- | +| PF1 | FSMC_A1 | +| PF2 | FSMC_A2 | +| PF3 | FSMC_A3 | +| PF4 | FSMC_A4 | +| PF5 | FSMC_A5 | +| PF12 | FSMC_A6 | +| PF13 | FSMC_A7 | +| PF14 | FSMC_A8 | +| PF15 | FSMC_A9 | +| PG0 | FSMC_A10 | +| PG1 | FSMC_A11 | +| PE7 | FSMC_D4 | +| PE8 | FSMC_D5 | +| PE9 | FSMC_D6 | +| PE10 | FSMC_D7 | +| PE11 | FSMC_D8 | +| PE12 | FSMC_D9 | +| PE13 | FSMC_D10 | +| PE14 | FSMC_D11 | +| PE15 | FSMC_D12 | +| PD8 | FSMC_D13 | +| PD9 | FSMC_D14 | +| PD10 | FSMC_D15 | +| PD11 | FSMC_A16 | +| PD12 | FSMC_A17 | +| PD13 | FSMC_A18 | +| PD14 | FSMC_D0 | +| PD15 | FSMC_D1 | +| PG2 | FSMC_A12 | +| PG3 | FSMC_A13 | +| PG4 | FSMC_A14 | +| PG5 | FSMC_A15 | +| PD0 | FSMC_D2 | +| PD1 | FSMC_D3 | +| PD4 | FSMC_NOE | +| PD5 | FSMC_NWE | +| PG10 | FSMC_NE3 | +| PE0 | FSMC_NBL0 | +| PE1 | FSMC_NBL1 | \ No newline at end of file diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/SConscript b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/SConscript new file mode 100644 index 000000000..20f7689c5 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/SConscript @@ -0,0 +1,15 @@ +# for module compiling +import os +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +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/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/SConstruct b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/SConstruct new file mode 100644 index 000000000..533cf2e28 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/SConstruct @@ -0,0 +1,92 @@ +import os +import sys +import rtconfig +import SCons + +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') +else: + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../rt-thread') + +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 = 'rt-thread.' + rtconfig.TARGET_EXT + +DefaultEnvironment(tools=[]) +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +AddOption('--compiledb', + dest = 'compiledb', + action = 'store_true', + default = False, + help = 'generate compile_commands.json') + +if GetOption('compiledb'): + if int(SCons.__version__.split('.')[0]) >= 4: + env['COMPILATIONDB_USE_ABSPATH'] = True + env.Tool('compilation_db') + env.CompilationDatabase('compile_commands.json') + else: + print('Warning: --compiledb only support on SCons 4.0+') + +if rtconfig.PLATFORM == 'iar': + env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = env["LINKCOM"] + ' --map rt-thread.map') + +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' + +libraries_path_prefix = RTT_ROOT + '/bsp/stm32/libraries' + +SDK_LIB = libraries_path_prefix +Export('SDK_LIB') + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) + +stm32_library = 'STM32F4xx_HAL' +rtconfig.BSP_LIBRARY_TYPE = stm32_library + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, stm32_library, 'SConscript'))) + +# include drivers +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'HAL_Drivers', 'SConscript'))) + +# include more drivers +objs.extend(SConscript(os.getcwd() + '/../../app_match_rt-thread/SConscript')) + +# include APP_Framework/Framework +objs.extend(SConscript(os.getcwd() + '/../../../../APP_Framework/Framework/SConscript')) + +# include APP_Framework/Applications +objs.extend(SConscript(os.getcwd() + '/../../../../APP_Framework/Applications/SConscript')) + +# include APP_Framework/lib +objs.extend(SConscript(os.getcwd() + '/../../../../APP_Framework/lib/SConscript')) + +# include Ubiquitous/RT-Thread/micropython +objs.extend(SConscript(os.getcwd() + '/../../micropython/SConscript')) + +# make a building +DoBuilding(TARGET, objs) diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/SConscript b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/SConscript new file mode 100644 index 000000000..efae61d10 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/SConscript @@ -0,0 +1,12 @@ +import rtconfig +from building import * + +cwd = GetCurrentDir() +CPPPATH = [cwd] +src = Split(""" +main.c +""") + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/main.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/main.c new file mode 100644 index 000000000..7f11d6ed8 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/main.c @@ -0,0 +1,51 @@ +/* + * @Author: chunyexixiaoyu + * @Date: 2021-09-24 16:33:15 + * @LastEditTime: 2021-09-24 15:48:30 + * @LastEditors: Please set LastEditors + * @Description: In User Settings Edit + * @FilePath: \xiuos\Ubiquitous\RT_Thread\bsp\stm32f407-atk-coreboard\applications\main.c + */ + +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#include +#include +#include +#include +#ifdef RT_USING_POSIX +#include +#include +#include +#include +#include +#include +#ifdef RT_USING_POSIX_TERMIOS +#include +#endif +#endif + +#define LED0_PIN GET_PIN(F, 9) +extern int FrameworkInit(); +int main(void) +{ + int count = 1; + rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); + rt_thread_mdelay(100); + FrameworkInit(); + printf("XIUOS stm32f4 build %s %s\n",__DATE__,__TIME__); + while (count++) + { + rt_pin_write(LED0_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED0_PIN, PIN_LOW); + rt_thread_mdelay(500); + } +} diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/uart_test.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/uart_test.c new file mode 100644 index 000000000..aeb9e8859 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/uart_test.c @@ -0,0 +1,43 @@ +/* + * @Author: yongliang + * @Date: 2022-03-31 16:00:00 + * @Description: uart_test code + * @FilePath: \xiuos\Ubiquitous\RT_Thread\aiit_board\stm32f407_mini_board\applications\uart_test.c + */ + +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#include +#include +#include +#include + +int main (void) +{ + /*1.设置系统中断优先组*/ + + /*2.串口初始化*/ + while(1) + { + if(USART_RX_STA&0X8000) + { + len =USART_RX_STA&0X3fff; + printf("发送的消息为:\r\n"); + for(t=0;t +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void Error_Handler(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +/* Private defines -----------------------------------------------------------*/ +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h new file mode 100644 index 000000000..c31746fa0 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h @@ -0,0 +1,442 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf_template.h + * @author MCD Application Team + * @brief HAL configuration template file. + * This file should be copied to the application folder and renamed + * to stm32f4xx_hal_conf.h. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CONF_H +#define __STM32F4xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED + + /* #define HAL_ADC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +#define HAL_CAN_MODULE_ENABLED +/* #define HAL_CRC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +/* #define HAL_DAC_MODULE_ENABLED */ +/* #define HAL_DCMI_MODULE_ENABLED */ +/* #define HAL_DMA2D_MODULE_ENABLED */ +/* #define HAL_ETH_MODULE_ENABLED */ +/* #define HAL_NAND_MODULE_ENABLED */ +/* #define HAL_NOR_MODULE_ENABLED */ +/* #define HAL_PCCARD_MODULE_ENABLED */ +#define HAL_SRAM_MODULE_ENABLED +/* #define HAL_SDRAM_MODULE_ENABLED */ +/* #define HAL_HASH_MODULE_ENABLED */ +#define HAL_I2C_MODULE_ENABLED +/* #define HAL_I2S_MODULE_ENABLED */ +#define HAL_IWDG_MODULE_ENABLED +/* #define HAL_LTDC_MODULE_ENABLED */ +/* #define HAL_RNG_MODULE_ENABLED */ +#define HAL_RTC_MODULE_ENABLED +/* #define HAL_SAI_MODULE_ENABLED */ +#define HAL_SD_MODULE_ENABLED +/* #define HAL_MMC_MODULE_ENABLED */ +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +#define HAL_UART_MODULE_ENABLED +/* #define HAL_USART_MODULE_ENABLED */ +/* #define HAL_IRDA_MODULE_ENABLED */ +/* #define HAL_SMARTCARD_MODULE_ENABLED */ +/* #define HAL_SMBUS_MODULE_ENABLED */ +/* #define HAL_WWDG_MODULE_ENABLED */ +/* #define HAL_PCD_MODULE_ENABLED */ +/* #define HAL_HCD_MODULE_ENABLED */ +/* #define HAL_DSI_MODULE_ENABLED */ +/* #define HAL_QSPI_MODULE_ENABLED */ +/* #define HAL_QSPI_MODULE_ENABLED */ +/* #define HAL_CEC_MODULE_ENABLED */ +/* #define HAL_FMPI2C_MODULE_ENABLED */ +/* #define HAL_SPDIFRX_MODULE_ENABLED */ +/* #define HAL_DFSDM_MODULE_ENABLED */ +/* #define HAL_LPTIM_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED + +/* ########################## HSE/HSI Values adaptation ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature.*/ +/** + * @brief External Low Speed oscillator (LSE) value. + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) + #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 1U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 2U +#define MAC_ADDR1 0U +#define MAC_ADDR2 0U +#define MAC_ADDR3 0U +#define MAC_ADDR4 0U +#define MAC_ADDR5 0U + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848_PHY_ADDRESS Address*/ +#define DP83848_PHY_ADDRESS 0x01U +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY ((uint32_t)0x000000FFU) +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU) + +#define PHY_READ_TO ((uint32_t)0x0000FFFFU) +#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU) + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ +#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */ + +#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver +* Activated: CRC code is present inside driver +* Deactivated: CRC code cleaned from driver +*/ + +#define USE_SPI_CRC 0U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32f4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32f4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED +#include "stm32f4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED + #include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED + #include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32f4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32f4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32f4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32f4xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_FMPI2C_MODULE_ENABLED + #include "stm32f4xx_hal_fmpi2c.h" +#endif /* HAL_FMPI2C_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED + #include "stm32f4xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32f4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "stm32f4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_CONF_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Inc/stm32f4xx_it.h b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Inc/stm32f4xx_it.h new file mode 100644 index 000000000..dd3a82473 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Inc/stm32f4xx_it.h @@ -0,0 +1,84 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_IT_H +#define __STM32F4xx_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_IT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/main.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/main.c new file mode 100644 index 000000000..bb1dd2e72 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/main.c @@ -0,0 +1,920 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +CAN_HandleTypeDef hcan1; + +I2C_HandleTypeDef hi2c1; + +IWDG_HandleTypeDef hiwdg; + +RTC_HandleTypeDef hrtc; + +SD_HandleTypeDef hsd; + +SPI_HandleTypeDef hspi1; +SPI_HandleTypeDef hspi2; +SPI_HandleTypeDef hspi3; + +TIM_HandleTypeDef htim2; +TIM_HandleTypeDef htim11; +TIM_HandleTypeDef htim13; +TIM_HandleTypeDef htim14; + +UART_HandleTypeDef huart4; +UART_HandleTypeDef huart1; +UART_HandleTypeDef huart2; +UART_HandleTypeDef huart3; + +SRAM_HandleTypeDef hsram1; + +/* USER CODE BEGIN PV */ +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_USART1_UART_Init(void); +static void MX_USART3_UART_Init(void); +static void MX_RTC_Init(void); +static void MX_IWDG_Init(void); +static void MX_TIM14_Init(void); +static void MX_TIM13_Init(void); +static void MX_TIM11_Init(void); +static void MX_SDIO_SD_Init(void); +static void MX_TIM2_Init(void); +static void MX_SPI2_Init(void); +static void MX_FSMC_Init(void); +static void MX_UART4_Init(void); +static void MX_USART2_UART_Init(void); +static void MX_CAN1_Init(void); +static void MX_I2C1_Init(void); +static void MX_SPI1_Init(void); +static void MX_SPI3_Init(void); +/* USER CODE BEGIN PFP */ +/* Private function prototypes -----------------------------------------------*/ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_USART1_UART_Init(); + MX_USART3_UART_Init(); + MX_RTC_Init(); + MX_IWDG_Init(); + MX_TIM14_Init(); + MX_TIM13_Init(); + MX_TIM11_Init(); + MX_SDIO_SD_Init(); + MX_TIM2_Init(); + MX_SPI2_Init(); + MX_FSMC_Init(); + MX_UART4_Init(); + MX_USART2_UART_Init(); + MX_CAN1_Init(); + MX_I2C1_Init(); + MX_SPI1_Init(); + MX_SPI3_Init(); + /* USER CODE BEGIN 2 */ + + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + + /** Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE + |RCC_OSCILLATORTYPE_LSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 4; + RCC_OscInitStruct.PLL.PLLN = 168; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief CAN1 Initialization Function + * @param None + * @retval None + */ +static void MX_CAN1_Init(void) +{ + + /* USER CODE BEGIN CAN1_Init 0 */ + + /* USER CODE END CAN1_Init 0 */ + + /* USER CODE BEGIN CAN1_Init 1 */ + + /* USER CODE END CAN1_Init 1 */ + hcan1.Instance = CAN1; + hcan1.Init.Prescaler = 16; + hcan1.Init.Mode = CAN_MODE_NORMAL; + hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ; + hcan1.Init.TimeSeg1 = CAN_BS1_1TQ; + hcan1.Init.TimeSeg2 = CAN_BS2_1TQ; + hcan1.Init.TimeTriggeredMode = DISABLE; + hcan1.Init.AutoBusOff = DISABLE; + hcan1.Init.AutoWakeUp = DISABLE; + hcan1.Init.AutoRetransmission = DISABLE; + hcan1.Init.ReceiveFifoLocked = DISABLE; + hcan1.Init.TransmitFifoPriority = DISABLE; + if (HAL_CAN_Init(&hcan1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN CAN1_Init 2 */ + + /* USER CODE END CAN1_Init 2 */ + +} + +/** + * @brief I2C1 Initialization Function + * @param None + * @retval None + */ +static void MX_I2C1_Init(void) +{ + + /* USER CODE BEGIN I2C1_Init 0 */ + + /* USER CODE END I2C1_Init 0 */ + + /* USER CODE BEGIN I2C1_Init 1 */ + + /* USER CODE END I2C1_Init 1 */ + hi2c1.Instance = I2C1; + hi2c1.Init.ClockSpeed = 100000; + hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; + hi2c1.Init.OwnAddress1 = 0; + hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c1.Init.OwnAddress2 = 0; + hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN I2C1_Init 2 */ + + /* USER CODE END I2C1_Init 2 */ + +} + +/** + * @brief IWDG Initialization Function + * @param None + * @retval None + */ +static void MX_IWDG_Init(void) +{ + + /* USER CODE BEGIN IWDG_Init 0 */ + + /* USER CODE END IWDG_Init 0 */ + + /* USER CODE BEGIN IWDG_Init 1 */ + + /* USER CODE END IWDG_Init 1 */ + hiwdg.Instance = IWDG; + hiwdg.Init.Prescaler = IWDG_PRESCALER_4; + hiwdg.Init.Reload = 4095; + if (HAL_IWDG_Init(&hiwdg) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN IWDG_Init 2 */ + + /* USER CODE END IWDG_Init 2 */ + +} + +/** + * @brief RTC Initialization Function + * @param None + * @retval None + */ +static void MX_RTC_Init(void) +{ + + /* USER CODE BEGIN RTC_Init 0 */ + + /* USER CODE END RTC_Init 0 */ + + /* USER CODE BEGIN RTC_Init 1 */ + + /* USER CODE END RTC_Init 1 */ + /** Initialize RTC Only + */ + hrtc.Instance = RTC; + hrtc.Init.HourFormat = RTC_HOURFORMAT_24; + hrtc.Init.AsynchPrediv = 127; + hrtc.Init.SynchPrediv = 255; + hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; + hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; + hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; + if (HAL_RTC_Init(&hrtc) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN RTC_Init 2 */ + + /* USER CODE END RTC_Init 2 */ + +} + +/** + * @brief SDIO Initialization Function + * @param None + * @retval None + */ +static void MX_SDIO_SD_Init(void) +{ + + /* USER CODE BEGIN SDIO_Init 0 */ + + /* USER CODE END SDIO_Init 0 */ + + /* USER CODE BEGIN SDIO_Init 1 */ + + /* USER CODE END SDIO_Init 1 */ + hsd.Instance = SDIO; + hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; + hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; + hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; + hsd.Init.BusWide = SDIO_BUS_WIDE_1B; + hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; + hsd.Init.ClockDiv = 0; + if (HAL_SD_Init(&hsd) != HAL_OK) + { + Error_Handler(); + } + if (HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SDIO_Init 2 */ + + /* USER CODE END SDIO_Init 2 */ + +} + +/** + * @brief SPI1 Initialization Function + * @param None + * @retval None + */ +static void MX_SPI1_Init(void) +{ + + /* USER CODE BEGIN SPI1_Init 0 */ + + /* USER CODE END SPI1_Init 0 */ + + /* USER CODE BEGIN SPI1_Init 1 */ + + /* USER CODE END SPI1_Init 1 */ + /* SPI1 parameter configuration*/ + hspi1.Instance = SPI1; + hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + hspi1.Init.DataSize = SPI_DATASIZE_8BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi1.Init.NSS = SPI_NSS_SOFT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 10; + if (HAL_SPI_Init(&hspi1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI1_Init 2 */ + + /* USER CODE END SPI1_Init 2 */ + +} + +/** + * @brief SPI2 Initialization Function + * @param None + * @retval None + */ +static void MX_SPI2_Init(void) +{ + + /* USER CODE BEGIN SPI2_Init 0 */ + + /* USER CODE END SPI2_Init 0 */ + + /* USER CODE BEGIN SPI2_Init 1 */ + + /* USER CODE END SPI2_Init 1 */ + /* SPI2 parameter configuration*/ + hspi2.Instance = SPI2; + hspi2.Init.Mode = SPI_MODE_MASTER; + hspi2.Init.Direction = SPI_DIRECTION_2LINES; + hspi2.Init.DataSize = SPI_DATASIZE_8BIT; + hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi2.Init.NSS = SPI_NSS_SOFT; + hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi2.Init.TIMode = SPI_TIMODE_DISABLE; + hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi2.Init.CRCPolynomial = 10; + if (HAL_SPI_Init(&hspi2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI2_Init 2 */ + + /* USER CODE END SPI2_Init 2 */ + +} + +/** + * @brief SPI3 Initialization Function + * @param None + * @retval None + */ +static void MX_SPI3_Init(void) +{ + + /* USER CODE BEGIN SPI3_Init 0 */ + + /* USER CODE END SPI3_Init 0 */ + + /* USER CODE BEGIN SPI3_Init 1 */ + + /* USER CODE END SPI3_Init 1 */ + /* SPI3 parameter configuration*/ + hspi3.Instance = SPI3; + hspi3.Init.Mode = SPI_MODE_MASTER; + hspi3.Init.Direction = SPI_DIRECTION_2LINES; + hspi3.Init.DataSize = SPI_DATASIZE_8BIT; + hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi3.Init.NSS = SPI_NSS_SOFT; + hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi3.Init.TIMode = SPI_TIMODE_DISABLE; + hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi3.Init.CRCPolynomial = 10; + if (HAL_SPI_Init(&hspi3) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI3_Init 2 */ + + /* USER CODE END SPI3_Init 2 */ + +} + +/** + * @brief TIM2 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM2_Init(void) +{ + + /* USER CODE BEGIN TIM2_Init 0 */ + + /* USER CODE END TIM2_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM2_Init 1 */ + + /* USER CODE END TIM2_Init 1 */ + htim2.Instance = TIM2; + htim2.Init.Prescaler = 0; + htim2.Init.CounterMode = TIM_COUNTERMODE_UP; + htim2.Init.Period = 0; + htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim2) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM2_Init 2 */ + + /* USER CODE END TIM2_Init 2 */ + +} + +/** + * @brief TIM11 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM11_Init(void) +{ + + /* USER CODE BEGIN TIM11_Init 0 */ + + /* USER CODE END TIM11_Init 0 */ + + /* USER CODE BEGIN TIM11_Init 1 */ + + /* USER CODE END TIM11_Init 1 */ + htim11.Instance = TIM11; + htim11.Init.Prescaler = 0; + htim11.Init.CounterMode = TIM_COUNTERMODE_UP; + htim11.Init.Period = 0; + htim11.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim11.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim11) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM11_Init 2 */ + + /* USER CODE END TIM11_Init 2 */ + +} + +/** + * @brief TIM13 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM13_Init(void) +{ + + /* USER CODE BEGIN TIM13_Init 0 */ + + /* USER CODE END TIM13_Init 0 */ + + /* USER CODE BEGIN TIM13_Init 1 */ + + /* USER CODE END TIM13_Init 1 */ + htim13.Instance = TIM13; + htim13.Init.Prescaler = 0; + htim13.Init.CounterMode = TIM_COUNTERMODE_UP; + htim13.Init.Period = 0; + htim13.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim13.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim13) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM13_Init 2 */ + + /* USER CODE END TIM13_Init 2 */ + +} + +/** + * @brief TIM14 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM14_Init(void) +{ + + /* USER CODE BEGIN TIM14_Init 0 */ + + /* USER CODE END TIM14_Init 0 */ + + /* USER CODE BEGIN TIM14_Init 1 */ + + /* USER CODE END TIM14_Init 1 */ + htim14.Instance = TIM14; + htim14.Init.Prescaler = 0; + htim14.Init.CounterMode = TIM_COUNTERMODE_UP; + htim14.Init.Period = 0; + htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim14) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM14_Init 2 */ + + /* USER CODE END TIM14_Init 2 */ + +} + +/** + * @brief UART4 Initialization Function + * @param None + * @retval None + */ +static void MX_UART4_Init(void) +{ + + /* USER CODE BEGIN UART4_Init 0 */ + + /* USER CODE END UART4_Init 0 */ + + /* USER CODE BEGIN UART4_Init 1 */ + + /* USER CODE END UART4_Init 1 */ + huart4.Instance = UART4; + huart4.Init.BaudRate = 115200; + huart4.Init.WordLength = UART_WORDLENGTH_8B; + huart4.Init.StopBits = UART_STOPBITS_1; + huart4.Init.Parity = UART_PARITY_NONE; + huart4.Init.Mode = UART_MODE_TX_RX; + huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart4.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart4) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN UART4_Init 2 */ + + /* USER CODE END UART4_Init 2 */ + +} + +/** + * @brief USART1 Initialization Function + * @param None + * @retval None + */ +static void MX_USART1_UART_Init(void) +{ + + /* USER CODE BEGIN USART1_Init 0 */ + + /* USER CODE END USART1_Init 0 */ + + /* USER CODE BEGIN USART1_Init 1 */ + + /* USER CODE END USART1_Init 1 */ + huart1.Instance = USART1; + huart1.Init.BaudRate = 115200; + huart1.Init.WordLength = UART_WORDLENGTH_8B; + huart1.Init.StopBits = UART_STOPBITS_1; + huart1.Init.Parity = UART_PARITY_NONE; + huart1.Init.Mode = UART_MODE_TX_RX; + huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart1.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART1_Init 2 */ + + /* USER CODE END USART1_Init 2 */ + +} + +/** + * @brief USART2 Initialization Function + * @param None + * @retval None + */ +static void MX_USART2_UART_Init(void) +{ + + /* USER CODE BEGIN USART2_Init 0 */ + + /* USER CODE END USART2_Init 0 */ + + /* USER CODE BEGIN USART2_Init 1 */ + + /* USER CODE END USART2_Init 1 */ + huart2.Instance = USART2; + huart2.Init.BaudRate = 115200; + huart2.Init.WordLength = UART_WORDLENGTH_8B; + huart2.Init.StopBits = UART_STOPBITS_1; + huart2.Init.Parity = UART_PARITY_NONE; + huart2.Init.Mode = UART_MODE_TX_RX; + huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart2.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART2_Init 2 */ + + /* USER CODE END USART2_Init 2 */ + +} + +/** + * @brief USART3 Initialization Function + * @param None + * @retval None + */ +static void MX_USART3_UART_Init(void) +{ + + /* USER CODE BEGIN USART3_Init 0 */ + + /* USER CODE END USART3_Init 0 */ + + /* USER CODE BEGIN USART3_Init 1 */ + + /* USER CODE END USART3_Init 1 */ + huart3.Instance = USART3; + huart3.Init.BaudRate = 115200; + huart3.Init.WordLength = UART_WORDLENGTH_8B; + huart3.Init.StopBits = UART_STOPBITS_1; + huart3.Init.Parity = UART_PARITY_NONE; + huart3.Init.Mode = UART_MODE_TX_RX; + huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart3.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart3) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART3_Init 2 */ + + /* USER CODE END USART3_Init 2 */ + +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOF_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOG_CLK_ENABLE(); + __HAL_RCC_GPIOE_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOG, GPIO_PIN_11|GPIO_PIN_14, GPIO_PIN_RESET); + + /*Configure GPIO pins : PG11 PG14 */ + GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_14; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + + /*Configure GPIO pin : PG13 */ + GPIO_InitStruct.Pin = GPIO_PIN_13; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF11_ETH; + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + +} + +/* FSMC initialization function */ +static void MX_FSMC_Init(void) +{ + + /* USER CODE BEGIN FSMC_Init 0 */ + + /* USER CODE END FSMC_Init 0 */ + + FSMC_NORSRAM_TimingTypeDef Timing = {0}; + + /* USER CODE BEGIN FSMC_Init 1 */ + + /* USER CODE END FSMC_Init 1 */ + + /** Perform the SRAM1 memory initialization sequence + */ + hsram1.Instance = FSMC_NORSRAM_DEVICE; + hsram1.Extended = FSMC_NORSRAM_EXTENDED_DEVICE; + /* hsram1.Init */ + hsram1.Init.NSBank = FSMC_NORSRAM_BANK3; + hsram1.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE; + hsram1.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM; + hsram1.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16; + hsram1.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE; + hsram1.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW; + hsram1.Init.WrapMode = FSMC_WRAP_MODE_DISABLE; + hsram1.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS; + hsram1.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE; + hsram1.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE; + hsram1.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE; + hsram1.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE; + hsram1.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE; + hsram1.Init.PageSize = FSMC_PAGE_SIZE_NONE; + /* Timing */ + Timing.AddressSetupTime = 15; + Timing.AddressHoldTime = 15; + Timing.DataSetupTime = 255; + Timing.BusTurnAroundDuration = 15; + Timing.CLKDivision = 16; + Timing.DataLatency = 17; + Timing.AccessMode = FSMC_ACCESS_MODE_A; + /* ExtTiming */ + + if (HAL_SRAM_Init(&hsram1, &Timing, NULL) != HAL_OK) + { + Error_Handler( ); + } + + /* USER CODE BEGIN FSMC_Init 2 */ + + /* USER CODE END FSMC_Init 2 */ +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + while(1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c new file mode 100644 index 000000000..e2a1e797a --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c @@ -0,0 +1,1025 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : stm32f4xx_hal_msp.c + * Description : This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/** +* @brief CAN MSP Initialization +* This function configures the hardware resources used in this example +* @param hcan: CAN handle pointer +* @retval None +*/ +void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hcan->Instance==CAN1) + { + /* USER CODE BEGIN CAN1_MspInit 0 */ + + /* USER CODE END CAN1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_CAN1_CLK_ENABLE(); + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**CAN1 GPIO Configuration + PB8 ------> CAN1_RX + PB9 ------> CAN1_TX + */ + GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF9_CAN1; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN CAN1_MspInit 1 */ + + /* USER CODE END CAN1_MspInit 1 */ + } + +} + +/** +* @brief CAN MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hcan: CAN handle pointer +* @retval None +*/ +void HAL_CAN_MspDeInit(CAN_HandleTypeDef* hcan) +{ + if(hcan->Instance==CAN1) + { + /* USER CODE BEGIN CAN1_MspDeInit 0 */ + + /* USER CODE END CAN1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_CAN1_CLK_DISABLE(); + + /**CAN1 GPIO Configuration + PB8 ------> CAN1_RX + PB9 ------> CAN1_TX + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8|GPIO_PIN_9); + + /* USER CODE BEGIN CAN1_MspDeInit 1 */ + + /* USER CODE END CAN1_MspDeInit 1 */ + } + +} + +/** +* @brief I2C MSP Initialization +* This function configures the hardware resources used in this example +* @param hi2c: I2C handle pointer +* @retval None +*/ +void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hi2c->Instance==I2C1) + { + /* USER CODE BEGIN I2C1_MspInit 0 */ + + /* USER CODE END I2C1_MspInit 0 */ + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**I2C1 GPIO Configuration + PB6 ------> I2C1_SCL + PB7 ------> I2C1_SDA + */ + GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* Peripheral clock enable */ + __HAL_RCC_I2C1_CLK_ENABLE(); + /* USER CODE BEGIN I2C1_MspInit 1 */ + + /* USER CODE END I2C1_MspInit 1 */ + } + +} + +/** +* @brief I2C MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hi2c: I2C handle pointer +* @retval None +*/ +void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c) +{ + if(hi2c->Instance==I2C1) + { + /* USER CODE BEGIN I2C1_MspDeInit 0 */ + + /* USER CODE END I2C1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_I2C1_CLK_DISABLE(); + + /**I2C1 GPIO Configuration + PB6 ------> I2C1_SCL + PB7 ------> I2C1_SDA + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6); + + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7); + + /* USER CODE BEGIN I2C1_MspDeInit 1 */ + + /* USER CODE END I2C1_MspDeInit 1 */ + } + +} + +/** +* @brief RTC MSP Initialization +* This function configures the hardware resources used in this example +* @param hrtc: RTC handle pointer +* @retval None +*/ +void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc) +{ + if(hrtc->Instance==RTC) + { + /* USER CODE BEGIN RTC_MspInit 0 */ + + /* USER CODE END RTC_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_RTC_ENABLE(); + /* USER CODE BEGIN RTC_MspInit 1 */ + + /* USER CODE END RTC_MspInit 1 */ + } + +} + +/** +* @brief RTC MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hrtc: RTC handle pointer +* @retval None +*/ +void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc) +{ + if(hrtc->Instance==RTC) + { + /* USER CODE BEGIN RTC_MspDeInit 0 */ + + /* USER CODE END RTC_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_RTC_DISABLE(); + /* USER CODE BEGIN RTC_MspDeInit 1 */ + + /* USER CODE END RTC_MspDeInit 1 */ + } + +} + +/** +* @brief SD MSP Initialization +* This function configures the hardware resources used in this example +* @param hsd: SD handle pointer +* @retval None +*/ +void HAL_SD_MspInit(SD_HandleTypeDef* hsd) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hsd->Instance==SDIO) + { + /* USER CODE BEGIN SDIO_MspInit 0 */ + + /* USER CODE END SDIO_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SDIO_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + /**SDIO GPIO Configuration + PC8 ------> SDIO_D0 + PC9 ------> SDIO_D1 + PC10 ------> SDIO_D2 + PC11 ------> SDIO_D3 + PC12 ------> SDIO_CK + PD2 ------> SDIO_CMD + */ + GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /* USER CODE BEGIN SDIO_MspInit 1 */ + + /* USER CODE END SDIO_MspInit 1 */ + } + +} + +/** +* @brief SD MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hsd: SD handle pointer +* @retval None +*/ +void HAL_SD_MspDeInit(SD_HandleTypeDef* hsd) +{ + if(hsd->Instance==SDIO) + { + /* USER CODE BEGIN SDIO_MspDeInit 0 */ + + /* USER CODE END SDIO_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SDIO_CLK_DISABLE(); + + /**SDIO GPIO Configuration + PC8 ------> SDIO_D0 + PC9 ------> SDIO_D1 + PC10 ------> SDIO_D2 + PC11 ------> SDIO_D3 + PC12 ------> SDIO_CK + PD2 ------> SDIO_CMD + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12); + + HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2); + + /* USER CODE BEGIN SDIO_MspDeInit 1 */ + + /* USER CODE END SDIO_MspDeInit 1 */ + } + +} + +/** +* @brief SPI MSP Initialization +* This function configures the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hspi->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspInit 0 */ + + /* USER CODE END SPI1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SPI1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**SPI1 GPIO Configuration + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI1_MspInit 1 */ + + /* USER CODE END SPI1_MspInit 1 */ + } + else if(hspi->Instance==SPI2) + { + /* USER CODE BEGIN SPI2_MspInit 0 */ + + /* USER CODE END SPI2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SPI2_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**SPI2 GPIO Configuration + PC2 ------> SPI2_MISO + PC3 ------> SPI2_MOSI + PB13 ------> SPI2_SCK + */ + GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_13; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI2_MspInit 1 */ + + /* USER CODE END SPI2_MspInit 1 */ + } + else if(hspi->Instance==SPI3) + { + /* USER CODE BEGIN SPI3_MspInit 0 */ + + /* USER CODE END SPI3_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SPI3_CLK_ENABLE(); + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**SPI3 GPIO Configuration + PB3 ------> SPI3_SCK + PB4 ------> SPI3_MISO + PB5 ------> SPI3_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI3_MspInit 1 */ + + /* USER CODE END SPI3_MspInit 1 */ + } + +} + +/** +* @brief SPI MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) +{ + if(hspi->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspDeInit 0 */ + + /* USER CODE END SPI1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI1_CLK_DISABLE(); + + /**SPI1 GPIO Configuration + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); + + /* USER CODE BEGIN SPI1_MspDeInit 1 */ + + /* USER CODE END SPI1_MspDeInit 1 */ + } + else if(hspi->Instance==SPI2) + { + /* USER CODE BEGIN SPI2_MspDeInit 0 */ + + /* USER CODE END SPI2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI2_CLK_DISABLE(); + + /**SPI2 GPIO Configuration + PC2 ------> SPI2_MISO + PC3 ------> SPI2_MOSI + PB13 ------> SPI2_SCK + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_2|GPIO_PIN_3); + + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13); + + /* USER CODE BEGIN SPI2_MspDeInit 1 */ + + /* USER CODE END SPI2_MspDeInit 1 */ + } + else if(hspi->Instance==SPI3) + { + /* USER CODE BEGIN SPI3_MspDeInit 0 */ + + /* USER CODE END SPI3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI3_CLK_DISABLE(); + + /**SPI3 GPIO Configuration + PB3 ------> SPI3_SCK + PB4 ------> SPI3_MISO + PB5 ------> SPI3_MOSI + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5); + + /* USER CODE BEGIN SPI3_MspDeInit 1 */ + + /* USER CODE END SPI3_MspDeInit 1 */ + } + +} + +/** +* @brief TIM_Base MSP Initialization +* This function configures the hardware resources used in this example +* @param htim_base: TIM_Base handle pointer +* @retval None +*/ +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) +{ + if(htim_base->Instance==TIM2) + { + /* USER CODE BEGIN TIM2_MspInit 0 */ + + /* USER CODE END TIM2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM2_CLK_ENABLE(); + /* USER CODE BEGIN TIM2_MspInit 1 */ + + /* USER CODE END TIM2_MspInit 1 */ + } + else if(htim_base->Instance==TIM11) + { + /* USER CODE BEGIN TIM11_MspInit 0 */ + + /* USER CODE END TIM11_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM11_CLK_ENABLE(); + /* USER CODE BEGIN TIM11_MspInit 1 */ + + /* USER CODE END TIM11_MspInit 1 */ + } + else if(htim_base->Instance==TIM13) + { + /* USER CODE BEGIN TIM13_MspInit 0 */ + + /* USER CODE END TIM13_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM13_CLK_ENABLE(); + /* USER CODE BEGIN TIM13_MspInit 1 */ + + /* USER CODE END TIM13_MspInit 1 */ + } + else if(htim_base->Instance==TIM14) + { + /* USER CODE BEGIN TIM14_MspInit 0 */ + + /* USER CODE END TIM14_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM14_CLK_ENABLE(); + /* USER CODE BEGIN TIM14_MspInit 1 */ + + /* USER CODE END TIM14_MspInit 1 */ + } + +} + +/** +* @brief TIM_Base MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param htim_base: TIM_Base handle pointer +* @retval None +*/ +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) +{ + if(htim_base->Instance==TIM2) + { + /* USER CODE BEGIN TIM2_MspDeInit 0 */ + + /* USER CODE END TIM2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM2_CLK_DISABLE(); + /* USER CODE BEGIN TIM2_MspDeInit 1 */ + + /* USER CODE END TIM2_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM11) + { + /* USER CODE BEGIN TIM11_MspDeInit 0 */ + + /* USER CODE END TIM11_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM11_CLK_DISABLE(); + /* USER CODE BEGIN TIM11_MspDeInit 1 */ + + /* USER CODE END TIM11_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM13) + { + /* USER CODE BEGIN TIM13_MspDeInit 0 */ + + /* USER CODE END TIM13_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM13_CLK_DISABLE(); + /* USER CODE BEGIN TIM13_MspDeInit 1 */ + + /* USER CODE END TIM13_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM14) + { + /* USER CODE BEGIN TIM14_MspDeInit 0 */ + + /* USER CODE END TIM14_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM14_CLK_DISABLE(); + /* USER CODE BEGIN TIM14_MspDeInit 1 */ + + /* USER CODE END TIM14_MspDeInit 1 */ + } + +} + +/** +* @brief UART MSP Initialization +* This function configures the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspInit(UART_HandleTypeDef* huart) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(huart->Instance==UART4) + { + /* USER CODE BEGIN UART4_MspInit 0 */ + + /* USER CODE END UART4_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_UART4_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**UART4 GPIO Configuration + PA0-WKUP ------> UART4_TX + PA1 ------> UART4_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF8_UART4; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN UART4_MspInit 1 */ + + /* USER CODE END UART4_MspInit 1 */ + } + else if(huart->Instance==USART1) + { + /* USER CODE BEGIN USART1_MspInit 0 */ + + /* USER CODE END USART1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART1 GPIO Configuration + PA9 ------> USART1_TX + PA10 ------> USART1_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN USART1_MspInit 1 */ + + /* USER CODE END USART1_MspInit 1 */ + } + else if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspInit 0 */ + + /* USER CODE END USART2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART2_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART2; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN USART2_MspInit 1 */ + + /* USER CODE END USART2_MspInit 1 */ + } + else if(huart->Instance==USART3) + { + /* USER CODE BEGIN USART3_MspInit 0 */ + + /* USER CODE END USART3_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART3_CLK_ENABLE(); + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**USART3 GPIO Configuration + PB10 ------> USART3_TX + PB11 ------> USART3_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN USART3_MspInit 1 */ + + /* USER CODE END USART3_MspInit 1 */ + } + +} + +/** +* @brief UART MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) +{ + if(huart->Instance==UART4) + { + /* USER CODE BEGIN UART4_MspDeInit 0 */ + + /* USER CODE END UART4_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_UART4_CLK_DISABLE(); + + /**UART4 GPIO Configuration + PA0-WKUP ------> UART4_TX + PA1 ------> UART4_RX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0|GPIO_PIN_1); + + /* USER CODE BEGIN UART4_MspDeInit 1 */ + + /* USER CODE END UART4_MspDeInit 1 */ + } + else if(huart->Instance==USART1) + { + /* USER CODE BEGIN USART1_MspDeInit 0 */ + + /* USER CODE END USART1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART1_CLK_DISABLE(); + + /**USART1 GPIO Configuration + PA9 ------> USART1_TX + PA10 ------> USART1_RX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); + + /* USER CODE BEGIN USART1_MspDeInit 1 */ + + /* USER CODE END USART1_MspDeInit 1 */ + } + else if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspDeInit 0 */ + + /* USER CODE END USART2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART2_CLK_DISABLE(); + + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3); + + /* USER CODE BEGIN USART2_MspDeInit 1 */ + + /* USER CODE END USART2_MspDeInit 1 */ + } + else if(huart->Instance==USART3) + { + /* USER CODE BEGIN USART3_MspDeInit 0 */ + + /* USER CODE END USART3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART3_CLK_DISABLE(); + + /**USART3 GPIO Configuration + PB10 ------> USART3_TX + PB11 ------> USART3_RX + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10|GPIO_PIN_11); + + /* USER CODE BEGIN USART3_MspDeInit 1 */ + + /* USER CODE END USART3_MspDeInit 1 */ + } + +} + +static uint32_t FSMC_Initialized = 0; + +static void HAL_FSMC_MspInit(void){ + /* USER CODE BEGIN FSMC_MspInit 0 */ + + /* USER CODE END FSMC_MspInit 0 */ + GPIO_InitTypeDef GPIO_InitStruct ={0}; + if (FSMC_Initialized) { + return; + } + FSMC_Initialized = 1; + + /* Peripheral clock enable */ + __HAL_RCC_FSMC_CLK_ENABLE(); + + /** FSMC GPIO Configuration + PF0 ------> FSMC_A0 + PF1 ------> FSMC_A1 + PF2 ------> FSMC_A2 + PF3 ------> FSMC_A3 + PF4 ------> FSMC_A4 + PF5 ------> FSMC_A5 + PF12 ------> FSMC_A6 + PF13 ------> FSMC_A7 + PF14 ------> FSMC_A8 + PF15 ------> FSMC_A9 + PG0 ------> FSMC_A10 + PG1 ------> FSMC_A11 + PE7 ------> FSMC_D4 + PE8 ------> FSMC_D5 + PE9 ------> FSMC_D6 + PE10 ------> FSMC_D7 + PE11 ------> FSMC_D8 + PE12 ------> FSMC_D9 + PE13 ------> FSMC_D10 + PE14 ------> FSMC_D11 + PE15 ------> FSMC_D12 + PD8 ------> FSMC_D13 + PD9 ------> FSMC_D14 + PD10 ------> FSMC_D15 + PD11 ------> FSMC_A16 + PD12 ------> FSMC_A17 + PD13 ------> FSMC_A18 + PD14 ------> FSMC_D0 + PD15 ------> FSMC_D1 + PG2 ------> FSMC_A12 + PG3 ------> FSMC_A13 + PG4 ------> FSMC_A14 + PG5 ------> FSMC_A15 + PD0 ------> FSMC_D2 + PD1 ------> FSMC_D3 + PD4 ------> FSMC_NOE + PD5 ------> FSMC_NWE + PG10 ------> FSMC_NE3 + PG12 ------> FSMC_NE4 + PE0 ------> FSMC_NBL0 + PE1 ------> FSMC_NBL1 + */ + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 + |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_12|GPIO_PIN_13 + |GPIO_PIN_14|GPIO_PIN_15; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_FSMC; + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 + |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_10|GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_FSMC; + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10 + |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14 + |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_FSMC; + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15 + |GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_FSMC; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /* USER CODE BEGIN FSMC_MspInit 1 */ + + /* USER CODE END FSMC_MspInit 1 */ +} + +void HAL_SRAM_MspInit(SRAM_HandleTypeDef* hsram){ + /* USER CODE BEGIN SRAM_MspInit 0 */ + + /* USER CODE END SRAM_MspInit 0 */ + HAL_FSMC_MspInit(); + /* USER CODE BEGIN SRAM_MspInit 1 */ + + /* USER CODE END SRAM_MspInit 1 */ +} + +static uint32_t FSMC_DeInitialized = 0; + +static void HAL_FSMC_MspDeInit(void){ + /* USER CODE BEGIN FSMC_MspDeInit 0 */ + + /* USER CODE END FSMC_MspDeInit 0 */ + if (FSMC_DeInitialized) { + return; + } + FSMC_DeInitialized = 1; + /* Peripheral clock enable */ + __HAL_RCC_FSMC_CLK_DISABLE(); + + /** FSMC GPIO Configuration + PF0 ------> FSMC_A0 + PF1 ------> FSMC_A1 + PF2 ------> FSMC_A2 + PF3 ------> FSMC_A3 + PF4 ------> FSMC_A4 + PF5 ------> FSMC_A5 + PF12 ------> FSMC_A6 + PF13 ------> FSMC_A7 + PF14 ------> FSMC_A8 + PF15 ------> FSMC_A9 + PG0 ------> FSMC_A10 + PG1 ------> FSMC_A11 + PE7 ------> FSMC_D4 + PE8 ------> FSMC_D5 + PE9 ------> FSMC_D6 + PE10 ------> FSMC_D7 + PE11 ------> FSMC_D8 + PE12 ------> FSMC_D9 + PE13 ------> FSMC_D10 + PE14 ------> FSMC_D11 + PE15 ------> FSMC_D12 + PD8 ------> FSMC_D13 + PD9 ------> FSMC_D14 + PD10 ------> FSMC_D15 + PD11 ------> FSMC_A16 + PD12 ------> FSMC_A17 + PD13 ------> FSMC_A18 + PD14 ------> FSMC_D0 + PD15 ------> FSMC_D1 + PG2 ------> FSMC_A12 + PG3 ------> FSMC_A13 + PG4 ------> FSMC_A14 + PG5 ------> FSMC_A15 + PD0 ------> FSMC_D2 + PD1 ------> FSMC_D3 + PD4 ------> FSMC_NOE + PD5 ------> FSMC_NWE + PG10 ------> FSMC_NE3 + PG12 ------> FSMC_NE4 + PE0 ------> FSMC_NBL0 + PE1 ------> FSMC_NBL1 + */ + HAL_GPIO_DeInit(GPIOF, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 + |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_12|GPIO_PIN_13 + |GPIO_PIN_14|GPIO_PIN_15); + + HAL_GPIO_DeInit(GPIOG, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 + |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_10|GPIO_PIN_12); + + HAL_GPIO_DeInit(GPIOE, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10 + |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14 + |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1); + + HAL_GPIO_DeInit(GPIOD, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15 + |GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5); + + /* USER CODE BEGIN FSMC_MspDeInit 1 */ + + /* USER CODE END FSMC_MspDeInit 1 */ +} + +void HAL_SRAM_MspDeInit(SRAM_HandleTypeDef* hsram){ + /* USER CODE BEGIN SRAM_MspDeInit 0 */ + + /* USER CODE END SRAM_MspDeInit 0 */ + HAL_FSMC_MspDeInit(); + /* USER CODE BEGIN SRAM_MspDeInit 1 */ + + /* USER CODE END SRAM_MspDeInit 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/stm32f4xx_it.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/stm32f4xx_it.c new file mode 100644 index 000000000..404f784a0 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/stm32f4xx_it.c @@ -0,0 +1,218 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32f4xx_it.h" +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ + +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex-M4 Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Memory management fault. + */ +void MemManage_Handler(void) +{ + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } +} + +/** + * @brief This function handles Pre-fetch fault, memory access fault. + */ +void BusFault_Handler(void) +{ + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Undefined instruction or illegal state. + */ +void UsageFault_Handler(void) +{ + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVCall_IRQn 0 */ + + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ + + /* USER CODE END SVCall_IRQn 1 */ +} + +/** + * @brief This function handles Debug monitor. + */ +void DebugMon_Handler(void) +{ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32F4xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file (startup_stm32f4xx.s). */ +/******************************************************************************/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/system_stm32f4xx.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/system_stm32f4xx.c new file mode 100644 index 000000000..3303f969d --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/system_stm32f4xx.c @@ -0,0 +1,761 @@ +/** + ****************************************************************************** + * @file system_stm32f4xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f4xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ + + +#include "stm32f4xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/*!< Uncomment the following line if you need to use external SRAM or SDRAM as data memory */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ + || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) +/* #define DATA_IN_ExtSRAM */ +#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx ||\ + STM32F412Zx || STM32F412Vx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/* #define DATA_IN_ExtSDRAM */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\ + STM32F479xx */ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ +uint32_t SystemCoreClock = 16000000; +const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; +const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ + +#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) + static void SystemInit_ExtMemCtl(void); +#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the FPU setting, vector table location and External memory + * configuration. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ + #endif + /* Reset the RCC clock configuration to the default reset state ------------*/ + /* Set HSION bit */ + RCC->CR |= (uint32_t)0x00000001; + + /* Reset CFGR register */ + RCC->CFGR = 0x00000000; + + /* Reset HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xFEF6FFFF; + + /* Reset PLLCFGR register */ + RCC->PLLCFGR = 0x24003010; + + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /* Disable all interrupts */ + RCC->CIR = 0x00000000; + +#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) + SystemInit_ExtMemCtl(); +#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value + * depends on the application requirements), user has to ensure that HSE_VALUE + * is same as the real frequency of the crystal used. Otherwise, this function + * may have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N + SYSCLK = PLL_VCO / PLL_P + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + + if (pllsource != 0) + { + /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + + pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; + SystemCoreClock = pllvco/pllp; + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK frequency --------------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK frequency */ + SystemCoreClock >>= tmp; +} + +#if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM) +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f4xx.s before jump to main. + * This function configures the external memories (SRAM/SDRAM) + * This SRAM/SDRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + __IO uint32_t tmp = 0x00; + + register uint32_t tmpreg = 0, timeout = 0xFFFF; + register __IO uint32_t index; + + /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface clock */ + RCC->AHB1ENR |= 0x000001F8; + + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x00CCC0CC; + GPIOD->AFR[1] = 0xCCCCCCCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xAAAA0A8A; + /* Configure PDx pins speed to 100 MHz */ + GPIOD->OSPEEDR = 0xFFFF0FCF; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00CC0CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA828A; + /* Configure PEx pins speed to 100 MHz */ + GPIOE->OSPEEDR = 0xFFFFC3CF; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0xCCCCCCCC; + GPIOF->AFR[1] = 0xCCCCCCCC; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA800AAA; + /* Configure PFx pins speed to 50 MHz */ + GPIOF->OSPEEDR = 0xAA800AAA; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0xCCCCCCCC; + GPIOG->AFR[1] = 0xCCCCCCCC; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0xAAAAAAAA; + /* Configure PGx pins speed to 50 MHz */ + GPIOG->OSPEEDR = 0xAAAAAAAA; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + + /* Connect PHx pins to FMC Alternate function */ + GPIOH->AFR[0] = 0x00C0CC00; + GPIOH->AFR[1] = 0xCCCCCCCC; + /* Configure PHx pins in Alternate function mode */ + GPIOH->MODER = 0xAAAA08A0; + /* Configure PHx pins speed to 50 MHz */ + GPIOH->OSPEEDR = 0xAAAA08A0; + /* Configure PHx pins Output type to push-pull */ + GPIOH->OTYPER = 0x00000000; + /* No pull-up, pull-down for PHx pins */ + GPIOH->PUPDR = 0x00000000; + + /* Connect PIx pins to FMC Alternate function */ + GPIOI->AFR[0] = 0xCCCCCCCC; + GPIOI->AFR[1] = 0x00000CC0; + /* Configure PIx pins in Alternate function mode */ + GPIOI->MODER = 0x0028AAAA; + /* Configure PIx pins speed to 50 MHz */ + GPIOI->OSPEEDR = 0x0028AAAA; + /* Configure PIx pins Output type to push-pull */ + GPIOI->OTYPER = 0x00000000; + /* No pull-up, pull-down for PIx pins */ + GPIOI->PUPDR = 0x00000000; + +/*-- FMC Configuration -------------------------------------------------------*/ + /* Enable the FMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + + FMC_Bank5_6->SDCR[0] = 0x000019E4; + FMC_Bank5_6->SDTR[0] = 0x01115351; + + /* SDRAM initialization sequence */ + /* Clock enable command */ + FMC_Bank5_6->SDCMR = 0x00000011; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Delay */ + for (index = 0; index<1000; index++); + + /* PALL command */ + FMC_Bank5_6->SDCMR = 0x00000012; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Auto refresh command */ + FMC_Bank5_6->SDCMR = 0x00000073; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* MRD register program */ + FMC_Bank5_6->SDCMR = 0x00046014; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Set refresh count */ + tmpreg = FMC_Bank5_6->SDRTR; + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); + + /* Disable write protection */ + tmpreg = FMC_Bank5_6->SDCR[0]; + FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001011; + FMC_Bank1->BTCR[3] = 0x00000201; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +#if defined(STM32F469xx) || defined(STM32F479xx) + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001091; + FMC_Bank1->BTCR[3] = 0x00110212; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F469xx || STM32F479xx */ + + (void)(tmp); +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +#elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f4xx.s before jump to main. + * This function configures the external memories (SRAM/SDRAM) + * This SRAM/SDRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + __IO uint32_t tmp = 0x00; +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#if defined (DATA_IN_ExtSDRAM) + register uint32_t tmpreg = 0, timeout = 0xFFFF; + register __IO uint32_t index; + +#if defined(STM32F446xx) + /* Enable GPIOA, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG interface + clock */ + RCC->AHB1ENR |= 0x0000007D; +#else + /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface + clock */ + RCC->AHB1ENR |= 0x000001F8; +#endif /* STM32F446xx */ + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); + +#if defined(STM32F446xx) + /* Connect PAx pins to FMC Alternate function */ + GPIOA->AFR[0] |= 0xC0000000; + GPIOA->AFR[1] |= 0x00000000; + /* Configure PDx pins in Alternate function mode */ + GPIOA->MODER |= 0x00008000; + /* Configure PDx pins speed to 50 MHz */ + GPIOA->OSPEEDR |= 0x00008000; + /* Configure PDx pins Output type to push-pull */ + GPIOA->OTYPER |= 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOA->PUPDR |= 0x00000000; + + /* Connect PCx pins to FMC Alternate function */ + GPIOC->AFR[0] |= 0x00CC0000; + GPIOC->AFR[1] |= 0x00000000; + /* Configure PDx pins in Alternate function mode */ + GPIOC->MODER |= 0x00000A00; + /* Configure PDx pins speed to 50 MHz */ + GPIOC->OSPEEDR |= 0x00000A00; + /* Configure PDx pins Output type to push-pull */ + GPIOC->OTYPER |= 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOC->PUPDR |= 0x00000000; +#endif /* STM32F446xx */ + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x000000CC; + GPIOD->AFR[1] = 0xCC000CCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xA02A000A; + /* Configure PDx pins speed to 50 MHz */ + GPIOD->OSPEEDR = 0xA02A000A; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00000CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA800A; + /* Configure PEx pins speed to 50 MHz */ + GPIOE->OSPEEDR = 0xAAAA800A; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0xCCCCCCCC; + GPIOF->AFR[1] = 0xCCCCCCCC; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA800AAA; + /* Configure PFx pins speed to 50 MHz */ + GPIOF->OSPEEDR = 0xAA800AAA; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0xCCCCCCCC; + GPIOG->AFR[1] = 0xCCCCCCCC; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0xAAAAAAAA; + /* Configure PGx pins speed to 50 MHz */ + GPIOG->OSPEEDR = 0xAAAAAAAA; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) + /* Connect PHx pins to FMC Alternate function */ + GPIOH->AFR[0] = 0x00C0CC00; + GPIOH->AFR[1] = 0xCCCCCCCC; + /* Configure PHx pins in Alternate function mode */ + GPIOH->MODER = 0xAAAA08A0; + /* Configure PHx pins speed to 50 MHz */ + GPIOH->OSPEEDR = 0xAAAA08A0; + /* Configure PHx pins Output type to push-pull */ + GPIOH->OTYPER = 0x00000000; + /* No pull-up, pull-down for PHx pins */ + GPIOH->PUPDR = 0x00000000; + + /* Connect PIx pins to FMC Alternate function */ + GPIOI->AFR[0] = 0xCCCCCCCC; + GPIOI->AFR[1] = 0x00000CC0; + /* Configure PIx pins in Alternate function mode */ + GPIOI->MODER = 0x0028AAAA; + /* Configure PIx pins speed to 50 MHz */ + GPIOI->OSPEEDR = 0x0028AAAA; + /* Configure PIx pins Output type to push-pull */ + GPIOI->OTYPER = 0x00000000; + /* No pull-up, pull-down for PIx pins */ + GPIOI->PUPDR = 0x00000000; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +/*-- FMC Configuration -------------------------------------------------------*/ + /* Enable the FMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + + /* Configure and enable SDRAM bank1 */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCR[0] = 0x00001954; +#else + FMC_Bank5_6->SDCR[0] = 0x000019E4; +#endif /* STM32F446xx */ + FMC_Bank5_6->SDTR[0] = 0x01115351; + + /* SDRAM initialization sequence */ + /* Clock enable command */ + FMC_Bank5_6->SDCMR = 0x00000011; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Delay */ + for (index = 0; index<1000; index++); + + /* PALL command */ + FMC_Bank5_6->SDCMR = 0x00000012; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Auto refresh command */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCMR = 0x000000F3; +#else + FMC_Bank5_6->SDCMR = 0x00000073; +#endif /* STM32F446xx */ + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* MRD register program */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCMR = 0x00044014; +#else + FMC_Bank5_6->SDCMR = 0x00046014; +#endif /* STM32F446xx */ + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Set refresh count */ + tmpreg = FMC_Bank5_6->SDRTR; +#if defined(STM32F446xx) + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1)); +#else + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); +#endif /* STM32F446xx */ + + /* Disable write protection */ + tmpreg = FMC_Bank5_6->SDCR[0]; + FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); +#endif /* DATA_IN_ExtSDRAM */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ + || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) + +#if defined(DATA_IN_ExtSRAM) +/*-- GPIOs Configuration -----------------------------------------------------*/ + /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ + RCC->AHB1ENR |= 0x00000078; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN); + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x00CCC0CC; + GPIOD->AFR[1] = 0xCCCCCCCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xAAAA0A8A; + /* Configure PDx pins speed to 100 MHz */ + GPIOD->OSPEEDR = 0xFFFF0FCF; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00CC0CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA828A; + /* Configure PEx pins speed to 100 MHz */ + GPIOE->OSPEEDR = 0xFFFFC3CF; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0x00CCCCCC; + GPIOF->AFR[1] = 0xCCCC0000; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA000AAA; + /* Configure PFx pins speed to 100 MHz */ + GPIOF->OSPEEDR = 0xFF000FFF; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0x00CCCCCC; + GPIOG->AFR[1] = 0x000000C0; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0x00085AAA; + /* Configure PGx pins speed to 100 MHz */ + GPIOG->OSPEEDR = 0x000CAFFF; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +/*-- FMC/FSMC Configuration --------------------------------------------------*/ + /* Enable the FMC/FSMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001011; + FMC_Bank1->BTCR[3] = 0x00000201; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +#if defined(STM32F469xx) || defined(STM32F479xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001091; + FMC_Bank1->BTCR[3] = 0x00110212; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F469xx || STM32F479xx */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\ + || defined(STM32F412Zx) || defined(STM32F412Vx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN); + /* Configure and enable Bank1_SRAM2 */ + FSMC_Bank1->BTCR[2] = 0x00001011; + FSMC_Bank1->BTCR[3] = 0x00000201; + FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF; +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F412Zx || STM32F412Vx */ + +#endif /* DATA_IN_ExtSRAM */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\ + STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx */ + (void)(tmp); +} +#endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/Kconfig new file mode 100644 index 000000000..86ccf39af --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/Kconfig @@ -0,0 +1,64 @@ +menu"Hardware Drivers Config" + + menuconfig SOC_STM32F407ZG + bool + select SOC_SERIES_STM32F4 + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y + + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN + default y + + + menuconfig BSP_USING_UART + bool "Using UART device" + default y + select RT_USING_SERIAL + if BSP_USING_UART + source "$BSP_DIR/board/ports/uart/Kconfig" + endif + + + menuconfig BSP_USING_I2C1 + bool "Using I2C device" + default n + select RT_USING_I2C + select RT_USING_I2C_BITOPS + select RT_USING_PIN + if BSP_USING_I2C1 + source "$BSP_DIR/board/ports/I2c/Kconfig" + endif + + menuconfig BSP_USING_SPI + bool "Using SPI BUS" + default n + select RT_USING_SPI + if BSP_USING_SPI + source "$BSP_DIR/board/ports/spi/Kconfig" + endif + + + menuconfig BSP_USING_CH438 + bool "Using CH438 device" + default y + if BSP_USING_CH438 + source "$BSP_DIR/board/ports/ch438/Kconfig" + endif + + menuconfig BSP_USING_USB + bool "Using USB device" + default n + select BSP_USING_STM32_USBH + select RESOURCES_USB + select RESOURCES_USB_HOST + select USBH_MSTORAGE + select RESOURCES_USB_DEVICE + if BSP_USING_USB + source "$BSP_DIR/board/ports/usb/Kconfig" + endif + + source "$RTT_DIR/bsp/stm32/libraries/HAL_Drivers/Kconfig" +endmenu diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/SConscript b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/SConscript new file mode 100644 index 000000000..4812888d5 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/SConscript @@ -0,0 +1,31 @@ +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +CubeMX_Config/Src/stm32f4xx_hal_msp.c +''') + +path = [cwd] +path += [cwd + '/CubeMX_Config/Inc'] +path += [cwd + '/ports'] + +startup_path_prefix = SDK_LIB + +if rtconfig.CROSS_TOOL == 'gcc': + src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f407xx.s'] +elif rtconfig.CROSS_TOOL == 'keil': + src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f407xx.s'] +elif rtconfig.CROSS_TOOL == 'iar': + src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f407xx.s'] + +CPPDEFINES = ['STM32F407xx'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') \ No newline at end of file diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/board.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/board.c new file mode 100644 index 000000000..c2c90a5e8 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/board.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift first version + */ + +#include "board.h" + +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + + /**Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE + |RCC_OSCILLATORTYPE_LSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 4; + RCC_OscInitStruct.PLL.PLLN = 168; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } +} diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/board.h b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/board.h new file mode 100644 index 000000000..70a4c0ed1 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/board.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-5 SummerGift first version + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include +#include "drv_common.h" +#include "drv_gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define STM32_SRAM_SIZE (128) +#define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024) + +#define STM32_FLASH_START_ADRESS ((uint32_t)0x08000000) +#define STM32_FLASH_SIZE (1024 * 1024) +#define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE)) + +#if defined(__CC_ARM) || defined(__CLANG_ARM) +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="CSTACK" +#define HEAP_BEGIN (__segment_end("CSTACK")) +#else +extern int __bss_end; +#define HEAP_BEGIN ((void *)&__bss_end) +#endif + +#define HEAP_END STM32_SRAM_END + +void SystemClock_Config(void); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/drv_dcmi.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/drv_dcmi.c new file mode 100644 index 000000000..f0f4c1d7b --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/drv_dcmi.c @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-07-27 thread-liu the first version + */ + +#include "board.h" +#ifdef BSP_USING_DCMI +#include +#ifdef RT_USING_POSIX +#include +#include +#ifdef RT_USING_POSIX_TERMIOS +#include +#endif +#endif + +#define DRV_DEBUG +#define LOG_TAG "drv.dcmi" +#include +static void (*dcmi_irq_callback)(void) = NULL; + +static struct stm32_dcmi rt_dcmi = {0}; +DMA_HandleTypeDef hdma_dcmi; +static void rt_hw_dcmi_dma_init(void) +{ + __HAL_RCC_DMA2_CLK_ENABLE(); + hdma_dcmi.Instance = DMA2_Stream1; + hdma_dcmi.Init.Channel = DMA_CHANNEL_1; + hdma_dcmi.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma_dcmi.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_dcmi.Init.MemInc = DMA_MINC_ENABLE; + hdma_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; + hdma_dcmi.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; + hdma_dcmi.Init.Mode = DMA_NORMAL; + hdma_dcmi.Init.Priority = DMA_PRIORITY_HIGH; + hdma_dcmi.Init.FIFOMode = DMA_FIFOMODE_ENABLE; + hdma_dcmi.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; + hdma_dcmi.Init.MemBurst = DMA_MBURST_SINGLE; + hdma_dcmi.Init.PeriphBurst = DMA_PBURST_SINGLE; + HAL_DMA_Init(&hdma_dcmi); + __HAL_LINKDMA(&rt_dcmi.DCMI_Handle, DMA_Handle, hdma_dcmi); + __HAL_DMA_ENABLE_IT(&hdma_dcmi,DMA_IT_TC); + HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 0x00, 0x00); + HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);; +} +/* +DMA multi_buffer DMA Transfer. +*/ +void rt_hw_dcmi_dma_config(rt_uint32_t dst_addr1, rt_uint32_t dst_addr2, rt_uint32_t len) +{ + HAL_DMAEx_MultiBufferStart(&hdma_dcmi, (rt_uint32_t)&DCMI->DR, dst_addr1, dst_addr2, len); + + __HAL_DMA_ENABLE_IT(&hdma_dcmi, DMA_IT_TC); +} + +static rt_err_t rt_hw_dcmi_init(DCMI_HandleTypeDef *device) +{ + RT_ASSERT(device != RT_NULL); + + device->Instance = DCMI; + device->Init.SynchroMode = DCMI_SYNCHRO_HARDWARE; + device->Init.PCKPolarity = DCMI_PCKPOLARITY_RISING; + device->Init.VSPolarity = DCMI_VSPOLARITY_LOW; + device->Init.HSPolarity = DCMI_HSPOLARITY_LOW; + device->Init.CaptureRate = DCMI_CR_ALL_FRAME; + device->Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B; + device->Init.JPEGMode = DCMI_JPEG_ENABLE; + #if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) + device->Init.ByteSelectMode = DCMI_BSM_ALL; + device->Init.ByteSelectStart = DCMI_OEBS_ODD; + device->Init.LineSelectMode = DCMI_LSM_ALL; + device->Init.LineSelectStart = DCMI_OELS_ODD; + #endif + if(HAL_DCMI_Init(device) != HAL_OK) + { + LOG_E("dcmi init error!"); + return RT_ERROR; + } + else + { + LOG_I("dcmi HAL_DCMI_Init success"); + } + DCMI->IER = 0x0; + __HAL_DCMI_ENABLE_IT(device, DCMI_IT_FRAME); + __HAL_DCMI_ENABLE(device); + return RT_EOK; +} + +void DCMI_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + HAL_DCMI_IRQHandler(&rt_dcmi.DCMI_Handle); + /* leave interrupt */ + rt_interrupt_leave(); +} +/* +the camera starts transfering photos +*/ +void rt_dcmi_start(uint32_t pData, uint32_t Length) +{ + HAL_DCMI_Start_DMA(&rt_dcmi.DCMI_Handle,DCMI_MODE_SNAPSHOT,pData, Length); +} + +/* +the camera stops transfering photos +*/ +void rt_dcmi_stop(void) +{ + HAL_DCMI_Stop(&rt_dcmi.DCMI_Handle);// +} + + +/* Capture a frame of the image */ +void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi) +{ + rt_interrupt_enter(); + __HAL_DCMI_ENABLE_IT(&rt_dcmi.DCMI_Handle, DCMI_IT_FRAME); + rt_dcmi_stop(); + if(NULL != dcmi_irq_callback) + { + (*dcmi_irq_callback)(); + } + rt_interrupt_leave(); +} + +void DMA2_Stream1_IRQHandler(void) +{ + extern void camera_dma_data_process(void); + /* enter interrupt */ + rt_interrupt_enter(); + + if (__HAL_DMA_GET_FLAG(&hdma_dcmi, DMA_FLAG_TCIF1_5) != RESET) + { + __HAL_DMA_CLEAR_FLAG(&hdma_dcmi, DMA_FLAG_TCIF1_5); + } + + /* leave interrupt */ + rt_interrupt_leave(); +} + +static rt_err_t rt_dcmi_init(rt_device_t dev) +{ + RT_ASSERT(dev != RT_NULL); + rt_err_t result = RT_EOK; + result = rt_hw_dcmi_init(&rt_dcmi.DCMI_Handle); + if (result != RT_EOK) + { + return result; + } + + rt_hw_dcmi_dma_init(); + + return result; +} + +static rt_err_t rt_dcmi_open(rt_device_t dev, rt_uint16_t oflag) +{ + RT_ASSERT(dev != RT_NULL); + + return RT_EOK; +} + +static rt_err_t rt_dcmi_close(rt_device_t dev) +{ + RT_ASSERT(dev != RT_NULL); + + return RT_EOK; +} + +static rt_err_t rt_dcmi_control(rt_device_t dev, int cmd, void *args) +{ + RT_ASSERT(dev != RT_NULL); + + return RT_EOK; +} + +static rt_size_t rt_dcmi_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) +{ + RT_ASSERT(dev != RT_NULL); + + return RT_EOK; +} + +static rt_size_t rt_dcmi_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) +{ + RT_ASSERT(dev != RT_NULL); + + return RT_EOK; +} + +rt_err_t rt_set_irq_dcmi_callback_hander(void (*p)(void)) +{ + if(NULL == p) + { + LOG_E("set irq dcmi callback hander is NULL"); + return RT_ERROR; + } + dcmi_irq_callback = p; + return RT_EOK; + +} +int dcmi_init(void) +{ + int ret = 0; + rt_device_t dcmi_dev = RT_NULL; + rt_dcmi.dev.parent.type = RT_Device_Class_Miscellaneous; + rt_dcmi.dev.parent.init = rt_dcmi_init; + rt_dcmi.dev.parent.open = rt_dcmi_open; + rt_dcmi.dev.parent.close = rt_dcmi_close; + rt_dcmi.dev.parent.read = rt_dcmi_read; + rt_dcmi.dev.parent.write = rt_dcmi_write; + rt_dcmi.dev.parent.control = rt_dcmi_control; + rt_dcmi.dev.parent.user_data = RT_NULL; + ret = rt_device_register(&rt_dcmi.dev.parent, "dcmi", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE | RT_DEVICE_FLAG_STANDALONE); + if(ret != RT_EOK) + { + LOG_E("dcmi registered fail!!\n\r"); + return -RT_ERROR; + } + LOG_I("dcmi registered successfully!"); + dcmi_dev = rt_device_find("dcmi"); + if (dcmi_dev == RT_NULL) + { + LOG_E("can't find dcmi device!"); + return RT_ERROR; + } + ret = rt_device_open(dcmi_dev, RT_DEVICE_FLAG_RDWR); + if(ret != RT_EOK) + { + LOG_E("can't open dcmi device!"); + return RT_ERROR; + } + LOG_I("dcmi open successfully"); + return RT_EOK; +} +INIT_BOARD_EXPORT(dcmi_init); +#endif diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/drv_dcmi.h b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/drv_dcmi.h new file mode 100644 index 000000000..abd01c183 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/drv_dcmi.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-07-27 thread-liu the first version + */ + +#ifndef __DRV_DCMI_H__ +#define __DRV_DCMI_H__ +#include "board.h" +#ifdef __cplusplus +extern "C" { +#endif +struct rt_dcmi_device +{ + struct rt_device parent; +}; +struct stm32_dcmi +{ + DCMI_HandleTypeDef DCMI_Handle; + struct rt_dcmi_device dev; +}; + +extern DMA_HandleTypeDef hdma_dcmi; +extern void DCMI_IRQHandler(void); +extern void rt_hw_dcmi_dma_config(rt_uint32_t dst_addr1, rt_uint32_t dst_addr2, rt_uint32_t len); +extern void rt_dcmi_start(uint32_t pData, uint32_t Length); +extern void rt_dcmi_stop(void); +extern rt_err_t rt_set_irq_dcmi_callback_hander(void (*p)(void)); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/linker_scripts/link.lds b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/linker_scripts/link.lds new file mode 100644 index 000000000..79a7e76df --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/linker_scripts/link.lds @@ -0,0 +1,159 @@ +/* + * linker script for STM32F4xx with GNU ld + * bernard.xiong 2009-10-14 + * flybreak 2018-11-19 Add support for RAM2 + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + CODE (rx) : ORIGIN = 0x08000000, LENGTH = 1024k /* 1024KB flash */ + RAM1 (rw) : ORIGIN = 0x20000000, LENGTH = 128k /* 128K sram */ + RAM2 (rw) : ORIGIN = 0x10000000, LENGTH = 64k /* 64K sram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x200; + +SECTIONS +{ + .text : + { + . = ALIGN(4); + _stext = .; + KEEP(*(.isr_vector)) /* Startup code */ + + . = ALIGN(4); + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t*) + + /* section information for finsh shell */ + . = ALIGN(4); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + + . = ALIGN(4); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + + . = ALIGN(4); + + PROVIDE(__ctors_start__ = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE(__ctors_end__ = .); + + . = ALIGN(4); + + _etext = .; + } > CODE = 0 + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > CODE + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + PROVIDE(__dtors_start__ = .); + KEEP(*(SORT(.dtors.*))) + KEEP(*(.dtors)) + PROVIDE(__dtors_end__ = .); + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } >RAM1 + + .stack : + { + . = ALIGN(4); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } >RAM1 + + __bss_start = .; + .bss : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _ebss = . ; + + *(.bss.init) + } > RAM1 + __bss_end = .; + + _end = .; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/I2c/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/I2c/Kconfig new file mode 100644 index 000000000..168ee276b --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/I2c/Kconfig @@ -0,0 +1,13 @@ +config BSP_USING_I2C1 + bool "Enable I2C1 BUS (software simulation)" + default y + if BSP_USING_I2C1 + config BSP_I2C1_SCL_PIN + int "I2C scl pin number" + range 0 143 + default 24 + config BSP_I2C1_SDA_PIN + int "I2C sda pin number" + range 0 143 + default 25 + endif diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/can/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/can/Kconfig new file mode 100644 index 000000000..34fb7d247 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/can/Kconfig @@ -0,0 +1,11 @@ +config CAN_BUS_NAME_1 + string "can bus name" + default "can1" + +config CAN_DRIVER_NAME + string "can driver name" + default "can1_drv" + +config CAN_1_DEVICE_NAME_1 + string "can bus 1 device 1 name" + default "can1_dev1" \ No newline at end of file diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/ch438/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/ch438/Kconfig new file mode 100644 index 000000000..389b67525 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/ch438/Kconfig @@ -0,0 +1,39 @@ +config CH438_BUS_NAME + string + default "extuart" + +config CH438_DRIVER_NAME + string + default "extuart_drv" + +config CH438_DEVICE_NAME_0 + string + default "extuart_dev0" + +config CH438_DEVICE_NAME_1 + string + default "extuart_dev1" + +config CH438_DEVICE_NAME_2 + string + default "extuart_dev2" + +config CH438_DEVICE_NAME_3 + string + default "extuart_dev3" + +config CH438_DEVICE_NAME_4 + string + default "extuart_dev4" + +config CH438_DEVICE_NAME_5 + string + default "extuart_dev5" + +config CH438_DEVICE_NAME_6 + string + default "extuart_dev6" + +config CH438_DEVICE_NAME_7 + string + default "extuart_dev7" diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/gpio/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/gpio/Kconfig new file mode 100644 index 000000000..1f789b987 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/gpio/Kconfig @@ -0,0 +1,4 @@ +config BSP_USING_GPIO + bool "Enable GPIO" + default y + diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/spi/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/spi/Kconfig new file mode 100644 index 000000000..33e9ba97f --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/spi/Kconfig @@ -0,0 +1,46 @@ +config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n + +config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + +config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n + +config BSP_USING_SPI2 + bool "Enable SPI2 BUS" + default n + +config BSP_SPI2_TX_USING_DMA + bool "Enable SPI2 TX DMA" + depends on BSP_USING_SPI2 + default n + +config BSP_SPI2_RX_USING_DMA + bool "Enable SPI2 RX DMA" + depends on BSP_USING_SPI2 + select BSP_SPI2_TX_USING_DMA + default n + + +config BSP_USING_SPI3 + bool "Enable SPI3 BUS" + default n + +config BSP_SPI3_TX_USING_DMA + bool "Enable SPI3 TX DMA" + depends on BSP_USING_SPI3 + default n + +config BSP_SPI3_RX_USING_DMA + bool "Enable SPI3 RX DMA" + depends on BSP_USING_SPI3 + select BSP_SPI3_TX_USING_DMA + default n + diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/uart/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/uart/Kconfig new file mode 100644 index 000000000..856d0d1f5 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/uart/Kconfig @@ -0,0 +1,21 @@ +config BSP_USING_UART1 + bool "Enable UART1" + default y + +config BSP_USING_UART2 + bool "Enable UART2" + default n + +config BSP_USING_UART3 + bool "Enable UART3" + default n + +config BSP_USING_UART4 + bool "Enable UART4" + default n + + + + + + diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/usb/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/usb/Kconfig new file mode 100644 index 000000000..4fcd37871 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/usb/Kconfig @@ -0,0 +1,15 @@ +config BSP_USING_STM32_USBH + bool "Using usb host" + default y + if BSP_USING_STM32_USBH + config USB_BUS_NAME + string "usb bus name" + default "usb" + config USB_DRIVER_NAME + string "usb bus driver name" + default "usb_drv" + config USB_DEVICE_NAME + string "usb bus device name" + default "usb_dev" + endif + diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/rtconfig.h b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/rtconfig.h new file mode 100644 index 000000000..da4679060 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/rtconfig.h @@ -0,0 +1,226 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* Automatically generated file; DO NOT EDIT. */ +/* RT-Thread Configuration */ + +#define ROOT_DIR "../../../.." +#define BSP_DIR "." +#define RT_Thread_DIR "../.." +#define RTT_DIR "../../rt-thread" + +/* 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_USING_IDLE_HOOK +#define RT_IDLE_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 256 +#define RT_USING_TIMER_SOFT +#define RT_TIMER_THREAD_PRIO 4 +#define RT_TIMER_THREAD_STACK_SIZE 512 + +/* 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 + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_MEMHEAP +#define RT_USING_MEMHEAP_AUTO_BINDING +#define RT_USING_MEMHEAP_AS_HEAP +#define RT_USING_HEAP + +/* Kernel Device Object */ + +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart1" +#define RT_VER_NUM 0x40004 +#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 + +/* C++ features */ + + +/* Command shell */ + +#define RT_USING_FINSH +#define RT_USING_MSH +#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 + +/* Device virtual file system */ + +#define RT_USING_DFS +#define DFS_USING_WORKDIR +#define DFS_FILESYSTEMS_MAX 4 +#define DFS_FILESYSTEM_TYPES_MAX 4 +#define DFS_FD_MAX 16 +#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_DFS_ROMFS + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_PIPE_BUFSZ 512 +#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 64 +#define RT_USING_CAN +#define RT_USING_I2C +#define RT_USING_I2C_BITOPS +#define RT_USING_PIN +#define RT_USING_RTC +#define RT_USING_SPI +#define RT_USING_SPI_MSD +#define RT_USING_SFUD +#define RT_SFUD_USING_SFDP +#define RT_SFUD_USING_FLASH_INFO_TABLE +#define RT_SFUD_SPI_MAX_HZ 50000000 + +/* Using USB */ + + +/* POSIX layer and C standard library */ + +#define RT_USING_LIBC +#define RT_USING_PTHREADS +#define PTHREAD_NUM_MAX 8 +#define RT_USING_POSIX +#define RT_LIBC_USING_TIME +#define RT_LIBC_DEFAULT_TIMEZONE 8 + +/* Network */ + +/* Socket abstraction layer */ + + +/* Network interface device */ + + +/* light weight TCP/IP stack */ + + +/* AT commands */ + + +/* VBUS(Virtual Software BUS) */ + + +/* Utilities */ + + +/* RT-Thread Utestcases */ + +#define SOC_FAMILY_STM32 +#define SOC_SERIES_STM32F4 + +/* Hardware Drivers Config */ + +#define SOC_STM32F407ZG +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_UART1 +#define BSP_USING_USB +#define BSP_USING_STM32_USBH +#define USB_BUS_NAME "usb" +#define USB_DRIVER_NAME "usb_drv" +#define USB_DEVICE_NAME "usb_dev" + +/* MicroPython */ + + +/* More Drivers */ + + +/* APP_Framework */ + +/* Framework */ + +#define TRANSFORM_LAYER_ATTRIUBUTE +#define ADD_XIZI_FETURES + +/* Security */ + + +/* Applications */ + +/* config stack size and priority of main task */ + +#define MAIN_KTASK_STACK_SIZE 1024 + +/* ota app */ + + +/* test app */ + + +/* connection app */ + + +/* control app */ + +/* knowing app */ + + +/* sensor app */ + + +/* lib */ + +#define APP_SELECT_NEWLIB + +#endif diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/rtconfig.py b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/rtconfig.py new file mode 100644 index 000000000..1e094c54c --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/rtconfig.py @@ -0,0 +1,151 @@ +import os +SRC_APP_DIR = '../../../../APP_Framework' +# toolchains options +ARCH='arm' +CPU='cortex-m4' +CROSS_TOOL='gcc' + +# bsp lib config +BSP_LIBRARY_TYPE = None + +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'/opt/gcc-arm-none-eabi-7-2018-q2-update/bin' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armcc' + EXEC_PATH = r'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iar' + EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.0' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' + +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' + + DEVICE = ' -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rt-thread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.lds' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + CXXFLAGS += ' -std=gnu++11' + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + CXX = 'armcc' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M4.fp ' + CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' + + CFLAGS += ' -D__MICROLIB ' + AFLAGS += ' --pd "__MICROLIB SETA 1" ' + LFLAGS += ' --library_type=microlib ' + EXEC_PATH += '/ARM/ARMCC/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O0' + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + CFLAGS += ' -std=c99' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iar': + # toolchains + CC = 'iccarm' + CXX = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-M4' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv4_sp' + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' --silent' + + AFLAGS = DEVICE + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu Cortex-M4' + AFLAGS += ' --fpu VFPv4_sp' + AFLAGS += ' -S' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + LFLAGS = ' --config "board/linker_scripts/link.icf"' + LFLAGS += ' --entry __iar_program_start' + + CXXFLAGS = CFLAGS + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' + +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) From fcdb1d8b628b823791c5f2309a12cdfda24949cc Mon Sep 17 00:00:00 2001 From: yl1185 <1182784652@qq.com> Date: Sat, 2 Apr 2022 09:51:33 +0800 Subject: [PATCH 04/38] Ubiquitous/RT-Thread/:add atti-arm32-board bsp 1.Modify the peripheral interface of the development board 2.Complete configuration files and build files 3.GCC is supported --- .../aiit_board/aiit-arm32-board/.config | 380 ++++++ .../aiit_board/aiit-arm32-board/.gitignore | 243 ++++ .../aiit_board/aiit-arm32-board/Kconfig | 29 + .../aiit_board/aiit-arm32-board/README.md | 65 ++ .../aiit_board/aiit-arm32-board/SConscript | 15 + .../aiit_board/aiit-arm32-board/SConstruct | 92 ++ .../aiit-arm32-board/applications/SConscript | 12 + .../aiit-arm32-board/applications/main.c | 51 + .../aiit-arm32-board/applications/uart_test.c | 43 + .../board/CubeMX_Config/.mxproject | 17 + .../board/CubeMX_Config/CubeMX_Config.ioc | 441 +++++++ .../board/CubeMX_Config/Inc/main.h | 91 ++ .../CubeMX_Config/Inc/stm32f4xx_hal_conf.h | 442 +++++++ .../board/CubeMX_Config/Inc/stm32f4xx_it.h | 84 ++ .../board/CubeMX_Config/Src/main.c | 920 +++++++++++++++ .../CubeMX_Config/Src/stm32f4xx_hal_msp.c | 1025 +++++++++++++++++ .../board/CubeMX_Config/Src/stm32f4xx_it.c | 218 ++++ .../CubeMX_Config/Src/system_stm32f4xx.c | 761 ++++++++++++ .../aiit_board/aiit-arm32-board/board/Kconfig | 64 + .../aiit-arm32-board/board/SConscript | 31 + .../aiit_board/aiit-arm32-board/board/board.c | 59 + .../aiit_board/aiit-arm32-board/board/board.h | 50 + .../aiit-arm32-board/board/drv_dcmi.c | 243 ++++ .../aiit-arm32-board/board/drv_dcmi.h | 37 + .../board/linker_scripts/link.lds | 159 +++ .../aiit-arm32-board/board/ports/I2c/Kconfig | 13 + .../aiit-arm32-board/board/ports/can/Kconfig | 11 + .../board/ports/ch438/Kconfig | 39 + .../aiit-arm32-board/board/ports/gpio/Kconfig | 4 + .../aiit-arm32-board/board/ports/spi/Kconfig | 46 + .../aiit-arm32-board/board/ports/uart/Kconfig | 21 + .../aiit-arm32-board/board/ports/usb/Kconfig | 15 + .../aiit_board/aiit-arm32-board/rtconfig.h | 226 ++++ .../aiit_board/aiit-arm32-board/rtconfig.py | 151 +++ 34 files changed, 6098 insertions(+) create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/.config create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/.gitignore create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/Kconfig create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/README.md create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/SConscript create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/SConstruct create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/SConscript create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/main.c create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/uart_test.c create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/.mxproject create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/CubeMX_Config.ioc create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Inc/main.h create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Inc/stm32f4xx_it.h create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/main.c create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/stm32f4xx_it.c create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/system_stm32f4xx.c create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/Kconfig create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/SConscript create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/board.c create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/board.h create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/drv_dcmi.c create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/drv_dcmi.h create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/linker_scripts/link.lds create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/I2c/Kconfig create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/can/Kconfig create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/ch438/Kconfig create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/gpio/Kconfig create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/spi/Kconfig create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/uart/Kconfig create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/usb/Kconfig create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/rtconfig.h create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/rtconfig.py diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/.config b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/.config new file mode 100644 index 000000000..aa3ade701 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/.config @@ -0,0 +1,380 @@ +# +# Automatically generated file; DO NOT EDIT. +# RT-Thread Configuration +# +CONFIG_ROOT_DIR="../../../.." +CONFIG_BSP_DIR="." +CONFIG_RT_Thread_DIR="../.." +CONFIG_RTT_DIR="../../rt-thread" + +# +# RT-Thread Kernel +# +CONFIG_RT_NAME_MAX=8 +# CONFIG_RT_USING_BIG_ENDIAN is not set +# CONFIG_RT_USING_ARCH_DATA_TYPE is not set +# CONFIG_RT_USING_SMP is not set +CONFIG_RT_ALIGN_SIZE=4 +# 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_USING_IDLE_HOOK=y +CONFIG_RT_IDLE_HOOK_LIST_SIZE=4 +CONFIG_IDLE_THREAD_STACK_SIZE=256 +CONFIG_RT_USING_TIMER_SOFT=y +CONFIG_RT_TIMER_THREAD_PRIO=4 +CONFIG_RT_TIMER_THREAD_STACK_SIZE=512 + +# +# kservice optimization +# +# CONFIG_RT_KSERVICE_USING_STDLIB is not set +# CONFIG_RT_KSERVICE_USING_TINY_SIZE is not set +# CONFIG_RT_USING_ASM_MEMCPY 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_MEMHEAP=y +CONFIG_RT_USING_MEMHEAP_AUTO_BINDING=y +# CONFIG_RT_USING_NOHEAP is not set +# CONFIG_RT_USING_SMALL_MEM is not set +# CONFIG_RT_USING_SLAB is not set +CONFIG_RT_USING_MEMHEAP_AS_HEAP=y +# CONFIG_RT_USING_USERHEAP is not set +# CONFIG_RT_USING_MEMTRACE 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_INTERRUPT_INFO is not set +CONFIG_RT_USING_CONSOLE=y +CONFIG_RT_CONSOLEBUF_SIZE=128 +CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" +# CONFIG_RT_PRINTF_LONGLONG is not set +CONFIG_RT_VER_NUM=0x40004 +CONFIG_ARCH_ARM=y +CONFIG_RT_USING_CPU_FFS=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 +# +CONFIG_RT_USING_COMPONENTS_INIT=y +CONFIG_RT_USING_USER_MAIN=y +CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 +CONFIG_RT_MAIN_THREAD_PRIORITY=10 + +# +# C++ features +# +# CONFIG_RT_USING_CPLUSPLUS is not set + +# +# Command shell +# +CONFIG_RT_USING_FINSH=y +CONFIG_RT_USING_MSH=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=80 +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 + +# +# Device virtual file system +# +CONFIG_RT_USING_DFS=y +CONFIG_DFS_USING_WORKDIR=y +CONFIG_DFS_FILESYSTEMS_MAX=4 +CONFIG_DFS_FILESYSTEM_TYPES_MAX=4 +CONFIG_DFS_FD_MAX=16 +# CONFIG_RT_USING_DFS_MNTTABLE is not set +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=2 +CONFIG_RT_DFS_ELM_MAX_SECTOR_SIZE=4096 +# 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=y +# CONFIG_RT_USING_DFS_RAMFS is not set + +# +# Device Drivers +# +CONFIG_RT_USING_DEVICE_IPC=y +CONFIG_RT_PIPE_BUFSZ=512 +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 is not set +CONFIG_RT_SERIAL_RB_BUFSZ=64 +CONFIG_RT_USING_CAN=y +# CONFIG_RT_CAN_USING_HDR is not set +# CONFIG_RT_USING_HWTIMER is not set +# 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 is not set +# CONFIG_RT_USING_DAC 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_RTC=y +# CONFIG_RT_USING_ALARM is not set +# CONFIG_RT_USING_SOFT_RTC is not set +# CONFIG_RT_USING_SDIO is not set +CONFIG_RT_USING_SPI=y +# CONFIG_RT_USING_QSPI is not set +CONFIG_RT_USING_SPI_MSD=y +CONFIG_RT_USING_SFUD=y +CONFIG_RT_SFUD_USING_SFDP=y +CONFIG_RT_SFUD_USING_FLASH_INFO_TABLE=y +# CONFIG_RT_SFUD_USING_QSPI is not set +CONFIG_RT_SFUD_SPI_MAX_HZ=50000000 +# CONFIG_RT_DEBUG_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 is not set +# CONFIG_RT_USING_SENSOR is not set +# CONFIG_RT_USING_TOUCH 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_WIFI is not set + +# +# Using USB +# +# CONFIG_RT_USING_USB_HOST is not set +# CONFIG_RT_USING_USB_DEVICE is not set + +# +# POSIX layer and C standard library +# +CONFIG_RT_USING_LIBC=y +CONFIG_RT_USING_PTHREADS=y +CONFIG_PTHREAD_NUM_MAX=8 +CONFIG_RT_USING_POSIX=y +# CONFIG_RT_USING_POSIX_MMAP is not set +# CONFIG_RT_USING_POSIX_TERMIOS is not set +# CONFIG_RT_USING_POSIX_GETLINE is not set +# CONFIG_RT_USING_POSIX_AIO is not set +CONFIG_RT_LIBC_USING_TIME=y +# CONFIG_RT_USING_MODULE is not set +CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8 + +# +# Network +# + +# +# Socket abstraction layer +# +# CONFIG_RT_USING_SAL is not set + +# +# Network interface device +# +# CONFIG_RT_USING_NETDEV is not set + +# +# light weight TCP/IP stack +# +# CONFIG_RT_USING_LWIP is not set + +# +# AT commands +# +# CONFIG_RT_USING_AT is not set + +# +# VBUS(Virtual Software BUS) +# +# CONFIG_RT_USING_VBUS is not set + +# +# Utilities +# +# CONFIG_RT_USING_RYM is not set +# CONFIG_RT_USING_ULOG is not set +# CONFIG_RT_USING_UTEST is not set +# CONFIG_RT_USING_VAR_EXPORT is not set +# CONFIG_RT_USING_RT_LINK is not set +# CONFIG_RT_USING_LWP is not set + +# +# RT-Thread Utestcases +# +# CONFIG_RT_USING_UTESTCASES is not set +CONFIG_SOC_FAMILY_STM32=y +CONFIG_SOC_SERIES_STM32F4=y + +# +# Hardware Drivers Config +# +CONFIG_SOC_STM32F407ZG=y +CONFIG_BSP_USING_GPIO=y +CONFIG_BSP_USING_UART=y +CONFIG_BSP_USING_UART1=y +# CONFIG_BSP_USING_UART2 is not set +# CONFIG_BSP_USING_UART3 is not set +# CONFIG_BSP_USING_UART4 is not set +# CONFIG_BSP_USING_I2C1 is not set +# CONFIG_BSP_USING_SPI is not set +# CONFIG_BSP_USING_CH438 is not set +CONFIG_BSP_USING_USB=y +CONFIG_BSP_USING_STM32_USBH=y +CONFIG_USB_BUS_NAME="usb" +CONFIG_USB_DRIVER_NAME="usb_drv" +CONFIG_USB_DEVICE_NAME="usb_dev" +# CONFIG_BSP_USING_RNG is not set +# CONFIG_BSP_USING_UDID is not set + +# +# MicroPython +# +# CONFIG_PKG_USING_MICROPYTHON is not set + +# +# More Drivers +# +# CONFIG_PKG_USING_RW007 is not set +# CONFIG_DRV_USING_OV2640 is not set + +# +# APP_Framework +# + +# +# Framework +# +CONFIG_TRANSFORM_LAYER_ATTRIUBUTE=y +CONFIG_ADD_XIZI_FETURES=y +# CONFIG_ADD_NUTTX_FETURES is not set +# CONFIG_ADD_RTTHREAD_FETURES is not set +# CONFIG_SUPPORT_SENSOR_FRAMEWORK is not set +# CONFIG_SUPPORT_CONNECTION_FRAMEWORK is not set +# CONFIG_SUPPORT_KNOWING_FRAMEWORK is not set +# CONFIG_SUPPORT_CONTROL_FRAMEWORK is not set + +# +# Security +# +# CONFIG_CRYPTO is not set + +# +# Applications +# + +# +# config stack size and priority of main task +# +CONFIG_MAIN_KTASK_STACK_SIZE=1024 + +# +# ota app +# +# CONFIG_APPLICATION_OTA is not set + +# +# test app +# +# CONFIG_USER_TEST is not set + +# +# connection app +# +# CONFIG_APPLICATION_CONNECTION is not set + +# +# control app +# + +# +# knowing app +# +# CONFIG_APPLICATION_KNOWING is not set + +# +# sensor app +# +# CONFIG_APPLICATION_SENSOR is not set +# CONFIG_USING_EMBEDDED_DATABASE_APP is not set + +# +# lib +# +CONFIG_APP_SELECT_NEWLIB=y +# CONFIG_APP_SELECT_OTHER_LIB is not set +# CONFIG_LIB_USING_CJSON is not set +# CONFIG_LIB_USING_QUEUE is not set +# CONFIG_LIB_LV is not set +# CONFIG_USING_EMBEDDED_DATABASE is not set diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/.gitignore b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/.gitignore new file mode 100644 index 000000000..331082a3e --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/.gitignore @@ -0,0 +1,243 @@ +# this +*.map +*.dblite +*.bin +*.axf +*.old +*~ +*.o +*.bak +*.dep +*.i +*.d +*.uimg +GPATH +GRTAGS +GTAGS +JLinkLog.txt +JLinkSettings.ini +DebugConfig/ +RTE/ +settings/ +*.uvguix* +cconfig.h + +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# Prerequisites +*.d + +# Object files +*.o +*.ko +*.obj +*.elf + +# Linker output +*.ilk +*.map +*.exp + +# Precompiled Headers +*.gch +*.pch + +# Libraries +*.lib +*.a +*.la +*.lo + +# Shared objects (inc. Windows DLLs) +*.dll +*.so +*.so.* +*.dylib + +# Executables +*.exe +*.out +*.app +*.i*86 +*.x86_64 +*.hex + +# Debug files +*.dSYM/ +*.su +*.idb +*.pdb + +# Kernel Module Compile Results +*.mod* +*.cmd +.tmp_versions/ +modules.order +Module.symvers +Mkfile.old +dkms.con diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/Kconfig new file mode 100644 index 000000000..32ee87ce8 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/Kconfig @@ -0,0 +1,29 @@ +mainmenu "RT-Thread Configuration" + +config ROOT_DIR + string + default "../../../.." + +config BSP_DIR + string + default "." + +config RT_Thread_DIR + string + default "../.." + +config RTT_DIR + string + default "../../rt-thread" + +config APP_DIR + string + default "../../../../APP_Framework" + +source "$RTT_DIR/Kconfig" +source "$RTT_DIR/bsp/stm32/libraries/Kconfig" +source "board/Kconfig" +source "$RT_Thread_DIR/micropython/Kconfig" +source "$RT_Thread_DIR/app_match_rt-thread/Kconfig" +source "$ROOT_DIR/APP_Framework/Kconfig" + diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/README.md b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/README.md new file mode 100644 index 000000000..38f47645c --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/README.md @@ -0,0 +1,65 @@ +# STM32F407最小系统板说明 + + +## 以下为引脚硬件的连接表 + +## **W25q16(SPI1 )** + +| 引脚 | 作用 | 引脚序号 |W25q16板子 | +| ---- | --------- | -------- | --------| +| PA5 | SPI1_SCK | 41 | CLK | +| PA6 | SPI1_MISO | 42 | DO | +| PA7 | SPI1_MOSI | 43 | DI | +| PB0 | SpiFlash_nCS | 46 | nCS | + +## **CRF1278-L3(SPI2 )** + +| 引脚 | 作用 | 引脚序号 |CRF1278板子| +| ---- | --------- | -------- | --------| +| PB13 | SPI2_SCK | 74 | SCK | +| PC2 | SPI2_MISO | 28 | MISO | +| PC3 | SPI2_MOSI | 29 | MOSI | +| PC6 | LORA_nCS | 96 | NSS | + +## **XPT2046(SPI3)** + +| 引脚 | 作用 | 引脚序号 |XPT2046板子| +| ---- | --------- | -------- | --------| +| PB3 | SPI3_SCK | 133 | DCLK | +| PB4 | SPI3_MISO | 134 | DOUT | +| PB5 | SPI3_MOSI | 135 | DIN | +| PG13 | T_nCS | 128 | CS | + +## **(I2C1)** + +| PB6 | I2C_SCL | +| ---- | ---------- | +| PB7 | I2C_SDA | + + +## uart1 串口1 + +| PA9 | USART1_TX | +| ---- | --------- | +| PA10 | USART1_RX | + +## uart2 串口2 + +| PA2 | USART2_TX | +| ---- | --------- | +| PA3 | USART2_RX | + +## uart3 串口3 + +| PB10 | USART3_TX | +| ---- | ----------| +| PB11 | USART3_RX | + +## uart4 串口4 + +| PA0-WKUP | UART4_TX | +| ---- | ------------ | +| PA1 | UART4_RX | + + + diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/SConscript b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/SConscript new file mode 100644 index 000000000..20f7689c5 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/SConscript @@ -0,0 +1,15 @@ +# for module compiling +import os +Import('RTT_ROOT') +from building import * + +cwd = GetCurrentDir() +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/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/SConstruct b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/SConstruct new file mode 100644 index 000000000..533cf2e28 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/SConstruct @@ -0,0 +1,92 @@ +import os +import sys +import rtconfig +import SCons + +if os.getenv('RTT_ROOT'): + RTT_ROOT = os.getenv('RTT_ROOT') +else: + RTT_ROOT = os.path.normpath(os.getcwd() + '/../../rt-thread') + +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 = 'rt-thread.' + rtconfig.TARGET_EXT + +DefaultEnvironment(tools=[]) +env = Environment(tools = ['mingw'], + AS = rtconfig.AS, ASFLAGS = rtconfig.AFLAGS, + CC = rtconfig.CC, CCFLAGS = rtconfig.CFLAGS, + AR = rtconfig.AR, ARFLAGS = '-rc', + CXX = rtconfig.CXX, CXXFLAGS = rtconfig.CXXFLAGS, + LINK = rtconfig.LINK, LINKFLAGS = rtconfig.LFLAGS) +env.PrependENVPath('PATH', rtconfig.EXEC_PATH) + +AddOption('--compiledb', + dest = 'compiledb', + action = 'store_true', + default = False, + help = 'generate compile_commands.json') + +if GetOption('compiledb'): + if int(SCons.__version__.split('.')[0]) >= 4: + env['COMPILATIONDB_USE_ABSPATH'] = True + env.Tool('compilation_db') + env.CompilationDatabase('compile_commands.json') + else: + print('Warning: --compiledb only support on SCons 4.0+') + +if rtconfig.PLATFORM == 'iar': + env.Replace(CCCOM = ['$CC $CCFLAGS $CPPFLAGS $_CPPDEFFLAGS $_CPPINCFLAGS -o $TARGET $SOURCES']) + env.Replace(ARFLAGS = ['']) + env.Replace(LINKCOM = env["LINKCOM"] + ' --map rt-thread.map') + +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' + +libraries_path_prefix = RTT_ROOT + '/bsp/stm32/libraries' + +SDK_LIB = libraries_path_prefix +Export('SDK_LIB') + +# prepare building environment +objs = PrepareBuilding(env, RTT_ROOT, has_libcpu=False) + +stm32_library = 'STM32F4xx_HAL' +rtconfig.BSP_LIBRARY_TYPE = stm32_library + +# include libraries +objs.extend(SConscript(os.path.join(libraries_path_prefix, stm32_library, 'SConscript'))) + +# include drivers +objs.extend(SConscript(os.path.join(libraries_path_prefix, 'HAL_Drivers', 'SConscript'))) + +# include more drivers +objs.extend(SConscript(os.getcwd() + '/../../app_match_rt-thread/SConscript')) + +# include APP_Framework/Framework +objs.extend(SConscript(os.getcwd() + '/../../../../APP_Framework/Framework/SConscript')) + +# include APP_Framework/Applications +objs.extend(SConscript(os.getcwd() + '/../../../../APP_Framework/Applications/SConscript')) + +# include APP_Framework/lib +objs.extend(SConscript(os.getcwd() + '/../../../../APP_Framework/lib/SConscript')) + +# include Ubiquitous/RT-Thread/micropython +objs.extend(SConscript(os.getcwd() + '/../../micropython/SConscript')) + +# make a building +DoBuilding(TARGET, objs) diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/SConscript b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/SConscript new file mode 100644 index 000000000..efae61d10 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/SConscript @@ -0,0 +1,12 @@ +import rtconfig +from building import * + +cwd = GetCurrentDir() +CPPPATH = [cwd] +src = Split(""" +main.c +""") + +group = DefineGroup('Applications', src, depend = [''], CPPPATH = CPPPATH) + +Return('group') diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/main.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/main.c new file mode 100644 index 000000000..7f11d6ed8 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/main.c @@ -0,0 +1,51 @@ +/* + * @Author: chunyexixiaoyu + * @Date: 2021-09-24 16:33:15 + * @LastEditTime: 2021-09-24 15:48:30 + * @LastEditors: Please set LastEditors + * @Description: In User Settings Edit + * @FilePath: \xiuos\Ubiquitous\RT_Thread\bsp\stm32f407-atk-coreboard\applications\main.c + */ + +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#include +#include +#include +#include +#ifdef RT_USING_POSIX +#include +#include +#include +#include +#include +#include +#ifdef RT_USING_POSIX_TERMIOS +#include +#endif +#endif + +#define LED0_PIN GET_PIN(F, 9) +extern int FrameworkInit(); +int main(void) +{ + int count = 1; + rt_pin_mode(LED0_PIN, PIN_MODE_OUTPUT); + rt_thread_mdelay(100); + FrameworkInit(); + printf("XIUOS stm32f4 build %s %s\n",__DATE__,__TIME__); + while (count++) + { + rt_pin_write(LED0_PIN, PIN_HIGH); + rt_thread_mdelay(500); + rt_pin_write(LED0_PIN, PIN_LOW); + rt_thread_mdelay(500); + } +} diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/uart_test.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/uart_test.c new file mode 100644 index 000000000..aeb9e8859 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/applications/uart_test.c @@ -0,0 +1,43 @@ +/* + * @Author: yongliang + * @Date: 2022-03-31 16:00:00 + * @Description: uart_test code + * @FilePath: \xiuos\Ubiquitous\RT_Thread\aiit_board\stm32f407_mini_board\applications\uart_test.c + */ + +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + */ + +#include +#include +#include +#include + +int main (void) +{ + /*1.设置系统中断优先组*/ + + /*2.串口初始化*/ + while(1) + { + if(USART_RX_STA&0X8000) + { + len =USART_RX_STA&0X3fff; + printf("发送的消息为:\r\n"); + for(t=0;t +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void Error_Handler(void); + +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +/* Private defines -----------------------------------------------------------*/ +/* USER CODE BEGIN Private defines */ + +/* USER CODE END Private defines */ + +#ifdef __cplusplus +} +#endif + +#endif /* __MAIN_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h new file mode 100644 index 000000000..c31746fa0 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Inc/stm32f4xx_hal_conf.h @@ -0,0 +1,442 @@ +/** + ****************************************************************************** + * @file stm32f4xx_hal_conf_template.h + * @author MCD Application Team + * @brief HAL configuration template file. + * This file should be copied to the application folder and renamed + * to stm32f4xx_hal_conf.h. + ****************************************************************************** + * @attention + * + *

© Copyright (c) 2017 STMicroelectronics. + * All rights reserved.

+ * + * This software component is licensed by ST under BSD 3-Clause license, + * the "License"; You may not use this file except in compliance with the + * License. You may obtain a copy of the License at: + * opensource.org/licenses/BSD-3-Clause + * + ****************************************************************************** + */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_HAL_CONF_H +#define __STM32F4xx_HAL_CONF_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Exported types ------------------------------------------------------------*/ +/* Exported constants --------------------------------------------------------*/ + +/* ########################## Module Selection ############################## */ +/** + * @brief This is the list of modules to be used in the HAL driver + */ +#define HAL_MODULE_ENABLED + + /* #define HAL_ADC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +#define HAL_CAN_MODULE_ENABLED +/* #define HAL_CRC_MODULE_ENABLED */ +/* #define HAL_CRYP_MODULE_ENABLED */ +/* #define HAL_DAC_MODULE_ENABLED */ +/* #define HAL_DCMI_MODULE_ENABLED */ +/* #define HAL_DMA2D_MODULE_ENABLED */ +/* #define HAL_ETH_MODULE_ENABLED */ +/* #define HAL_NAND_MODULE_ENABLED */ +/* #define HAL_NOR_MODULE_ENABLED */ +/* #define HAL_PCCARD_MODULE_ENABLED */ +#define HAL_SRAM_MODULE_ENABLED +/* #define HAL_SDRAM_MODULE_ENABLED */ +/* #define HAL_HASH_MODULE_ENABLED */ +#define HAL_I2C_MODULE_ENABLED +/* #define HAL_I2S_MODULE_ENABLED */ +#define HAL_IWDG_MODULE_ENABLED +/* #define HAL_LTDC_MODULE_ENABLED */ +/* #define HAL_RNG_MODULE_ENABLED */ +#define HAL_RTC_MODULE_ENABLED +/* #define HAL_SAI_MODULE_ENABLED */ +#define HAL_SD_MODULE_ENABLED +/* #define HAL_MMC_MODULE_ENABLED */ +#define HAL_SPI_MODULE_ENABLED +#define HAL_TIM_MODULE_ENABLED +#define HAL_UART_MODULE_ENABLED +/* #define HAL_USART_MODULE_ENABLED */ +/* #define HAL_IRDA_MODULE_ENABLED */ +/* #define HAL_SMARTCARD_MODULE_ENABLED */ +/* #define HAL_SMBUS_MODULE_ENABLED */ +/* #define HAL_WWDG_MODULE_ENABLED */ +/* #define HAL_PCD_MODULE_ENABLED */ +/* #define HAL_HCD_MODULE_ENABLED */ +/* #define HAL_DSI_MODULE_ENABLED */ +/* #define HAL_QSPI_MODULE_ENABLED */ +/* #define HAL_QSPI_MODULE_ENABLED */ +/* #define HAL_CEC_MODULE_ENABLED */ +/* #define HAL_FMPI2C_MODULE_ENABLED */ +/* #define HAL_SPDIFRX_MODULE_ENABLED */ +/* #define HAL_DFSDM_MODULE_ENABLED */ +/* #define HAL_LPTIM_MODULE_ENABLED */ +#define HAL_GPIO_MODULE_ENABLED +#define HAL_EXTI_MODULE_ENABLED +#define HAL_DMA_MODULE_ENABLED +#define HAL_RCC_MODULE_ENABLED +#define HAL_FLASH_MODULE_ENABLED +#define HAL_PWR_MODULE_ENABLED +#define HAL_CORTEX_MODULE_ENABLED + +/* ########################## HSE/HSI Values adaptation ##################### */ +/** + * @brief Adjust the value of External High Speed oscillator (HSE) used in your application. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSE is used as system clock source, directly or through the PLL). + */ +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)8000000U) /*!< Value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSE_STARTUP_TIMEOUT) + #define HSE_STARTUP_TIMEOUT ((uint32_t)100U) /*!< Time out for HSE start up, in ms */ +#endif /* HSE_STARTUP_TIMEOUT */ + +/** + * @brief Internal High Speed oscillator (HSI) value. + * This value is used by the RCC HAL module to compute the system frequency + * (when HSI is used as system clock source, directly or through the PLL). + */ +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000U) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @brief Internal Low Speed oscillator (LSI) value. + */ +#if !defined (LSI_VALUE) + #define LSI_VALUE ((uint32_t)32000U) /*!< LSI Typical Value in Hz*/ +#endif /* LSI_VALUE */ /*!< Value of the Internal Low Speed oscillator in Hz + The real value may vary depending on the variations + in voltage and temperature.*/ +/** + * @brief External Low Speed oscillator (LSE) value. + */ +#if !defined (LSE_VALUE) + #define LSE_VALUE ((uint32_t)32768U) /*!< Value of the External Low Speed oscillator in Hz */ +#endif /* LSE_VALUE */ + +#if !defined (LSE_STARTUP_TIMEOUT) + #define LSE_STARTUP_TIMEOUT ((uint32_t)5000U) /*!< Time out for LSE start up, in ms */ +#endif /* LSE_STARTUP_TIMEOUT */ + +/** + * @brief External clock source for I2S peripheral + * This value is used by the I2S HAL module to compute the I2S clock source + * frequency, this source is inserted directly through I2S_CKIN pad. + */ +#if !defined (EXTERNAL_CLOCK_VALUE) + #define EXTERNAL_CLOCK_VALUE ((uint32_t)12288000U) /*!< Value of the External audio frequency in Hz*/ +#endif /* EXTERNAL_CLOCK_VALUE */ + +/* Tip: To avoid modifying this file each time you need to use different HSE, + === you can define the HSE value in your toolchain compiler preprocessor. */ + +/* ########################### System Configuration ######################### */ +/** + * @brief This is the HAL system configuration section + */ +#define VDD_VALUE ((uint32_t)3300U) /*!< Value of VDD in mv */ +#define TICK_INT_PRIORITY ((uint32_t)0U) /*!< tick interrupt priority */ +#define USE_RTOS 0U +#define PREFETCH_ENABLE 1U +#define INSTRUCTION_CACHE_ENABLE 1U +#define DATA_CACHE_ENABLE 1U + +/* ########################## Assert Selection ############################## */ +/** + * @brief Uncomment the line below to expanse the "assert_param" macro in the + * HAL drivers code + */ +/* #define USE_FULL_ASSERT 1U */ + +/* ################## Ethernet peripheral configuration ##################### */ + +/* Section 1 : Ethernet peripheral configuration */ + +/* MAC ADDRESS: MAC_ADDR0:MAC_ADDR1:MAC_ADDR2:MAC_ADDR3:MAC_ADDR4:MAC_ADDR5 */ +#define MAC_ADDR0 2U +#define MAC_ADDR1 0U +#define MAC_ADDR2 0U +#define MAC_ADDR3 0U +#define MAC_ADDR4 0U +#define MAC_ADDR5 0U + +/* Definition of the Ethernet driver buffers size and count */ +#define ETH_RX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for receive */ +#define ETH_TX_BUF_SIZE ETH_MAX_PACKET_SIZE /* buffer size for transmit */ +#define ETH_RXBUFNB ((uint32_t)4U) /* 4 Rx buffers of size ETH_RX_BUF_SIZE */ +#define ETH_TXBUFNB ((uint32_t)4U) /* 4 Tx buffers of size ETH_TX_BUF_SIZE */ + +/* Section 2: PHY configuration section */ + +/* DP83848_PHY_ADDRESS Address*/ +#define DP83848_PHY_ADDRESS 0x01U +/* PHY Reset delay these values are based on a 1 ms Systick interrupt*/ +#define PHY_RESET_DELAY ((uint32_t)0x000000FFU) +/* PHY Configuration delay */ +#define PHY_CONFIG_DELAY ((uint32_t)0x00000FFFU) + +#define PHY_READ_TO ((uint32_t)0x0000FFFFU) +#define PHY_WRITE_TO ((uint32_t)0x0000FFFFU) + +/* Section 3: Common PHY Registers */ + +#define PHY_BCR ((uint16_t)0x0000U) /*!< Transceiver Basic Control Register */ +#define PHY_BSR ((uint16_t)0x0001U) /*!< Transceiver Basic Status Register */ + +#define PHY_RESET ((uint16_t)0x8000U) /*!< PHY Reset */ +#define PHY_LOOPBACK ((uint16_t)0x4000U) /*!< Select loop-back mode */ +#define PHY_FULLDUPLEX_100M ((uint16_t)0x2100U) /*!< Set the full-duplex mode at 100 Mb/s */ +#define PHY_HALFDUPLEX_100M ((uint16_t)0x2000U) /*!< Set the half-duplex mode at 100 Mb/s */ +#define PHY_FULLDUPLEX_10M ((uint16_t)0x0100U) /*!< Set the full-duplex mode at 10 Mb/s */ +#define PHY_HALFDUPLEX_10M ((uint16_t)0x0000U) /*!< Set the half-duplex mode at 10 Mb/s */ +#define PHY_AUTONEGOTIATION ((uint16_t)0x1000U) /*!< Enable auto-negotiation function */ +#define PHY_RESTART_AUTONEGOTIATION ((uint16_t)0x0200U) /*!< Restart auto-negotiation function */ +#define PHY_POWERDOWN ((uint16_t)0x0800U) /*!< Select the power down mode */ +#define PHY_ISOLATE ((uint16_t)0x0400U) /*!< Isolate PHY from MII */ + +#define PHY_AUTONEGO_COMPLETE ((uint16_t)0x0020U) /*!< Auto-Negotiation process completed */ +#define PHY_LINKED_STATUS ((uint16_t)0x0004U) /*!< Valid link established */ +#define PHY_JABBER_DETECTION ((uint16_t)0x0002U) /*!< Jabber condition detected */ + +/* Section 4: Extended PHY Registers */ +#define PHY_SR ((uint16_t)0x10U) /*!< PHY status register Offset */ + +#define PHY_SPEED_STATUS ((uint16_t)0x0002U) /*!< PHY Speed mask */ +#define PHY_DUPLEX_STATUS ((uint16_t)0x0004U) /*!< PHY Duplex mask */ + +/* ################## SPI peripheral configuration ########################## */ + +/* CRC FEATURE: Use to activate CRC feature inside HAL SPI Driver +* Activated: CRC code is present inside driver +* Deactivated: CRC code cleaned from driver +*/ + +#define USE_SPI_CRC 0U + +/* Includes ------------------------------------------------------------------*/ +/** + * @brief Include module's header file + */ + +#ifdef HAL_RCC_MODULE_ENABLED + #include "stm32f4xx_hal_rcc.h" +#endif /* HAL_RCC_MODULE_ENABLED */ + +#ifdef HAL_EXTI_MODULE_ENABLED + #include "stm32f4xx_hal_exti.h" +#endif /* HAL_EXTI_MODULE_ENABLED */ + +#ifdef HAL_GPIO_MODULE_ENABLED + #include "stm32f4xx_hal_gpio.h" +#endif /* HAL_GPIO_MODULE_ENABLED */ + +#ifdef HAL_DMA_MODULE_ENABLED + #include "stm32f4xx_hal_dma.h" +#endif /* HAL_DMA_MODULE_ENABLED */ + +#ifdef HAL_CORTEX_MODULE_ENABLED + #include "stm32f4xx_hal_cortex.h" +#endif /* HAL_CORTEX_MODULE_ENABLED */ + +#ifdef HAL_ADC_MODULE_ENABLED + #include "stm32f4xx_hal_adc.h" +#endif /* HAL_ADC_MODULE_ENABLED */ + +#ifdef HAL_CAN_MODULE_ENABLED + #include "stm32f4xx_hal_can.h" +#endif /* HAL_CAN_MODULE_ENABLED */ + +#ifdef HAL_CRC_MODULE_ENABLED + #include "stm32f4xx_hal_crc.h" +#endif /* HAL_CRC_MODULE_ENABLED */ + +#ifdef HAL_CRYP_MODULE_ENABLED + #include "stm32f4xx_hal_cryp.h" +#endif /* HAL_CRYP_MODULE_ENABLED */ + +#ifdef HAL_SMBUS_MODULE_ENABLED +#include "stm32f4xx_hal_smbus.h" +#endif /* HAL_SMBUS_MODULE_ENABLED */ + +#ifdef HAL_DMA2D_MODULE_ENABLED + #include "stm32f4xx_hal_dma2d.h" +#endif /* HAL_DMA2D_MODULE_ENABLED */ + +#ifdef HAL_DAC_MODULE_ENABLED + #include "stm32f4xx_hal_dac.h" +#endif /* HAL_DAC_MODULE_ENABLED */ + +#ifdef HAL_DCMI_MODULE_ENABLED + #include "stm32f4xx_hal_dcmi.h" +#endif /* HAL_DCMI_MODULE_ENABLED */ + +#ifdef HAL_ETH_MODULE_ENABLED + #include "stm32f4xx_hal_eth.h" +#endif /* HAL_ETH_MODULE_ENABLED */ + +#ifdef HAL_FLASH_MODULE_ENABLED + #include "stm32f4xx_hal_flash.h" +#endif /* HAL_FLASH_MODULE_ENABLED */ + +#ifdef HAL_SRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sram.h" +#endif /* HAL_SRAM_MODULE_ENABLED */ + +#ifdef HAL_NOR_MODULE_ENABLED + #include "stm32f4xx_hal_nor.h" +#endif /* HAL_NOR_MODULE_ENABLED */ + +#ifdef HAL_NAND_MODULE_ENABLED + #include "stm32f4xx_hal_nand.h" +#endif /* HAL_NAND_MODULE_ENABLED */ + +#ifdef HAL_PCCARD_MODULE_ENABLED + #include "stm32f4xx_hal_pccard.h" +#endif /* HAL_PCCARD_MODULE_ENABLED */ + +#ifdef HAL_SDRAM_MODULE_ENABLED + #include "stm32f4xx_hal_sdram.h" +#endif /* HAL_SDRAM_MODULE_ENABLED */ + +#ifdef HAL_HASH_MODULE_ENABLED + #include "stm32f4xx_hal_hash.h" +#endif /* HAL_HASH_MODULE_ENABLED */ + +#ifdef HAL_I2C_MODULE_ENABLED + #include "stm32f4xx_hal_i2c.h" +#endif /* HAL_I2C_MODULE_ENABLED */ + +#ifdef HAL_I2S_MODULE_ENABLED + #include "stm32f4xx_hal_i2s.h" +#endif /* HAL_I2S_MODULE_ENABLED */ + +#ifdef HAL_IWDG_MODULE_ENABLED + #include "stm32f4xx_hal_iwdg.h" +#endif /* HAL_IWDG_MODULE_ENABLED */ + +#ifdef HAL_LTDC_MODULE_ENABLED + #include "stm32f4xx_hal_ltdc.h" +#endif /* HAL_LTDC_MODULE_ENABLED */ + +#ifdef HAL_PWR_MODULE_ENABLED + #include "stm32f4xx_hal_pwr.h" +#endif /* HAL_PWR_MODULE_ENABLED */ + +#ifdef HAL_RNG_MODULE_ENABLED + #include "stm32f4xx_hal_rng.h" +#endif /* HAL_RNG_MODULE_ENABLED */ + +#ifdef HAL_RTC_MODULE_ENABLED + #include "stm32f4xx_hal_rtc.h" +#endif /* HAL_RTC_MODULE_ENABLED */ + +#ifdef HAL_SAI_MODULE_ENABLED + #include "stm32f4xx_hal_sai.h" +#endif /* HAL_SAI_MODULE_ENABLED */ + +#ifdef HAL_SD_MODULE_ENABLED + #include "stm32f4xx_hal_sd.h" +#endif /* HAL_SD_MODULE_ENABLED */ + +#ifdef HAL_MMC_MODULE_ENABLED + #include "stm32f4xx_hal_mmc.h" +#endif /* HAL_MMC_MODULE_ENABLED */ + +#ifdef HAL_SPI_MODULE_ENABLED + #include "stm32f4xx_hal_spi.h" +#endif /* HAL_SPI_MODULE_ENABLED */ + +#ifdef HAL_TIM_MODULE_ENABLED + #include "stm32f4xx_hal_tim.h" +#endif /* HAL_TIM_MODULE_ENABLED */ + +#ifdef HAL_UART_MODULE_ENABLED + #include "stm32f4xx_hal_uart.h" +#endif /* HAL_UART_MODULE_ENABLED */ + +#ifdef HAL_USART_MODULE_ENABLED + #include "stm32f4xx_hal_usart.h" +#endif /* HAL_USART_MODULE_ENABLED */ + +#ifdef HAL_IRDA_MODULE_ENABLED + #include "stm32f4xx_hal_irda.h" +#endif /* HAL_IRDA_MODULE_ENABLED */ + +#ifdef HAL_SMARTCARD_MODULE_ENABLED + #include "stm32f4xx_hal_smartcard.h" +#endif /* HAL_SMARTCARD_MODULE_ENABLED */ + +#ifdef HAL_WWDG_MODULE_ENABLED + #include "stm32f4xx_hal_wwdg.h" +#endif /* HAL_WWDG_MODULE_ENABLED */ + +#ifdef HAL_PCD_MODULE_ENABLED + #include "stm32f4xx_hal_pcd.h" +#endif /* HAL_PCD_MODULE_ENABLED */ + +#ifdef HAL_HCD_MODULE_ENABLED + #include "stm32f4xx_hal_hcd.h" +#endif /* HAL_HCD_MODULE_ENABLED */ + +#ifdef HAL_DSI_MODULE_ENABLED + #include "stm32f4xx_hal_dsi.h" +#endif /* HAL_DSI_MODULE_ENABLED */ + +#ifdef HAL_QSPI_MODULE_ENABLED + #include "stm32f4xx_hal_qspi.h" +#endif /* HAL_QSPI_MODULE_ENABLED */ + +#ifdef HAL_CEC_MODULE_ENABLED + #include "stm32f4xx_hal_cec.h" +#endif /* HAL_CEC_MODULE_ENABLED */ + +#ifdef HAL_FMPI2C_MODULE_ENABLED + #include "stm32f4xx_hal_fmpi2c.h" +#endif /* HAL_FMPI2C_MODULE_ENABLED */ + +#ifdef HAL_SPDIFRX_MODULE_ENABLED + #include "stm32f4xx_hal_spdifrx.h" +#endif /* HAL_SPDIFRX_MODULE_ENABLED */ + +#ifdef HAL_DFSDM_MODULE_ENABLED + #include "stm32f4xx_hal_dfsdm.h" +#endif /* HAL_DFSDM_MODULE_ENABLED */ + +#ifdef HAL_LPTIM_MODULE_ENABLED + #include "stm32f4xx_hal_lptim.h" +#endif /* HAL_LPTIM_MODULE_ENABLED */ + +/* Exported macro ------------------------------------------------------------*/ +#ifdef USE_FULL_ASSERT +/** + * @brief The assert_param macro is used for function's parameters check. + * @param expr: If expr is false, it calls assert_failed function + * which reports the name of the source file and the source + * line number of the call that failed. + * If expr is true, it returns no value. + * @retval None + */ + #define assert_param(expr) ((expr) ? (void)0U : assert_failed((uint8_t *)__FILE__, __LINE__)) +/* Exported functions ------------------------------------------------------- */ + void assert_failed(uint8_t* file, uint32_t line); +#else + #define assert_param(expr) ((void)0U) +#endif /* USE_FULL_ASSERT */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_HAL_CONF_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Inc/stm32f4xx_it.h b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Inc/stm32f4xx_it.h new file mode 100644 index 000000000..dd3a82473 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Inc/stm32f4xx_it.h @@ -0,0 +1,84 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_it.h + * @brief This file contains the headers of the interrupt handlers. + ****************************************************************************** + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __STM32F4xx_IT_H +#define __STM32F4xx_IT_H + +#ifdef __cplusplus + extern "C" { +#endif + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Exported types ------------------------------------------------------------*/ +/* USER CODE BEGIN ET */ + +/* USER CODE END ET */ + +/* Exported constants --------------------------------------------------------*/ +/* USER CODE BEGIN EC */ + +/* USER CODE END EC */ + +/* Exported macro ------------------------------------------------------------*/ +/* USER CODE BEGIN EM */ + +/* USER CODE END EM */ + +/* Exported functions prototypes ---------------------------------------------*/ +void NMI_Handler(void); +void HardFault_Handler(void); +void MemManage_Handler(void); +void BusFault_Handler(void); +void UsageFault_Handler(void); +void SVC_Handler(void); +void DebugMon_Handler(void); +void PendSV_Handler(void); +void SysTick_Handler(void); +/* USER CODE BEGIN EFP */ + +/* USER CODE END EFP */ + +#ifdef __cplusplus +} +#endif + +#endif /* __STM32F4xx_IT_H */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/main.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/main.c new file mode 100644 index 000000000..bb1dd2e72 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/main.c @@ -0,0 +1,920 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file : main.c + * @brief : Main program body + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" + +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN PTD */ + +/* USER CODE END PTD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +CAN_HandleTypeDef hcan1; + +I2C_HandleTypeDef hi2c1; + +IWDG_HandleTypeDef hiwdg; + +RTC_HandleTypeDef hrtc; + +SD_HandleTypeDef hsd; + +SPI_HandleTypeDef hspi1; +SPI_HandleTypeDef hspi2; +SPI_HandleTypeDef hspi3; + +TIM_HandleTypeDef htim2; +TIM_HandleTypeDef htim11; +TIM_HandleTypeDef htim13; +TIM_HandleTypeDef htim14; + +UART_HandleTypeDef huart4; +UART_HandleTypeDef huart1; +UART_HandleTypeDef huart2; +UART_HandleTypeDef huart3; + +SRAM_HandleTypeDef hsram1; + +/* USER CODE BEGIN PV */ +/* Private variables ---------------------------------------------------------*/ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +void SystemClock_Config(void); +static void MX_GPIO_Init(void); +static void MX_USART1_UART_Init(void); +static void MX_USART3_UART_Init(void); +static void MX_RTC_Init(void); +static void MX_IWDG_Init(void); +static void MX_TIM14_Init(void); +static void MX_TIM13_Init(void); +static void MX_TIM11_Init(void); +static void MX_SDIO_SD_Init(void); +static void MX_TIM2_Init(void); +static void MX_SPI2_Init(void); +static void MX_FSMC_Init(void); +static void MX_UART4_Init(void); +static void MX_USART2_UART_Init(void); +static void MX_CAN1_Init(void); +static void MX_I2C1_Init(void); +static void MX_SPI1_Init(void); +static void MX_SPI3_Init(void); +/* USER CODE BEGIN PFP */ +/* Private function prototypes -----------------------------------------------*/ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/** + * @brief The application entry point. + * @retval int + */ +int main(void) +{ + /* USER CODE BEGIN 1 */ + + /* USER CODE END 1 */ + + /* MCU Configuration--------------------------------------------------------*/ + + /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ + HAL_Init(); + + /* USER CODE BEGIN Init */ + + /* USER CODE END Init */ + + /* Configure the system clock */ + SystemClock_Config(); + + /* USER CODE BEGIN SysInit */ + + /* USER CODE END SysInit */ + + /* Initialize all configured peripherals */ + MX_GPIO_Init(); + MX_USART1_UART_Init(); + MX_USART3_UART_Init(); + MX_RTC_Init(); + MX_IWDG_Init(); + MX_TIM14_Init(); + MX_TIM13_Init(); + MX_TIM11_Init(); + MX_SDIO_SD_Init(); + MX_TIM2_Init(); + MX_SPI2_Init(); + MX_FSMC_Init(); + MX_UART4_Init(); + MX_USART2_UART_Init(); + MX_CAN1_Init(); + MX_I2C1_Init(); + MX_SPI1_Init(); + MX_SPI3_Init(); + /* USER CODE BEGIN 2 */ + + /* USER CODE END 2 */ + + /* Infinite loop */ + /* USER CODE BEGIN WHILE */ + while (1) + { + + /* USER CODE END WHILE */ + + /* USER CODE BEGIN 3 */ + + } + /* USER CODE END 3 */ +} + +/** + * @brief System Clock Configuration + * @retval None + */ +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + + /** Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE + |RCC_OSCILLATORTYPE_LSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 4; + RCC_OscInitStruct.PLL.PLLN = 168; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } +} + +/** + * @brief CAN1 Initialization Function + * @param None + * @retval None + */ +static void MX_CAN1_Init(void) +{ + + /* USER CODE BEGIN CAN1_Init 0 */ + + /* USER CODE END CAN1_Init 0 */ + + /* USER CODE BEGIN CAN1_Init 1 */ + + /* USER CODE END CAN1_Init 1 */ + hcan1.Instance = CAN1; + hcan1.Init.Prescaler = 16; + hcan1.Init.Mode = CAN_MODE_NORMAL; + hcan1.Init.SyncJumpWidth = CAN_SJW_1TQ; + hcan1.Init.TimeSeg1 = CAN_BS1_1TQ; + hcan1.Init.TimeSeg2 = CAN_BS2_1TQ; + hcan1.Init.TimeTriggeredMode = DISABLE; + hcan1.Init.AutoBusOff = DISABLE; + hcan1.Init.AutoWakeUp = DISABLE; + hcan1.Init.AutoRetransmission = DISABLE; + hcan1.Init.ReceiveFifoLocked = DISABLE; + hcan1.Init.TransmitFifoPriority = DISABLE; + if (HAL_CAN_Init(&hcan1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN CAN1_Init 2 */ + + /* USER CODE END CAN1_Init 2 */ + +} + +/** + * @brief I2C1 Initialization Function + * @param None + * @retval None + */ +static void MX_I2C1_Init(void) +{ + + /* USER CODE BEGIN I2C1_Init 0 */ + + /* USER CODE END I2C1_Init 0 */ + + /* USER CODE BEGIN I2C1_Init 1 */ + + /* USER CODE END I2C1_Init 1 */ + hi2c1.Instance = I2C1; + hi2c1.Init.ClockSpeed = 100000; + hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2; + hi2c1.Init.OwnAddress1 = 0; + hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT; + hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE; + hi2c1.Init.OwnAddress2 = 0; + hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE; + hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE; + if (HAL_I2C_Init(&hi2c1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN I2C1_Init 2 */ + + /* USER CODE END I2C1_Init 2 */ + +} + +/** + * @brief IWDG Initialization Function + * @param None + * @retval None + */ +static void MX_IWDG_Init(void) +{ + + /* USER CODE BEGIN IWDG_Init 0 */ + + /* USER CODE END IWDG_Init 0 */ + + /* USER CODE BEGIN IWDG_Init 1 */ + + /* USER CODE END IWDG_Init 1 */ + hiwdg.Instance = IWDG; + hiwdg.Init.Prescaler = IWDG_PRESCALER_4; + hiwdg.Init.Reload = 4095; + if (HAL_IWDG_Init(&hiwdg) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN IWDG_Init 2 */ + + /* USER CODE END IWDG_Init 2 */ + +} + +/** + * @brief RTC Initialization Function + * @param None + * @retval None + */ +static void MX_RTC_Init(void) +{ + + /* USER CODE BEGIN RTC_Init 0 */ + + /* USER CODE END RTC_Init 0 */ + + /* USER CODE BEGIN RTC_Init 1 */ + + /* USER CODE END RTC_Init 1 */ + /** Initialize RTC Only + */ + hrtc.Instance = RTC; + hrtc.Init.HourFormat = RTC_HOURFORMAT_24; + hrtc.Init.AsynchPrediv = 127; + hrtc.Init.SynchPrediv = 255; + hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; + hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; + hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; + if (HAL_RTC_Init(&hrtc) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN RTC_Init 2 */ + + /* USER CODE END RTC_Init 2 */ + +} + +/** + * @brief SDIO Initialization Function + * @param None + * @retval None + */ +static void MX_SDIO_SD_Init(void) +{ + + /* USER CODE BEGIN SDIO_Init 0 */ + + /* USER CODE END SDIO_Init 0 */ + + /* USER CODE BEGIN SDIO_Init 1 */ + + /* USER CODE END SDIO_Init 1 */ + hsd.Instance = SDIO; + hsd.Init.ClockEdge = SDIO_CLOCK_EDGE_RISING; + hsd.Init.ClockBypass = SDIO_CLOCK_BYPASS_DISABLE; + hsd.Init.ClockPowerSave = SDIO_CLOCK_POWER_SAVE_DISABLE; + hsd.Init.BusWide = SDIO_BUS_WIDE_1B; + hsd.Init.HardwareFlowControl = SDIO_HARDWARE_FLOW_CONTROL_DISABLE; + hsd.Init.ClockDiv = 0; + if (HAL_SD_Init(&hsd) != HAL_OK) + { + Error_Handler(); + } + if (HAL_SD_ConfigWideBusOperation(&hsd, SDIO_BUS_WIDE_4B) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SDIO_Init 2 */ + + /* USER CODE END SDIO_Init 2 */ + +} + +/** + * @brief SPI1 Initialization Function + * @param None + * @retval None + */ +static void MX_SPI1_Init(void) +{ + + /* USER CODE BEGIN SPI1_Init 0 */ + + /* USER CODE END SPI1_Init 0 */ + + /* USER CODE BEGIN SPI1_Init 1 */ + + /* USER CODE END SPI1_Init 1 */ + /* SPI1 parameter configuration*/ + hspi1.Instance = SPI1; + hspi1.Init.Mode = SPI_MODE_MASTER; + hspi1.Init.Direction = SPI_DIRECTION_2LINES; + hspi1.Init.DataSize = SPI_DATASIZE_8BIT; + hspi1.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi1.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi1.Init.NSS = SPI_NSS_SOFT; + hspi1.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi1.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi1.Init.TIMode = SPI_TIMODE_DISABLE; + hspi1.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi1.Init.CRCPolynomial = 10; + if (HAL_SPI_Init(&hspi1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI1_Init 2 */ + + /* USER CODE END SPI1_Init 2 */ + +} + +/** + * @brief SPI2 Initialization Function + * @param None + * @retval None + */ +static void MX_SPI2_Init(void) +{ + + /* USER CODE BEGIN SPI2_Init 0 */ + + /* USER CODE END SPI2_Init 0 */ + + /* USER CODE BEGIN SPI2_Init 1 */ + + /* USER CODE END SPI2_Init 1 */ + /* SPI2 parameter configuration*/ + hspi2.Instance = SPI2; + hspi2.Init.Mode = SPI_MODE_MASTER; + hspi2.Init.Direction = SPI_DIRECTION_2LINES; + hspi2.Init.DataSize = SPI_DATASIZE_8BIT; + hspi2.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi2.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi2.Init.NSS = SPI_NSS_SOFT; + hspi2.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi2.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi2.Init.TIMode = SPI_TIMODE_DISABLE; + hspi2.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi2.Init.CRCPolynomial = 10; + if (HAL_SPI_Init(&hspi2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI2_Init 2 */ + + /* USER CODE END SPI2_Init 2 */ + +} + +/** + * @brief SPI3 Initialization Function + * @param None + * @retval None + */ +static void MX_SPI3_Init(void) +{ + + /* USER CODE BEGIN SPI3_Init 0 */ + + /* USER CODE END SPI3_Init 0 */ + + /* USER CODE BEGIN SPI3_Init 1 */ + + /* USER CODE END SPI3_Init 1 */ + /* SPI3 parameter configuration*/ + hspi3.Instance = SPI3; + hspi3.Init.Mode = SPI_MODE_MASTER; + hspi3.Init.Direction = SPI_DIRECTION_2LINES; + hspi3.Init.DataSize = SPI_DATASIZE_8BIT; + hspi3.Init.CLKPolarity = SPI_POLARITY_LOW; + hspi3.Init.CLKPhase = SPI_PHASE_1EDGE; + hspi3.Init.NSS = SPI_NSS_SOFT; + hspi3.Init.BaudRatePrescaler = SPI_BAUDRATEPRESCALER_2; + hspi3.Init.FirstBit = SPI_FIRSTBIT_MSB; + hspi3.Init.TIMode = SPI_TIMODE_DISABLE; + hspi3.Init.CRCCalculation = SPI_CRCCALCULATION_DISABLE; + hspi3.Init.CRCPolynomial = 10; + if (HAL_SPI_Init(&hspi3) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SPI3_Init 2 */ + + /* USER CODE END SPI3_Init 2 */ + +} + +/** + * @brief TIM2 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM2_Init(void) +{ + + /* USER CODE BEGIN TIM2_Init 0 */ + + /* USER CODE END TIM2_Init 0 */ + + TIM_ClockConfigTypeDef sClockSourceConfig = {0}; + TIM_MasterConfigTypeDef sMasterConfig = {0}; + + /* USER CODE BEGIN TIM2_Init 1 */ + + /* USER CODE END TIM2_Init 1 */ + htim2.Instance = TIM2; + htim2.Init.Prescaler = 0; + htim2.Init.CounterMode = TIM_COUNTERMODE_UP; + htim2.Init.Period = 0; + htim2.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim2.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim2) != HAL_OK) + { + Error_Handler(); + } + sClockSourceConfig.ClockSource = TIM_CLOCKSOURCE_INTERNAL; + if (HAL_TIM_ConfigClockSource(&htim2, &sClockSourceConfig) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim2, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM2_Init 2 */ + + /* USER CODE END TIM2_Init 2 */ + +} + +/** + * @brief TIM11 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM11_Init(void) +{ + + /* USER CODE BEGIN TIM11_Init 0 */ + + /* USER CODE END TIM11_Init 0 */ + + /* USER CODE BEGIN TIM11_Init 1 */ + + /* USER CODE END TIM11_Init 1 */ + htim11.Instance = TIM11; + htim11.Init.Prescaler = 0; + htim11.Init.CounterMode = TIM_COUNTERMODE_UP; + htim11.Init.Period = 0; + htim11.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim11.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim11) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM11_Init 2 */ + + /* USER CODE END TIM11_Init 2 */ + +} + +/** + * @brief TIM13 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM13_Init(void) +{ + + /* USER CODE BEGIN TIM13_Init 0 */ + + /* USER CODE END TIM13_Init 0 */ + + /* USER CODE BEGIN TIM13_Init 1 */ + + /* USER CODE END TIM13_Init 1 */ + htim13.Instance = TIM13; + htim13.Init.Prescaler = 0; + htim13.Init.CounterMode = TIM_COUNTERMODE_UP; + htim13.Init.Period = 0; + htim13.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim13.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim13) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM13_Init 2 */ + + /* USER CODE END TIM13_Init 2 */ + +} + +/** + * @brief TIM14 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM14_Init(void) +{ + + /* USER CODE BEGIN TIM14_Init 0 */ + + /* USER CODE END TIM14_Init 0 */ + + /* USER CODE BEGIN TIM14_Init 1 */ + + /* USER CODE END TIM14_Init 1 */ + htim14.Instance = TIM14; + htim14.Init.Prescaler = 0; + htim14.Init.CounterMode = TIM_COUNTERMODE_UP; + htim14.Init.Period = 0; + htim14.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim14.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE; + if (HAL_TIM_Base_Init(&htim14) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM14_Init 2 */ + + /* USER CODE END TIM14_Init 2 */ + +} + +/** + * @brief UART4 Initialization Function + * @param None + * @retval None + */ +static void MX_UART4_Init(void) +{ + + /* USER CODE BEGIN UART4_Init 0 */ + + /* USER CODE END UART4_Init 0 */ + + /* USER CODE BEGIN UART4_Init 1 */ + + /* USER CODE END UART4_Init 1 */ + huart4.Instance = UART4; + huart4.Init.BaudRate = 115200; + huart4.Init.WordLength = UART_WORDLENGTH_8B; + huart4.Init.StopBits = UART_STOPBITS_1; + huart4.Init.Parity = UART_PARITY_NONE; + huart4.Init.Mode = UART_MODE_TX_RX; + huart4.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart4.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart4) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN UART4_Init 2 */ + + /* USER CODE END UART4_Init 2 */ + +} + +/** + * @brief USART1 Initialization Function + * @param None + * @retval None + */ +static void MX_USART1_UART_Init(void) +{ + + /* USER CODE BEGIN USART1_Init 0 */ + + /* USER CODE END USART1_Init 0 */ + + /* USER CODE BEGIN USART1_Init 1 */ + + /* USER CODE END USART1_Init 1 */ + huart1.Instance = USART1; + huart1.Init.BaudRate = 115200; + huart1.Init.WordLength = UART_WORDLENGTH_8B; + huart1.Init.StopBits = UART_STOPBITS_1; + huart1.Init.Parity = UART_PARITY_NONE; + huart1.Init.Mode = UART_MODE_TX_RX; + huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart1.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART1_Init 2 */ + + /* USER CODE END USART1_Init 2 */ + +} + +/** + * @brief USART2 Initialization Function + * @param None + * @retval None + */ +static void MX_USART2_UART_Init(void) +{ + + /* USER CODE BEGIN USART2_Init 0 */ + + /* USER CODE END USART2_Init 0 */ + + /* USER CODE BEGIN USART2_Init 1 */ + + /* USER CODE END USART2_Init 1 */ + huart2.Instance = USART2; + huart2.Init.BaudRate = 115200; + huart2.Init.WordLength = UART_WORDLENGTH_8B; + huart2.Init.StopBits = UART_STOPBITS_1; + huart2.Init.Parity = UART_PARITY_NONE; + huart2.Init.Mode = UART_MODE_TX_RX; + huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart2.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart2) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART2_Init 2 */ + + /* USER CODE END USART2_Init 2 */ + +} + +/** + * @brief USART3 Initialization Function + * @param None + * @retval None + */ +static void MX_USART3_UART_Init(void) +{ + + /* USER CODE BEGIN USART3_Init 0 */ + + /* USER CODE END USART3_Init 0 */ + + /* USER CODE BEGIN USART3_Init 1 */ + + /* USER CODE END USART3_Init 1 */ + huart3.Instance = USART3; + huart3.Init.BaudRate = 115200; + huart3.Init.WordLength = UART_WORDLENGTH_8B; + huart3.Init.StopBits = UART_STOPBITS_1; + huart3.Init.Parity = UART_PARITY_NONE; + huart3.Init.Mode = UART_MODE_TX_RX; + huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE; + huart3.Init.OverSampling = UART_OVERSAMPLING_16; + if (HAL_UART_Init(&huart3) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USART3_Init 2 */ + + /* USER CODE END USART3_Init 2 */ + +} + +/** + * @brief GPIO Initialization Function + * @param None + * @retval None + */ +static void MX_GPIO_Init(void) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + + /* GPIO Ports Clock Enable */ + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOF_CLK_ENABLE(); + __HAL_RCC_GPIOH_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + __HAL_RCC_GPIOG_CLK_ENABLE(); + __HAL_RCC_GPIOE_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + + /*Configure GPIO pin Output Level */ + HAL_GPIO_WritePin(GPIOG, GPIO_PIN_11|GPIO_PIN_14, GPIO_PIN_RESET); + + /*Configure GPIO pins : PG11 PG14 */ + GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_14; + GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + + /*Configure GPIO pin : PG13 */ + GPIO_InitStruct.Pin = GPIO_PIN_13; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF11_ETH; + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + +} + +/* FSMC initialization function */ +static void MX_FSMC_Init(void) +{ + + /* USER CODE BEGIN FSMC_Init 0 */ + + /* USER CODE END FSMC_Init 0 */ + + FSMC_NORSRAM_TimingTypeDef Timing = {0}; + + /* USER CODE BEGIN FSMC_Init 1 */ + + /* USER CODE END FSMC_Init 1 */ + + /** Perform the SRAM1 memory initialization sequence + */ + hsram1.Instance = FSMC_NORSRAM_DEVICE; + hsram1.Extended = FSMC_NORSRAM_EXTENDED_DEVICE; + /* hsram1.Init */ + hsram1.Init.NSBank = FSMC_NORSRAM_BANK3; + hsram1.Init.DataAddressMux = FSMC_DATA_ADDRESS_MUX_DISABLE; + hsram1.Init.MemoryType = FSMC_MEMORY_TYPE_SRAM; + hsram1.Init.MemoryDataWidth = FSMC_NORSRAM_MEM_BUS_WIDTH_16; + hsram1.Init.BurstAccessMode = FSMC_BURST_ACCESS_MODE_DISABLE; + hsram1.Init.WaitSignalPolarity = FSMC_WAIT_SIGNAL_POLARITY_LOW; + hsram1.Init.WrapMode = FSMC_WRAP_MODE_DISABLE; + hsram1.Init.WaitSignalActive = FSMC_WAIT_TIMING_BEFORE_WS; + hsram1.Init.WriteOperation = FSMC_WRITE_OPERATION_ENABLE; + hsram1.Init.WaitSignal = FSMC_WAIT_SIGNAL_DISABLE; + hsram1.Init.ExtendedMode = FSMC_EXTENDED_MODE_DISABLE; + hsram1.Init.AsynchronousWait = FSMC_ASYNCHRONOUS_WAIT_DISABLE; + hsram1.Init.WriteBurst = FSMC_WRITE_BURST_DISABLE; + hsram1.Init.PageSize = FSMC_PAGE_SIZE_NONE; + /* Timing */ + Timing.AddressSetupTime = 15; + Timing.AddressHoldTime = 15; + Timing.DataSetupTime = 255; + Timing.BusTurnAroundDuration = 15; + Timing.CLKDivision = 16; + Timing.DataLatency = 17; + Timing.AccessMode = FSMC_ACCESS_MODE_A; + /* ExtTiming */ + + if (HAL_SRAM_Init(&hsram1, &Timing, NULL) != HAL_OK) + { + Error_Handler( ); + } + + /* USER CODE BEGIN FSMC_Init 2 */ + + /* USER CODE END FSMC_Init 2 */ +} + +/* USER CODE BEGIN 4 */ + +/* USER CODE END 4 */ + +/** + * @brief This function is executed in case of error occurrence. + * @retval None + */ +void Error_Handler(void) +{ + /* USER CODE BEGIN Error_Handler_Debug */ + /* User can add his own implementation to report the HAL error return state */ + while(1) + { + } + /* USER CODE END Error_Handler_Debug */ +} + +#ifdef USE_FULL_ASSERT +/** + * @brief Reports the name of the source file and the source line number + * where the assert_param error has occurred. + * @param file: pointer to the source file name + * @param line: assert_param error line source number + * @retval None + */ +void assert_failed(uint8_t *file, uint32_t line) +{ + /* USER CODE BEGIN 6 */ + /* User can add his own implementation to report the file name and line number, + tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */ + /* USER CODE END 6 */ +} +#endif /* USE_FULL_ASSERT */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c new file mode 100644 index 000000000..e2a1e797a --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/stm32f4xx_hal_msp.c @@ -0,0 +1,1025 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * File Name : stm32f4xx_hal_msp.c + * Description : This file provides code for the MSP Initialization + * and de-Initialization codes. + ****************************************************************************** + ** This notice applies to any and all portions of this file + * that are not between comment pairs USER CODE BEGIN and + * USER CODE END. Other portions of this file, whether + * inserted by the user or by software development tools + * are owned by their respective copyright owners. + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +/* USER CODE BEGIN Includes */ + +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN Define */ + +/* USER CODE END Define */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN Macro */ + +/* USER CODE END Macro */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* External functions --------------------------------------------------------*/ +/* USER CODE BEGIN ExternalFunctions */ + +/* USER CODE END ExternalFunctions */ + +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ +/** + * Initializes the Global MSP. + */ +void HAL_MspInit(void) +{ + /* USER CODE BEGIN MspInit 0 */ + + /* USER CODE END MspInit 0 */ + + __HAL_RCC_SYSCFG_CLK_ENABLE(); + __HAL_RCC_PWR_CLK_ENABLE(); + + /* System interrupt init*/ + + /* USER CODE BEGIN MspInit 1 */ + + /* USER CODE END MspInit 1 */ +} + +/** +* @brief CAN MSP Initialization +* This function configures the hardware resources used in this example +* @param hcan: CAN handle pointer +* @retval None +*/ +void HAL_CAN_MspInit(CAN_HandleTypeDef* hcan) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hcan->Instance==CAN1) + { + /* USER CODE BEGIN CAN1_MspInit 0 */ + + /* USER CODE END CAN1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_CAN1_CLK_ENABLE(); + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**CAN1 GPIO Configuration + PB8 ------> CAN1_RX + PB9 ------> CAN1_TX + */ + GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF9_CAN1; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN CAN1_MspInit 1 */ + + /* USER CODE END CAN1_MspInit 1 */ + } + +} + +/** +* @brief CAN MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hcan: CAN handle pointer +* @retval None +*/ +void HAL_CAN_MspDeInit(CAN_HandleTypeDef* hcan) +{ + if(hcan->Instance==CAN1) + { + /* USER CODE BEGIN CAN1_MspDeInit 0 */ + + /* USER CODE END CAN1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_CAN1_CLK_DISABLE(); + + /**CAN1 GPIO Configuration + PB8 ------> CAN1_RX + PB9 ------> CAN1_TX + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_8|GPIO_PIN_9); + + /* USER CODE BEGIN CAN1_MspDeInit 1 */ + + /* USER CODE END CAN1_MspDeInit 1 */ + } + +} + +/** +* @brief I2C MSP Initialization +* This function configures the hardware resources used in this example +* @param hi2c: I2C handle pointer +* @retval None +*/ +void HAL_I2C_MspInit(I2C_HandleTypeDef* hi2c) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hi2c->Instance==I2C1) + { + /* USER CODE BEGIN I2C1_MspInit 0 */ + + /* USER CODE END I2C1_MspInit 0 */ + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**I2C1 GPIO Configuration + PB6 ------> I2C1_SCL + PB7 ------> I2C1_SDA + */ + GPIO_InitStruct.Pin = GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_OD; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF4_I2C1; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* Peripheral clock enable */ + __HAL_RCC_I2C1_CLK_ENABLE(); + /* USER CODE BEGIN I2C1_MspInit 1 */ + + /* USER CODE END I2C1_MspInit 1 */ + } + +} + +/** +* @brief I2C MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hi2c: I2C handle pointer +* @retval None +*/ +void HAL_I2C_MspDeInit(I2C_HandleTypeDef* hi2c) +{ + if(hi2c->Instance==I2C1) + { + /* USER CODE BEGIN I2C1_MspDeInit 0 */ + + /* USER CODE END I2C1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_I2C1_CLK_DISABLE(); + + /**I2C1 GPIO Configuration + PB6 ------> I2C1_SCL + PB7 ------> I2C1_SDA + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_6); + + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7); + + /* USER CODE BEGIN I2C1_MspDeInit 1 */ + + /* USER CODE END I2C1_MspDeInit 1 */ + } + +} + +/** +* @brief RTC MSP Initialization +* This function configures the hardware resources used in this example +* @param hrtc: RTC handle pointer +* @retval None +*/ +void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc) +{ + if(hrtc->Instance==RTC) + { + /* USER CODE BEGIN RTC_MspInit 0 */ + + /* USER CODE END RTC_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_RTC_ENABLE(); + /* USER CODE BEGIN RTC_MspInit 1 */ + + /* USER CODE END RTC_MspInit 1 */ + } + +} + +/** +* @brief RTC MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hrtc: RTC handle pointer +* @retval None +*/ +void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc) +{ + if(hrtc->Instance==RTC) + { + /* USER CODE BEGIN RTC_MspDeInit 0 */ + + /* USER CODE END RTC_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_RTC_DISABLE(); + /* USER CODE BEGIN RTC_MspDeInit 1 */ + + /* USER CODE END RTC_MspDeInit 1 */ + } + +} + +/** +* @brief SD MSP Initialization +* This function configures the hardware resources used in this example +* @param hsd: SD handle pointer +* @retval None +*/ +void HAL_SD_MspInit(SD_HandleTypeDef* hsd) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hsd->Instance==SDIO) + { + /* USER CODE BEGIN SDIO_MspInit 0 */ + + /* USER CODE END SDIO_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SDIO_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + /**SDIO GPIO Configuration + PC8 ------> SDIO_D0 + PC9 ------> SDIO_D1 + PC10 ------> SDIO_D2 + PC11 ------> SDIO_D3 + PC12 ------> SDIO_CK + PD2 ------> SDIO_CMD + */ + GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_SDIO; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /* USER CODE BEGIN SDIO_MspInit 1 */ + + /* USER CODE END SDIO_MspInit 1 */ + } + +} + +/** +* @brief SD MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hsd: SD handle pointer +* @retval None +*/ +void HAL_SD_MspDeInit(SD_HandleTypeDef* hsd) +{ + if(hsd->Instance==SDIO) + { + /* USER CODE BEGIN SDIO_MspDeInit 0 */ + + /* USER CODE END SDIO_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SDIO_CLK_DISABLE(); + + /**SDIO GPIO Configuration + PC8 ------> SDIO_D0 + PC9 ------> SDIO_D1 + PC10 ------> SDIO_D2 + PC11 ------> SDIO_D3 + PC12 ------> SDIO_CK + PD2 ------> SDIO_CMD + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12); + + HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2); + + /* USER CODE BEGIN SDIO_MspDeInit 1 */ + + /* USER CODE END SDIO_MspDeInit 1 */ + } + +} + +/** +* @brief SPI MSP Initialization +* This function configures the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspInit(SPI_HandleTypeDef* hspi) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hspi->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspInit 0 */ + + /* USER CODE END SPI1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SPI1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**SPI1 GPIO Configuration + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI1_MspInit 1 */ + + /* USER CODE END SPI1_MspInit 1 */ + } + else if(hspi->Instance==SPI2) + { + /* USER CODE BEGIN SPI2_MspInit 0 */ + + /* USER CODE END SPI2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SPI2_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**SPI2 GPIO Configuration + PC2 ------> SPI2_MISO + PC3 ------> SPI2_MOSI + PB13 ------> SPI2_SCK + */ + GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_13; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF5_SPI2; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI2_MspInit 1 */ + + /* USER CODE END SPI2_MspInit 1 */ + } + else if(hspi->Instance==SPI3) + { + /* USER CODE BEGIN SPI3_MspInit 0 */ + + /* USER CODE END SPI3_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_SPI3_CLK_ENABLE(); + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**SPI3 GPIO Configuration + PB3 ------> SPI3_SCK + PB4 ------> SPI3_MISO + PB5 ------> SPI3_MOSI + */ + GPIO_InitStruct.Pin = GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF6_SPI3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN SPI3_MspInit 1 */ + + /* USER CODE END SPI3_MspInit 1 */ + } + +} + +/** +* @brief SPI MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hspi: SPI handle pointer +* @retval None +*/ +void HAL_SPI_MspDeInit(SPI_HandleTypeDef* hspi) +{ + if(hspi->Instance==SPI1) + { + /* USER CODE BEGIN SPI1_MspDeInit 0 */ + + /* USER CODE END SPI1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI1_CLK_DISABLE(); + + /**SPI1 GPIO Configuration + PA5 ------> SPI1_SCK + PA6 ------> SPI1_MISO + PA7 ------> SPI1_MOSI + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); + + /* USER CODE BEGIN SPI1_MspDeInit 1 */ + + /* USER CODE END SPI1_MspDeInit 1 */ + } + else if(hspi->Instance==SPI2) + { + /* USER CODE BEGIN SPI2_MspDeInit 0 */ + + /* USER CODE END SPI2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI2_CLK_DISABLE(); + + /**SPI2 GPIO Configuration + PC2 ------> SPI2_MISO + PC3 ------> SPI2_MOSI + PB13 ------> SPI2_SCK + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_2|GPIO_PIN_3); + + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_13); + + /* USER CODE BEGIN SPI2_MspDeInit 1 */ + + /* USER CODE END SPI2_MspDeInit 1 */ + } + else if(hspi->Instance==SPI3) + { + /* USER CODE BEGIN SPI3_MspDeInit 0 */ + + /* USER CODE END SPI3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SPI3_CLK_DISABLE(); + + /**SPI3 GPIO Configuration + PB3 ------> SPI3_SCK + PB4 ------> SPI3_MISO + PB5 ------> SPI3_MOSI + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5); + + /* USER CODE BEGIN SPI3_MspDeInit 1 */ + + /* USER CODE END SPI3_MspDeInit 1 */ + } + +} + +/** +* @brief TIM_Base MSP Initialization +* This function configures the hardware resources used in this example +* @param htim_base: TIM_Base handle pointer +* @retval None +*/ +void HAL_TIM_Base_MspInit(TIM_HandleTypeDef* htim_base) +{ + if(htim_base->Instance==TIM2) + { + /* USER CODE BEGIN TIM2_MspInit 0 */ + + /* USER CODE END TIM2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM2_CLK_ENABLE(); + /* USER CODE BEGIN TIM2_MspInit 1 */ + + /* USER CODE END TIM2_MspInit 1 */ + } + else if(htim_base->Instance==TIM11) + { + /* USER CODE BEGIN TIM11_MspInit 0 */ + + /* USER CODE END TIM11_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM11_CLK_ENABLE(); + /* USER CODE BEGIN TIM11_MspInit 1 */ + + /* USER CODE END TIM11_MspInit 1 */ + } + else if(htim_base->Instance==TIM13) + { + /* USER CODE BEGIN TIM13_MspInit 0 */ + + /* USER CODE END TIM13_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM13_CLK_ENABLE(); + /* USER CODE BEGIN TIM13_MspInit 1 */ + + /* USER CODE END TIM13_MspInit 1 */ + } + else if(htim_base->Instance==TIM14) + { + /* USER CODE BEGIN TIM14_MspInit 0 */ + + /* USER CODE END TIM14_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM14_CLK_ENABLE(); + /* USER CODE BEGIN TIM14_MspInit 1 */ + + /* USER CODE END TIM14_MspInit 1 */ + } + +} + +/** +* @brief TIM_Base MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param htim_base: TIM_Base handle pointer +* @retval None +*/ +void HAL_TIM_Base_MspDeInit(TIM_HandleTypeDef* htim_base) +{ + if(htim_base->Instance==TIM2) + { + /* USER CODE BEGIN TIM2_MspDeInit 0 */ + + /* USER CODE END TIM2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM2_CLK_DISABLE(); + /* USER CODE BEGIN TIM2_MspDeInit 1 */ + + /* USER CODE END TIM2_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM11) + { + /* USER CODE BEGIN TIM11_MspDeInit 0 */ + + /* USER CODE END TIM11_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM11_CLK_DISABLE(); + /* USER CODE BEGIN TIM11_MspDeInit 1 */ + + /* USER CODE END TIM11_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM13) + { + /* USER CODE BEGIN TIM13_MspDeInit 0 */ + + /* USER CODE END TIM13_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM13_CLK_DISABLE(); + /* USER CODE BEGIN TIM13_MspDeInit 1 */ + + /* USER CODE END TIM13_MspDeInit 1 */ + } + else if(htim_base->Instance==TIM14) + { + /* USER CODE BEGIN TIM14_MspDeInit 0 */ + + /* USER CODE END TIM14_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM14_CLK_DISABLE(); + /* USER CODE BEGIN TIM14_MspDeInit 1 */ + + /* USER CODE END TIM14_MspDeInit 1 */ + } + +} + +/** +* @brief UART MSP Initialization +* This function configures the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspInit(UART_HandleTypeDef* huart) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(huart->Instance==UART4) + { + /* USER CODE BEGIN UART4_MspInit 0 */ + + /* USER CODE END UART4_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_UART4_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**UART4 GPIO Configuration + PA0-WKUP ------> UART4_TX + PA1 ------> UART4_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF8_UART4; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN UART4_MspInit 1 */ + + /* USER CODE END UART4_MspInit 1 */ + } + else if(huart->Instance==USART1) + { + /* USER CODE BEGIN USART1_MspInit 0 */ + + /* USER CODE END USART1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART1_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART1 GPIO Configuration + PA9 ------> USART1_TX + PA10 ------> USART1_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN USART1_MspInit 1 */ + + /* USER CODE END USART1_MspInit 1 */ + } + else if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspInit 0 */ + + /* USER CODE END USART2_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART2_CLK_ENABLE(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART2; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN USART2_MspInit 1 */ + + /* USER CODE END USART2_MspInit 1 */ + } + else if(huart->Instance==USART3) + { + /* USER CODE BEGIN USART3_MspInit 0 */ + + /* USER CODE END USART3_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_USART3_CLK_ENABLE(); + + __HAL_RCC_GPIOB_CLK_ENABLE(); + /**USART3 GPIO Configuration + PB10 ------> USART3_TX + PB11 ------> USART3_RX + */ + GPIO_InitStruct.Pin = GPIO_PIN_10|GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF7_USART3; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + /* USER CODE BEGIN USART3_MspInit 1 */ + + /* USER CODE END USART3_MspInit 1 */ + } + +} + +/** +* @brief UART MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param huart: UART handle pointer +* @retval None +*/ +void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) +{ + if(huart->Instance==UART4) + { + /* USER CODE BEGIN UART4_MspDeInit 0 */ + + /* USER CODE END UART4_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_UART4_CLK_DISABLE(); + + /**UART4 GPIO Configuration + PA0-WKUP ------> UART4_TX + PA1 ------> UART4_RX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_0|GPIO_PIN_1); + + /* USER CODE BEGIN UART4_MspDeInit 1 */ + + /* USER CODE END UART4_MspDeInit 1 */ + } + else if(huart->Instance==USART1) + { + /* USER CODE BEGIN USART1_MspDeInit 0 */ + + /* USER CODE END USART1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART1_CLK_DISABLE(); + + /**USART1 GPIO Configuration + PA9 ------> USART1_TX + PA10 ------> USART1_RX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10); + + /* USER CODE BEGIN USART1_MspDeInit 1 */ + + /* USER CODE END USART1_MspDeInit 1 */ + } + else if(huart->Instance==USART2) + { + /* USER CODE BEGIN USART2_MspDeInit 0 */ + + /* USER CODE END USART2_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART2_CLK_DISABLE(); + + /**USART2 GPIO Configuration + PA2 ------> USART2_TX + PA3 ------> USART2_RX + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_2|GPIO_PIN_3); + + /* USER CODE BEGIN USART2_MspDeInit 1 */ + + /* USER CODE END USART2_MspDeInit 1 */ + } + else if(huart->Instance==USART3) + { + /* USER CODE BEGIN USART3_MspDeInit 0 */ + + /* USER CODE END USART3_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USART3_CLK_DISABLE(); + + /**USART3 GPIO Configuration + PB10 ------> USART3_TX + PB11 ------> USART3_RX + */ + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_10|GPIO_PIN_11); + + /* USER CODE BEGIN USART3_MspDeInit 1 */ + + /* USER CODE END USART3_MspDeInit 1 */ + } + +} + +static uint32_t FSMC_Initialized = 0; + +static void HAL_FSMC_MspInit(void){ + /* USER CODE BEGIN FSMC_MspInit 0 */ + + /* USER CODE END FSMC_MspInit 0 */ + GPIO_InitTypeDef GPIO_InitStruct ={0}; + if (FSMC_Initialized) { + return; + } + FSMC_Initialized = 1; + + /* Peripheral clock enable */ + __HAL_RCC_FSMC_CLK_ENABLE(); + + /** FSMC GPIO Configuration + PF0 ------> FSMC_A0 + PF1 ------> FSMC_A1 + PF2 ------> FSMC_A2 + PF3 ------> FSMC_A3 + PF4 ------> FSMC_A4 + PF5 ------> FSMC_A5 + PF12 ------> FSMC_A6 + PF13 ------> FSMC_A7 + PF14 ------> FSMC_A8 + PF15 ------> FSMC_A9 + PG0 ------> FSMC_A10 + PG1 ------> FSMC_A11 + PE7 ------> FSMC_D4 + PE8 ------> FSMC_D5 + PE9 ------> FSMC_D6 + PE10 ------> FSMC_D7 + PE11 ------> FSMC_D8 + PE12 ------> FSMC_D9 + PE13 ------> FSMC_D10 + PE14 ------> FSMC_D11 + PE15 ------> FSMC_D12 + PD8 ------> FSMC_D13 + PD9 ------> FSMC_D14 + PD10 ------> FSMC_D15 + PD11 ------> FSMC_A16 + PD12 ------> FSMC_A17 + PD13 ------> FSMC_A18 + PD14 ------> FSMC_D0 + PD15 ------> FSMC_D1 + PG2 ------> FSMC_A12 + PG3 ------> FSMC_A13 + PG4 ------> FSMC_A14 + PG5 ------> FSMC_A15 + PD0 ------> FSMC_D2 + PD1 ------> FSMC_D3 + PD4 ------> FSMC_NOE + PD5 ------> FSMC_NWE + PG10 ------> FSMC_NE3 + PG12 ------> FSMC_NE4 + PE0 ------> FSMC_NBL0 + PE1 ------> FSMC_NBL1 + */ + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 + |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_12|GPIO_PIN_13 + |GPIO_PIN_14|GPIO_PIN_15; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_FSMC; + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 + |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_10|GPIO_PIN_12; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_FSMC; + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10 + |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14 + |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_FSMC; + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15 + |GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_FSMC; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /* USER CODE BEGIN FSMC_MspInit 1 */ + + /* USER CODE END FSMC_MspInit 1 */ +} + +void HAL_SRAM_MspInit(SRAM_HandleTypeDef* hsram){ + /* USER CODE BEGIN SRAM_MspInit 0 */ + + /* USER CODE END SRAM_MspInit 0 */ + HAL_FSMC_MspInit(); + /* USER CODE BEGIN SRAM_MspInit 1 */ + + /* USER CODE END SRAM_MspInit 1 */ +} + +static uint32_t FSMC_DeInitialized = 0; + +static void HAL_FSMC_MspDeInit(void){ + /* USER CODE BEGIN FSMC_MspDeInit 0 */ + + /* USER CODE END FSMC_MspDeInit 0 */ + if (FSMC_DeInitialized) { + return; + } + FSMC_DeInitialized = 1; + /* Peripheral clock enable */ + __HAL_RCC_FSMC_CLK_DISABLE(); + + /** FSMC GPIO Configuration + PF0 ------> FSMC_A0 + PF1 ------> FSMC_A1 + PF2 ------> FSMC_A2 + PF3 ------> FSMC_A3 + PF4 ------> FSMC_A4 + PF5 ------> FSMC_A5 + PF12 ------> FSMC_A6 + PF13 ------> FSMC_A7 + PF14 ------> FSMC_A8 + PF15 ------> FSMC_A9 + PG0 ------> FSMC_A10 + PG1 ------> FSMC_A11 + PE7 ------> FSMC_D4 + PE8 ------> FSMC_D5 + PE9 ------> FSMC_D6 + PE10 ------> FSMC_D7 + PE11 ------> FSMC_D8 + PE12 ------> FSMC_D9 + PE13 ------> FSMC_D10 + PE14 ------> FSMC_D11 + PE15 ------> FSMC_D12 + PD8 ------> FSMC_D13 + PD9 ------> FSMC_D14 + PD10 ------> FSMC_D15 + PD11 ------> FSMC_A16 + PD12 ------> FSMC_A17 + PD13 ------> FSMC_A18 + PD14 ------> FSMC_D0 + PD15 ------> FSMC_D1 + PG2 ------> FSMC_A12 + PG3 ------> FSMC_A13 + PG4 ------> FSMC_A14 + PG5 ------> FSMC_A15 + PD0 ------> FSMC_D2 + PD1 ------> FSMC_D3 + PD4 ------> FSMC_NOE + PD5 ------> FSMC_NWE + PG10 ------> FSMC_NE3 + PG12 ------> FSMC_NE4 + PE0 ------> FSMC_NBL0 + PE1 ------> FSMC_NBL1 + */ + HAL_GPIO_DeInit(GPIOF, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 + |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_12|GPIO_PIN_13 + |GPIO_PIN_14|GPIO_PIN_15); + + HAL_GPIO_DeInit(GPIOG, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3 + |GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_10|GPIO_PIN_12); + + HAL_GPIO_DeInit(GPIOE, GPIO_PIN_7|GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10 + |GPIO_PIN_11|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14 + |GPIO_PIN_15|GPIO_PIN_0|GPIO_PIN_1); + + HAL_GPIO_DeInit(GPIOD, GPIO_PIN_8|GPIO_PIN_9|GPIO_PIN_10|GPIO_PIN_11 + |GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15 + |GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_4|GPIO_PIN_5); + + /* USER CODE BEGIN FSMC_MspDeInit 1 */ + + /* USER CODE END FSMC_MspDeInit 1 */ +} + +void HAL_SRAM_MspDeInit(SRAM_HandleTypeDef* hsram){ + /* USER CODE BEGIN SRAM_MspDeInit 0 */ + + /* USER CODE END SRAM_MspDeInit 0 */ + HAL_FSMC_MspDeInit(); + /* USER CODE BEGIN SRAM_MspDeInit 1 */ + + /* USER CODE END SRAM_MspDeInit 1 */ +} + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ + +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/stm32f4xx_it.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/stm32f4xx_it.c new file mode 100644 index 000000000..404f784a0 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/stm32f4xx_it.c @@ -0,0 +1,218 @@ +/* USER CODE BEGIN Header */ +/** + ****************************************************************************** + * @file stm32f4xx_it.c + * @brief Interrupt Service Routines. + ****************************************************************************** + * + * COPYRIGHT(c) 2018 STMicroelectronics + * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ +/* USER CODE END Header */ + +/* Includes ------------------------------------------------------------------*/ +#include "main.h" +#include "stm32f4xx_it.h" +/* Private includes ----------------------------------------------------------*/ +/* USER CODE BEGIN Includes */ +/* USER CODE END Includes */ + +/* Private typedef -----------------------------------------------------------*/ +/* USER CODE BEGIN TD */ + +/* USER CODE END TD */ + +/* Private define ------------------------------------------------------------*/ +/* USER CODE BEGIN PD */ + +/* USER CODE END PD */ + +/* Private macro -------------------------------------------------------------*/ +/* USER CODE BEGIN PM */ + +/* USER CODE END PM */ + +/* Private variables ---------------------------------------------------------*/ +/* USER CODE BEGIN PV */ + +/* USER CODE END PV */ + +/* Private function prototypes -----------------------------------------------*/ +/* USER CODE BEGIN PFP */ + +/* USER CODE END PFP */ + +/* Private user code ---------------------------------------------------------*/ +/* USER CODE BEGIN 0 */ + +/* USER CODE END 0 */ + +/* External variables --------------------------------------------------------*/ + +/* USER CODE BEGIN EV */ + +/* USER CODE END EV */ + +/******************************************************************************/ +/* Cortex-M4 Processor Interruption and Exception Handlers */ +/******************************************************************************/ +/** + * @brief This function handles Non maskable interrupt. + */ +void NMI_Handler(void) +{ + /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ + + /* USER CODE END NonMaskableInt_IRQn 0 */ + /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ + + /* USER CODE END NonMaskableInt_IRQn 1 */ +} + +/** + * @brief This function handles Hard fault interrupt. + */ +void HardFault_Handler(void) +{ + /* USER CODE BEGIN HardFault_IRQn 0 */ + + /* USER CODE END HardFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_HardFault_IRQn 0 */ + /* USER CODE END W1_HardFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Memory management fault. + */ +void MemManage_Handler(void) +{ + /* USER CODE BEGIN MemoryManagement_IRQn 0 */ + + /* USER CODE END MemoryManagement_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */ + /* USER CODE END W1_MemoryManagement_IRQn 0 */ + } +} + +/** + * @brief This function handles Pre-fetch fault, memory access fault. + */ +void BusFault_Handler(void) +{ + /* USER CODE BEGIN BusFault_IRQn 0 */ + + /* USER CODE END BusFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_BusFault_IRQn 0 */ + /* USER CODE END W1_BusFault_IRQn 0 */ + } +} + +/** + * @brief This function handles Undefined instruction or illegal state. + */ +void UsageFault_Handler(void) +{ + /* USER CODE BEGIN UsageFault_IRQn 0 */ + + /* USER CODE END UsageFault_IRQn 0 */ + while (1) + { + /* USER CODE BEGIN W1_UsageFault_IRQn 0 */ + /* USER CODE END W1_UsageFault_IRQn 0 */ + } +} + +/** + * @brief This function handles System service call via SWI instruction. + */ +void SVC_Handler(void) +{ + /* USER CODE BEGIN SVCall_IRQn 0 */ + + /* USER CODE END SVCall_IRQn 0 */ + /* USER CODE BEGIN SVCall_IRQn 1 */ + + /* USER CODE END SVCall_IRQn 1 */ +} + +/** + * @brief This function handles Debug monitor. + */ +void DebugMon_Handler(void) +{ + /* USER CODE BEGIN DebugMonitor_IRQn 0 */ + + /* USER CODE END DebugMonitor_IRQn 0 */ + /* USER CODE BEGIN DebugMonitor_IRQn 1 */ + + /* USER CODE END DebugMonitor_IRQn 1 */ +} + +/** + * @brief This function handles Pendable request for system service. + */ +void PendSV_Handler(void) +{ + /* USER CODE BEGIN PendSV_IRQn 0 */ + + /* USER CODE END PendSV_IRQn 0 */ + /* USER CODE BEGIN PendSV_IRQn 1 */ + + /* USER CODE END PendSV_IRQn 1 */ +} + +/** + * @brief This function handles System tick timer. + */ +void SysTick_Handler(void) +{ + /* USER CODE BEGIN SysTick_IRQn 0 */ + + /* USER CODE END SysTick_IRQn 0 */ + HAL_IncTick(); + /* USER CODE BEGIN SysTick_IRQn 1 */ + + /* USER CODE END SysTick_IRQn 1 */ +} + +/******************************************************************************/ +/* STM32F4xx Peripheral Interrupt Handlers */ +/* Add here the Interrupt Handlers for the used peripherals. */ +/* For the available peripheral interrupt handler names, */ +/* please refer to the startup file (startup_stm32f4xx.s). */ +/******************************************************************************/ + +/* USER CODE BEGIN 1 */ + +/* USER CODE END 1 */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/system_stm32f4xx.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/system_stm32f4xx.c new file mode 100644 index 000000000..3303f969d --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/CubeMX_Config/Src/system_stm32f4xx.c @@ -0,0 +1,761 @@ +/** + ****************************************************************************** + * @file system_stm32f4xx.c + * @author MCD Application Team + * @brief CMSIS Cortex-M4 Device Peripheral Access Layer System Source File. + * + * This file provides two functions and one global variable to be called from + * user application: + * - SystemInit(): This function is called at startup just after reset and + * before branch to main program. This call is made inside + * the "startup_stm32f4xx.s" file. + * + * - SystemCoreClock variable: Contains the core clock (HCLK), it can be used + * by the user application to setup the SysTick + * timer or configure other parameters. + * + * - SystemCoreClockUpdate(): Updates the variable SystemCoreClock and must + * be called whenever the core clock is changed + * during program execution. + * + * + ****************************************************************************** + * @attention + * + *

© COPYRIGHT 2017 STMicroelectronics

+ * + * Redistribution and use in source and binary forms, with or without modification, + * are permitted provided that the following conditions are met: + * 1. Redistributions of source code must retain the above copyright notice, + * this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * 3. Neither the name of STMicroelectronics nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + ****************************************************************************** + */ + +/** @addtogroup CMSIS + * @{ + */ + +/** @addtogroup stm32f4xx_system + * @{ + */ + +/** @addtogroup STM32F4xx_System_Private_Includes + * @{ + */ + + +#include "stm32f4xx.h" + +#if !defined (HSE_VALUE) + #define HSE_VALUE ((uint32_t)25000000) /*!< Default value of the External oscillator in Hz */ +#endif /* HSE_VALUE */ + +#if !defined (HSI_VALUE) + #define HSI_VALUE ((uint32_t)16000000) /*!< Value of the Internal oscillator in Hz*/ +#endif /* HSI_VALUE */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_TypesDefinitions + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Defines + * @{ + */ + +/************************* Miscellaneous Configuration ************************/ +/*!< Uncomment the following line if you need to use external SRAM or SDRAM as data memory */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ + || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) +/* #define DATA_IN_ExtSRAM */ +#endif /* STM32F40xxx || STM32F41xxx || STM32F42xxx || STM32F43xxx || STM32F469xx || STM32F479xx ||\ + STM32F412Zx || STM32F412Vx */ + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +/* #define DATA_IN_ExtSDRAM */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx ||\ + STM32F479xx */ + +/*!< Uncomment the following line if you need to relocate your vector Table in + Internal SRAM. */ +/* #define VECT_TAB_SRAM */ +#define VECT_TAB_OFFSET 0x00 /*!< Vector Table base offset field. + This value must be a multiple of 0x200. */ +/******************************************************************************/ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Macros + * @{ + */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Variables + * @{ + */ + /* This variable is updated in three ways: + 1) by calling CMSIS function SystemCoreClockUpdate() + 2) by calling HAL API function HAL_RCC_GetHCLKFreq() + 3) each time HAL_RCC_ClockConfig() is called to configure the system clock frequency + Note: If you use this function to configure the system clock; then there + is no need to call the 2 first functions listed above, since SystemCoreClock + variable is updated automatically. + */ +uint32_t SystemCoreClock = 16000000; +const uint8_t AHBPrescTable[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; +const uint8_t APBPrescTable[8] = {0, 0, 0, 0, 1, 2, 3, 4}; +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_FunctionPrototypes + * @{ + */ + +#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) + static void SystemInit_ExtMemCtl(void); +#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + +/** + * @} + */ + +/** @addtogroup STM32F4xx_System_Private_Functions + * @{ + */ + +/** + * @brief Setup the microcontroller system + * Initialize the FPU setting, vector table location and External memory + * configuration. + * @param None + * @retval None + */ +void SystemInit(void) +{ + /* FPU settings ------------------------------------------------------------*/ + #if (__FPU_PRESENT == 1) && (__FPU_USED == 1) + SCB->CPACR |= ((3UL << 10*2)|(3UL << 11*2)); /* set CP10 and CP11 Full Access */ + #endif + /* Reset the RCC clock configuration to the default reset state ------------*/ + /* Set HSION bit */ + RCC->CR |= (uint32_t)0x00000001; + + /* Reset CFGR register */ + RCC->CFGR = 0x00000000; + + /* Reset HSEON, CSSON and PLLON bits */ + RCC->CR &= (uint32_t)0xFEF6FFFF; + + /* Reset PLLCFGR register */ + RCC->PLLCFGR = 0x24003010; + + /* Reset HSEBYP bit */ + RCC->CR &= (uint32_t)0xFFFBFFFF; + + /* Disable all interrupts */ + RCC->CIR = 0x00000000; + +#if defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) + SystemInit_ExtMemCtl(); +#endif /* DATA_IN_ExtSRAM || DATA_IN_ExtSDRAM */ + + /* Configure the Vector Table location add offset address ------------------*/ +#ifdef VECT_TAB_SRAM + SCB->VTOR = SRAM_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal SRAM */ +#else + SCB->VTOR = FLASH_BASE | VECT_TAB_OFFSET; /* Vector Table Relocation in Internal FLASH */ +#endif +} + +/** + * @brief Update SystemCoreClock variable according to Clock Register Values. + * The SystemCoreClock variable contains the core clock (HCLK), it can + * be used by the user application to setup the SysTick timer or configure + * other parameters. + * + * @note Each time the core clock (HCLK) changes, this function must be called + * to update SystemCoreClock variable value. Otherwise, any configuration + * based on this variable will be incorrect. + * + * @note - The system frequency computed by this function is not the real + * frequency in the chip. It is calculated based on the predefined + * constant and the selected clock source: + * + * - If SYSCLK source is HSI, SystemCoreClock will contain the HSI_VALUE(*) + * + * - If SYSCLK source is HSE, SystemCoreClock will contain the HSE_VALUE(**) + * + * - If SYSCLK source is PLL, SystemCoreClock will contain the HSE_VALUE(**) + * or HSI_VALUE(*) multiplied/divided by the PLL factors. + * + * (*) HSI_VALUE is a constant defined in stm32f4xx_hal_conf.h file (default value + * 16 MHz) but the real value may vary depending on the variations + * in voltage and temperature. + * + * (**) HSE_VALUE is a constant defined in stm32f4xx_hal_conf.h file (its value + * depends on the application requirements), user has to ensure that HSE_VALUE + * is same as the real frequency of the crystal used. Otherwise, this function + * may have wrong result. + * + * - The result of this function could be not correct when using fractional + * value for HSE crystal. + * + * @param None + * @retval None + */ +void SystemCoreClockUpdate(void) +{ + uint32_t tmp = 0, pllvco = 0, pllp = 2, pllsource = 0, pllm = 2; + + /* Get SYSCLK source -------------------------------------------------------*/ + tmp = RCC->CFGR & RCC_CFGR_SWS; + + switch (tmp) + { + case 0x00: /* HSI used as system clock source */ + SystemCoreClock = HSI_VALUE; + break; + case 0x04: /* HSE used as system clock source */ + SystemCoreClock = HSE_VALUE; + break; + case 0x08: /* PLL used as system clock source */ + + /* PLL_VCO = (HSE_VALUE or HSI_VALUE / PLL_M) * PLL_N + SYSCLK = PLL_VCO / PLL_P + */ + pllsource = (RCC->PLLCFGR & RCC_PLLCFGR_PLLSRC) >> 22; + pllm = RCC->PLLCFGR & RCC_PLLCFGR_PLLM; + + if (pllsource != 0) + { + /* HSE used as PLL clock source */ + pllvco = (HSE_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + else + { + /* HSI used as PLL clock source */ + pllvco = (HSI_VALUE / pllm) * ((RCC->PLLCFGR & RCC_PLLCFGR_PLLN) >> 6); + } + + pllp = (((RCC->PLLCFGR & RCC_PLLCFGR_PLLP) >>16) + 1 ) *2; + SystemCoreClock = pllvco/pllp; + break; + default: + SystemCoreClock = HSI_VALUE; + break; + } + /* Compute HCLK frequency --------------------------------------------------*/ + /* Get HCLK prescaler */ + tmp = AHBPrescTable[((RCC->CFGR & RCC_CFGR_HPRE) >> 4)]; + /* HCLK frequency */ + SystemCoreClock >>= tmp; +} + +#if defined (DATA_IN_ExtSRAM) && defined (DATA_IN_ExtSDRAM) +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f4xx.s before jump to main. + * This function configures the external memories (SRAM/SDRAM) + * This SRAM/SDRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + __IO uint32_t tmp = 0x00; + + register uint32_t tmpreg = 0, timeout = 0xFFFF; + register __IO uint32_t index; + + /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface clock */ + RCC->AHB1ENR |= 0x000001F8; + + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x00CCC0CC; + GPIOD->AFR[1] = 0xCCCCCCCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xAAAA0A8A; + /* Configure PDx pins speed to 100 MHz */ + GPIOD->OSPEEDR = 0xFFFF0FCF; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00CC0CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA828A; + /* Configure PEx pins speed to 100 MHz */ + GPIOE->OSPEEDR = 0xFFFFC3CF; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0xCCCCCCCC; + GPIOF->AFR[1] = 0xCCCCCCCC; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA800AAA; + /* Configure PFx pins speed to 50 MHz */ + GPIOF->OSPEEDR = 0xAA800AAA; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0xCCCCCCCC; + GPIOG->AFR[1] = 0xCCCCCCCC; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0xAAAAAAAA; + /* Configure PGx pins speed to 50 MHz */ + GPIOG->OSPEEDR = 0xAAAAAAAA; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + + /* Connect PHx pins to FMC Alternate function */ + GPIOH->AFR[0] = 0x00C0CC00; + GPIOH->AFR[1] = 0xCCCCCCCC; + /* Configure PHx pins in Alternate function mode */ + GPIOH->MODER = 0xAAAA08A0; + /* Configure PHx pins speed to 50 MHz */ + GPIOH->OSPEEDR = 0xAAAA08A0; + /* Configure PHx pins Output type to push-pull */ + GPIOH->OTYPER = 0x00000000; + /* No pull-up, pull-down for PHx pins */ + GPIOH->PUPDR = 0x00000000; + + /* Connect PIx pins to FMC Alternate function */ + GPIOI->AFR[0] = 0xCCCCCCCC; + GPIOI->AFR[1] = 0x00000CC0; + /* Configure PIx pins in Alternate function mode */ + GPIOI->MODER = 0x0028AAAA; + /* Configure PIx pins speed to 50 MHz */ + GPIOI->OSPEEDR = 0x0028AAAA; + /* Configure PIx pins Output type to push-pull */ + GPIOI->OTYPER = 0x00000000; + /* No pull-up, pull-down for PIx pins */ + GPIOI->PUPDR = 0x00000000; + +/*-- FMC Configuration -------------------------------------------------------*/ + /* Enable the FMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + + FMC_Bank5_6->SDCR[0] = 0x000019E4; + FMC_Bank5_6->SDTR[0] = 0x01115351; + + /* SDRAM initialization sequence */ + /* Clock enable command */ + FMC_Bank5_6->SDCMR = 0x00000011; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Delay */ + for (index = 0; index<1000; index++); + + /* PALL command */ + FMC_Bank5_6->SDCMR = 0x00000012; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Auto refresh command */ + FMC_Bank5_6->SDCMR = 0x00000073; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* MRD register program */ + FMC_Bank5_6->SDCMR = 0x00046014; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Set refresh count */ + tmpreg = FMC_Bank5_6->SDRTR; + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); + + /* Disable write protection */ + tmpreg = FMC_Bank5_6->SDCR[0]; + FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001011; + FMC_Bank1->BTCR[3] = 0x00000201; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +#if defined(STM32F469xx) || defined(STM32F479xx) + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001091; + FMC_Bank1->BTCR[3] = 0x00110212; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F469xx || STM32F479xx */ + + (void)(tmp); +} +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ +#elif defined (DATA_IN_ExtSRAM) || defined (DATA_IN_ExtSDRAM) +/** + * @brief Setup the external memory controller. + * Called in startup_stm32f4xx.s before jump to main. + * This function configures the external memories (SRAM/SDRAM) + * This SRAM/SDRAM will be used as program data memory (including heap and stack). + * @param None + * @retval None + */ +void SystemInit_ExtMemCtl(void) +{ + __IO uint32_t tmp = 0x00; +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) +#if defined (DATA_IN_ExtSDRAM) + register uint32_t tmpreg = 0, timeout = 0xFFFF; + register __IO uint32_t index; + +#if defined(STM32F446xx) + /* Enable GPIOA, GPIOC, GPIOD, GPIOE, GPIOF, GPIOG interface + clock */ + RCC->AHB1ENR |= 0x0000007D; +#else + /* Enable GPIOC, GPIOD, GPIOE, GPIOF, GPIOG, GPIOH and GPIOI interface + clock */ + RCC->AHB1ENR |= 0x000001F8; +#endif /* STM32F446xx */ + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIOCEN); + +#if defined(STM32F446xx) + /* Connect PAx pins to FMC Alternate function */ + GPIOA->AFR[0] |= 0xC0000000; + GPIOA->AFR[1] |= 0x00000000; + /* Configure PDx pins in Alternate function mode */ + GPIOA->MODER |= 0x00008000; + /* Configure PDx pins speed to 50 MHz */ + GPIOA->OSPEEDR |= 0x00008000; + /* Configure PDx pins Output type to push-pull */ + GPIOA->OTYPER |= 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOA->PUPDR |= 0x00000000; + + /* Connect PCx pins to FMC Alternate function */ + GPIOC->AFR[0] |= 0x00CC0000; + GPIOC->AFR[1] |= 0x00000000; + /* Configure PDx pins in Alternate function mode */ + GPIOC->MODER |= 0x00000A00; + /* Configure PDx pins speed to 50 MHz */ + GPIOC->OSPEEDR |= 0x00000A00; + /* Configure PDx pins Output type to push-pull */ + GPIOC->OTYPER |= 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOC->PUPDR |= 0x00000000; +#endif /* STM32F446xx */ + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x000000CC; + GPIOD->AFR[1] = 0xCC000CCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xA02A000A; + /* Configure PDx pins speed to 50 MHz */ + GPIOD->OSPEEDR = 0xA02A000A; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00000CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA800A; + /* Configure PEx pins speed to 50 MHz */ + GPIOE->OSPEEDR = 0xAAAA800A; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0xCCCCCCCC; + GPIOF->AFR[1] = 0xCCCCCCCC; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA800AAA; + /* Configure PFx pins speed to 50 MHz */ + GPIOF->OSPEEDR = 0xAA800AAA; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0xCCCCCCCC; + GPIOG->AFR[1] = 0xCCCCCCCC; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0xAAAAAAAA; + /* Configure PGx pins speed to 50 MHz */ + GPIOG->OSPEEDR = 0xAAAAAAAA; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) + /* Connect PHx pins to FMC Alternate function */ + GPIOH->AFR[0] = 0x00C0CC00; + GPIOH->AFR[1] = 0xCCCCCCCC; + /* Configure PHx pins in Alternate function mode */ + GPIOH->MODER = 0xAAAA08A0; + /* Configure PHx pins speed to 50 MHz */ + GPIOH->OSPEEDR = 0xAAAA08A0; + /* Configure PHx pins Output type to push-pull */ + GPIOH->OTYPER = 0x00000000; + /* No pull-up, pull-down for PHx pins */ + GPIOH->PUPDR = 0x00000000; + + /* Connect PIx pins to FMC Alternate function */ + GPIOI->AFR[0] = 0xCCCCCCCC; + GPIOI->AFR[1] = 0x00000CC0; + /* Configure PIx pins in Alternate function mode */ + GPIOI->MODER = 0x0028AAAA; + /* Configure PIx pins speed to 50 MHz */ + GPIOI->OSPEEDR = 0x0028AAAA; + /* Configure PIx pins Output type to push-pull */ + GPIOI->OTYPER = 0x00000000; + /* No pull-up, pull-down for PIx pins */ + GPIOI->PUPDR = 0x00000000; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx */ + +/*-- FMC Configuration -------------------------------------------------------*/ + /* Enable the FMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + + /* Configure and enable SDRAM bank1 */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCR[0] = 0x00001954; +#else + FMC_Bank5_6->SDCR[0] = 0x000019E4; +#endif /* STM32F446xx */ + FMC_Bank5_6->SDTR[0] = 0x01115351; + + /* SDRAM initialization sequence */ + /* Clock enable command */ + FMC_Bank5_6->SDCMR = 0x00000011; + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Delay */ + for (index = 0; index<1000; index++); + + /* PALL command */ + FMC_Bank5_6->SDCMR = 0x00000012; + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Auto refresh command */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCMR = 0x000000F3; +#else + FMC_Bank5_6->SDCMR = 0x00000073; +#endif /* STM32F446xx */ + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* MRD register program */ +#if defined(STM32F446xx) + FMC_Bank5_6->SDCMR = 0x00044014; +#else + FMC_Bank5_6->SDCMR = 0x00046014; +#endif /* STM32F446xx */ + timeout = 0xFFFF; + while((tmpreg != 0) && (timeout-- > 0)) + { + tmpreg = FMC_Bank5_6->SDSR & 0x00000020; + } + + /* Set refresh count */ + tmpreg = FMC_Bank5_6->SDRTR; +#if defined(STM32F446xx) + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000050C<<1)); +#else + FMC_Bank5_6->SDRTR = (tmpreg | (0x0000027C<<1)); +#endif /* STM32F446xx */ + + /* Disable write protection */ + tmpreg = FMC_Bank5_6->SDCR[0]; + FMC_Bank5_6->SDCR[0] = (tmpreg & 0xFFFFFDFF); +#endif /* DATA_IN_ExtSDRAM */ +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx || STM32F446xx || STM32F469xx || STM32F479xx */ + +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx) || defined(STM32F417xx)\ + || defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx)\ + || defined(STM32F469xx) || defined(STM32F479xx) || defined(STM32F412Zx) || defined(STM32F412Vx) + +#if defined(DATA_IN_ExtSRAM) +/*-- GPIOs Configuration -----------------------------------------------------*/ + /* Enable GPIOD, GPIOE, GPIOF and GPIOG interface clock */ + RCC->AHB1ENR |= 0x00000078; + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB1ENR, RCC_AHB1ENR_GPIODEN); + + /* Connect PDx pins to FMC Alternate function */ + GPIOD->AFR[0] = 0x00CCC0CC; + GPIOD->AFR[1] = 0xCCCCCCCC; + /* Configure PDx pins in Alternate function mode */ + GPIOD->MODER = 0xAAAA0A8A; + /* Configure PDx pins speed to 100 MHz */ + GPIOD->OSPEEDR = 0xFFFF0FCF; + /* Configure PDx pins Output type to push-pull */ + GPIOD->OTYPER = 0x00000000; + /* No pull-up, pull-down for PDx pins */ + GPIOD->PUPDR = 0x00000000; + + /* Connect PEx pins to FMC Alternate function */ + GPIOE->AFR[0] = 0xC00CC0CC; + GPIOE->AFR[1] = 0xCCCCCCCC; + /* Configure PEx pins in Alternate function mode */ + GPIOE->MODER = 0xAAAA828A; + /* Configure PEx pins speed to 100 MHz */ + GPIOE->OSPEEDR = 0xFFFFC3CF; + /* Configure PEx pins Output type to push-pull */ + GPIOE->OTYPER = 0x00000000; + /* No pull-up, pull-down for PEx pins */ + GPIOE->PUPDR = 0x00000000; + + /* Connect PFx pins to FMC Alternate function */ + GPIOF->AFR[0] = 0x00CCCCCC; + GPIOF->AFR[1] = 0xCCCC0000; + /* Configure PFx pins in Alternate function mode */ + GPIOF->MODER = 0xAA000AAA; + /* Configure PFx pins speed to 100 MHz */ + GPIOF->OSPEEDR = 0xFF000FFF; + /* Configure PFx pins Output type to push-pull */ + GPIOF->OTYPER = 0x00000000; + /* No pull-up, pull-down for PFx pins */ + GPIOF->PUPDR = 0x00000000; + + /* Connect PGx pins to FMC Alternate function */ + GPIOG->AFR[0] = 0x00CCCCCC; + GPIOG->AFR[1] = 0x000000C0; + /* Configure PGx pins in Alternate function mode */ + GPIOG->MODER = 0x00085AAA; + /* Configure PGx pins speed to 100 MHz */ + GPIOG->OSPEEDR = 0x000CAFFF; + /* Configure PGx pins Output type to push-pull */ + GPIOG->OTYPER = 0x00000000; + /* No pull-up, pull-down for PGx pins */ + GPIOG->PUPDR = 0x00000000; + +/*-- FMC/FSMC Configuration --------------------------------------------------*/ + /* Enable the FMC/FSMC interface clock */ + RCC->AHB3ENR |= 0x00000001; + +#if defined(STM32F427xx) || defined(STM32F437xx) || defined(STM32F429xx) || defined(STM32F439xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001011; + FMC_Bank1->BTCR[3] = 0x00000201; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F427xx || STM32F437xx || STM32F429xx || STM32F439xx */ +#if defined(STM32F469xx) || defined(STM32F479xx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FMCEN); + /* Configure and enable Bank1_SRAM2 */ + FMC_Bank1->BTCR[2] = 0x00001091; + FMC_Bank1->BTCR[3] = 0x00110212; + FMC_Bank1E->BWTR[2] = 0x0fffffff; +#endif /* STM32F469xx || STM32F479xx */ +#if defined(STM32F405xx) || defined(STM32F415xx) || defined(STM32F407xx)|| defined(STM32F417xx)\ + || defined(STM32F412Zx) || defined(STM32F412Vx) + /* Delay after an RCC peripheral clock enabling */ + tmp = READ_BIT(RCC->AHB3ENR, RCC_AHB3ENR_FSMCEN); + /* Configure and enable Bank1_SRAM2 */ + FSMC_Bank1->BTCR[2] = 0x00001011; + FSMC_Bank1->BTCR[3] = 0x00000201; + FSMC_Bank1E->BWTR[2] = 0x0FFFFFFF; +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F412Zx || STM32F412Vx */ + +#endif /* DATA_IN_ExtSRAM */ +#endif /* STM32F405xx || STM32F415xx || STM32F407xx || STM32F417xx || STM32F427xx || STM32F437xx ||\ + STM32F429xx || STM32F439xx || STM32F469xx || STM32F479xx || STM32F412Zx || STM32F412Vx */ + (void)(tmp); +} +#endif /* DATA_IN_ExtSRAM && DATA_IN_ExtSDRAM */ +/** + * @} + */ + +/** + * @} + */ + +/** + * @} + */ +/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/ diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/Kconfig new file mode 100644 index 000000000..86ccf39af --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/Kconfig @@ -0,0 +1,64 @@ +menu"Hardware Drivers Config" + + menuconfig SOC_STM32F407ZG + bool + select SOC_SERIES_STM32F4 + select RT_USING_COMPONENTS_INIT + select RT_USING_USER_MAIN + default y + + config BSP_USING_GPIO + bool "Enable GPIO" + select RT_USING_PIN + default y + + + menuconfig BSP_USING_UART + bool "Using UART device" + default y + select RT_USING_SERIAL + if BSP_USING_UART + source "$BSP_DIR/board/ports/uart/Kconfig" + endif + + + menuconfig BSP_USING_I2C1 + bool "Using I2C device" + default n + select RT_USING_I2C + select RT_USING_I2C_BITOPS + select RT_USING_PIN + if BSP_USING_I2C1 + source "$BSP_DIR/board/ports/I2c/Kconfig" + endif + + menuconfig BSP_USING_SPI + bool "Using SPI BUS" + default n + select RT_USING_SPI + if BSP_USING_SPI + source "$BSP_DIR/board/ports/spi/Kconfig" + endif + + + menuconfig BSP_USING_CH438 + bool "Using CH438 device" + default y + if BSP_USING_CH438 + source "$BSP_DIR/board/ports/ch438/Kconfig" + endif + + menuconfig BSP_USING_USB + bool "Using USB device" + default n + select BSP_USING_STM32_USBH + select RESOURCES_USB + select RESOURCES_USB_HOST + select USBH_MSTORAGE + select RESOURCES_USB_DEVICE + if BSP_USING_USB + source "$BSP_DIR/board/ports/usb/Kconfig" + endif + + source "$RTT_DIR/bsp/stm32/libraries/HAL_Drivers/Kconfig" +endmenu diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/SConscript b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/SConscript new file mode 100644 index 000000000..4812888d5 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/SConscript @@ -0,0 +1,31 @@ +import os +import rtconfig +from building import * + +Import('SDK_LIB') + +cwd = GetCurrentDir() + +# add general drivers +src = Split(''' +board.c +CubeMX_Config/Src/stm32f4xx_hal_msp.c +''') + +path = [cwd] +path += [cwd + '/CubeMX_Config/Inc'] +path += [cwd + '/ports'] + +startup_path_prefix = SDK_LIB + +if rtconfig.CROSS_TOOL == 'gcc': + src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/gcc/startup_stm32f407xx.s'] +elif rtconfig.CROSS_TOOL == 'keil': + src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/arm/startup_stm32f407xx.s'] +elif rtconfig.CROSS_TOOL == 'iar': + src += [startup_path_prefix + '/STM32F4xx_HAL/CMSIS/Device/ST/STM32F4xx/Source/Templates/iar/startup_stm32f407xx.s'] + +CPPDEFINES = ['STM32F407xx'] +group = DefineGroup('Drivers', src, depend = [''], CPPPATH = path, CPPDEFINES = CPPDEFINES) + +Return('group') \ No newline at end of file diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/board.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/board.c new file mode 100644 index 000000000..c2c90a5e8 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/board.c @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-06 SummerGift first version + */ + +#include "board.h" + +void SystemClock_Config(void) +{ + RCC_OscInitTypeDef RCC_OscInitStruct = {0}; + RCC_ClkInitTypeDef RCC_ClkInitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + + /**Configure the main internal regulator output voltage + */ + __HAL_RCC_PWR_CLK_ENABLE(); + __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_LSI|RCC_OSCILLATORTYPE_HSE + |RCC_OSCILLATORTYPE_LSE; + RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.LSEState = RCC_LSE_ON; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; + RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; + RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; + RCC_OscInitStruct.PLL.PLLM = 4; + RCC_OscInitStruct.PLL.PLLN = 168; + RCC_OscInitStruct.PLL.PLLP = RCC_PLLP_DIV2; + RCC_OscInitStruct.PLL.PLLQ = 7; + if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK) + { + Error_Handler(); + } + /**Initializes the CPU, AHB and APB busses clocks + */ + RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK + |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2; + RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK; + RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1; + RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV4; + RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV2; + + if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_5) != HAL_OK) + { + Error_Handler(); + } + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } +} diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/board.h b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/board.h new file mode 100644 index 000000000..70a4c0ed1 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/board.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2006-2018, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-5 SummerGift first version + */ + +#ifndef __BOARD_H__ +#define __BOARD_H__ + +#include +#include +#include "drv_common.h" +#include "drv_gpio.h" + +#ifdef __cplusplus +extern "C" { +#endif + +#define STM32_SRAM_SIZE (128) +#define STM32_SRAM_END (0x20000000 + STM32_SRAM_SIZE * 1024) + +#define STM32_FLASH_START_ADRESS ((uint32_t)0x08000000) +#define STM32_FLASH_SIZE (1024 * 1024) +#define STM32_FLASH_END_ADDRESS ((uint32_t)(STM32_FLASH_START_ADRESS + STM32_FLASH_SIZE)) + +#if defined(__CC_ARM) || defined(__CLANG_ARM) +extern int Image$$RW_IRAM1$$ZI$$Limit; +#define HEAP_BEGIN ((void *)&Image$$RW_IRAM1$$ZI$$Limit) +#elif __ICCARM__ +#pragma section="CSTACK" +#define HEAP_BEGIN (__segment_end("CSTACK")) +#else +extern int __bss_end; +#define HEAP_BEGIN ((void *)&__bss_end) +#endif + +#define HEAP_END STM32_SRAM_END + +void SystemClock_Config(void); + +#ifdef __cplusplus +} +#endif + +#endif + diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/drv_dcmi.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/drv_dcmi.c new file mode 100644 index 000000000..f0f4c1d7b --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/drv_dcmi.c @@ -0,0 +1,243 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-07-27 thread-liu the first version + */ + +#include "board.h" +#ifdef BSP_USING_DCMI +#include +#ifdef RT_USING_POSIX +#include +#include +#ifdef RT_USING_POSIX_TERMIOS +#include +#endif +#endif + +#define DRV_DEBUG +#define LOG_TAG "drv.dcmi" +#include +static void (*dcmi_irq_callback)(void) = NULL; + +static struct stm32_dcmi rt_dcmi = {0}; +DMA_HandleTypeDef hdma_dcmi; +static void rt_hw_dcmi_dma_init(void) +{ + __HAL_RCC_DMA2_CLK_ENABLE(); + hdma_dcmi.Instance = DMA2_Stream1; + hdma_dcmi.Init.Channel = DMA_CHANNEL_1; + hdma_dcmi.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma_dcmi.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_dcmi.Init.MemInc = DMA_MINC_ENABLE; + hdma_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; + hdma_dcmi.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; + hdma_dcmi.Init.Mode = DMA_NORMAL; + hdma_dcmi.Init.Priority = DMA_PRIORITY_HIGH; + hdma_dcmi.Init.FIFOMode = DMA_FIFOMODE_ENABLE; + hdma_dcmi.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; + hdma_dcmi.Init.MemBurst = DMA_MBURST_SINGLE; + hdma_dcmi.Init.PeriphBurst = DMA_PBURST_SINGLE; + HAL_DMA_Init(&hdma_dcmi); + __HAL_LINKDMA(&rt_dcmi.DCMI_Handle, DMA_Handle, hdma_dcmi); + __HAL_DMA_ENABLE_IT(&hdma_dcmi,DMA_IT_TC); + HAL_NVIC_SetPriority(DMA2_Stream1_IRQn, 0x00, 0x00); + HAL_NVIC_EnableIRQ(DMA2_Stream1_IRQn);; +} +/* +DMA multi_buffer DMA Transfer. +*/ +void rt_hw_dcmi_dma_config(rt_uint32_t dst_addr1, rt_uint32_t dst_addr2, rt_uint32_t len) +{ + HAL_DMAEx_MultiBufferStart(&hdma_dcmi, (rt_uint32_t)&DCMI->DR, dst_addr1, dst_addr2, len); + + __HAL_DMA_ENABLE_IT(&hdma_dcmi, DMA_IT_TC); +} + +static rt_err_t rt_hw_dcmi_init(DCMI_HandleTypeDef *device) +{ + RT_ASSERT(device != RT_NULL); + + device->Instance = DCMI; + device->Init.SynchroMode = DCMI_SYNCHRO_HARDWARE; + device->Init.PCKPolarity = DCMI_PCKPOLARITY_RISING; + device->Init.VSPolarity = DCMI_VSPOLARITY_LOW; + device->Init.HSPolarity = DCMI_HSPOLARITY_LOW; + device->Init.CaptureRate = DCMI_CR_ALL_FRAME; + device->Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B; + device->Init.JPEGMode = DCMI_JPEG_ENABLE; + #if defined(STM32F446xx) || defined(STM32F469xx) || defined(STM32F479xx) + device->Init.ByteSelectMode = DCMI_BSM_ALL; + device->Init.ByteSelectStart = DCMI_OEBS_ODD; + device->Init.LineSelectMode = DCMI_LSM_ALL; + device->Init.LineSelectStart = DCMI_OELS_ODD; + #endif + if(HAL_DCMI_Init(device) != HAL_OK) + { + LOG_E("dcmi init error!"); + return RT_ERROR; + } + else + { + LOG_I("dcmi HAL_DCMI_Init success"); + } + DCMI->IER = 0x0; + __HAL_DCMI_ENABLE_IT(device, DCMI_IT_FRAME); + __HAL_DCMI_ENABLE(device); + return RT_EOK; +} + +void DCMI_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + HAL_DCMI_IRQHandler(&rt_dcmi.DCMI_Handle); + /* leave interrupt */ + rt_interrupt_leave(); +} +/* +the camera starts transfering photos +*/ +void rt_dcmi_start(uint32_t pData, uint32_t Length) +{ + HAL_DCMI_Start_DMA(&rt_dcmi.DCMI_Handle,DCMI_MODE_SNAPSHOT,pData, Length); +} + +/* +the camera stops transfering photos +*/ +void rt_dcmi_stop(void) +{ + HAL_DCMI_Stop(&rt_dcmi.DCMI_Handle);// +} + + +/* Capture a frame of the image */ +void HAL_DCMI_FrameEventCallback(DCMI_HandleTypeDef *hdcmi) +{ + rt_interrupt_enter(); + __HAL_DCMI_ENABLE_IT(&rt_dcmi.DCMI_Handle, DCMI_IT_FRAME); + rt_dcmi_stop(); + if(NULL != dcmi_irq_callback) + { + (*dcmi_irq_callback)(); + } + rt_interrupt_leave(); +} + +void DMA2_Stream1_IRQHandler(void) +{ + extern void camera_dma_data_process(void); + /* enter interrupt */ + rt_interrupt_enter(); + + if (__HAL_DMA_GET_FLAG(&hdma_dcmi, DMA_FLAG_TCIF1_5) != RESET) + { + __HAL_DMA_CLEAR_FLAG(&hdma_dcmi, DMA_FLAG_TCIF1_5); + } + + /* leave interrupt */ + rt_interrupt_leave(); +} + +static rt_err_t rt_dcmi_init(rt_device_t dev) +{ + RT_ASSERT(dev != RT_NULL); + rt_err_t result = RT_EOK; + result = rt_hw_dcmi_init(&rt_dcmi.DCMI_Handle); + if (result != RT_EOK) + { + return result; + } + + rt_hw_dcmi_dma_init(); + + return result; +} + +static rt_err_t rt_dcmi_open(rt_device_t dev, rt_uint16_t oflag) +{ + RT_ASSERT(dev != RT_NULL); + + return RT_EOK; +} + +static rt_err_t rt_dcmi_close(rt_device_t dev) +{ + RT_ASSERT(dev != RT_NULL); + + return RT_EOK; +} + +static rt_err_t rt_dcmi_control(rt_device_t dev, int cmd, void *args) +{ + RT_ASSERT(dev != RT_NULL); + + return RT_EOK; +} + +static rt_size_t rt_dcmi_read(rt_device_t dev, rt_off_t pos, void *buffer, rt_size_t size) +{ + RT_ASSERT(dev != RT_NULL); + + return RT_EOK; +} + +static rt_size_t rt_dcmi_write(rt_device_t dev, rt_off_t pos, const void *buffer, rt_size_t size) +{ + RT_ASSERT(dev != RT_NULL); + + return RT_EOK; +} + +rt_err_t rt_set_irq_dcmi_callback_hander(void (*p)(void)) +{ + if(NULL == p) + { + LOG_E("set irq dcmi callback hander is NULL"); + return RT_ERROR; + } + dcmi_irq_callback = p; + return RT_EOK; + +} +int dcmi_init(void) +{ + int ret = 0; + rt_device_t dcmi_dev = RT_NULL; + rt_dcmi.dev.parent.type = RT_Device_Class_Miscellaneous; + rt_dcmi.dev.parent.init = rt_dcmi_init; + rt_dcmi.dev.parent.open = rt_dcmi_open; + rt_dcmi.dev.parent.close = rt_dcmi_close; + rt_dcmi.dev.parent.read = rt_dcmi_read; + rt_dcmi.dev.parent.write = rt_dcmi_write; + rt_dcmi.dev.parent.control = rt_dcmi_control; + rt_dcmi.dev.parent.user_data = RT_NULL; + ret = rt_device_register(&rt_dcmi.dev.parent, "dcmi", RT_DEVICE_FLAG_RDWR | RT_DEVICE_FLAG_REMOVABLE | RT_DEVICE_FLAG_STANDALONE); + if(ret != RT_EOK) + { + LOG_E("dcmi registered fail!!\n\r"); + return -RT_ERROR; + } + LOG_I("dcmi registered successfully!"); + dcmi_dev = rt_device_find("dcmi"); + if (dcmi_dev == RT_NULL) + { + LOG_E("can't find dcmi device!"); + return RT_ERROR; + } + ret = rt_device_open(dcmi_dev, RT_DEVICE_FLAG_RDWR); + if(ret != RT_EOK) + { + LOG_E("can't open dcmi device!"); + return RT_ERROR; + } + LOG_I("dcmi open successfully"); + return RT_EOK; +} +INIT_BOARD_EXPORT(dcmi_init); +#endif diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/drv_dcmi.h b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/drv_dcmi.h new file mode 100644 index 000000000..abd01c183 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/drv_dcmi.h @@ -0,0 +1,37 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-07-27 thread-liu the first version + */ + +#ifndef __DRV_DCMI_H__ +#define __DRV_DCMI_H__ +#include "board.h" +#ifdef __cplusplus +extern "C" { +#endif +struct rt_dcmi_device +{ + struct rt_device parent; +}; +struct stm32_dcmi +{ + DCMI_HandleTypeDef DCMI_Handle; + struct rt_dcmi_device dev; +}; + +extern DMA_HandleTypeDef hdma_dcmi; +extern void DCMI_IRQHandler(void); +extern void rt_hw_dcmi_dma_config(rt_uint32_t dst_addr1, rt_uint32_t dst_addr2, rt_uint32_t len); +extern void rt_dcmi_start(uint32_t pData, uint32_t Length); +extern void rt_dcmi_stop(void); +extern rt_err_t rt_set_irq_dcmi_callback_hander(void (*p)(void)); +#ifdef __cplusplus +} +#endif + +#endif diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/linker_scripts/link.lds b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/linker_scripts/link.lds new file mode 100644 index 000000000..79a7e76df --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/linker_scripts/link.lds @@ -0,0 +1,159 @@ +/* + * linker script for STM32F4xx with GNU ld + * bernard.xiong 2009-10-14 + * flybreak 2018-11-19 Add support for RAM2 + */ + +/* Program Entry, set to mark it as "used" and avoid gc */ +MEMORY +{ + CODE (rx) : ORIGIN = 0x08000000, LENGTH = 1024k /* 1024KB flash */ + RAM1 (rw) : ORIGIN = 0x20000000, LENGTH = 128k /* 128K sram */ + RAM2 (rw) : ORIGIN = 0x10000000, LENGTH = 64k /* 64K sram */ +} +ENTRY(Reset_Handler) +_system_stack_size = 0x200; + +SECTIONS +{ + .text : + { + . = ALIGN(4); + _stext = .; + KEEP(*(.isr_vector)) /* Startup code */ + + . = ALIGN(4); + *(.text) /* remaining code */ + *(.text.*) /* remaining code */ + *(.rodata) /* read-only data (constants) */ + *(.rodata*) + *(.glue_7) + *(.glue_7t) + *(.gnu.linkonce.t*) + + /* section information for finsh shell */ + . = ALIGN(4); + __fsymtab_start = .; + KEEP(*(FSymTab)) + __fsymtab_end = .; + + . = ALIGN(4); + __vsymtab_start = .; + KEEP(*(VSymTab)) + __vsymtab_end = .; + + /* section information for initial. */ + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + + . = ALIGN(4); + + PROVIDE(__ctors_start__ = .); + KEEP (*(SORT(.init_array.*))) + KEEP (*(.init_array)) + PROVIDE(__ctors_end__ = .); + + . = ALIGN(4); + + _etext = .; + } > CODE = 0 + + /* .ARM.exidx is sorted, so has to go in its own output section. */ + __exidx_start = .; + .ARM.exidx : + { + *(.ARM.exidx* .gnu.linkonce.armexidx.*) + + /* This is used by the startup in order to initialize the .data secion */ + _sidata = .; + } > CODE + __exidx_end = .; + + /* .data section which is used for initialized data */ + + .data : AT (_sidata) + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _sdata = . ; + + *(.data) + *(.data.*) + *(.gnu.linkonce.d*) + + PROVIDE(__dtors_start__ = .); + KEEP(*(SORT(.dtors.*))) + KEEP(*(.dtors)) + PROVIDE(__dtors_end__ = .); + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .data secion */ + _edata = . ; + } >RAM1 + + .stack : + { + . = ALIGN(4); + _sstack = .; + . = . + _system_stack_size; + . = ALIGN(4); + _estack = .; + } >RAM1 + + __bss_start = .; + .bss : + { + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _sbss = .; + + *(.bss) + *(.bss.*) + *(COMMON) + + . = ALIGN(4); + /* This is used by the startup in order to initialize the .bss secion */ + _ebss = . ; + + *(.bss.init) + } > RAM1 + __bss_end = .; + + _end = .; + + /* Stabs debugging sections. */ + .stab 0 : { *(.stab) } + .stabstr 0 : { *(.stabstr) } + .stab.excl 0 : { *(.stab.excl) } + .stab.exclstr 0 : { *(.stab.exclstr) } + .stab.index 0 : { *(.stab.index) } + .stab.indexstr 0 : { *(.stab.indexstr) } + .comment 0 : { *(.comment) } + /* DWARF debug sections. + * Symbols in the DWARF debugging sections are relative to the beginning + * of the section so we begin them at 0. */ + /* DWARF 1 */ + .debug 0 : { *(.debug) } + .line 0 : { *(.line) } + /* GNU DWARF 1 extensions */ + .debug_srcinfo 0 : { *(.debug_srcinfo) } + .debug_sfnames 0 : { *(.debug_sfnames) } + /* DWARF 1.1 and DWARF 2 */ + .debug_aranges 0 : { *(.debug_aranges) } + .debug_pubnames 0 : { *(.debug_pubnames) } + /* DWARF 2 */ + .debug_info 0 : { *(.debug_info .gnu.linkonce.wi.*) } + .debug_abbrev 0 : { *(.debug_abbrev) } + .debug_line 0 : { *(.debug_line) } + .debug_frame 0 : { *(.debug_frame) } + .debug_str 0 : { *(.debug_str) } + .debug_loc 0 : { *(.debug_loc) } + .debug_macinfo 0 : { *(.debug_macinfo) } + /* SGI/MIPS DWARF 2 extensions */ + .debug_weaknames 0 : { *(.debug_weaknames) } + .debug_funcnames 0 : { *(.debug_funcnames) } + .debug_typenames 0 : { *(.debug_typenames) } + .debug_varnames 0 : { *(.debug_varnames) } +} diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/I2c/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/I2c/Kconfig new file mode 100644 index 000000000..168ee276b --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/I2c/Kconfig @@ -0,0 +1,13 @@ +config BSP_USING_I2C1 + bool "Enable I2C1 BUS (software simulation)" + default y + if BSP_USING_I2C1 + config BSP_I2C1_SCL_PIN + int "I2C scl pin number" + range 0 143 + default 24 + config BSP_I2C1_SDA_PIN + int "I2C sda pin number" + range 0 143 + default 25 + endif diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/can/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/can/Kconfig new file mode 100644 index 000000000..34fb7d247 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/can/Kconfig @@ -0,0 +1,11 @@ +config CAN_BUS_NAME_1 + string "can bus name" + default "can1" + +config CAN_DRIVER_NAME + string "can driver name" + default "can1_drv" + +config CAN_1_DEVICE_NAME_1 + string "can bus 1 device 1 name" + default "can1_dev1" \ No newline at end of file diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/ch438/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/ch438/Kconfig new file mode 100644 index 000000000..389b67525 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/ch438/Kconfig @@ -0,0 +1,39 @@ +config CH438_BUS_NAME + string + default "extuart" + +config CH438_DRIVER_NAME + string + default "extuart_drv" + +config CH438_DEVICE_NAME_0 + string + default "extuart_dev0" + +config CH438_DEVICE_NAME_1 + string + default "extuart_dev1" + +config CH438_DEVICE_NAME_2 + string + default "extuart_dev2" + +config CH438_DEVICE_NAME_3 + string + default "extuart_dev3" + +config CH438_DEVICE_NAME_4 + string + default "extuart_dev4" + +config CH438_DEVICE_NAME_5 + string + default "extuart_dev5" + +config CH438_DEVICE_NAME_6 + string + default "extuart_dev6" + +config CH438_DEVICE_NAME_7 + string + default "extuart_dev7" diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/gpio/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/gpio/Kconfig new file mode 100644 index 000000000..1f789b987 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/gpio/Kconfig @@ -0,0 +1,4 @@ +config BSP_USING_GPIO + bool "Enable GPIO" + default y + diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/spi/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/spi/Kconfig new file mode 100644 index 000000000..33e9ba97f --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/spi/Kconfig @@ -0,0 +1,46 @@ +config BSP_USING_SPI1 + bool "Enable SPI1 BUS" + default n + +config BSP_SPI1_TX_USING_DMA + bool "Enable SPI1 TX DMA" + depends on BSP_USING_SPI1 + default n + +config BSP_SPI1_RX_USING_DMA + bool "Enable SPI1 RX DMA" + depends on BSP_USING_SPI1 + select BSP_SPI1_TX_USING_DMA + default n + +config BSP_USING_SPI2 + bool "Enable SPI2 BUS" + default n + +config BSP_SPI2_TX_USING_DMA + bool "Enable SPI2 TX DMA" + depends on BSP_USING_SPI2 + default n + +config BSP_SPI2_RX_USING_DMA + bool "Enable SPI2 RX DMA" + depends on BSP_USING_SPI2 + select BSP_SPI2_TX_USING_DMA + default n + + +config BSP_USING_SPI3 + bool "Enable SPI3 BUS" + default n + +config BSP_SPI3_TX_USING_DMA + bool "Enable SPI3 TX DMA" + depends on BSP_USING_SPI3 + default n + +config BSP_SPI3_RX_USING_DMA + bool "Enable SPI3 RX DMA" + depends on BSP_USING_SPI3 + select BSP_SPI3_TX_USING_DMA + default n + diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/uart/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/uart/Kconfig new file mode 100644 index 000000000..856d0d1f5 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/uart/Kconfig @@ -0,0 +1,21 @@ +config BSP_USING_UART1 + bool "Enable UART1" + default y + +config BSP_USING_UART2 + bool "Enable UART2" + default n + +config BSP_USING_UART3 + bool "Enable UART3" + default n + +config BSP_USING_UART4 + bool "Enable UART4" + default n + + + + + + diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/usb/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/usb/Kconfig new file mode 100644 index 000000000..4fcd37871 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/board/ports/usb/Kconfig @@ -0,0 +1,15 @@ +config BSP_USING_STM32_USBH + bool "Using usb host" + default y + if BSP_USING_STM32_USBH + config USB_BUS_NAME + string "usb bus name" + default "usb" + config USB_DRIVER_NAME + string "usb bus driver name" + default "usb_drv" + config USB_DEVICE_NAME + string "usb bus device name" + default "usb_dev" + endif + diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/rtconfig.h b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/rtconfig.h new file mode 100644 index 000000000..da4679060 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/rtconfig.h @@ -0,0 +1,226 @@ +#ifndef RT_CONFIG_H__ +#define RT_CONFIG_H__ + +/* Automatically generated file; DO NOT EDIT. */ +/* RT-Thread Configuration */ + +#define ROOT_DIR "../../../.." +#define BSP_DIR "." +#define RT_Thread_DIR "../.." +#define RTT_DIR "../../rt-thread" + +/* 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_USING_IDLE_HOOK +#define RT_IDLE_HOOK_LIST_SIZE 4 +#define IDLE_THREAD_STACK_SIZE 256 +#define RT_USING_TIMER_SOFT +#define RT_TIMER_THREAD_PRIO 4 +#define RT_TIMER_THREAD_STACK_SIZE 512 + +/* 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 + +/* Memory Management */ + +#define RT_USING_MEMPOOL +#define RT_USING_MEMHEAP +#define RT_USING_MEMHEAP_AUTO_BINDING +#define RT_USING_MEMHEAP_AS_HEAP +#define RT_USING_HEAP + +/* Kernel Device Object */ + +#define RT_USING_DEVICE +#define RT_USING_CONSOLE +#define RT_CONSOLEBUF_SIZE 128 +#define RT_CONSOLE_DEVICE_NAME "uart1" +#define RT_VER_NUM 0x40004 +#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 + +/* C++ features */ + + +/* Command shell */ + +#define RT_USING_FINSH +#define RT_USING_MSH +#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 + +/* Device virtual file system */ + +#define RT_USING_DFS +#define DFS_USING_WORKDIR +#define DFS_FILESYSTEMS_MAX 4 +#define DFS_FILESYSTEM_TYPES_MAX 4 +#define DFS_FD_MAX 16 +#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_DFS_ROMFS + +/* Device Drivers */ + +#define RT_USING_DEVICE_IPC +#define RT_PIPE_BUFSZ 512 +#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 64 +#define RT_USING_CAN +#define RT_USING_I2C +#define RT_USING_I2C_BITOPS +#define RT_USING_PIN +#define RT_USING_RTC +#define RT_USING_SPI +#define RT_USING_SPI_MSD +#define RT_USING_SFUD +#define RT_SFUD_USING_SFDP +#define RT_SFUD_USING_FLASH_INFO_TABLE +#define RT_SFUD_SPI_MAX_HZ 50000000 + +/* Using USB */ + + +/* POSIX layer and C standard library */ + +#define RT_USING_LIBC +#define RT_USING_PTHREADS +#define PTHREAD_NUM_MAX 8 +#define RT_USING_POSIX +#define RT_LIBC_USING_TIME +#define RT_LIBC_DEFAULT_TIMEZONE 8 + +/* Network */ + +/* Socket abstraction layer */ + + +/* Network interface device */ + + +/* light weight TCP/IP stack */ + + +/* AT commands */ + + +/* VBUS(Virtual Software BUS) */ + + +/* Utilities */ + + +/* RT-Thread Utestcases */ + +#define SOC_FAMILY_STM32 +#define SOC_SERIES_STM32F4 + +/* Hardware Drivers Config */ + +#define SOC_STM32F407ZG +#define BSP_USING_GPIO +#define BSP_USING_UART +#define BSP_USING_UART1 +#define BSP_USING_USB +#define BSP_USING_STM32_USBH +#define USB_BUS_NAME "usb" +#define USB_DRIVER_NAME "usb_drv" +#define USB_DEVICE_NAME "usb_dev" + +/* MicroPython */ + + +/* More Drivers */ + + +/* APP_Framework */ + +/* Framework */ + +#define TRANSFORM_LAYER_ATTRIUBUTE +#define ADD_XIZI_FETURES + +/* Security */ + + +/* Applications */ + +/* config stack size and priority of main task */ + +#define MAIN_KTASK_STACK_SIZE 1024 + +/* ota app */ + + +/* test app */ + + +/* connection app */ + + +/* control app */ + +/* knowing app */ + + +/* sensor app */ + + +/* lib */ + +#define APP_SELECT_NEWLIB + +#endif diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/rtconfig.py b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/rtconfig.py new file mode 100644 index 000000000..1e094c54c --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/rtconfig.py @@ -0,0 +1,151 @@ +import os +SRC_APP_DIR = '../../../../APP_Framework' +# toolchains options +ARCH='arm' +CPU='cortex-m4' +CROSS_TOOL='gcc' + +# bsp lib config +BSP_LIBRARY_TYPE = None + +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'/opt/gcc-arm-none-eabi-7-2018-q2-update/bin' +elif CROSS_TOOL == 'keil': + PLATFORM = 'armcc' + EXEC_PATH = r'C:/Keil_v5' +elif CROSS_TOOL == 'iar': + PLATFORM = 'iar' + EXEC_PATH = r'C:/Program Files (x86)/IAR Systems/Embedded Workbench 8.0' + +if os.getenv('RTT_EXEC_PATH'): + EXEC_PATH = os.getenv('RTT_EXEC_PATH') + +BUILD = 'debug' + +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' + + DEVICE = ' -mcpu=cortex-m4 -mthumb -mfpu=fpv4-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections' + CFLAGS = DEVICE + ' -Dgcc' + AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp -Wa,-mimplicit-it=thumb ' + LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rt-thread.map,-cref,-u,Reset_Handler -T board/linker_scripts/link.lds' + + CPATH = '' + LPATH = '' + + if BUILD == 'debug': + CFLAGS += ' -O0 -gdwarf-2 -g' + AFLAGS += ' -gdwarf-2' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + CXXFLAGS += ' -std=gnu++11' + + POST_ACTION = OBJCPY + ' -O binary $TARGET rtthread.bin\n' + SIZE + ' $TARGET \n' + +elif PLATFORM == 'armcc': + # toolchains + CC = 'armcc' + CXX = 'armcc' + AS = 'armasm' + AR = 'armar' + LINK = 'armlink' + TARGET_EXT = 'axf' + + DEVICE = ' --cpu Cortex-M4.fp ' + CFLAGS = '-c ' + DEVICE + ' --apcs=interwork --c99' + AFLAGS = DEVICE + ' --apcs=interwork ' + LFLAGS = DEVICE + ' --scatter "board\linker_scripts\link.sct" --info sizes --info totals --info unused --info veneers --list rt-thread.map --strict' + CFLAGS += ' -I' + EXEC_PATH + '/ARM/ARMCC/include' + LFLAGS += ' --libpath=' + EXEC_PATH + '/ARM/ARMCC/lib' + + CFLAGS += ' -D__MICROLIB ' + AFLAGS += ' --pd "__MICROLIB SETA 1" ' + LFLAGS += ' --library_type=microlib ' + EXEC_PATH += '/ARM/ARMCC/bin/' + + if BUILD == 'debug': + CFLAGS += ' -g -O0' + AFLAGS += ' -g' + else: + CFLAGS += ' -O2' + + CXXFLAGS = CFLAGS + CFLAGS += ' -std=c99' + + POST_ACTION = 'fromelf --bin $TARGET --output rtthread.bin \nfromelf -z $TARGET' + +elif PLATFORM == 'iar': + # toolchains + CC = 'iccarm' + CXX = 'iccarm' + AS = 'iasmarm' + AR = 'iarchive' + LINK = 'ilinkarm' + TARGET_EXT = 'out' + + DEVICE = '-Dewarm' + + CFLAGS = DEVICE + CFLAGS += ' --diag_suppress Pa050' + CFLAGS += ' --no_cse' + CFLAGS += ' --no_unroll' + CFLAGS += ' --no_inline' + CFLAGS += ' --no_code_motion' + CFLAGS += ' --no_tbaa' + CFLAGS += ' --no_clustering' + CFLAGS += ' --no_scheduling' + CFLAGS += ' --endian=little' + CFLAGS += ' --cpu=Cortex-M4' + CFLAGS += ' -e' + CFLAGS += ' --fpu=VFPv4_sp' + CFLAGS += ' --dlib_config "' + EXEC_PATH + '/arm/INC/c/DLib_Config_Normal.h"' + CFLAGS += ' --silent' + + AFLAGS = DEVICE + AFLAGS += ' -s+' + AFLAGS += ' -w+' + AFLAGS += ' -r' + AFLAGS += ' --cpu Cortex-M4' + AFLAGS += ' --fpu VFPv4_sp' + AFLAGS += ' -S' + + if BUILD == 'debug': + CFLAGS += ' --debug' + CFLAGS += ' -On' + else: + CFLAGS += ' -Oh' + + LFLAGS = ' --config "board/linker_scripts/link.icf"' + LFLAGS += ' --entry __iar_program_start' + + CXXFLAGS = CFLAGS + + EXEC_PATH = EXEC_PATH + '/arm/bin/' + POST_ACTION = 'ielftool --bin $TARGET rtthread.bin' + +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) From 137f2493b7735176e32c1166ee2fdad41137dac6 Mon Sep 17 00:00:00 2001 From: Liu_Weichao Date: Sat, 2 Apr 2022 11:21:07 +0800 Subject: [PATCH 05/38] feat add lwext4 submodule for XiZi --- .gitmodules | 3 +++ .../third_party_driver/sdio/connect_sdio.c | 14 ++++++++++++++ .../usb/nxp_usb_driver/host_msd_command.c | 4 ++-- .../third_party_driver/sdio/connect_sdio.c | 14 ++++++++++++++ .../usb/nxp_usb_driver/host_msd_command.c | 4 ++-- Ubiquitous/XiZi/fs/lwext4/Kconfig | 7 +++++++ Ubiquitous/XiZi/fs/lwext4/Makefile | 5 ++--- Ubiquitous/XiZi/fs/lwext4/lwext4_submodule | 1 + Ubiquitous/XiZi/fs/shared/include/iot-vfs.h | 3 +++ Ubiquitous/XiZi/path_kernel.mk | 6 ++++++ 10 files changed, 54 insertions(+), 7 deletions(-) create mode 160000 Ubiquitous/XiZi/fs/lwext4/lwext4_submodule diff --git a/.gitmodules b/.gitmodules index c89e1be25..bb955406c 100644 --- a/.gitmodules +++ b/.gitmodules @@ -13,3 +13,6 @@ [submodule "Ubiquitous/Nuttx/nuttx"] path = Ubiquitous/Nuttx/nuttx url = https://code.gitlink.org.cn/wgzAIIT/incubator-nuttx.git +[submodule "Ubiquitous/XiZi/fs/lwext4/lwext4_submodule"] + path = Ubiquitous/XiZi/fs/lwext4/lwext4_submodule + url = https://gitlink.org.cn/xuos/lwext4_filesystem_support_XiUOS.git diff --git a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/sdio/connect_sdio.c b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/sdio/connect_sdio.c index b29bc4fe6..0a84b7fff 100644 --- a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/sdio/connect_sdio.c +++ b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/sdio/connect_sdio.c @@ -261,6 +261,19 @@ static uint32 SdioWrite(void *dev, struct BusBlockWriteParam *write_param) return write_param->size; } +static int SdioControl(struct HardwareDev *dev, struct HalDevBlockParam *block_param) +{ + NULL_PARAM_CHECK(dev); + + if (OPER_BLK_GETGEOME == block_param->cmd) { + block_param->dev_block.size_perbank = g_sd.blockSize; + block_param->dev_block.block_size = g_sd.blockSize; + block_param->dev_block.bank_num = g_sd.blockCount; + } + + return EOK; +} + static struct SdioDevDone dev_done = { SdioOpen, @@ -352,6 +365,7 @@ int Imxrt1052HwSdioInit(void) } sdio_dev.dev_done = &dev_done; + sdio_dev.haldev.dev_block_control = SdioControl; ret = SdioDeviceRegister(&sdio_dev, SDIO_DEVICE_NAME); if (ret != EOK) { KPrintf("Sdio device register error %d\n", ret); diff --git a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/usb/nxp_usb_driver/host_msd_command.c b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/usb/nxp_usb_driver/host_msd_command.c index 78cb4af70..7bab0d1bc 100644 --- a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/usb/nxp_usb_driver/host_msd_command.c +++ b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/usb/nxp_usb_driver/host_msd_command.c @@ -15,8 +15,8 @@ */ /************************************************* -File name: usb_misc.h -Description: modify usb_echo to KPrintf +File name: host_msd_command.c +Description: modify usb msd command test function Others: take SDK_2.6.1_MIMXRT1052xxxxB/boards/evkbimxrt1050/usb_examples/usb_host_msd_command for references History: 1. Date: 2022-02-10 diff --git a/Ubiquitous/XiZi/board/xidatong/third_party_driver/sdio/connect_sdio.c b/Ubiquitous/XiZi/board/xidatong/third_party_driver/sdio/connect_sdio.c index 431e3fc98..d13ea9a80 100644 --- a/Ubiquitous/XiZi/board/xidatong/third_party_driver/sdio/connect_sdio.c +++ b/Ubiquitous/XiZi/board/xidatong/third_party_driver/sdio/connect_sdio.c @@ -261,6 +261,19 @@ static uint32 SdioWrite(void *dev, struct BusBlockWriteParam *write_param) return write_param->size; } +static int SdioControl(struct HardwareDev *dev, struct HalDevBlockParam *block_param) +{ + NULL_PARAM_CHECK(dev); + + if (OPER_BLK_GETGEOME == block_param->cmd) { + block_param->dev_block.size_perbank = g_sd.blockSize; + block_param->dev_block.block_size = g_sd.blockSize; + block_param->dev_block.bank_num = g_sd.blockCount; + } + + return EOK; +} + static struct SdioDevDone dev_done = { SdioOpen, @@ -352,6 +365,7 @@ int Imxrt1052HwSdioInit(void) } sdio_dev.dev_done = &dev_done; + sdio_dev.haldev.dev_block_control = SdioControl; ret = SdioDeviceRegister(&sdio_dev, SDIO_DEVICE_NAME); if (ret != EOK) { KPrintf("Sdio device register error %d\n", ret); diff --git a/Ubiquitous/XiZi/board/xidatong/third_party_driver/usb/nxp_usb_driver/host_msd_command.c b/Ubiquitous/XiZi/board/xidatong/third_party_driver/usb/nxp_usb_driver/host_msd_command.c index 78cb4af70..7bab0d1bc 100644 --- a/Ubiquitous/XiZi/board/xidatong/third_party_driver/usb/nxp_usb_driver/host_msd_command.c +++ b/Ubiquitous/XiZi/board/xidatong/third_party_driver/usb/nxp_usb_driver/host_msd_command.c @@ -15,8 +15,8 @@ */ /************************************************* -File name: usb_misc.h -Description: modify usb_echo to KPrintf +File name: host_msd_command.c +Description: modify usb msd command test function Others: take SDK_2.6.1_MIMXRT1052xxxxB/boards/evkbimxrt1050/usb_examples/usb_host_msd_command for references History: 1. Date: 2022-02-10 diff --git a/Ubiquitous/XiZi/fs/lwext4/Kconfig b/Ubiquitous/XiZi/fs/lwext4/Kconfig index e69de29bb..afa4938f1 100644 --- a/Ubiquitous/XiZi/fs/lwext4/Kconfig +++ b/Ubiquitous/XiZi/fs/lwext4/Kconfig @@ -0,0 +1,7 @@ +config CONFIG_USE_DEFAULT_CFG + int + default 1 + +config CONFIG_HAVE_OWN_OFLAGS + int + default 0 diff --git a/Ubiquitous/XiZi/fs/lwext4/Makefile b/Ubiquitous/XiZi/fs/lwext4/Makefile index 15357b7bc..6c25f1470 100644 --- a/Ubiquitous/XiZi/fs/lwext4/Makefile +++ b/Ubiquitous/XiZi/fs/lwext4/Makefile @@ -1,4 +1,3 @@ +SRC_DIR := lwext4_submodule - - -include $(KERNEL_ROOT)/compiler.mk \ No newline at end of file +include $(KERNEL_ROOT)/compiler.mk diff --git a/Ubiquitous/XiZi/fs/lwext4/lwext4_submodule b/Ubiquitous/XiZi/fs/lwext4/lwext4_submodule new file mode 160000 index 000000000..1eba3cfed --- /dev/null +++ b/Ubiquitous/XiZi/fs/lwext4/lwext4_submodule @@ -0,0 +1 @@ +Subproject commit 1eba3cfeda305e5c735827805e90f5f1c8043394 diff --git a/Ubiquitous/XiZi/fs/shared/include/iot-vfs.h b/Ubiquitous/XiZi/fs/shared/include/iot-vfs.h index bc61255da..d1531e5c2 100644 --- a/Ubiquitous/XiZi/fs/shared/include/iot-vfs.h +++ b/Ubiquitous/XiZi/fs/shared/include/iot-vfs.h @@ -24,6 +24,9 @@ enum FilesystemType FSTYPE_FATFS = 0, FSTYPE_IOTDEVICEFILE, FSTYPE_CH376, +#ifdef FS_LWEXT4 + FSTYPE_LWEXT4, +#endif FSTYPE_END, }; diff --git a/Ubiquitous/XiZi/path_kernel.mk b/Ubiquitous/XiZi/path_kernel.mk index 3b6f53047..d755f0f3b 100755 --- a/Ubiquitous/XiZi/path_kernel.mk +++ b/Ubiquitous/XiZi/path_kernel.mk @@ -354,6 +354,12 @@ ifeq ($(CONFIG_LIB_NEWLIB),y) KERNELPATHS += -I$(KERNEL_ROOT)/lib/newlib/include # endif +ifeq ($(CONFIG_FS_LWEXT4),y) +KERNELPATHS += -I$(KERNEL_ROOT)/fs/lwext4/lwext4_submodule/blockdev/xiuos # +KERNELPATHS += -I$(KERNEL_ROOT)/fs/lwext4/lwext4_submodule/include # +KERNELPATHS += -I$(KERNEL_ROOT)/fs/lwext4/lwext4_submodule/include/misc +endif + ifeq ($(ARCH), risc-v) KERNELPATHS +=-I$(KERNEL_ROOT)/arch/risc-v/shared From c4f51c15aa2485e319cc9412a508fe7802f1e305 Mon Sep 17 00:00:00 2001 From: yl1185 <1182784652@qq.com> Date: Sat, 2 Apr 2022 15:04:17 +0800 Subject: [PATCH 06/38] 1.Modify the README.md --- .../aiit_board/aiit-arm32-board/README.md | 76 +++++++++++++------ 1 file changed, 51 insertions(+), 25 deletions(-) diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/README.md b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/README.md index 38f47645c..601783687 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/README.md +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/README.md @@ -1,11 +1,12 @@ # STM32F407最小系统板说明 +采用ST公司的32位ARM-Cortex M4内核的STM32F407 ## 以下为引脚硬件的连接表 ## **W25q16(SPI1 )** -| 引脚 | 作用 | 引脚序号 |W25q16板子 | +| 引脚 | 作用 | 引脚序号 | W25q16 | | ---- | --------- | -------- | --------| | PA5 | SPI1_SCK | 41 | CLK | | PA6 | SPI1_MISO | 42 | DO | @@ -14,7 +15,7 @@ ## **CRF1278-L3(SPI2 )** -| 引脚 | 作用 | 引脚序号 |CRF1278板子| +| 引脚 | 作用 | 引脚序号 | CRF1278 | | ---- | --------- | -------- | --------| | PB13 | SPI2_SCK | 74 | SCK | | PC2 | SPI2_MISO | 28 | MISO | @@ -23,43 +24,68 @@ ## **XPT2046(SPI3)** -| 引脚 | 作用 | 引脚序号 |XPT2046板子| -| ---- | --------- | -------- | --------| +| 引脚 | 作用 | 引脚序号 | XPT2046 | +| ---- | --------- | -------- | --------| | PB3 | SPI3_SCK | 133 | DCLK | | PB4 | SPI3_MISO | 134 | DOUT | | PB5 | SPI3_MOSI | 135 | DIN | -| PG13 | T_nCS | 128 | CS | +| PG13 | T_nCS | 128 | CS | -## **(I2C1)** +## **sensor(I2C1)** | PB6 | I2C_SCL | | ---- | ---------- | | PB7 | I2C_SDA | -## uart1 串口1 +## **TTL_debug(uart1) +| 引脚 | 作用 | 引脚序号 | TTL_debug | +| ---- | ----------|------------ |--------- | +| PA9 | USART1_TX | 101 |USART1_RX | +| PA10 | USART1_RX | 102 |USART1_TX | -| PA9 | USART1_TX | -| ---- | --------- | -| PA10 | USART1_RX | +## **NB/4G(uart2)** -## uart2 串口2 +| 引脚 | 作用 | 引脚序号 | NB/4G | +| ---- | ----------|------------ |--------- | +| PA2 | USART2_TX | 36 |USART2_RX | +| PA3 | USART2_RX | 37 |USART2_TX | -| PA2 | USART2_TX | -| ---- | --------- | -| PA3 | USART2_RX | +## **Ethernet/WIFI(uart3)** -## uart3 串口3 - -| PB10 | USART3_TX | -| ---- | ----------| -| PB11 | USART3_RX | - -## uart4 串口4 - -| PA0-WKUP | UART4_TX | -| ---- | ------------ | -| PA1 | UART4_RX | +| 引脚 | 作用 | 引脚序号 | Ethernet/WIFI | +| ---- | ----------|------------ |------------- | +| PB10 | USART3_TX | 69 |UART0_RXD | +| PB11 | USART3_RX | 70 |UART0_TXD | +## **BT-HC08(uart4) +| 引脚 | 作用 | 引脚序号 | BT-HC08 | +| -----------| ---------|------------ |--------- | +| PA0_WAKEUP | UART4_TX | 34 | RXD | +| PA1 | UART4_RX | 35 | TXD | + +## **SD ** + +| 引脚 | 作用 | 引脚序号 | TF-01A | +| ---- | --------- | -------- | ---------| +| PC10 | SDIO_D2 | 114 | DATA2 | +| PC11 | SDIO_D3 | 115 | DATA3 | +| PD2 | SDIO_CMD | 116 | CMD | +| PC12 | SDIO_CK | 113 | CLK | +| PC8 | SDIO_D0 | 98 | DATA0 | +| PC9 | SDIO_D1 | 99 | DATA1 | + +## **USB-HOST** + +| 引脚 | 作用 | 引脚序号 | USB-S | +| -----------| --------- |------------ |------------| +| PA12 | USB_OTG_DP | 104 | USB_OTG_DP | +| PA11 | USB_OTG_DM | 103 | USB_OTG_DM | + +## **CAN** +| 引脚 | 作用 | 引脚序号 | USB-S | +| -----------| --------- |------------ |---------| +| PB8 | CAN1_RX | 139 | CAN1_TX | +| PB9 | CAN1_TX | 140 | CAN1_RX | From 313e1da99a2bba9eacde9a4167528d233345d38d Mon Sep 17 00:00:00 2001 From: yl1185 <1182784652@qq.com> Date: Sat, 2 Apr 2022 15:08:38 +0800 Subject: [PATCH 07/38] 1.Modify the README.md --- .../aiit_board/aiit-arm32-board/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/README.md b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/README.md index 601783687..4f30d274a 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/README.md +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/aiit-arm32-board/README.md @@ -38,7 +38,7 @@ | PB7 | I2C_SDA | -## **TTL_debug(uart1) +## **TTL_debug(uart1)** | 引脚 | 作用 | 引脚序号 | TTL_debug | | ---- | ----------|------------ |--------- | | PA9 | USART1_TX | 101 |USART1_RX | @@ -59,14 +59,14 @@ | PB11 | USART3_RX | 70 |UART0_TXD | -## **BT-HC08(uart4) +## **BT-HC08(uart4)** | 引脚 | 作用 | 引脚序号 | BT-HC08 | | -----------| ---------|------------ |--------- | | PA0_WAKEUP | UART4_TX | 34 | RXD | | PA1 | UART4_RX | 35 | TXD | -## **SD ** +## **SD** | 引脚 | 作用 | 引脚序号 | TF-01A | | ---- | --------- | -------- | ---------| From 563479f581e44f974fd6ca096e1e3f4251465f9a Mon Sep 17 00:00:00 2001 From: chunyexixiaoyu <834670833@qq.com> Date: Wed, 6 Apr 2022 10:26:06 +0800 Subject: [PATCH 08/38] =?UTF-8?q?Ubiquitous/RT-Thread=5FFusion=5FXiUOS/?= =?UTF-8?q?=EF=BC=9Aupdate=20the=20comments?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aiit_board/xidatong/board/ports/LAN8720A.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/ports/LAN8720A.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/ports/LAN8720A.c index f55a920d1..f09a64780 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/ports/LAN8720A.c +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/ports/LAN8720A.c @@ -5,7 +5,7 @@ * * Change Logs: * Date Author Notes - * 2020-10-14 wangqiang the first version + * 2022-4-1 tianchunyu the first version */ #include From 90f30cf6d2134416ac8192582e84241127471e44 Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Thu, 7 Apr 2022 10:28:09 +0800 Subject: [PATCH 09/38] repair the problem of irq and add mode judge for zigbee --- .../Framework/connection/zigbee/e18/Kconfig | 7 ++ .../Framework/connection/zigbee/e18/e18.c | 75 +++++++++++++++---- .../third_party_driver/uart/connect_uart.c | 13 ++-- .../third_party_driver/usb/connect_usb.c | 6 +- Ubiquitous/XiZi/kernel/thread/idle.c | 2 +- 5 files changed, 77 insertions(+), 26 deletions(-) diff --git a/APP_Framework/Framework/connection/zigbee/e18/Kconfig b/APP_Framework/Framework/connection/zigbee/e18/Kconfig index 607df8f3e..643d07acb 100644 --- a/APP_Framework/Framework/connection/zigbee/e18/Kconfig +++ b/APP_Framework/Framework/connection/zigbee/e18/Kconfig @@ -18,6 +18,13 @@ endchoice if ADD_XIZI_FETURES + config ADAPTER_E18_MODEPIN + int "E18 MODE pin number" + default "61" + + config ADAPTER_BC28_PIN_DRIVER + string "BC28 device pin driver path" + default "/dev/pin_dev" config ADAPTER_E18_DRIVER_EXTUART bool "Using extra uart to support zigbee" diff --git a/APP_Framework/Framework/connection/zigbee/e18/e18.c b/APP_Framework/Framework/connection/zigbee/e18/e18.c index 640d6d582..12a52cf22 100644 --- a/APP_Framework/Framework/connection/zigbee/e18/e18.c +++ b/APP_Framework/Framework/connection/zigbee/e18/e18.c @@ -37,6 +37,33 @@ char *cmd_role_as_e = "AT+DEV=E"; /*set device type for end device*/ char *cmd_role_as_r = "AT+DEV=R"; /*set device type for router*/ char *cmd_set_ch = "AT+CH=11"; /*set channel as 11*/ +#define E18_AS_HEX_MODE 0 +#define E18_AS_AT_MODE 1 + +static int E18HardwareModeGet() +{ + int ret = 0; + int pin_fd; + + pin_fd = PrivOpen(ADAPTER_BC28_PIN_DRIVER, O_RDWR); + + struct PinStat pin_stat; + pin_stat.pin = ADAPTER_E18_MODEPIN; + + ret = PrivRead(pin_fd, &pin_stat, 1); + + PrivTaskDelay(200); + + PrivClose(pin_fd); + + if(pin_stat.pin == GPIO_HIGH) { + printf(" E18 as AT mode\n"); + return E18_AS_AT_MODE; + } else { + printf(" E18 as HEX mode\n"); + return E18_AS_HEX_MODE; + } +} #ifdef ADD_NUTTX_FETURES static int E18UartOpen(struct Adapter *adapter) @@ -148,19 +175,25 @@ out: static int E18NetRoleConfig(struct Adapter *adapter) { int ret = 0; + int mode = -1; + if (NULL == adapter) { printf("%s %d adapter is null!\n",__func__,__LINE__); ret = -1; goto out; } - - ret = AtCmdConfigAndCheck(adapter->agent, cmd_hex2at, "+OK"); - if(ret < 0) { - printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,cmd_hex2at); - ret = -1; - goto out; + mode = E18HardwareModeGet(); + if(E18_AS_HEX_MODE == mode) + { + ret = AtCmdConfigAndCheck(adapter->agent, cmd_hex2at, "+OK"); + if(ret < 0) { + printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,cmd_hex2at); + ret = -1; + goto out; + } } + switch (adapter->net_role) { @@ -197,7 +230,10 @@ static int E18NetRoleConfig(struct Adapter *adapter) } out: - AtCmdConfigAndCheck(adapter->agent, cmd_exit, "+OK"); + if(E18_AS_HEX_MODE == mode) { + AtCmdConfigAndCheck(adapter->agent, cmd_exit, "+OK"); + } + return ret; } @@ -274,12 +310,17 @@ static int E18Ioctl(struct Adapter *adapter, int cmd, void *args) static int E18Join(struct Adapter *adapter, unsigned char *priv_net_group) { int ret = 0; + int mode = -1; - ret = AtCmdConfigAndCheck(adapter->agent, cmd_hex2at, "+OK"); - if(ret < 0) { - printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,cmd_hex2at); - ret = -1; - goto out; + mode = E18HardwareModeGet(); + if(E18_AS_HEX_MODE == mode) + { + ret = AtCmdConfigAndCheck(adapter->agent, cmd_hex2at, "+OK"); + if(ret < 0) { + printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,cmd_hex2at); + ret = -1; + goto out; + } } switch (adapter->net_role) @@ -327,9 +368,13 @@ static int E18Join(struct Adapter *adapter, unsigned char *priv_net_group) // } if(!ret){ - ret = AtCmdConfigAndCheck(adapter->agent, cmd_exit, "+OK"); - if(ret < 0) { - printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,cmd_exit); + if(E18_AS_HEX_MODE == mode) { + ret = AtCmdConfigAndCheck(adapter->agent, cmd_exit, "+OK"); + if(ret < 0) { + printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,cmd_exit); + ret = -1; + } + } else { ret = -1; } } diff --git a/Ubiquitous/XiZi/board/xidatong/third_party_driver/uart/connect_uart.c b/Ubiquitous/XiZi/board/xidatong/third_party_driver/uart/connect_uart.c index ce567700a..2be209890 100644 --- a/Ubiquitous/XiZi/board/xidatong/third_party_driver/uart/connect_uart.c +++ b/Ubiquitous/XiZi/board/xidatong/third_party_driver/uart/connect_uart.c @@ -39,13 +39,12 @@ struct SerialHardwareDevice serial_device_1; void LPUART1_IRQHandler(int irqn, void *arg) { - x_base lock = 0; - // KPrintf("LPUART1_IRQHandler \n"); - lock = DISABLE_INTERRUPT(); + + DisableIRQ(UART1_IRQn); UartIsr(&serial_bus_1, &serial_driver_1, &serial_device_1); + EnableIRQ(UART1_IRQn); - ENABLE_INTERRUPT(lock); } DECLARE_HW_IRQ(UART1_IRQn, LPUART1_IRQHandler, NONE); #endif @@ -57,12 +56,12 @@ struct SerialHardwareDevice serial_device_2; void LPUART2_IRQHandler(int irqn, void *arg) { - x_base lock = 0; - lock = DISABLE_INTERRUPT(); + + DisableIRQ(UART2_IRQn); UartIsr(&serial_bus_2, &serial_driver_2, &serial_device_2); + EnableIRQ(UART2_IRQn); - ENABLE_INTERRUPT(lock); } DECLARE_HW_IRQ(UART2_IRQn, LPUART2_IRQHandler, NONE); #endif diff --git a/Ubiquitous/XiZi/board/xidatong/third_party_driver/usb/connect_usb.c b/Ubiquitous/XiZi/board/xidatong/third_party_driver/usb/connect_usb.c index 8baa7c57d..536e52db3 100644 --- a/Ubiquitous/XiZi/board/xidatong/third_party_driver/usb/connect_usb.c +++ b/Ubiquitous/XiZi/board/xidatong/third_party_driver/usb/connect_usb.c @@ -41,12 +41,12 @@ extern usb_status_t USB_HostMsdWriteApi(usb_host_msd_command_instance_t *msdComm //USB HOST ISR void UsbOtg2IrqHandler(int irqn, void *arg) { - x_base lock = 0; - lock = DISABLE_INTERRUPT(); + + DisableIRQ(USB2_IRQn); USB_HostEhciIsrFunction(g_HostHandle); + EnableIRQ(USB2_IRQn); - ENABLE_INTERRUPT(lock); } DECLARE_HW_IRQ(USB2_IRQn, UsbOtg2IrqHandler, NONE); diff --git a/Ubiquitous/XiZi/kernel/thread/idle.c b/Ubiquitous/XiZi/kernel/thread/idle.c index 0d64ba4df..932ce41c1 100644 --- a/Ubiquitous/XiZi/kernel/thread/idle.c +++ b/Ubiquitous/XiZi/kernel/thread/idle.c @@ -46,7 +46,7 @@ __attribute__((aligned(MEM_ALIGN_SIZE))) void RunningIntoLowPowerMode() { #ifdef ARCH_ARM - __asm volatile("WFI"); + // __asm volatile("WFI"); #endif #ifdef ARCH_RISCV From a6b403984e975a91df96285da09cc1d20580c9d4 Mon Sep 17 00:00:00 2001 From: chunyexixiaoyu <834670833@qq.com> Date: Thu, 7 Apr 2022 18:16:58 +0800 Subject: [PATCH 10/38] Ubiquitous/RT-Thread_Fusion_XiUOS/:modify the code in xidatong --- .../aiit_board/xidatong/board/MCUX_Config/pin_mux.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/MCUX_Config/pin_mux.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/MCUX_Config/pin_mux.c index 22ec13700..38c3e231b 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/MCUX_Config/pin_mux.c +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/MCUX_Config/pin_mux.c @@ -66,12 +66,7 @@ void BOARD_InitPins(void) { CLOCK_EnableClock(kCLOCK_Iomuxc); /* iomuxc clock (iomuxc_clk_enable): 0x03U */ - /*CH438 IO initialize - IOMUXC_SetPinMux( - IOMUXC_GPIO_SD_B1_05_GPIO3_IO05, /* GPIO3_IO05 is configured as CH438_nRD - 0U);*/ - - /* uart 1 2 3 4 8 io initialize */ + /* uart 1 */ IOMUXC_SetPinMux( IOMUXC_GPIO_AD_B0_12_LPUART1_TX, /* GPIO_AD_B0_12 is configured as LPUART1_TX */ 0U); /* Software Input On Field: Input Path is determined by functionality */ From f42d049cb0a24f0c16bf67dca42f974d0e647134 Mon Sep 17 00:00:00 2001 From: chunyexixiaoyu <834670833@qq.com> Date: Thu, 7 Apr 2022 18:17:44 +0800 Subject: [PATCH 11/38] =?UTF-8?q?Ubiquitous/RT-Thread=5FFusion=5FXiUOS/?= =?UTF-8?q?=EF=BC=9Aadd=20sdio=20configuration=20file=20in=20xidatong?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../aiit_board/xidatong/board/Kconfig | 13 ++++++++++++- .../aiit_board/xidatong/board/SConscript | 2 ++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/Kconfig index ce132f12a..5eee78ea2 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/Kconfig +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/Kconfig @@ -203,6 +203,10 @@ menu "On-chip Peripheral Drivers" bool "Enable RTC" select RT_USING_RTC default n + + config BSP_USING_SDIO + bool "Enable SDIO" + default n endmenu @@ -210,7 +214,14 @@ menu "Onboard Peripheral Drivers" config BSP_USING_SDRAM bool "Enable SDRAM" default n - + config BSP_USING_SDCARD + bool "Using SDCard" + select BSP_USING_SDIO + select RT_USING_SDIO + select RT_USING_DFS + select RT_USING_DFS_ELMFAT + default n + menuconfig BSP_USING_ETH bool "Enable Ethernet" select RT_USING_NETDEV diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/SConscript b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/SConscript index 5e0d423ee..bf9a14de1 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/SConscript +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/SConscript @@ -13,6 +13,8 @@ CPPPATH = [cwd,cwd + '/MCUX_Config',cwd + '/ports'] CPPDEFINES = ['CPU_MIMXRT1052CVL5B', 'SKIP_SYSCLK_INIT', 'EVK_MCIMXRM', 'FSL_SDK_ENABLE_DRIVER_CACHE_CONTROL=1','XIP_EXTERNAL_FLASH=1'] if GetDepend('BSP_USING_PHY') and GetDepend('PHY_USING_8720A'): src += ['./ports/LAN8720A.c'] +if GetDepend('BSP_USING_SDCARD'): + src += ['./ports/sdcard_port.c'] group = DefineGroup('Drivers', src, depend = [''], CPPPATH = CPPPATH, CPPDEFINES=CPPDEFINES) Return('group') From 42416d58efea2e383c26412b62b6f315318844b4 Mon Sep 17 00:00:00 2001 From: chunyexixiaoyu <834670833@qq.com> Date: Thu, 7 Apr 2022 18:18:22 +0800 Subject: [PATCH 12/38] Ubiquitous/RT-Thread_Fusion_XiUOS/: sd(tf) card driver supported by sdio --- .../aiit_board/xidatong/board/board.c | 102 ++++++++++++++++++ .../xidatong/board/ports/sdcard_port.c | 33 ++++++ 2 files changed, 135 insertions(+) create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/ports/sdcard_port.c diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/board.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/board.c index 80ddbfa0c..93659f924 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/board.c +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/board.c @@ -949,6 +949,104 @@ void imxrt_enet_pins_init(void) } +#endif + +#ifdef RT_USING_SDIO +void imxrt_sdio_pins_init(void) +{ + IOMUXC_SetPinMux( + IOMUXC_GPIO_B1_14_USDHC1_VSELECT, /* GPIO_B1_14 is configured as USDHC1_VSELECT */ + 0U); /* Software Input On Field: Input Path is determined by functionality */ + IOMUXC_SetPinMux( + IOMUXC_GPIO_SD_B0_00_USDHC1_CMD, /* GPIO_SD_B0_00 is configured as USDHC1_CMD */ + 0U); /* Software Input On Field: Input Path is determined by functionality */ + IOMUXC_SetPinMux( + IOMUXC_GPIO_SD_B0_01_USDHC1_CLK, /* GPIO_SD_B0_01 is configured as USDHC1_CLK */ + 0U); /* Software Input On Field: Input Path is determined by functionality */ + IOMUXC_SetPinMux( + IOMUXC_GPIO_SD_B0_02_USDHC1_DATA0, /* GPIO_SD_B0_02 is configured as USDHC1_DATA0 */ + 0U); /* Software Input On Field: Input Path is determined by functionality */ + IOMUXC_SetPinMux( + IOMUXC_GPIO_SD_B0_03_USDHC1_DATA1, /* GPIO_SD_B0_03 is configured as USDHC1_DATA1 */ + 0U); /* Software Input On Field: Input Path is determined by functionality */ + IOMUXC_SetPinMux( + IOMUXC_GPIO_SD_B0_04_USDHC1_DATA2, /* GPIO_SD_B0_04 is configured as USDHC1_DATA2 */ + 0U); /* Software Input On Field: Input Path is determined by functionality */ + IOMUXC_SetPinMux( + IOMUXC_GPIO_SD_B0_05_USDHC1_DATA3, /* GPIO_SD_B0_05 is configured as USDHC1_DATA3 */ + 0U); /* Software Input On Field: Input Path is determined by functionality */ + IOMUXC_SetPinConfig( + IOMUXC_GPIO_B1_14_USDHC1_VSELECT, /* GPIO_B1_14 PAD functional properties : */ + 0x0170A1u); /* Slew Rate Field: Fast Slew Rate + Drive Strength Field: R0/4 + Speed Field: medium(100MHz) + Open Drain Enable Field: Open Drain Disabled + Pull / Keep Enable Field: Pull/Keeper Enabled + Pull / Keep Select Field: Pull + Pull Up / Down Config. Field: 47K Ohm Pull Up + Hyst. Enable Field: Hysteresis Enabled */ + IOMUXC_SetPinConfig( + IOMUXC_GPIO_SD_B0_00_USDHC1_CMD, /* GPIO_SD_B0_00 PAD functional properties : */ + 0x017089u); /* Slew Rate Field: Fast Slew Rate + Drive Strength Field: R0(150 Ohm @ 3.3V, 260 Ohm@1.8V) + Speed Field: medium(100MHz) + Open Drain Enable Field: Open Drain Disabled + Pull / Keep Enable Field: Pull/Keeper Enabled + Pull / Keep Select Field: Pull + Pull Up / Down Config. Field: 47K Ohm Pull Up + Hyst. Enable Field: Hysteresis Enabled */ + IOMUXC_SetPinConfig( + IOMUXC_GPIO_SD_B0_01_USDHC1_CLK, /* GPIO_SD_B0_01 PAD functional properties : */ + 0x014089u); /* Slew Rate Field: Fast Slew Rate + Drive Strength Field: R0(150 Ohm @ 3.3V, 260 Ohm@1.8V) + Speed Field: medium(100MHz) + Open Drain Enable Field: Open Drain Disabled + Pull / Keep Enable Field: Pull/Keeper Disabled + Pull / Keep Select Field: Keeper + Pull Up / Down Config. Field: 47K Ohm Pull Up + Hyst. Enable Field: Hysteresis Enabled */ + IOMUXC_SetPinConfig( + IOMUXC_GPIO_SD_B0_02_USDHC1_DATA0, /* GPIO_SD_B0_02 PAD functional properties : */ + 0x017089u); /* Slew Rate Field: Fast Slew Rate + Drive Strength Field: R0(150 Ohm @ 3.3V, 260 Ohm@1.8V) + Speed Field: medium(100MHz) + Open Drain Enable Field: Open Drain Disabled + Pull / Keep Enable Field: Pull/Keeper Enabled + Pull / Keep Select Field: Pull + Pull Up / Down Config. Field: 47K Ohm Pull Up + Hyst. Enable Field: Hysteresis Enabled */ + IOMUXC_SetPinConfig( + IOMUXC_GPIO_SD_B0_03_USDHC1_DATA1, /* GPIO_SD_B0_03 PAD functional properties : */ + 0x017089u); /* Slew Rate Field: Fast Slew Rate + Drive Strength Field: R0(150 Ohm @ 3.3V, 260 Ohm@1.8V) + Speed Field: medium(100MHz) + Open Drain Enable Field: Open Drain Disabled + Pull / Keep Enable Field: Pull/Keeper Enabled + Pull / Keep Select Field: Pull + Pull Up / Down Config. Field: 47K Ohm Pull Up + Hyst. Enable Field: Hysteresis Enabled */ + IOMUXC_SetPinConfig( + IOMUXC_GPIO_SD_B0_04_USDHC1_DATA2, /* GPIO_SD_B0_04 PAD functional properties : */ + 0x017089u); /* Slew Rate Field: Fast Slew Rate + Drive Strength Field: R0(150 Ohm @ 3.3V, 260 Ohm@1.8V) + Speed Field: medium(100MHz) + Open Drain Enable Field: Open Drain Disabled + Pull / Keep Enable Field: Pull/Keeper Enabled + Pull / Keep Select Field: Pull + Pull Up / Down Config. Field: 47K Ohm Pull Up + Hyst. Enable Field: Hysteresis Enabled */ + IOMUXC_SetPinConfig( + IOMUXC_GPIO_SD_B0_05_USDHC1_DATA3, /* GPIO_SD_B0_05 PAD functional properties : */ + 0x017089u); /* Slew Rate Field: Fast Slew Rate + Drive Strength Field: R0(150 Ohm @ 3.3V, 260 Ohm@1.8V) + Speed Field: medium(100MHz) + Open Drain Enable Field: Open Drain Disabled + Pull / Keep Enable Field: Pull/Keeper Enabled + Pull / Keep Select Field: Pull + Pull Up / Down Config. Field: 47K Ohm Pull Up + Hyst. Enable Field: Hysteresis Enabled */ + +} #endif void rt_hw_board_init() { @@ -974,6 +1072,10 @@ void rt_hw_board_init() imxrt_dma_init(); #endif +#ifdef RT_USING_SDIO + imxrt_sdio_pins_init(); +#endif + #ifdef RT_USING_HEAP rt_system_heap_init((void *)HEAP_BEGIN, (void *)HEAP_END); #endif diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/ports/sdcard_port.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/ports/sdcard_port.c new file mode 100644 index 000000000..084394790 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/board/ports/sdcard_port.c @@ -0,0 +1,33 @@ + +#include +#include +#include "drv_gpio.h" +#include +#include +#include +#define DBG_TAG "sdcard" +#define DBG_LVL DBG_INFO +#include +int sd_mount() +{ + rt_uint32_t result; + result = mmcsd_wait_cd_changed(RT_TICK_PER_SECOND); + if (result == MMCSD_HOST_PLUGED) + { + /* mount sd card fat partition 1 as root directory */ + if (dfs_mount("sd0", "/", "elm", 0, 0) == 0) + { + LOG_I("File System initialized!\n"); + return RT_EOK; + } + else + { + LOG_E("File System init failed!\n"); + return -RT_ERROR; + } + + } + LOG_E("msd_init fail !!!"); + return -RT_ERROR; +} +INIT_APP_EXPORT(sd_mount); \ No newline at end of file From 355669e402c7d0d0b429a5b59060698cac17519b Mon Sep 17 00:00:00 2001 From: chunyexixiaoyu <834670833@qq.com> Date: Thu, 7 Apr 2022 18:23:49 +0800 Subject: [PATCH 13/38] Ubiquitous/RT-Thread_Fusion_XiUOS/: update the default configuration(lwip dfs sdram) --- .../aiit_board/xidatong/.config | 34 +++++++++++++++++-- .../aiit_board/xidatong/rtconfig.h | 24 +++++++++++++ 2 files changed, 56 insertions(+), 2 deletions(-) diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/.config b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/.config index aaa537a37..d47741477 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/.config +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/.config @@ -125,7 +125,29 @@ CONFIG_DFS_FILESYSTEMS_MAX=4 CONFIG_DFS_FILESYSTEM_TYPES_MAX=4 CONFIG_DFS_FD_MAX=16 # CONFIG_RT_USING_DFS_MNTTABLE is not set -# CONFIG_RT_USING_DFS_ELMFAT is not set +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=2 +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_RAMFS is not set @@ -157,7 +179,13 @@ CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_MTD_NAND is not set # CONFIG_RT_USING_PM is not set # CONFIG_RT_USING_RTC is not set -# CONFIG_RT_USING_SDIO is not set +CONFIG_RT_USING_SDIO=y +CONFIG_RT_SDIO_STACK_SIZE=512 +CONFIG_RT_SDIO_THREAD_PRIORITY=15 +CONFIG_RT_MMCSD_STACK_SIZE=1024 +CONFIG_RT_MMCSD_THREAD_PREORITY=22 +CONFIG_RT_MMCSD_MAX_PARTITION=16 +CONFIG_RT_SDIO_DEBUG=y # CONFIG_RT_USING_SPI is not set # CONFIG_RT_USING_WDT is not set # CONFIG_RT_USING_AUDIO is not set @@ -324,11 +352,13 @@ CONFIG_BSP_USING_LPUART1=y # CONFIG_BSP_USING_I2C is not set # CONFIG_BSP_USING_CAN is not set # CONFIG_BSP_USING_RTC is not set +CONFIG_BSP_USING_SDIO=y # # Onboard Peripheral Drivers # CONFIG_BSP_USING_SDRAM=y +CONFIG_BSP_USING_SDCARD=y CONFIG_BSP_USING_ETH=y CONFIG_BSP_USING_PHY=y CONFIG_PHY_DEVICE_ADDRESS=0 diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/rtconfig.h b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/rtconfig.h index 2aede503c..565db313f 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/rtconfig.h +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/xidatong/rtconfig.h @@ -85,6 +85,21 @@ #define DFS_FILESYSTEMS_MAX 4 #define DFS_FILESYSTEM_TYPES_MAX 4 #define DFS_FD_MAX 16 +#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 512 +#define RT_DFS_ELM_REENTRANT +#define RT_DFS_ELM_MUTEX_TIMEOUT 3000 #define RT_USING_DFS_DEVFS /* Device Drivers */ @@ -101,6 +116,13 @@ #define RT_USING_CPUTIME #define RT_USING_PHY #define RT_USING_PIN +#define RT_USING_SDIO +#define RT_SDIO_STACK_SIZE 512 +#define RT_SDIO_THREAD_PRIORITY 15 +#define RT_MMCSD_STACK_SIZE 1024 +#define RT_MMCSD_THREAD_PREORITY 22 +#define RT_MMCSD_MAX_PARTITION 16 +#define RT_SDIO_DEBUG /* Using USB */ @@ -202,10 +224,12 @@ #define BSP_USING_GPIO #define BSP_USING_LPUART #define BSP_USING_LPUART1 +#define BSP_USING_SDIO /* Onboard Peripheral Drivers */ #define BSP_USING_SDRAM +#define BSP_USING_SDCARD #define BSP_USING_ETH #define BSP_USING_PHY #define PHY_DEVICE_ADDRESS 0 From e6d53292cab32fbe0831eeb8fd168f8a50fe6202 Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Fri, 8 Apr 2022 16:52:43 +0800 Subject: [PATCH 14/38] add esp07s dir and files --- .../Framework/connection/wifi/Kconfig | 8 + .../Framework/connection/wifi/Makefile | 4 + .../Framework/connection/wifi/adapter_wifi.c | 16 + .../connection/wifi/esp07s_wifi/Kconfig | 33 ++ .../connection/wifi/esp07s_wifi/Makefile | 3 + .../connection/wifi/esp07s_wifi/esp07s_wifi.c | 524 ++++++++++++++++++ 6 files changed, 588 insertions(+) create mode 100755 APP_Framework/Framework/connection/wifi/esp07s_wifi/Kconfig create mode 100755 APP_Framework/Framework/connection/wifi/esp07s_wifi/Makefile create mode 100755 APP_Framework/Framework/connection/wifi/esp07s_wifi/esp07s_wifi.c diff --git a/APP_Framework/Framework/connection/wifi/Kconfig b/APP_Framework/Framework/connection/wifi/Kconfig index 11617b352..9afa7bf28 100644 --- a/APP_Framework/Framework/connection/wifi/Kconfig +++ b/APP_Framework/Framework/connection/wifi/Kconfig @@ -7,3 +7,11 @@ config ADAPTER_HFA21_WIFI if ADAPTER_HFA21_WIFI source "$APP_DIR/Framework/connection/wifi/hfa21_wifi/Kconfig" endif + +config ADAPTER_ESP07S_WIFI + bool "Using wifi adapter device esp07s" + default n + +if ADAPTER_ESP07S_WIFI + source "$APP_DIR/Framework/connection/wifi/esp07s_wifi/Kconfig" +endif diff --git a/APP_Framework/Framework/connection/wifi/Makefile b/APP_Framework/Framework/connection/wifi/Makefile index 3e08f0652..2930fd977 100644 --- a/APP_Framework/Framework/connection/wifi/Makefile +++ b/APP_Framework/Framework/connection/wifi/Makefile @@ -4,4 +4,8 @@ ifeq ($(CONFIG_ADAPTER_HFA21_WIFI),y) SRC_DIR += hfa21_wifi endif +ifeq ($(CONFIG_ADAPTER_ESP07S_WIFI),y) + SRC_DIR += esp07s_wifi +endif + include $(KERNEL_ROOT)/compiler.mk diff --git a/APP_Framework/Framework/connection/wifi/adapter_wifi.c b/APP_Framework/Framework/connection/wifi/adapter_wifi.c index ab6ea8ca6..c4fab060a 100644 --- a/APP_Framework/Framework/connection/wifi/adapter_wifi.c +++ b/APP_Framework/Framework/connection/wifi/adapter_wifi.c @@ -24,6 +24,9 @@ #ifdef ADAPTER_HFA21_WIFI extern AdapterProductInfoType Hfa21WifiAttach(struct Adapter *adapter); #endif +#ifdef ADAPTER_ESP07S_WIFI +extern AdapterProductInfoType Esp07sWifiAttach(struct Adapter *adapter); +#endif #define ADAPTER_WIFI_NAME "wifi" @@ -77,6 +80,19 @@ int AdapterWifiInit(void) adapter->info = product_info; adapter->done = product_info->model_done; +#endif +#ifdef ADAPTER_ESP07S_WIFI + AdapterProductInfoType product_info = Esp07sWifiAttach(adapter); + if (!product_info) { + printf("AdapterWifiInit ESP07S attach error\n"); + PrivFree(adapter); + return -1; + } + + adapter->product_info_flag = 1; + adapter->info = product_info; + adapter->done = product_info->model_done; + #endif return ret; diff --git a/APP_Framework/Framework/connection/wifi/esp07s_wifi/Kconfig b/APP_Framework/Framework/connection/wifi/esp07s_wifi/Kconfig new file mode 100755 index 000000000..3c2bbfb7e --- /dev/null +++ b/APP_Framework/Framework/connection/wifi/esp07s_wifi/Kconfig @@ -0,0 +1,33 @@ +config ADAPTER_WIFI_ESP07S + string "ESP07S WIFI adapter name" + default "esp07s_wifi" + +if ADD_XIZI_FETURES + + config ADAPTER_ESP07S_DRIVER_EXTUART + bool "Using extra uart to support wifi" + default n + + config ADAPTER_ESP07S_DRIVER + string "ESP07S device uart driver path" + default "/dev/usart2_dev2" + depends on !ADAPTER_ESP07S_DRIVER_EXTUART + + if ADAPTER_ESP07S_DRIVER_EXTUART + config ADAPTER_ESP07S_DRIVER + string "ESP07S device extra uart driver path" + default "/dev/extuart_dev6" + + config ADAPTER_ESP07S_DRIVER_EXT_PORT + int "if ESP07S device using extuart, choose port" + default "6" + endif +endif + +if ADD_NUTTX_FETURES + +endif + +if ADD_RTTHREAD_FETURES + +endif diff --git a/APP_Framework/Framework/connection/wifi/esp07s_wifi/Makefile b/APP_Framework/Framework/connection/wifi/esp07s_wifi/Makefile new file mode 100755 index 000000000..e0ce0a8ac --- /dev/null +++ b/APP_Framework/Framework/connection/wifi/esp07s_wifi/Makefile @@ -0,0 +1,3 @@ +SRC_FILES := esp07s_wifi.c + +include $(KERNEL_ROOT)/compiler.mk diff --git a/APP_Framework/Framework/connection/wifi/esp07s_wifi/esp07s_wifi.c b/APP_Framework/Framework/connection/wifi/esp07s_wifi/esp07s_wifi.c new file mode 100755 index 000000000..f6ab7feb5 --- /dev/null +++ b/APP_Framework/Framework/connection/wifi/esp07s_wifi/esp07s_wifi.c @@ -0,0 +1,524 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** + * @file esp07_wifi.c + * @brief Implement the connection wifi adapter function, using ESP07S device + * @version 1.1 + * @author AIIT XUOS Lab + * @date 2022.04.08 + */ + +#include +#include + +#define LEN_PARA_BUF 128 + +static int Esp07sWifiSetDown(struct Adapter *adapter_at); + +/** + * @description: enter AT command mode + * @param at_agent - wifi device agent pointer + * @return success: EOK + */ +static int Esp07sWifiInitAtCmd(ATAgentType at_agent) +{ + ATOrderSend(at_agent, REPLY_TIME_OUT, NULL, "+++"); + PrivTaskDelay(100); + + ATOrderSend(at_agent, REPLY_TIME_OUT, NULL, "a"); + PrivTaskDelay(500); + + return 0; +} + +/** + * @description: Open wifi + * @param adapter - wifi device pointer + * @return success: EOK, failure: ENOMEMORY + */ +static int Esp07sWifiOpen(struct Adapter *adapter) +{ + /*step1: open esp07s serial port*/ + adapter->fd = PrivOpen(ADAPTER_ESP07S_DRIVER, O_RDWR); + if (adapter->fd < 0) { + printf("Esp07sWifiOpen get serial %s fd error\n", ADAPTER_ESP07S_DRIVER); + return -1; + } + + /*step2: init AT agent*/ + if (!adapter->agent) { + char *agent_name = "wifi_uart_client"; + if (EOK != InitATAgent(agent_name, adapter->fd, 512)) { + printf("at agent init failed !\n"); + return -1; + } + ATAgentType at_agent = GetATAgent(agent_name); + + adapter->agent = at_agent; + } + + ADAPTER_DEBUG("Esp07sWifi open done\n"); + + return 0; +} + +/** + * @description: Close wifi + * @param adapter - wifi device pointer + * @return success: EOK + */ +static int Esp07sWifiClose(struct Adapter *adapter) +{ + return Esp07sWifiSetDown(adapter); +} + +/** + * @description: send data to adapter + * @param adapter - wifi device pointer + * @param data - data buffer + * @param data - data length + * @return success: EOK + */ +static int Esp07sWifiSend(struct Adapter *adapter, const void *data, size_t len) +{ + x_err_t result = EOK; + if (adapter->agent) { + EntmSend(adapter->agent, (const char *)data, len); + }else { + printf("Esp07sWifiSend can not find agent!\n"); + } + +__exit: + + return result; +} + +/** + * @description: receive data from adapter + * @param adapter - wifi device pointer + * @param data - data buffer + * @param data - data length + * @return success: EOK + */ +static int Esp07sWifiReceive(struct Adapter *adapter, void *rev_buffer, size_t buffer_len) +{ + x_err_t result = EOK; + printf("esp07s receive waiting ... \n"); + + if (adapter->agent) { + return EntmRecv(adapter->agent, (char *)rev_buffer, buffer_len, 40); + } else { + printf("Esp07sWifiReceive can not find agent!\n"); + } + +__exit: + + return result; +} + +/** + * @description: connnect wifi to internet + * @param adapter - wifi device pointer + * @return success: EOK + */ +static int Esp07sWifiSetUp(struct Adapter *adapter) +{ + uint8 wifi_ssid[LEN_PARA_BUF] = "AIIT-Guest"; + uint8 wifi_pwd[LEN_PARA_BUF] = ""; + char cmd[LEN_PARA_BUF]; + + struct ATAgent *agent = adapter->agent; + + /* wait esp07s device startup finish */ + PrivTaskDelay(5000); + + Esp07sWifiInitAtCmd(agent); + + memset(cmd,0,sizeof(cmd)); + strcpy(cmd,"AT+FCLR\r"); + ATOrderSend(agent, REPLY_TIME_OUT, NULL, cmd); + PrivTaskDelay(20000); + + Esp07sWifiInitAtCmd(agent); + + memset(cmd,0,sizeof(cmd)); + strcpy(cmd,"AT+WSSSID="); + strcat(cmd,wifi_ssid); + strcat(cmd,"\r"); + ATOrderSend(agent, REPLY_TIME_OUT, NULL, cmd); + PrivTaskDelay(2500); + + memset(cmd,0,sizeof(cmd)); + strcpy(cmd,"AT+WSKEY=OPEN,NONE,"); + strcat(cmd,wifi_pwd); + strcat(cmd,"\r"); + ATOrderSend(agent, REPLY_TIME_OUT, NULL, cmd); + PrivTaskDelay(2500); + + memset(cmd,0,sizeof(cmd)); + strcpy(cmd,"AT+WMODE=sta\r"); + ATOrderSend(agent, REPLY_TIME_OUT, NULL, cmd); + PrivTaskDelay(2500); + + memset(cmd,0,sizeof(cmd)); + strcat(cmd,"AT+Z\r"); + ATOrderSend(agent, REPLY_TIME_OUT, NULL, cmd); + PrivTaskDelay(10000); + + return 0; +} + +/** + * @description: disconnnect wifi from internet + * @param adapter - wifi device pointer + * @return success: EOK + */ +static int Esp07sWifiSetDown(struct Adapter *adapter) +{ + Esp07sWifiInitAtCmd(adapter->agent); + + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "AT+FCLR\r"); + PrivTaskDelay(20000); + + return 0; +} + +/** + * @description: set wifi ip/gateway/netmask address(in sta mode) + * @param adapter - wifi device pointer + * @param ip - ip address + * @param gateway - gateway address + * @param netmask - netmask address + * @return success: EOK, failure: ENOMEMORY + */ +static int Esp07sWifiSetAddr(struct Adapter *adapter, const char *ip, const char *gateway, const char *netmask) +{ + #define ESP07S_SET_ADDR_EXPRESSION "+ok=%[^,],%[^,],%[^,],%[^,]\r" + char *dhcp_mode =NULL; + char *ip_str = NULL; + char *gw_str = NULL; + char *mask_str = NULL; + + dhcp_mode = (char *) PrivCalloc(1, 8); + ip_str = (char *) PrivCalloc(1, 17); + gw_str = (char *) PrivCalloc(1, 17); + mask_str = (char *) PrivCalloc(1, 17); + + Esp07sWifiInitAtCmd(adapter->agent); + + x_err_t result = EOK; + + ATReplyType reply = CreateATReply(64); + if (NULL == reply) { + printf("at_create_resp failed ! \n"); + result = ENOMEMORY; + goto __exit; + } + + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "AT+WANN=%s,%s,%s,%s\r", "dhcp", ip, netmask, gateway); + PrivTaskDelay(2500); + + ATOrderSend(adapter->agent, REPLY_TIME_OUT, reply, "AT+WANN\r"); + PrivTaskDelay(2500); + + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "AT+Z\r"); + PrivTaskDelay(10000); + + const char * result_buf = GetReplyText(reply); + + char* str = strstr(result_buf, "+ok="); + + ParseATReply(str, ESP07S_SET_ADDR_EXPRESSION, dhcp_mode,ip_str,mask_str,gw_str); + printf("after configure:\n mode:%s\n ip:%s\n netmask:%s\n gateway:%s\n", dhcp_mode, ip_str, mask_str, gw_str); + +__exit: + if (reply) { + DeleteATReply(reply); + } + + return result; +} + +/** + * @description: wifi ping function + * @param adapter - wifi device pointer + * @param destination - domain name or ip address + * @return success: EOK, failure: ENOMEMORY + */ +static int Esp07sWifiPing(struct Adapter *adapter, const char *destination) +{ + char *ping_result = NONE; + char *dst = NONE; + ping_result = (char *) PrivCalloc(1, 17); + dst = (char *) PrivCalloc(1, 17); + strcpy(dst, destination); + strcat(dst, "\r"); + + Esp07sWifiInitAtCmd(adapter->agent); + + uint32 result = EOK; + + ATReplyType reply = CreateATReply(64); + if (NULL == reply) { + printf("at_create_resp failed ! \n"); + result = ENOMEMORY; + goto __exit; + } + + //ping baidu.com + ATOrderSend(adapter->agent, REPLY_TIME_OUT, reply, "AT+PING=%s", dst); + + PrivTaskDelay(2500); + + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "AT+Z\r"); + PrivTaskDelay(10000); + + const char * result_buf = GetReplyText(reply); + + char* str = strstr(result_buf, "+ok="); + + ParseATReply(str, "+ok=%s\r", ping_result); + + printf("ping www.baidu.com(36.152.44.95) result is:%s\n", ping_result); + +__exit: + if (reply) { + DeleteATReply(reply); + } + + return result; +} + +/** + * @description: display wifi network configuration + * @param adapter - wifi device pointer + * @return success: EOK, failure: ENOMEMORY + */ +static int Esp07sWifiNetstat(struct Adapter *adapter) +{ + #define ESP07S_NETSTAT_RESP_SIZE 320 + #define ESP07S_NETSTAT_TYPE_SIZE 10 + #define ESP07S_NETSTAT_IPADDR_SIZE 17 + #define ESP07S_WANN_EXPRESSION "+ok=%[^,],%[^,],%[^,],%[^,]\r" + #define ESP07S_LANN_EXPRESSION "+ok=%[^,],%[^,]\r" + #define ESP07S_WMODE_EXPRESSION "+ok=%s\r" + + ATReplyType reply = NULL; + struct ATAgent *agent = adapter->agent; + uint32 result; + char * result_buf = NULL; + char * str = NULL; + + /* sta/ap */ + char *work_mode = NULL; + /* dhcp/static */ + char *ip_mode = NULL; + char *local_ipaddr = NULL; + char *gateway = NULL; + char *netmask = NULL; + local_ipaddr = (char *) PrivCalloc(1, ESP07S_NETSTAT_IPADDR_SIZE); + gateway = (char *) PrivCalloc(1, ESP07S_NETSTAT_IPADDR_SIZE); + netmask = (char *) PrivCalloc(1, ESP07S_NETSTAT_IPADDR_SIZE); + work_mode = (char *) PrivCalloc(1, ESP07S_NETSTAT_IPADDR_SIZE); + ip_mode = (char *) PrivCalloc(1, ESP07S_NETSTAT_IPADDR_SIZE); + + reply = CreateATReply(ESP07S_NETSTAT_RESP_SIZE); + if (reply == NULL) { + result = ENOMEMORY; + goto __exit; + } + + ATOrderSend(agent, REPLY_TIME_OUT, NULL, "+++"); + PrivTaskDelay(100); + + ATOrderSend(agent, REPLY_TIME_OUT, NULL, "a"); + PrivTaskDelay(2500); + + ATOrderSend(agent, REPLY_TIME_OUT, reply, "AT+WMODE\r"); + PrivTaskDelay(2500); + + result_buf = GetReplyText(reply); + + str = strstr(result_buf, "+ok="); + /* parse the third line of response data, get the network connection information */ + ParseATReply(str, ESP07S_WMODE_EXPRESSION, work_mode); + + if (work_mode[0]=='S') { + if (ATOrderSend(agent, REPLY_TIME_OUT, reply, "AT+WANN\r") < 0) { + goto __exit; + } + + PrivTaskDelay(2500); + + GetReplyText(reply); + str = strstr(result_buf, "+ok="); + /* parse the third line of response data, get the network connection information */ + ParseATReply(str, ESP07S_WANN_EXPRESSION, ip_mode, local_ipaddr, netmask, gateway); + } else { + ATOrderSend(agent, REPLY_TIME_OUT, reply, "AT+LANN\r"); + PrivTaskDelay(2500); + + GetReplyText(reply); + + str = strstr(result_buf, "+ok="); + /* parse the third line of response data, get the network connection information */ + ParseATReply(str, ESP07S_LANN_EXPRESSION, local_ipaddr, netmask); + } + + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "AT+Z\r"); + PrivTaskDelay(10000); + + printf("work mode: %s\n", work_mode); + if (work_mode[0]=='S') + printf("ip mode: %s\nlocal ip: %s\nnetmask: %s\ngateway: %s\n", ip_mode, local_ipaddr, netmask, gateway); + else + printf("local ip: %s\nnetmask: %s\n", local_ipaddr, netmask); + + return EOK; + +__exit: + if (reply) + DeleteATReply(reply); + if (local_ipaddr) + PrivFree(local_ipaddr); + if (netmask) + PrivFree(netmask); + if (gateway) + PrivFree(gateway); + if (work_mode) + PrivFree(work_mode); +} + +/** + * @description: wifi connect function + * @param adapter - wifi device pointer + * @param net_role - net role, CLIENT or SERVER + * @param ip - ip address + * @param port - port num + * @param ip_type - ip type, IPV4 or IPV6 + * @return success: 0, failure: -1 + */ +static int Esp07sWifiConnect(struct Adapter *adapter, enum NetRoleType net_role, const char *ip, const char *port, enum IpType ip_type) +{ + int result = EOK; + ATReplyType reply = NONE; + char cmd[LEN_PARA_BUF]; + struct ATAgent *agent = adapter->agent; + + reply = CreateATReply(64); + if (reply == NONE) { + printf("no memory for reply struct."); + return ENOMEMORY; + } + + Esp07sWifiInitAtCmd(adapter->agent); + + memset(cmd,0,sizeof(cmd)); + strcpy(cmd,"AT+NETP=TCP,"); + if(net_role == CLIENT) + strcat(cmd,"CLIENT,"); + else if(net_role == SERVER) + strcat(cmd,"SERVER,"); + strcat(cmd,port); + strcat(cmd,","); + if(ip_type == IPV4) + strcat(cmd,ip); + else if(ip_type == IPV6) + { + + } + strcat(cmd,"\r"); + ATOrderSend(agent, REPLY_TIME_OUT, NULL, cmd); + PrivTaskDelay(2500); + + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "AT+Z\r"); + PrivTaskDelay(10000); + + adapter->net_role = net_role; + +__exit: + if (reply) { + DeleteATReply(reply); + } + + return result; +} + +static int Esp07sWifiIoctl(struct Adapter *adapter, int cmd, void *args) +{ + if (OPE_INT != cmd) { + printf("Esp07sWifiIoctl only support OPE_INT, do not support %d\n", cmd); + return -1; + } + + uint32_t baud_rate = *((uint32_t *)args); + + struct SerialDataCfg serial_cfg; + memset(&serial_cfg, 0 ,sizeof(struct SerialDataCfg)); + serial_cfg.serial_baud_rate = baud_rate; + serial_cfg.serial_data_bits = DATA_BITS_8; + serial_cfg.serial_stop_bits = STOP_BITS_1; + serial_cfg.serial_buffer_size = SERIAL_RB_BUFSZ; + serial_cfg.serial_parity_mode = PARITY_NONE; + serial_cfg.serial_bit_order = BIT_ORDER_LSB; + serial_cfg.serial_invert_mode = NRZ_NORMAL; +#ifdef ADAPTER_ESP07S_DRIVER_EXT_PORT + serial_cfg.ext_uart_no = ADAPTER_ESP07S_DRIVER_EXT_PORT; + serial_cfg.port_configure = PORT_CFG_INIT; +#endif + + struct PrivIoctlCfg ioctl_cfg; + ioctl_cfg.ioctl_driver_type = SERIAL_TYPE; + ioctl_cfg.args = &serial_cfg; + PrivIoctl(adapter->fd, OPE_INT, &ioctl_cfg); + printf("Esp07sWifiIoctl success\n"); + return 0; +} + +static const struct IpProtocolDone esp07s_wifi_done = +{ + .open = Esp07sWifiOpen, + .close = Esp07sWifiClose, + .ioctl = Esp07sWifiIoctl, + .setup = Esp07sWifiSetUp, + .setdown = Esp07sWifiSetDown, + .setaddr = Esp07sWifiSetAddr, + .setdns = NULL, + .setdhcp = NULL, + .ping = Esp07sWifiPing, + .netstat = Esp07sWifiNetstat, + .connect = Esp07sWifiConnect, + .send = Esp07sWifiSend, + .recv = Esp07sWifiReceive, + .disconnect = NULL, +}; + +/** + * @description: Register wifi device esp07s + * @return success: EOK, failure: ERROR + */ +AdapterProductInfoType Esp07sWifiAttach(struct Adapter *adapter) +{ + struct AdapterProductInfo *product_info = PrivMalloc(sizeof(struct AdapterProductInfo)); + if (!product_info) { + printf("Esp07sWifiAttach Attach malloc product_info error\n"); + PrivFree(product_info); + return NULL; + } + + strcpy(product_info->model_name, ADAPTER_WIFI_ESP07S); + + product_info->model_done = (void *)&esp07s_wifi_done; + + return product_info; +} \ No newline at end of file From 6f859b91db7ad737f9d36c018359fb19d02faed4 Mon Sep 17 00:00:00 2001 From: Liu_Weichao Date: Mon, 11 Apr 2022 17:56:09 +0800 Subject: [PATCH 15/38] feat add sd card auto-check-attach function for ok1052 and xidatong --- Ubiquitous/XiZi/board/ok1052-c/Kconfig | 1 - Ubiquitous/XiZi/board/ok1052-c/board.c | 24 --- .../third_party_driver/include/connect_sdio.h | 3 + .../ok1052-c/third_party_driver/sdio/Kconfig | 11 ++ .../third_party_driver/sdio/connect_sdio.c | 155 +++++++++++++----- Ubiquitous/XiZi/board/xidatong/Kconfig | 1 - Ubiquitous/XiZi/board/xidatong/board.c | 18 -- .../third_party_driver/include/connect_sdio.h | 3 + .../xidatong/third_party_driver/sdio/Kconfig | 11 ++ .../third_party_driver/sdio/connect_sdio.c | 150 ++++++++++++----- 10 files changed, 257 insertions(+), 120 deletions(-) diff --git a/Ubiquitous/XiZi/board/ok1052-c/Kconfig b/Ubiquitous/XiZi/board/ok1052-c/Kconfig index 5f685a174..62afaf430 100644 --- a/Ubiquitous/XiZi/board/ok1052-c/Kconfig +++ b/Ubiquitous/XiZi/board/ok1052-c/Kconfig @@ -44,7 +44,6 @@ menu "ok1052-c feature" config MOUNT_SDCARD bool "mount cd card" default n - select BSP_USING_SDIO endmenu endmenu diff --git a/Ubiquitous/XiZi/board/ok1052-c/board.c b/Ubiquitous/XiZi/board/ok1052-c/board.c index 363c8424c..5b1174a39 100644 --- a/Ubiquitous/XiZi/board/ok1052-c/board.c +++ b/Ubiquitous/XiZi/board/ok1052-c/board.c @@ -41,30 +41,6 @@ extern int ExtSramInit(void); #endif #endif -#if defined(FS_VFS) && defined(MOUNT_SDCARD) -#include - -// SD card mount flag 1: OK -int sd_mount_flag = 0; - -/** - * @description: Mount SD card - * @return 0 - */ -int MountSDCard(void) -{ - if (MountFilesystem(SDIO_BUS_NAME, SDIO_DEVICE_NAME, SDIO_DRIVER_NAME, FSTYPE_FATFS, "/") == 0) - { - sd_mount_flag = 1; - KPrintf("sd card mount to '/'"); - } - else - KPrintf("sd card mount to '/' failed!"); - - return 0; -} -#endif - #if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED #include "fsl_lpi2c.h" #endif /* SDK_I2C_BASED_COMPONENT_USED */ diff --git a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/include/connect_sdio.h b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/include/connect_sdio.h index 768e0ac3a..501c14422 100644 --- a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/include/connect_sdio.h +++ b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/include/connect_sdio.h @@ -27,11 +27,14 @@ #include #include #include +#include #ifdef __cplusplus extern "C" { #endif +#define SD_CARD_STACK_SIZE 2048 + int Imxrt1052HwSdioInit(void); #ifdef __cplusplus diff --git a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/sdio/Kconfig b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/sdio/Kconfig index 56ebba209..c2ceb303d 100644 --- a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/sdio/Kconfig +++ b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/sdio/Kconfig @@ -10,4 +10,15 @@ if BSP_USING_SDIO config SDIO_DEVICE_NAME string "sdio device name" default "sdio_dev" + + config MOUNT_SDCARD_FS + bool "mount cd card file system" + default n + select MOUNT_SDCARD + + if MOUNT_SDCARD_FS + config MOUNT_SDCARD_FS_TYPE + int "choose file system type : FATFS(0) LWEXT4(3)" + default 0 + endif endif diff --git a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/sdio/connect_sdio.c b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/sdio/connect_sdio.c index 0a84b7fff..bebbce78a 100644 --- a/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/sdio/connect_sdio.c +++ b/Ubiquitous/XiZi/board/ok1052-c/third_party_driver/sdio/connect_sdio.c @@ -104,9 +104,6 @@ static const sdmmchost_card_switch_voltage_func_t s_sdcard_voltage_switch = { }; #endif -/*! @brief SD card detect flag */ -static volatile bool s_card_inserted = false; - /*! @brief Card descriptor. */ static sd_card_t g_sd; static int sd_lock = -1; @@ -142,11 +139,6 @@ static void BoardPowerOnSdCard(void) BOARD_USDHC_SDCARD_POWER_CONTROL(1); } -static void SdcardDetectCallBack(bool is_inserted, void *user_data) -{ - s_card_inserted = is_inserted; -} - static void CardInformationLog(sd_card_t *card) { NULL_PARAM_CHECK(card); @@ -282,10 +274,126 @@ static struct SdioDevDone dev_done = SdioRead, }; +#if defined(FS_VFS) && defined(MOUNT_SDCARD_FS) +#include + +int sd_mount_flag = 0; + +/** + * @description: Mount SD card + * @return 0 + */ +static int MountSDCardFs(enum FilesystemType fs_type) +{ + if (MountFilesystem(SDIO_BUS_NAME, SDIO_DEVICE_NAME, SDIO_DRIVER_NAME, fs_type, "/") == 0) { + sd_mount_flag = 1; + KPrintf("Sd card mount to '/'"); + } else { + KPrintf("Sd card mount to '/' failed!"); + } + + return 0; +} +#endif + +static void SdCardAttach(void) +{ + bool is_read_only; + static sd_card_t *card = &g_sd; + + KPrintf("\r\nCard inserted.\r\n"); + /* reset host once card re-plug in */ + SD_HostReset(&(card->host)); + /* power on the card */ + SD_PowerOnCard(card->host.base, card->usrParam.pwr); + KPrintf("Power on done\n"); + + /* Init card. */ + if (SD_CardInit(card)) { + KPrintf("\r\nSD card init failed.\r\n"); + return; + } + + /* card information log */ + CardInformationLog(card); + + /* Check if card is readonly. */ + is_read_only = SD_CheckReadOnly(card); + +#ifdef MOUNT_SDCARD_FS + /*mount file system*/ + MountSDCardFs(MOUNT_SDCARD_FS_TYPE); +#endif +} + +static void SdCardDetach(void) +{ + /*unmount file system*/ + KPrintf("\r\nCard detect extracted.\r\n"); + +#ifdef MOUNT_SDCARD_FS + UnmountFileSystem("/"); +#endif +} + +static uint8 SdCardReadCd(void) +{ + BusType pin; + + pin = BusFind(PIN_BUS_NAME); + + pin->owner_haldev = BusFindDevice(pin, PIN_DEVICE_NAME); + + struct PinStat PinStat; + + struct BusBlockReadParam read_param; + read_param.buffer = (void *)&PinStat; + + PinStat.pin = IMXRT_GET_PIN(2, 28); + + return BusDevReadData(pin->owner_haldev, &read_param); +} + +static void SdCardTask(void* parameter) +{ + static int sd_card_status = 0; + + while (1) { + if (!SdCardReadCd()) { + if (!sd_card_status) { + SdCardAttach(); + sd_card_status = 1; + } + } else { + if (sd_card_status) { + SdCardDetach(); + sd_card_status = 0; + } + } + } +} + +#ifdef MOUNT_SDCARD +int MountSDCard() +{ + int sd_card_task = 0; + sd_card_task = KTaskCreate("sd_card", SdCardTask, NONE, + SD_CARD_STACK_SIZE, 8); + if(sd_card_task < 0) { + KPrintf("sd_card_task create failed ...%s %d.\n", __FUNCTION__,__LINE__); + return ERROR; + } + + StartupKTask(sd_card_task); + + return EOK; +} +#endif + + int Imxrt1052HwSdioInit(void) { x_err_t ret = EOK; - bool is_read_only; static struct SdioBus sdio_bus; static struct SdioDriver sdio_drv; @@ -318,35 +426,6 @@ int Imxrt1052HwSdioInit(void) return ERROR; } - KPrintf("\r\nPlease insert a card into board.\r\n"); - - /* power off card */ - SD_PowerOffCard(card->host.base, card->usrParam.pwr); - - if (SD_WaitCardDetectStatus(SD_HOST_BASEADDR, &s_sdcard_detect, true) == kStatus_Success) { - KPrintf("\r\nCard inserted.\r\n"); - /* reset host once card re-plug in */ - SD_HostReset(&(card->host)); - /* power on the card */ - SD_PowerOnCard(card->host.base, card->usrParam.pwr); - KPrintf("power on done\n"); - } else { - KPrintf("\r\nCard detect fail.\r\n"); - return ERROR; - } - - /* Init card. */ - if (SD_CardInit(card)) { - KPrintf("\r\nSD card init failed.\r\n"); - return ERROR; - } - - /* card information log */ - CardInformationLog(card); - - /* Check if card is readonly. */ - is_read_only = SD_CheckReadOnly(card); - ret = SdioBusInit(&sdio_bus, SDIO_BUS_NAME); if (ret != EOK) { KPrintf("Sdio bus init error %d\n", ret); diff --git a/Ubiquitous/XiZi/board/xidatong/Kconfig b/Ubiquitous/XiZi/board/xidatong/Kconfig index fedc84638..629a1c18a 100644 --- a/Ubiquitous/XiZi/board/xidatong/Kconfig +++ b/Ubiquitous/XiZi/board/xidatong/Kconfig @@ -44,7 +44,6 @@ menu "xidatong feature" config MOUNT_SDCARD bool "mount cd card" default n - select BSP_USING_SDIO endmenu endmenu diff --git a/Ubiquitous/XiZi/board/xidatong/board.c b/Ubiquitous/XiZi/board/xidatong/board.c index 769b40efa..197afc0f3 100644 --- a/Ubiquitous/XiZi/board/xidatong/board.c +++ b/Ubiquitous/XiZi/board/xidatong/board.c @@ -29,24 +29,6 @@ Modification: #include "board.h" #include "pin_mux.h" -#if defined(FS_VFS) && defined(MOUNT_SDCARD) -#include - -/** - * @description: Mount SD card - * @return 0 - */ -int MountSDCard(void) -{ - if (MountFilesystem(SDIO_BUS_NAME, SDIO_DEVICE_NAME, SDIO_DRIVER_NAME, FSTYPE_FATFS, "/") == 0) - KPrintf("sd card mount to '/'"); - else - KPrintf("sd card mount to '/' failed!"); - - return 0; -} -#endif - #if defined(SDK_I2C_BASED_COMPONENT_USED) && SDK_I2C_BASED_COMPONENT_USED #include "fsl_lpi2c.h" #endif /* SDK_I2C_BASED_COMPONENT_USED */ diff --git a/Ubiquitous/XiZi/board/xidatong/third_party_driver/include/connect_sdio.h b/Ubiquitous/XiZi/board/xidatong/third_party_driver/include/connect_sdio.h index 6adf230c8..f76b1a46f 100644 --- a/Ubiquitous/XiZi/board/xidatong/third_party_driver/include/connect_sdio.h +++ b/Ubiquitous/XiZi/board/xidatong/third_party_driver/include/connect_sdio.h @@ -27,11 +27,14 @@ #include #include #include +#include #ifdef __cplusplus extern "C" { #endif +#define SD_CARD_STACK_SIZE 2048 + int Imxrt1052HwSdioInit(void); #ifdef __cplusplus diff --git a/Ubiquitous/XiZi/board/xidatong/third_party_driver/sdio/Kconfig b/Ubiquitous/XiZi/board/xidatong/third_party_driver/sdio/Kconfig index 56ebba209..c2ceb303d 100644 --- a/Ubiquitous/XiZi/board/xidatong/third_party_driver/sdio/Kconfig +++ b/Ubiquitous/XiZi/board/xidatong/third_party_driver/sdio/Kconfig @@ -10,4 +10,15 @@ if BSP_USING_SDIO config SDIO_DEVICE_NAME string "sdio device name" default "sdio_dev" + + config MOUNT_SDCARD_FS + bool "mount cd card file system" + default n + select MOUNT_SDCARD + + if MOUNT_SDCARD_FS + config MOUNT_SDCARD_FS_TYPE + int "choose file system type : FATFS(0) LWEXT4(3)" + default 0 + endif endif diff --git a/Ubiquitous/XiZi/board/xidatong/third_party_driver/sdio/connect_sdio.c b/Ubiquitous/XiZi/board/xidatong/third_party_driver/sdio/connect_sdio.c index d13ea9a80..841ed2fc2 100644 --- a/Ubiquitous/XiZi/board/xidatong/third_party_driver/sdio/connect_sdio.c +++ b/Ubiquitous/XiZi/board/xidatong/third_party_driver/sdio/connect_sdio.c @@ -104,9 +104,6 @@ static const sdmmchost_card_switch_voltage_func_t s_sdcard_voltage_switch = { }; #endif -/*! @brief SD card detect flag */ -static volatile bool s_card_inserted = false; - /*! @brief Card descriptor. */ static sd_card_t g_sd; static int sd_lock = -1; @@ -142,11 +139,6 @@ static void BoardPowerOnSdCard(void) BOARD_USDHC_SDCARD_POWER_CONTROL(1); } -static void SdcardDetectCallBack(bool is_inserted, void *user_data) -{ - s_card_inserted = is_inserted; -} - static void CardInformationLog(sd_card_t *card) { NULL_PARAM_CHECK(card); @@ -282,10 +274,121 @@ static struct SdioDevDone dev_done = SdioRead, }; +#if defined(FS_VFS) && defined(MOUNT_SDCARD_FS) +#include + +/** + * @description: Mount SD card + * @return 0 + */ +static int MountSDCardFs(enum FilesystemType fs_type) +{ + if (MountFilesystem(SDIO_BUS_NAME, SDIO_DEVICE_NAME, SDIO_DRIVER_NAME, fs_type, "/") == 0) + KPrintf("Sd card mount to '/'"); + else + KPrintf("Sd card mount to '/' failed!"); + + return 0; +} +#endif + +static void SdCardAttach(void) +{ + bool is_read_only; + static sd_card_t *card = &g_sd; + + KPrintf("\r\nCard inserted.\r\n"); + /* reset host once card re-plug in */ + SD_HostReset(&(card->host)); + /* power on the card */ + SD_PowerOnCard(card->host.base, card->usrParam.pwr); + KPrintf("Power on done\n"); + + /* Init card. */ + if (SD_CardInit(card)) { + KPrintf("\r\nSD card init failed.\r\n"); + return; + } + + /* card information log */ + CardInformationLog(card); + + /* Check if card is readonly. */ + is_read_only = SD_CheckReadOnly(card); + +#ifdef MOUNT_SDCARD_FS + /*mount file system*/ + MountSDCardFs(MOUNT_SDCARD_FS_TYPE); +#endif +} + +static void SdCardDetach(void) +{ + /*unmount file system*/ + KPrintf("\r\nCard detect extracted.\r\n"); + +#ifdef MOUNT_SDCARD_FS + UnmountFileSystem("/"); +#endif +} + +static uint8 SdCardReadCd(void) +{ + BusType pin; + + pin = BusFind(PIN_BUS_NAME); + + pin->owner_haldev = BusFindDevice(pin, PIN_DEVICE_NAME); + + struct PinStat PinStat; + + struct BusBlockReadParam read_param; + read_param.buffer = (void *)&PinStat; + + PinStat.pin = IMXRT_GET_PIN(2, 28); + + return BusDevReadData(pin->owner_haldev, &read_param); +} + +static void SdCardTask(void* parameter) +{ + static int sd_card_status = 0; + + while (1) { + if (!SdCardReadCd()) { + if (!sd_card_status) { + SdCardAttach(); + sd_card_status = 1; + } + } else { + if (sd_card_status) { + SdCardDetach(); + sd_card_status = 0; + } + } + } +} + +#ifdef MOUNT_SDCARD +int MountSDCard() +{ + int sd_card_task = 0; + sd_card_task = KTaskCreate("sd_card", SdCardTask, NONE, + SD_CARD_STACK_SIZE, 8); + if(sd_card_task < 0) { + KPrintf("sd_card_task create failed ...%s %d.\n", __FUNCTION__,__LINE__); + return ERROR; + } + + StartupKTask(sd_card_task); + + return EOK; +} +#endif + int Imxrt1052HwSdioInit(void) { x_err_t ret = EOK; - bool is_read_only; static struct SdioBus sdio_bus; static struct SdioDriver sdio_drv; @@ -317,35 +420,6 @@ int Imxrt1052HwSdioInit(void) KPrintf("\r\nSD host init fail\r\n"); return ERROR; } - - KPrintf("\r\nPlease insert a card into board.\r\n"); - - /* power off card */ - SD_PowerOffCard(card->host.base, card->usrParam.pwr); - - if (SD_WaitCardDetectStatus(SD_HOST_BASEADDR, &s_sdcard_detect, true) == kStatus_Success) { - KPrintf("\r\nCard inserted.\r\n"); - /* reset host once card re-plug in */ - SD_HostReset(&(card->host)); - /* power on the card */ - SD_PowerOnCard(card->host.base, card->usrParam.pwr); - KPrintf("power on done\n"); - } else { - KPrintf("\r\nCard detect fail.\r\n"); - return ERROR; - } - - /* Init card. */ - if (SD_CardInit(card)) { - KPrintf("\r\nSD card init failed.\r\n"); - return ERROR; - } - - /* card information log */ - CardInformationLog(card); - - /* Check if card is readonly. */ - is_read_only = SD_CheckReadOnly(card); ret = SdioBusInit(&sdio_bus, SDIO_BUS_NAME); if (ret != EOK) { From b939838f5223011e2c278da7d8c28061730bfee4 Mon Sep 17 00:00:00 2001 From: wlyu Date: Wed, 13 Apr 2022 15:02:47 +0800 Subject: [PATCH 16/38] support ethernet for xidatong with configure.sh xidatong:netnsh --- .../xidatong/configs/netnsh/defconfig | 3 +- .../nuttx/arch/arm/src/imxrt/imxrt_enet.c | 2654 +++++++++++++++++ 2 files changed, 2656 insertions(+), 1 deletion(-) create mode 100755 Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/nuttx/arch/arm/src/imxrt/imxrt_enet.c diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/netnsh/defconfig b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/netnsh/defconfig index b85c81a33..40dc3d0a9 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/netnsh/defconfig +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/netnsh/defconfig @@ -22,7 +22,8 @@ CONFIG_ARMV7M_USEBASEPRI=y CONFIG_BOARD_LOOPSPERMSEC=104926 CONFIG_BUILTIN=y CONFIG_CLOCK_MONOTONIC=y -CONFIG_ETH0_PHY_KSZ8081=y +CONFIG_ETH0_PHY_LAN8720=y +CONFIG_IMXRT_ENET_PHYINIT=y CONFIG_FS_PROCFS=y CONFIG_IDLETHREAD_STACKSIZE=2048 CONFIG_IMXRT_ENET=y diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/nuttx/arch/arm/src/imxrt/imxrt_enet.c b/Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/nuttx/arch/arm/src/imxrt/imxrt_enet.c new file mode 100755 index 000000000..8949a418a --- /dev/null +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/nuttx/arch/arm/src/imxrt/imxrt_enet.c @@ -0,0 +1,2654 @@ +/**************************************************************************** + * arch/arm/src/imxrt/imxrt_enet.c + * + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. The + * ASF licenses this file to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance with the + * License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT + * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the + * License for the specific language governing permissions and limitations + * under the License. + * + ****************************************************************************/ + +/**************************************************************************** + * Included Files + ****************************************************************************/ + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#ifdef CONFIG_NET_PKT +# include +#endif + +#include "arm_arch.h" +#include "chip.h" +#include "imxrt_config.h" +#include "hardware/imxrt_enet.h" +#include "hardware/imxrt_ccm.h" +#include "hardware/imxrt_pinmux.h" +#include "imxrt_periphclks.h" +#include "imxrt_gpio.h" +#include "imxrt_enet.h" + +#ifdef CONFIG_IMXRT_ENET + +/**************************************************************************** + * Pre-processor Definitions + ****************************************************************************/ + +/* If processing is not done at the interrupt level, then work queue support + * is required. + */ + +#if !defined(CONFIG_SCHED_WORKQUEUE) +# error Work queue support is required +#else + + /* Select work queue. Always use the LP work queue if available. If not, + * then LPWORK will re-direct to the HP work queue. + * + * NOTE: However, the network should NEVER run on the high priority work + * queue! That queue is intended only to service short back end interrupt + * processing that never suspends. Suspending the high priority work queue + * may bring the system to its knees! + */ + +# define ETHWORK LPWORK +#endif + +/* CONFIG_IMXRT_ENET_NETHIFS determines the number of physical interfaces + * that will be supported. + */ + +#if CONFIG_IMXRT_ENET_NETHIFS != 1 +# error "CONFIG_IMXRT_ENET_NETHIFS must be one for now" +#endif + +#if CONFIG_IMXRT_ENET_NTXBUFFERS < 1 +# error "Need at least one TX buffer" +#endif + +#if CONFIG_IMXRT_ENET_NRXBUFFERS < 1 +# error "Need at least one RX buffer" +#endif + +#define NENET_NBUFFERS \ + (CONFIG_IMXRT_ENET_NTXBUFFERS + CONFIG_IMXRT_ENET_NRXBUFFERS) + +/* Normally you would clean the cache after writing new values to the DMA + * memory so assure that the dirty cache lines are flushed to memory + * before the DMA occurs. And you would invalid the cache after a data is + * received via DMA so that you fetch the actual content of the data from + * the cache. + * + * These conditions are not fully supported here. If the write-throuch + * D-Cache is enabled, however, then many of these issues go away: The + * cache clean operation does nothing (because there are not dirty cache + * lines) and the cache invalid operation is innocuous (because there are + * never dirty cache lines to be lost; valid data will always be reloaded). + * + * At present, we simply insist that write through cache be enabled. + */ + +#if defined(CONFIG_ARMV7M_DCACHE) && !defined(CONFIG_ARMV7M_DCACHE_WRITETHROUGH) +# error Write back D-Cache not yet supported +#endif + +/* TX poll delay = 1 seconds. CLK_TCK is the number of clock ticks per + * second. + */ + +#define IMXRT_WDDELAY (1 * CLK_TCK) + +/* Align assuming that the D-Cache is enabled (probably 32-bytes). + * + * REVISIT: The size of descriptors and buffers must also be in even units + * of the cache line size That is because the operations to clean and + * invalidate the cache will operate on a full 32-byte cache line. If + * CONFIG_ENET_ENHANCEDBD is selected, then the size of the descriptor is + * 32-bytes (and probably already the correct size for the cache line); + * otherwise, the size of the descriptors much smaller, only 8 bytes. + */ + +#define ENET_ALIGN ARMV7M_DCACHE_LINESIZE +#define ENET_ALIGN_MASK (ENET_ALIGN - 1) +#define ENET_ALIGN_UP(n) (((n) + ENET_ALIGN_MASK) & ~ENET_ALIGN_MASK) + +/* TX timeout = 1 minute */ + +#define IMXRT_TXTIMEOUT (60 * CLK_TCK) +#define MII_MAXPOLLS (0x1ffff) +#define LINK_WAITUS (500 * 1000) +#define LINK_NLOOPS (10) + +/* PHY definitions. + * + * The selected PHY must be selected from the drivers/net/Kconfig PHY menu. + * A description of the PHY must be provided here. That description must + * include: + * + * 1. BOARD_PHY_NAME: A PHY name string (for debug output), + * 2. BOARD_PHYID1 and BOARD_PHYID2: The PHYID1 and PHYID2 values (from + * include/nuttx/net/mii.h) + * 3. BOARD_PHY_STATUS: The address of the status register to use when + * querying link status (from include/nuttx/net/mii.h) + * 4. BOARD_PHY_ADDRThe PHY broadcast address of 0 is selected. This + * should be fine as long as there is only a single PHY. + * 5. BOARD_PHY_10BASET: A macro that can convert the status register + * value into a boolean: true=10Base-T, false=Not 10Base-T + * 6. BOARD_PHY_100BASET: A macro that can convert the status register + * value into a boolean: true=100Base-T, false=Not 100Base-T + * 7. BOARD_PHY_ISDUPLEX: A macro that can convert the status register + * value into a boolean: true=duplex mode, false=half-duplex mode + * + * The imxrt1050-evk board uses a KSZ8081 PHY + * The Versiboard2 uses a LAN8720 PHY + * The Teensy-4.1 board uses a DP83825I PHY + * + * ...and further PHY descriptions here. + */ + +#if defined(CONFIG_ETH0_PHY_KSZ8081) +# define BOARD_PHY_NAME "KSZ8081" +# define BOARD_PHYID1 MII_PHYID1_KSZ8081 +# define BOARD_PHYID2 MII_PHYID2_KSZ8081 +# define BOARD_PHY_STATUS MII_KSZ8081_PHYCTRL1 +# define BOARD_PHY_ADDR (0) +# define BOARD_PHY_10BASET(s) (((s) & MII_PHYCTRL1_MODE_10HDX) != 0) +# define BOARD_PHY_100BASET(s) (((s) & MII_PHYCTRL1_MODE_100HDX) != 0) +# define BOARD_PHY_ISDUPLEX(s) (((s) & MII_PHYCTRL1_MODE_DUPLEX) != 0) +#elif defined(CONFIG_ETH0_PHY_LAN8720) +# define BOARD_PHY_NAME "LAN8720" +# define BOARD_PHYID1 MII_PHYID1_LAN8720 +# define BOARD_PHYID2 MII_PHYID2_LAN8720 +# define BOARD_PHY_STATUS MII_LAN8720_SCSR +# define BOARD_PHY_ADDR (0) //(1) +# define BOARD_PHY_10BASET(s) (((s)&MII_LAN8720_SPSCR_10MBPS) != 0) +# define BOARD_PHY_100BASET(s) (((s)&MII_LAN8720_SPSCR_100MBPS) != 0) +# define BOARD_PHY_ISDUPLEX(s) (((s)&MII_LAN8720_SPSCR_DUPLEX) != 0) +#elif defined(CONFIG_ETH0_PHY_DP83825I) +# define BOARD_PHY_NAME "DP83825I" +# define BOARD_PHYID1 MII_PHYID1_DP83825I +# define BOARD_PHYID2 MII_PHYID2_DP83825I +# define BOARD_PHY_STATUS MII_DP83825I_PHYSTS +# define BOARD_PHY_ADDR (0) +# define BOARD_PHY_10BASET(s) (((s) & MII_DP83825I_PHYSTS_SPEED) != 0) +# define BOARD_PHY_100BASET(s) (((s) & MII_DP83825I_PHYSTS_SPEED) == 0) +# define BOARD_PHY_ISDUPLEX(s) (((s) & MII_DP83825I_PHYSTS_DUPLEX) != 0) +#else +# error "Unrecognized or missing PHY selection" +#endif + +/* Estimate the MII_SPEED in order to get an MDC close to 2.5MHz, + * based on the internal module (ENET) clock: + * + * MII_SPEED = ENET_FREQ/5000000 -1 + * + * For example, if ENET_FREQ_MHZ=120 (MHz): + * + * MII_SPEED = 120000000/5000000 -1 + * = 23 + */ + +#define IMXRT_MII_SPEED 0x38 /* 100Mbs. Revisit and remove hardcoded value */ +#if IMXRT_MII_SPEED > 63 +# error "IMXRT_MII_SPEED is out-of-range" +#endif + +/* Interrupt groups */ + +#define RX_INTERRUPTS (ENET_INT_RXF | ENET_INT_RXB) +#define TX_INTERRUPTS ENET_INT_TXF +#define ERROR_INTERRUPTS (ENET_INT_UN | ENET_INT_RL | ENET_INT_LC | \ + ENET_INT_EBERR | ENET_INT_BABT | ENET_INT_BABR) + +/* The subset of errors that require us to reset the hardware - this list + * may need to be revisited if it's found that some error above leads to a + * locking up of the Ethernet interface. + */ + +#define CRITICAL_ERROR (ENET_INT_UN | ENET_INT_RL | ENET_INT_EBERR) + +/* This is a helper pointer for accessing + * the contents of the Ethernet header + */ + +#define BUF ((struct eth_hdr_s *)priv->dev.d_buf) + +#define IMXRT_BUF_SIZE ENET_ALIGN_UP(CONFIG_NET_ETH_PKTSIZE + \ + CONFIG_NET_GUARDSIZE) + +/**************************************************************************** + * Private Types + ****************************************************************************/ + +/* The imxrt_driver_s encapsulates all state information for + * a single hardware interface + */ + +struct imxrt_driver_s +{ + bool bifup; /* true:ifup false:ifdown */ + uint8_t txtail; /* The oldest busy TX descriptor */ + uint8_t txhead; /* The next TX descriptor to use */ + uint8_t rxtail; /* The next RX descriptor to use */ + uint8_t phyaddr; /* Selected PHY address */ + struct wdog_s txpoll; /* TX poll timer */ + struct wdog_s txtimeout; /* TX timeout timer */ + struct work_s irqwork; /* For deferring interrupt work to the work queue */ + struct work_s pollwork; /* For deferring poll work to the work queue */ + struct enet_desc_s *txdesc; /* A pointer to the list of TX descriptor */ + struct enet_desc_s *rxdesc; /* A pointer to the list of RX descriptors */ + + /* This holds the information visible to the NuttX network */ + + struct net_driver_s dev; /* Interface understood by the network */ +}; + +/**************************************************************************** + * Private Data + ****************************************************************************/ + +static struct imxrt_driver_s g_enet[CONFIG_IMXRT_ENET_NETHIFS]; + +/* The DMA descriptors. A unaligned uint8_t is used to allocate the + * memory; 16 is added to assure that we can meet the descriptor alignment + * requirements. + */ + +static uint8_t g_desc_pool[NENET_NBUFFERS * sizeof(struct enet_desc_s)] + aligned_data(ENET_ALIGN); + +/* The DMA buffers. Again, A unaligned uint8_t is used to allocate the + * memory; 16 is added to assure that we can meet the descriptor alignment + * requirements. + */ + +static uint8_t g_buffer_pool[NENET_NBUFFERS * IMXRT_BUF_SIZE] + aligned_data(ENET_ALIGN); + +/**************************************************************************** + * Private Function Prototypes + ****************************************************************************/ + +/* Utility functions */ + +#ifndef IMXRT_BUFFERS_SWAP +# define imxrt_swap32(value) (value) +# define imxrt_swap16(value) (value) +#else +#if 0 /* Use builtins if the compiler supports them */ +static inline uint32_t imxrt_swap32(uint32_t value); +static inline uint16_t imxrt_swap16(uint16_t value); +#else +# define imxrt_swap32 __builtin_bswap32 +# define imxrt_swap16 __builtin_bswap16 +#endif +#endif + +/* Common TX logic */ + +static bool imxrt_txringfull(FAR struct imxrt_driver_s *priv); +static int imxrt_transmit(FAR struct imxrt_driver_s *priv); +static int imxrt_txpoll(struct net_driver_s *dev); + +/* Interrupt handling */ + +static void imxrt_dispatch(FAR struct imxrt_driver_s *priv); +static void imxrt_receive(FAR struct imxrt_driver_s *priv); +static void imxrt_txdone(FAR struct imxrt_driver_s *priv); + +static void imxrt_enet_interrupt_work(FAR void *arg); +static int imxrt_enet_interrupt(int irq, FAR void *context, FAR void *arg); + +/* Watchdog timer expirations */ + +static void imxrt_txtimeout_work(FAR void *arg); +static void imxrt_txtimeout_expiry(wdparm_t arg); + +static void imxrt_poll_work(FAR void *arg); +static void imxrt_polltimer_expiry(wdparm_t arg); + +/* NuttX callback functions */ + +static int imxrt_ifup(struct net_driver_s *dev); +static int imxrt_ifdown(struct net_driver_s *dev); + +static void imxrt_txavail_work(FAR void *arg); +static int imxrt_txavail(struct net_driver_s *dev); + +/* Internal ifup function that allows phy reset to be optional */ + +static int imxrt_ifup_action(struct net_driver_s *dev, bool resetphy); + +#ifdef CONFIG_NET_MCASTGROUP +static int imxrt_addmac(struct net_driver_s *dev, + FAR const uint8_t *mac); +static int imxrt_rmmac(struct net_driver_s *dev, FAR const uint8_t *mac); +#endif + +#ifdef CONFIG_NETDEV_IOCTL +static int imxrt_ioctl(struct net_driver_s *dev, int cmd, + unsigned long arg); +#endif + +/* PHY/MII support */ + +#if defined(CONFIG_NETDEV_PHY_IOCTL) && defined(CONFIG_ARCH_PHY_INTERRUPT) +static int imxrt_phyintenable(struct imxrt_driver_s *priv); +#endif +static inline void imxrt_initmii(struct imxrt_driver_s *priv); +static int imxrt_writemii(struct imxrt_driver_s *priv, uint8_t phyaddr, + uint8_t regaddr, uint16_t data); +static int imxrt_readmii(struct imxrt_driver_s *priv, uint8_t phyaddr, + uint8_t regaddr, uint16_t *data); +static int imxrt_initphy(struct imxrt_driver_s *priv, bool renogphy); + +/* Initialization */ + +static void imxrt_initbuffers(struct imxrt_driver_s *priv); +static void imxrt_reset(struct imxrt_driver_s *priv); + +/**************************************************************************** + * Private Functions + ****************************************************************************/ + +/**************************************************************************** + * Function: imxrt_swap16/32 + * + * Description: + * The descriptors are represented by structures Unfortunately, when the + * structures are overlaid on the data, the bytes are reversed because + * the underlying hardware writes the data in big-endian byte order. + * + * Input Parameters: + * value - The value to be byte swapped + * + * Returned Value: + * The byte swapped value + * + ****************************************************************************/ + +#if 0 /* Use builtins if the compiler supports them */ +#ifndef CONFIG_ENDIAN_BIG +static inline uint32_t imxrt_swap32(uint32_t value) +{ + uint32_t result = 0; + + __asm__ __volatile__ + ( + "rev %0, %1" + :"=r" (result) + : "r"(value) + ); + return result; +} + +static inline uint16_t imxrt_swap16(uint16_t value) +{ + uint16_t result = 0; + + __asm__ __volatile__ + ( + "revsh %0, %1" + :"=r" (result) + : "r"(value) + ); + return result; +} +#endif +#endif + +/**************************************************************************** + * Function: imxrt_txringfull + * + * Description: + * Check if all of the TX descriptors are in use. + * + * Input Parameters: + * priv - Reference to the driver state structure + * + * Returned Value: + * true is the TX ring is full; false if there are free slots at the + * head index. + * + ****************************************************************************/ + +static bool imxrt_txringfull(FAR struct imxrt_driver_s *priv) +{ + uint8_t txnext; + + /* Check if there is room in the hardware to hold another outgoing + * packet. The ring is full if incrementing the head pointer would + * collide with the tail pointer. + */ + + txnext = priv->txhead + 1; + if (txnext >= CONFIG_IMXRT_ENET_NTXBUFFERS) + { + txnext = 0; + } + + return priv->txtail == txnext; +} + +/**************************************************************************** + * Function: imxrt_transmit + * + * Description: + * Start hardware transmission. Called either from the txdone interrupt + * handling or from watchdog based polling. + * + * Input Parameters: + * priv - Reference to the driver state structure + * + * Returned Value: + * OK on success; a negated errno on failure + * + * Assumptions: + * May or may not be called from an interrupt handler. In either case, + * global interrupts are disabled, either explicitly or indirectly through + * interrupt handling logic. + * + ****************************************************************************/ + +static int imxrt_transmit(FAR struct imxrt_driver_s *priv) +{ + struct enet_desc_s *txdesc; + irqstate_t flags; + uint32_t regval; + uint8_t *buf; + + /* Since this can be called from imxrt_receive, it is possible that + * the transmit queue is full, so check for that now. If this is the + * case, the outgoing packet will be dropped (e.g. an ARP reply) + */ + + if (imxrt_txringfull(priv)) + { + return -EBUSY; + } + + /* When we get here the TX descriptor should show that the previous + * transfer has completed. If we get here, then we are committed to + * sending a packet; Higher level logic must have assured that there is + * no transmission in progress. + */ + + txdesc = &priv->txdesc[priv->txhead]; + priv->txhead++; + if (priv->txhead >= CONFIG_IMXRT_ENET_NTXBUFFERS) + { + priv->txhead = 0; + } + +#ifdef CONFIG_DEBUG_ASSERTIONS + up_invalidate_dcache((uintptr_t)txdesc, + (uintptr_t)txdesc + sizeof(struct enet_desc_s)); + + DEBUGASSERT(priv->txtail != priv->txhead && + (txdesc->status1 & TXDESC_R) == 0); +#endif + + /* Increment statistics */ + + NETDEV_TXPACKETS(&priv->dev); + + /* Setup the buffer descriptor for transmission: address=priv->dev.d_buf, + * length=priv->dev.d_len + */ + + txdesc->length = imxrt_swap16(priv->dev.d_len); +#ifdef CONFIG_IMXRT_ENETENHANCEDBD + txdesc->bdu = 0x00000000; + txdesc->status2 = TXDESC_INT | TXDESC_TS; /* | TXDESC_IINS | TXDESC_PINS; */ +#endif + txdesc->status1 |= (TXDESC_R | TXDESC_L | TXDESC_TC); + + buf = (uint8_t *)imxrt_swap32((uint32_t)priv->dev.d_buf); + if (priv->rxdesc[priv->rxtail].data == buf) + { + struct enet_desc_s *rxdesc = &priv->rxdesc[priv->rxtail]; + + /* Data was written into the RX buffer, so swap the TX and RX buffers */ + + DEBUGASSERT((rxdesc->status1 & RXDESC_E) == 0); + rxdesc->data = txdesc->data; + txdesc->data = buf; + } + else + { + DEBUGASSERT(txdesc->data == buf); + } + + /* Make the following operations atomic */ + + flags = spin_lock_irqsave(NULL); + + /* Enable TX interrupts */ + + regval = getreg32(IMXRT_ENET_EIMR); + regval |= TX_INTERRUPTS; + putreg32(regval, IMXRT_ENET_EIMR); + + /* Setup the TX timeout watchdog (perhaps restarting the timer) */ + + wd_start(&priv->txtimeout, IMXRT_TXTIMEOUT, + imxrt_txtimeout_expiry, (wdparm_t)priv); + + /* Start the TX transfer (if it was not already waiting for buffers) */ + + putreg32(ENET_TDAR, IMXRT_ENET_TDAR); + + spin_unlock_irqrestore(NULL, flags); + return OK; +} + +/**************************************************************************** + * Function: imxrt_txpoll + * + * Description: + * The transmitter is available, check if the network has any outgoing + * packets ready to send. This is a callback from devif_poll(). + * devif_poll() may be called: + * + * 1. When the preceding TX packet send is complete, + * 2. When the preceding TX packet send timesout and the interface is reset + * 3. During normal TX polling + * + * Input Parameters: + * dev - Reference to the NuttX driver state structure + * + * Returned Value: + * OK on success; a negated errno on failure + * + * Assumptions: + * May or may not be called from an interrupt handler. In either case, + * global interrupts are disabled, either explicitly or indirectly through + * interrupt handling logic. + * + ****************************************************************************/ + +static int imxrt_txpoll(struct net_driver_s *dev) +{ + FAR struct imxrt_driver_s *priv = + (FAR struct imxrt_driver_s *)dev->d_private; + + /* If the polling resulted in data that should be sent out on the network, + * the field d_len is set to a value > 0. + */ + + if (priv->dev.d_len > 0) + { + /* Look up the destination MAC address and add it to the Ethernet + * header. + */ + +#ifdef CONFIG_NET_IPv4 +#ifdef CONFIG_NET_IPv6 + if (IFF_IS_IPv4(priv->dev.d_flags)) +#endif + { + arp_out(&priv->dev); + } +#endif /* CONFIG_NET_IPv4 */ + +#ifdef CONFIG_NET_IPv6 +#ifdef CONFIG_NET_IPv4 + else +#endif + { + neighbor_out(&priv->dev); + } +#endif /* CONFIG_NET_IPv6 */ + + if (!devif_loopback(&priv->dev)) + { + /* Send the packet */ + + imxrt_transmit(priv); + priv->dev.d_buf = (uint8_t *) + imxrt_swap32((uint32_t)priv->txdesc[priv->txhead].data); + + /* Check if there is room in the device to hold another packet. If + * not, return a non-zero value to terminate the poll. + */ + + if (imxrt_txringfull(priv)) + { + return -EBUSY; + } + } + } + + /* If zero is returned, the polling will continue until + * all connections have been examined. + */ + + return 0; +} + +/**************************************************************************** + * Function: imxrt_dispatch + * + * Description: + * A new Rx packet was received; dispatch that packet to the network layer + * as necessary. + * + * Input Parameters: + * priv - Reference to the driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * Global interrupts are disabled by interrupt handling logic. + * + ****************************************************************************/ + +static inline void imxrt_dispatch(FAR struct imxrt_driver_s *priv) +{ + /* Update statistics */ + + NETDEV_RXPACKETS(&priv->dev); + +#ifdef CONFIG_NET_PKT + /* When packet sockets are enabled, feed the frame into the tap */ + + pkt_input(&priv->dev); +#endif + +#ifdef CONFIG_NET_IPv4 + /* Check for an IPv4 packet */ + + if (BUF->type == HTONS(ETHTYPE_IP)) + { + ninfo("IPv4 frame\n"); + NETDEV_RXIPV4(&priv->dev); + + /* Handle ARP on input then give the IPv4 packet to the network + * layer + */ + + arp_ipin(&priv->dev); + ipv4_input(&priv->dev); + + /* If the above function invocation resulted in data that should be + * sent out on the network, d_len field will set to a value > 0. + */ + + if (priv->dev.d_len > 0) + { + /* Update the Ethernet header with the correct MAC address */ + +#ifdef CONFIG_NET_IPv6 + if (IFF_IS_IPv4(priv->dev.d_flags)) +#endif + { + arp_out(&priv->dev); + } +#ifdef CONFIG_NET_IPv6 + else + { + neighbor_out(&priv->dev); + } +#endif + + /* And send the packet */ + + imxrt_transmit(priv); + } + } + else +#endif +#ifdef CONFIG_NET_IPv6 + /* Check for an IPv6 packet */ + + if (BUF->type == HTONS(ETHTYPE_IP6)) + { + ninfo("IPv6 frame\n"); + NETDEV_RXIPV6(&priv->dev); + + /* Give the IPv6 packet to the network layer */ + + ipv6_input(&priv->dev); + + /* If the above function invocation resulted in data that should be + * sent out on the network, d_len field will set to a value > 0. + */ + + if (priv->dev.d_len > 0) + { + /* Update the Ethernet header with the correct MAC address */ + +#ifdef CONFIG_NET_IPv4 + if (IFF_IS_IPv4(priv->dev.d_flags)) + { + arp_out(&priv->dev); + } + else +#endif +#ifdef CONFIG_NET_IPv6 + { + neighbor_out(&priv->dev); + } +#endif + + /* And send the packet */ + + imxrt_transmit(priv); + } + } + else +#endif +#ifdef CONFIG_NET_ARP + /* Check for an ARP packet */ + + if (BUF->type == htons(ETHTYPE_ARP)) + { + NETDEV_RXARP(&priv->dev); + arp_arpin(&priv->dev); + + /* If the above function invocation resulted in data that should + * be sent out on the network, the field d_len will set to a + * value > 0. + */ + + if (priv->dev.d_len > 0) + { + imxrt_transmit(priv); + } + } +#endif + else + { + NETDEV_RXDROPPED(&priv->dev); + } +} + +/**************************************************************************** + * Function: imxrt_receive + * + * Description: + * An interrupt was received indicating the availability of a new RX packet + * + * Input Parameters: + * priv - Reference to the driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * Global interrupts are disabled by interrupt handling logic. + * + ****************************************************************************/ + +static void imxrt_receive(FAR struct imxrt_driver_s *priv) +{ + struct enet_desc_s *rxdesc; + bool received; + + /* Loop while there are received packets to be processed */ + + do + { + /* Invalidate the Rx descriptor. Since it has been modified via DMA, + * we must assure that we must invalid any cached values and re-read + * the descriptor from the memory. + */ + + rxdesc = &priv->rxdesc[priv->rxtail]; + up_invalidate_dcache((uintptr_t)rxdesc, + (uintptr_t)rxdesc + sizeof(struct enet_desc_s)); + + /* Check if the data buffer associated with the descriptor has + * been filled with valid data. + */ + + received = ((rxdesc->status1 & RXDESC_E) == 0); + if (received) + { + /* Copy the buffer pointer to priv->dev.d_buf. Set amount of data + * in priv->dev.d_len + */ + + priv->dev.d_len = imxrt_swap16(rxdesc->length); + priv->dev.d_buf = (uint8_t *)imxrt_swap32((uint32_t)rxdesc->data); + + /* Invalidate the buffer so that the correct packet will be re-read + * from memory when the packet content is accessed. + */ + + up_invalidate_dcache((uintptr_t)priv->dev.d_buf, + (uintptr_t)priv->dev.d_buf + priv->dev.d_len); + + /* Dispatch (or drop) the newly received packet */ + + imxrt_dispatch(priv); + + /* Point the packet buffer back to the next Tx buffer that will be + * used during the next write. If the write queue is full, then + * this will point at an active buffer, which must not be written + * to. This is OK because devif_poll won't be called unless the + * queue is not full. + */ + + priv->dev.d_buf = (uint8_t *) + imxrt_swap32((uint32_t)priv->txdesc[priv->txhead].data); + rxdesc->status1 |= RXDESC_E; + + /* Update the index to the next descriptor */ + + priv->rxtail++; + if (priv->rxtail >= CONFIG_IMXRT_ENET_NRXBUFFERS) + { + priv->rxtail = 0; + } + + /* Indicate that there have been empty receive buffers produced */ + + putreg32(ENET_RDAR, IMXRT_ENET_RDAR); + } + } + while (received); +} + +/**************************************************************************** + * Function: imxrt_txdone + * + * Description: + * An interrupt was received indicating that the last TX packet(s) is done + * + * Input Parameters: + * priv - Reference to the driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * Global interrupts are disabled by the watchdog logic. + * The network is locked. + * + ****************************************************************************/ + +static void imxrt_txdone(FAR struct imxrt_driver_s *priv) +{ + struct enet_desc_s *txdesc; + uint32_t regval; + bool txdone; + + /* We are here because a transmission completed, so the watchdog can be + * canceled. + */ + + wd_cancel(&priv->txtimeout); + + /* Verify that the oldest descriptor descriptor completed */ + + do + { + /* Invalidate the Tx descriptor. Since status information has been + * modified via DMA, we must assure that we must invalid any cached + * values and re-read the descriptor from the memory. + */ + + txdesc = &priv->txdesc[priv->txtail]; + up_invalidate_dcache((uintptr_t)txdesc, + (uintptr_t)txdesc + sizeof(struct enet_desc_s)); + + txdone = false; + if ((txdesc->status1 & TXDESC_R) == 0 && priv->txtail != priv->txhead) + { + /* Yes.. bump up the tail pointer, making space for a new TX + * descriptor. + */ + + priv->txtail++; + if (priv->txtail >= CONFIG_IMXRT_ENET_NTXBUFFERS) + { + priv->txtail = 0; + } + + /* Update statistics */ + + NETDEV_TXDONE(&priv->dev); + txdone = true; + } + } + while (txdone); + + /* Are there other transmissions queued? */ + + if (priv->txtail == priv->txhead) + { + /* No.. Cancel the TX timeout and disable further Tx interrupts. */ + + wd_cancel(&priv->txtimeout); + + regval = getreg32(IMXRT_ENET_EIMR); + regval &= ~TX_INTERRUPTS; + putreg32(regval, IMXRT_ENET_EIMR); + } + + /* There should be space for a new TX in any event. Poll the network for + * new XMIT data + */ + + devif_poll(&priv->dev, imxrt_txpoll); +} + +/**************************************************************************** + * Function: imxrt_enet_interrupt_work + * + * Description: + * Perform interrupt related work from the worker thread + * + * Input Parameters: + * arg - The argument passed when work_queue() was called. + * + * Returned Value: + * OK on success + * + * Assumptions: + * The network is locked. + * + ****************************************************************************/ + +static void imxrt_enet_interrupt_work(FAR void *arg) +{ + FAR struct imxrt_driver_s *priv = (FAR struct imxrt_driver_s *)arg; + uint32_t pending; +#ifdef CONFIG_NET_MCASTGROUP + uint32_t gaurstore; + uint32_t galrstore; +#endif + + /* Process pending Ethernet interrupts */ + + net_lock(); + + /* Get the set of unmasked, pending interrupt. */ + + pending = getreg32(IMXRT_ENET_EIR) & getreg32(IMXRT_ENET_EIMR); + + /* Clear the pending interrupts */ + + putreg32(pending, IMXRT_ENET_EIR); + + /* Check for errors */ + + if (pending & ERROR_INTERRUPTS) + { + /* An error has occurred, update statistics */ + + NETDEV_ERRORS(&priv->dev); + + nerr("ERROR: Network interface error occurred (0x%08" PRIX32 ")\n", + (pending & ERROR_INTERRUPTS)); + } + + if (pending & CRITICAL_ERROR) + { + nerr("Critical error, restarting Ethernet interface\n"); + + /* Bring the Ethernet chip down and back up but with no need to + * reset/renegotiate the phy. + */ + +#ifdef CONFIG_NET_MCASTGROUP + /* Just before we pull the rug lets make sure we retain the + * multicast hash table. + */ + + gaurstore = getreg32(IMXRT_ENET_GAUR); + galrstore = getreg32(IMXRT_ENET_GALR); +#endif + + imxrt_ifdown(&priv->dev); + imxrt_ifup_action(&priv->dev, false); + +#ifdef CONFIG_NET_MCASTGROUP + /* Now write the multicast table back */ + + putreg32(gaurstore, IMXRT_ENET_GAUR); + putreg32(galrstore, IMXRT_ENET_GALR); +#endif + + /* Then poll the network for new XMIT data */ + + devif_poll(&priv->dev, imxrt_txpoll); + } + else + { + /* Check for the receipt of a packet */ + + if ((pending & ENET_INT_RXF) != 0) + { + /* A packet has been received, call imxrt_receive() to handle the + * packet. + */ + + imxrt_receive(priv); + } + + /* Check if a packet transmission has completed */ + + if ((pending & ENET_INT_TXF) != 0) + { + /* Call imxrt_txdone to handle the end of transfer even. NOTE + * that this may disable further Tx interrupts if there are no + * pending transmissions. + */ + + imxrt_txdone(priv); + } + } + + net_unlock(); + + /* Re-enable Ethernet interrupts */ + +#if 0 + up_enable_irq(IMXRT_IRQ_EMACTMR); +#endif + up_enable_irq(IMXRT_IRQ_ENET); +} + +/**************************************************************************** + * Function: imxrt_enet_interrupt + * + * Description: + * Three interrupt sources will vector to this function: + * 1. Ethernet MAC transmit interrupt handler + * 2. Ethernet MAC receive interrupt handler + * 3. + * + * Input Parameters: + * irq - Number of the IRQ that generated the interrupt + * context - Interrupt register state save info (architecture-specific) + * + * Returned Value: + * OK on success + * + * Assumptions: + * + ****************************************************************************/ + +static int imxrt_enet_interrupt(int irq, FAR void *context, FAR void *arg) +{ + register FAR struct imxrt_driver_s *priv = &g_enet[0]; + + /* Disable further Ethernet interrupts. Because Ethernet interrupts are + * also disabled if the TX timeout event occurs, there can be no race + * condition here. + */ + + up_disable_irq(IMXRT_IRQ_ENET); + + /* Schedule to perform the interrupt processing on the worker thread. */ + + work_queue(ETHWORK, &priv->irqwork, imxrt_enet_interrupt_work, priv, 0); + return OK; +} + +/**************************************************************************** + * Function: imxrt_txtimeout_work + * + * Description: + * Perform TX timeout related work from the worker thread + * + * Input Parameters: + * arg - The argument passed when work_queue() as called. + * + * Returned Value: + * OK on success + * + * Assumptions: + * + ****************************************************************************/ + +static void imxrt_txtimeout_work(FAR void *arg) +{ + FAR struct imxrt_driver_s *priv = (FAR struct imxrt_driver_s *)arg; + + /* Increment statistics and dump debug info */ + + net_lock(); + nerr("Resetting interface\n"); + + NETDEV_TXTIMEOUTS(&priv->dev); + + /* Take the interface down and bring it back up. That is the most + * aggressive hardware reset. + */ + + imxrt_ifdown(&priv->dev); + imxrt_ifup_action(&priv->dev, false); + + /* Then poll the network for new XMIT data */ + + devif_poll(&priv->dev, imxrt_txpoll); + net_unlock(); +} + +/**************************************************************************** + * Function: imxrt_txtimeout_expiry + * + * Description: + * Our TX watchdog timed out. Called from the timer interrupt handler. + * The last TX never completed. Reset the hardware and start again. + * + * Input Parameters: + * arg - The argument + * + * Returned Value: + * None + * + * Assumptions: + * Global interrupts are disabled by the watchdog logic. + * + ****************************************************************************/ + +static void imxrt_txtimeout_expiry(wdparm_t arg) +{ + FAR struct imxrt_driver_s *priv = (FAR struct imxrt_driver_s *)arg; + + /* Disable further Ethernet interrupts. This will prevent some race + * conditions with interrupt work. There is still a potential race + * condition with interrupt work that is already queued and in progress. + */ + + up_disable_irq(IMXRT_IRQ_ENET); + + /* Schedule to perform the TX timeout processing on the worker thread, + * canceling any pending interrupt work. + */ + + work_queue(ETHWORK, &priv->irqwork, imxrt_txtimeout_work, priv, 0); +} + +/**************************************************************************** + * Function: imxrt_poll_work + * + * Description: + * Perform periodic polling from the worker thread + * + * Input Parameters: + * arg - The argument passed when work_queue() as called. + * + * Returned Value: + * OK on success + * + * Assumptions: + * The network is locked. + * + ****************************************************************************/ + +static void imxrt_poll_work(FAR void *arg) +{ + FAR struct imxrt_driver_s *priv = (FAR struct imxrt_driver_s *)arg; + + /* Check if there is there is a transmission in progress. + * We cannot perform the TX poll if he are unable to accept + * another packet for transmission. + */ + + net_lock(); + if (!imxrt_txringfull(priv)) + { + /* If so, update TCP timing states and poll the network for new XMIT + * data. Hmmm.. might be bug here. Does this mean if there is a + * transmit in progress, we will missing TCP time state updates? + */ + + devif_timer(&priv->dev, IMXRT_WDDELAY, imxrt_txpoll); + } + + /* Setup the watchdog poll timer again in any case */ + + wd_start(&priv->txpoll, IMXRT_WDDELAY, + imxrt_polltimer_expiry, (wdparm_t)priv); + net_unlock(); +} + +/**************************************************************************** + * Function: imxrt_polltimer_expiry + * + * Description: + * Periodic timer handler. Called from the timer interrupt handler. + * + * Input Parameters: + * arg - The argument + * + * Returned Value: + * None + * + * Assumptions: + * Global interrupts are disabled by the watchdog logic. + * + ****************************************************************************/ + +static void imxrt_polltimer_expiry(wdparm_t arg) +{ + FAR struct imxrt_driver_s *priv = (FAR struct imxrt_driver_s *)arg; + + /* Schedule to perform the poll processing on the worker thread. */ + + work_queue(ETHWORK, &priv->pollwork, imxrt_poll_work, priv, 0); +} + +/**************************************************************************** + * Function: imxrt_ifup_action + * + * Description: + * Internal action routine to bring up the Ethernet interface + * which makes the resetting of the phy (which takes considerable time) + * optional. + * + * Input Parameters: + * dev - Reference to the NuttX driver state structure + * resetphy - Flag indicating if Phy is to be reset. If not then the + * phy configuration is just re-loaded into the ethernet + * interface + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +static int imxrt_ifup_action(struct net_driver_s *dev, bool resetphy) +{ + FAR struct imxrt_driver_s *priv = + (FAR struct imxrt_driver_s *)dev->d_private; + uint8_t *mac = dev->d_mac.ether.ether_addr_octet; + uint32_t regval; + int ret; + + ninfo("Bringing up: %d.%d.%d.%d\n", + (int)(dev->d_ipaddr & 0xff), + (int)((dev->d_ipaddr >> 8) & 0xff), + (int)((dev->d_ipaddr >> 16) & 0xff), + (int)(dev->d_ipaddr >> 24)); + + /* Initialize ENET buffers */ + + imxrt_initbuffers(priv); + + /* Configure the MII interface */ + + imxrt_initmii(priv); + + /* Set the MAC address */ + + putreg32((mac[0] << 24) | (mac[1] << 16) | (mac[2] << 8) | mac[3], + IMXRT_ENET_PALR); + putreg32((mac[4] << 24) | (mac[5] << 16), IMXRT_ENET_PAUR); + + /* Configure the PHY */ + + ret = imxrt_initphy(priv, resetphy); + if (ret < 0) + { + nerr("ERROR: Failed to configure the PHY: %d\n", ret); + return ret; + } + + /* Handle promiscuous mode */ + +#ifdef CONFIG_NET_PROMISCUOUS + regval = getreg32(IMXRT_ENET_RCR); + regval |= ENET_RCR_PROM; + putreg32(regval, IMXRT_ENET_RCR); +#endif + + /* Select legacy of enhanced buffer descriptor format */ + +#ifdef CONFIG_IMXRT_ENETENHANCEDBD + putreg32(ENET_ECR_EN1588, IMXRT_ENET_ECR); +#else + putreg32(0, IMXRT_ENET_ECR); +#endif + + /* Set the RX buffer size */ + + putreg32(IMXRT_BUF_SIZE, IMXRT_ENET_MRBR); + + /* Point to the start of the circular RX buffer descriptor queue */ + + putreg32((uint32_t)priv->rxdesc, IMXRT_ENET_RDSR); + + /* Point to the start of the circular TX buffer descriptor queue */ + + putreg32((uint32_t)priv->txdesc, IMXRT_ENET_TDSR); + + /* And enable the MAC itself */ + + regval = getreg32(IMXRT_ENET_ECR); + regval |= ENET_ECR_ETHEREN +#ifdef IMXRT_USE_DBSWAP + | ENET_ECR_DBSWP +#endif + ; + putreg32(regval, IMXRT_ENET_ECR); + + /* Indicate that there have been empty receive buffers produced */ + + putreg32(ENET_RDAR, IMXRT_ENET_RDAR); + + /* Set and activate a timer process */ + + wd_start(&priv->txpoll, IMXRT_WDDELAY, + imxrt_polltimer_expiry, (wdparm_t)priv); + + /* Clear all pending ENET interrupt */ + + putreg32(RX_INTERRUPTS | ERROR_INTERRUPTS | TX_INTERRUPTS, IMXRT_ENET_EIR); + + /* Enable RX and error interrupts at the controller (TX interrupts are + * still disabled). + */ + + putreg32(RX_INTERRUPTS | ERROR_INTERRUPTS, + IMXRT_ENET_EIMR); + + /* Mark the interrupt "up" and enable interrupts at the NVIC */ + + priv->bifup = true; + +#if 0 + up_enable_irq(IMXRT_IRQ_EMACTMR); +#endif + up_enable_irq(IMXRT_IRQ_ENET); + + return OK; +} + +/**************************************************************************** + * Function: imxrt_ifup + * + * Description: + * NuttX Callback: Bring up the Ethernet interface when an IP address is + * provided + * + * Input Parameters: + * dev - Reference to the NuttX driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +static int imxrt_ifup(struct net_driver_s *dev) +{ + /* The externally available ifup action includes resetting the phy */ + + return imxrt_ifup_action(dev, true); +} + +/**************************************************************************** + * Function: imxrt_ifdown + * + * Description: + * NuttX Callback: Stop the interface. + * + * Input Parameters: + * dev - Reference to the NuttX driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +static int imxrt_ifdown(struct net_driver_s *dev) +{ + FAR struct imxrt_driver_s *priv = + (FAR struct imxrt_driver_s *)dev->d_private; + irqstate_t flags; + + ninfo("Taking down: %d.%d.%d.%d\n", + (int)(dev->d_ipaddr & 0xff), + (int)((dev->d_ipaddr >> 8) & 0xff), + (int)((dev->d_ipaddr >> 16) & 0xff), + (int)(dev->d_ipaddr >> 24)); + + /* Flush and disable the Ethernet interrupts at the NVIC */ + + flags = enter_critical_section(); + + up_disable_irq(IMXRT_IRQ_ENET); + putreg32(0, IMXRT_ENET_EIMR); + + /* Cancel the TX poll timer and TX timeout timers */ + + wd_cancel(&priv->txpoll); + wd_cancel(&priv->txtimeout); + + /* Put the EMAC in its reset, non-operational state. This should be + * a known configuration that will guarantee the imxrt_ifup() always + * successfully brings the interface back up. + */ + + imxrt_reset(priv); + + /* Mark the device "down" */ + + priv->bifup = false; + leave_critical_section(flags); + return OK; +} + +/**************************************************************************** + * Function: imxrt_txavail_work + * + * Description: + * Perform an out-of-cycle poll on the worker thread. + * + * Input Parameters: + * arg - Reference to the NuttX driver state structure (cast to void*) + * + * Returned Value: + * None + * + * Assumptions: + * Called on the higher priority worker thread. + * + ****************************************************************************/ + +static void imxrt_txavail_work(FAR void *arg) +{ + FAR struct imxrt_driver_s *priv = (FAR struct imxrt_driver_s *)arg; + + /* Ignore the notification if the interface is not yet up */ + + net_lock(); + if (priv->bifup) + { + /* Check if there is room in the hardware to hold another outgoing + * packet. + */ + + if (!imxrt_txringfull(priv)) + { + /* No, there is space for another transfer. Poll the network for + * new XMIT data. + */ + + devif_timer(&priv->dev, 0, imxrt_txpoll); + } + } + + net_unlock(); +} + +/**************************************************************************** + * Function: imxrt_txavail + * + * Description: + * Driver callback invoked when new TX data is available. This is a + * stimulus perform an out-of-cycle poll and, thereby, reduce the TX + * latency. + * + * Input Parameters: + * dev - Reference to the NuttX driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * Called in normal user mode + * + ****************************************************************************/ + +static int imxrt_txavail(struct net_driver_s *dev) +{ + FAR struct imxrt_driver_s *priv = + (FAR struct imxrt_driver_s *)dev->d_private; + + /* Is our single work structure available? It may not be if there are + * pending interrupt actions and we will have to ignore the Tx + * availability action. + */ + + if (work_available(&priv->pollwork)) + { + /* Schedule to serialize the poll on the worker thread. */ + + work_queue(ETHWORK, &priv->pollwork, imxrt_txavail_work, priv, 0); + } + + return OK; +} + +/**************************************************************************** + * Function: imxrt_calcethcrc + * + * Description: + * Function to calculate the CRC used by IMXRT to check an Ethernet frame + * + * Input Parameters: + * data - the data to be checked + * length - length of the data + * + * Returned Value: + * crc32 + * + * Assumptions: + * + ****************************************************************************/ + +#ifdef CONFIG_NET_MCASTGROUP +static uint32_t imxrt_calcethcrc(const uint8_t *data, size_t length) +{ + uint32_t crc = 0xffffffffu; + uint32_t count1 = 0; + uint32_t count2 = 0; + + /* Calculates the CRC-32 polynomial on the multicast group address. */ + + for (count1 = 0; count1 < length; count1++) + { + uint8_t c = data[count1]; + + for (count2 = 0; count2 < 0x08u; count2++) + { + if ((c ^ crc) & 1U) + { + crc >>= 1U; + c >>= 1U; + crc ^= 0xedb88320u; + } + else + { + crc >>= 1U; + c >>= 1U; + } + } + } + + return crc; +} +#endif + +/**************************************************************************** + * Function: imxrt_enet_hash_index + * + * Description: + * Function to find the hash index for multicast address filter + * + * Input Parameters: + * mac - The MAC address + * + * Returned Value: + * hash index + * + * Assumptions: + * + ****************************************************************************/ + +#ifdef CONFIG_NET_MCASTGROUP +static uint32_t imxrt_enet_hash_index(const uint8_t *mac) +{ + uint32_t crc; + uint32_t hashindex; + + ninfo("MAC: %02x:%02x:%02x:%02x:%02x:%02x\n", + mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]); + + crc = imxrt_calcethcrc(mac, 6); + hashindex = (crc >> 26) & 0x3f; + + return hashindex; +} +#endif + +/**************************************************************************** + * Function: imxrt_addmac + * + * Description: + * NuttX Callback: Add the specified MAC address to the hardware multicast + * address filtering + * + * Input Parameters: + * dev - Reference to the NuttX driver state structure + * mac - The MAC address to be added + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +#ifdef CONFIG_NET_MCASTGROUP +static int imxrt_addmac(struct net_driver_s *dev, FAR const uint8_t *mac) +{ + uint32_t hashindex; + uint32_t temp; + uint32_t registeraddress; + + hashindex = imxrt_enet_hash_index(mac); + + /* Add the MAC address to the hardware multicast routing table */ + + if (hashindex > 31) + { + registeraddress = IMXRT_ENET_GAUR; + hashindex -= 32; + } + else + { + registeraddress = IMXRT_ENET_GALR; + } + + temp = getreg32(registeraddress); + temp |= 1 << hashindex; + putreg32(temp, registeraddress); + + return OK; +} +#endif + +/**************************************************************************** + * Function: imxrt_rmmac + * + * Description: + * NuttX Callback: Remove the specified MAC address from the hardware + * multicast address filtering + * + * Input Parameters: + * dev - Reference to the NuttX driver state structure + * mac - The MAC address to be removed + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +#ifdef CONFIG_NET_MCASTGROUP +static int imxrt_rmmac(struct net_driver_s *dev, FAR const uint8_t *mac) +{ + uint32_t hashindex; + uint32_t temp; + uint32_t registeraddress; + + /* Remove the MAC address from the hardware multicast routing table */ + + hashindex = imxrt_enet_hash_index(mac); + + if (hashindex > 31) + { + registeraddress = IMXRT_ENET_GAUR; + hashindex -= 32; + } + else + { + registeraddress = IMXRT_ENET_GALR; + } + + temp = getreg32(registeraddress); + temp &= ~(1 << hashindex); + putreg32(temp, registeraddress); + + return OK; +} +#endif + +/**************************************************************************** + * Function: imxrt_ioctl + * + * Description: + * PHY ioctl command handler + * + * Input Parameters: + * dev - Reference to the NuttX driver state structure + * cmd - ioctl command + * arg - Argument accompanying the command + * + * Returned Value: + * Zero (OK) on success; a negated errno value on failure. + * + * Assumptions: + * + ****************************************************************************/ + +#ifdef CONFIG_NETDEV_IOCTL +static int imxrt_ioctl(struct net_driver_s *dev, int cmd, unsigned long arg) +{ +#ifdef CONFIG_NETDEV_PHY_IOCTL + FAR struct imxrt_driver_s *priv = + (FAR struct imxrt_driver_s *)dev->d_private; +#endif + int ret; + + switch (cmd) + { +#ifdef CONFIG_NETDEV_PHY_IOCTL +#ifdef CONFIG_ARCH_PHY_INTERRUPT + case SIOCMIINOTIFY: /* Set up for PHY event notifications */ + { + struct mii_ioctl_notify_s *req = + (struct mii_ioctl_notify_s *)((uintptr_t)arg); + + ret = phy_notify_subscribe(dev->d_ifname, req->pid, &req->event); + if (ret == OK) + { + /* Enable PHY link up/down interrupts */ + + ret = imxrt_phyintenable(priv); + } + } + break; +#endif + + case SIOCGMIIPHY: /* Get MII PHY address */ + { + struct mii_ioctl_data_s *req = + (struct mii_ioctl_data_s *)((uintptr_t)arg); + req->phy_id = priv->phyaddr; + ret = OK; + } + break; + + case SIOCGMIIREG: /* Get register from MII PHY */ + { + struct mii_ioctl_data_s *req = + (struct mii_ioctl_data_s *)((uintptr_t)arg); + ret = imxrt_readmii(priv, req->phy_id, + req->reg_num, &req->val_out); + } + break; + + case SIOCSMIIREG: /* Set register in MII PHY */ + { + struct mii_ioctl_data_s *req = + (struct mii_ioctl_data_s *)((uintptr_t)arg); + ret = imxrt_writemii(priv, req->phy_id, req->reg_num, req->val_in); + } + break; +#endif /* CONFIG_NETDEV_PHY_IOCTL */ + + default: + ret = -ENOTTY; + break; + } + + return ret; +} +#endif /* CONFIG_NETDEV_IOCTL */ + +/**************************************************************************** + * Function: imxrt_phyintenable + * + * Description: + * Enable link up/down PHY interrupts. The interrupt protocol is like this: + * + * - Interrupt status is cleared when the interrupt is enabled. + * - Interrupt occurs. Interrupt is disabled (at the processor level) when + * is received. + * - Interrupt status is cleared when the interrupt is re-enabled. + * + * Input Parameters: + * priv - A reference to the private driver state structure + * + * Returned Value: + * OK on success; Negated errno (-ETIMEDOUT) on failure. + * + ****************************************************************************/ + +#if defined(CONFIG_NETDEV_PHY_IOCTL) && defined(CONFIG_ARCH_PHY_INTERRUPT) +static int imxrt_phyintenable(struct imxrt_driver_s *priv) +{ +#if defined(CONFIG_ETH0_PHY_KSZ8051) || defined(CONFIG_ETH0_PHY_KSZ8061) || \ + defined(CONFIG_ETH0_PHY_KSZ8081) || defined(CONFIG_ETH0_PHY_DP83825I) + uint16_t phyval; + int ret; + + /* Read the interrupt status register in order to clear any pending + * interrupts + */ + + ret = imxrt_readmii(priv, priv->phyaddr, MII_KSZ8081_INT, &phyval); + if (ret == OK) + { + /* Enable link up/down interrupts */ + + ret = imxrt_writemii(priv, priv->phyaddr, MII_KSZ8081_INT, + (MII_KSZ80X1_INT_LDEN | MII_KSZ80X1_INT_LUEN)); + } + + return ret; +#else +# error Unrecognized PHY + return -ENOSYS; +#endif +} +#endif + +/**************************************************************************** + * Function: imxrt_initmii + * + * Description: + * Configure the MII interface + * + * Input Parameters: + * priv - Reference to the private ENET driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +static void imxrt_initmii(struct imxrt_driver_s *priv) +{ + /* Speed is based on the peripheral (bus) clock; hold time is 2 module + * clock. This hold time value may need to be increased on some platforms + */ + + putreg32(ENET_MSCR_HOLDTIME_2CYCLES | + IMXRT_MII_SPEED << ENET_MSCR_MII_SPEED_SHIFT, + IMXRT_ENET_MSCR); +} + +/**************************************************************************** + * Function: imxrt_writemii + * + * Description: + * Write a 16-bit value to a PHY register. + * + * Input Parameters: + * priv - Reference to the private ENET driver state structure + * phyaddr - The PHY address + * regaddr - The PHY register address + * data - The data to write to the PHY register + * + * Returned Value: + * Zero on success, a negated errno value on failure. + * + ****************************************************************************/ + +static int imxrt_writemii(struct imxrt_driver_s *priv, uint8_t phyaddr, + uint8_t regaddr, uint16_t data) +{ + int timeout; + + /* Clear the MII interrupt bit */ + + putreg32(ENET_INT_MII, IMXRT_ENET_EIR); + + /* Initiate the MII Management write */ + + putreg32(data | + 2 << ENET_MMFR_TA_SHIFT | + (uint32_t)regaddr << ENET_MMFR_RA_SHIFT | + (uint32_t)phyaddr << ENET_MMFR_PA_SHIFT | + ENET_MMFR_OP_WRMII | + 1 << ENET_MMFR_ST_SHIFT, + IMXRT_ENET_MMFR); + + /* Wait for the transfer to complete */ + + for (timeout = 0; timeout < MII_MAXPOLLS; timeout++) + { + if ((getreg32(IMXRT_ENET_EIR) & ENET_INT_MII) != 0) + { + break; + } + } + + /* Check for a timeout */ + + if (timeout == MII_MAXPOLLS) + { + return -ETIMEDOUT; + } + + /* Clear the MII interrupt bit */ + + putreg32(ENET_INT_MII, IMXRT_ENET_EIR); + return OK; +} + +/**************************************************************************** + * Function: imxrt_reademii + * + * Description: + * Read a 16-bit value from a PHY register. + * + * Input Parameters: + * priv - Reference to the private ENET driver state structure + * phyaddr - The PHY address + * regaddr - The PHY register address + * data - A pointer to the location to return the data + * + * Returned Value: + * Zero on success, a negated errno value on failure. + * + ****************************************************************************/ + +static int imxrt_readmii(struct imxrt_driver_s *priv, uint8_t phyaddr, + uint8_t regaddr, uint16_t *data) +{ + int timeout; + + /* Clear the MII interrupt bit */ + + putreg32(ENET_INT_MII, IMXRT_ENET_EIR); + + /* Initiate the MII Management read */ + + putreg32(2 << ENET_MMFR_TA_SHIFT | + (uint32_t)regaddr << ENET_MMFR_RA_SHIFT | + (uint32_t)phyaddr << ENET_MMFR_PA_SHIFT | + ENET_MMFR_OP_RDMII | + 1 << ENET_MMFR_ST_SHIFT, + IMXRT_ENET_MMFR); + + /* Wait for the transfer to complete */ + + for (timeout = 0; timeout < MII_MAXPOLLS; timeout++) + { + if ((getreg32(IMXRT_ENET_EIR) & ENET_INT_MII) != 0) + { + break; + } + } + + /* Check for a timeout */ + + if (timeout >= MII_MAXPOLLS) + { + nerr("ERROR: Timed out waiting for transfer to complete\n"); + return -ETIMEDOUT; + } + + /* Clear the MII interrupt bit */ + + putreg32(ENET_INT_MII, IMXRT_ENET_EIR); + + /* And return the MII data */ + + *data = (uint16_t)(getreg32(IMXRT_ENET_MMFR) & ENET_MMFR_DATA_MASK); + return OK; +} + +/**************************************************************************** + * Function: imxrt_initphy + * + * Description: + * Configure the PHY + * + * Input Parameters: + * priv - Reference to the private ENET driver state structure + * renogphy - Flag indicating if to perform negotiation of the link + * + * Returned Value: + * Zero (OK) returned on success; a negated errno value is returned on any + * failure; + * + * Assumptions: + * + ****************************************************************************/ + +static inline int imxrt_initphy(struct imxrt_driver_s *priv, bool renogphy) +{ + uint32_t rcr; + uint32_t tcr; + uint32_t racc; + uint16_t phydata; + uint8_t phyaddr = BOARD_PHY_ADDR; + int retries; + int ret; + + if (renogphy) + { + /* Loop (potentially infinitely?) until we successfully communicate + * with the PHY. This is 'standard stuff' that should work for any PHY + * - we are not communicating with it's 'special' registers + * at this point. + */ + + ninfo("%s: Try phyaddr: %u\n", BOARD_PHY_NAME, phyaddr); + + /* Try to read PHYID1 few times using this address */ + + retries = 0; + do + { + nxsig_usleep(LINK_WAITUS); + + ninfo("%s: Read PHYID1, retries=%d\n", + BOARD_PHY_NAME, retries + 1); + + phydata = 0xffff; + ret = imxrt_readmii(priv, phyaddr, MII_PHYID1, &phydata); + } + while ((ret < 0 || phydata == 0xffff) && ++retries < 3); + + if (retries >= 3) + { + nerr("ERROR: Failed to read %s PHYID1 at address %d\n", + BOARD_PHY_NAME, phyaddr); + return -ENOENT; + } + + ninfo("%s: Using PHY address %u\n", BOARD_PHY_NAME, phyaddr); + priv->phyaddr = phyaddr; + + /* Verify PHYID1. Compare OUI bits 3-18 */ + + ninfo("%s: PHYID1: %04x\n", BOARD_PHY_NAME, phydata); + if (phydata != BOARD_PHYID1) + { + nerr("ERROR: PHYID1=%04x incorrect for %s. Expected %04x\n", + phydata, BOARD_PHY_NAME, BOARD_PHYID1); + return -ENXIO; + } + + /* Read PHYID2 */ + + ret = imxrt_readmii(priv, phyaddr, MII_PHYID2, &phydata); + if (ret < 0) + { + nerr("ERROR: Failed to read %s PHYID2: %d\n", BOARD_PHY_NAME, ret); + return ret; + } + + ninfo("%s: PHYID2: %04x\n", BOARD_PHY_NAME, phydata); + + /* Verify PHYID2: Compare OUI bits 19-24 and the 6-bit model number + * (ignoring the 4-bit revision number). + */ + + if ((phydata & 0xfff0) != (BOARD_PHYID2 & 0xfff0)) + { + nerr("ERROR: PHYID2=%04x incorrect for %s. Expected %04x\n", + (phydata & 0xfff0), BOARD_PHY_NAME, (BOARD_PHYID2 & 0xfff0)); + return -ENXIO; + } + +#ifdef CONFIG_ETH0_PHY_KSZ8081 + /* Reset PHY */ + + imxrt_writemii(priv, phyaddr, MII_MCR, MII_MCR_RESET); + + /* Set RMII mode */ + + ret = imxrt_readmii(priv, phyaddr, MII_KSZ8081_PHYCTRL2, &phydata); + if (ret < 0) + { + nerr("ERROR: Failed to read MII_KSZ8081_PHYCTRL2\n"); + return ret; + } + + /* Indicate 50MHz clock */ + + imxrt_writemii(priv, phyaddr, MII_KSZ8081_PHYCTRL2, + (phydata | (1 << 7))); + + /* Switch off NAND Tree mode (in case it was set via pinning) */ + + ret = imxrt_readmii(priv, phyaddr, MII_KSZ8081_OMSO, &phydata); + if (ret < 0) + { + nerr("ERROR: Failed to read MII_KSZ8081_OMSO: %d\n", ret); + return ret; + } + + imxrt_writemii(priv, phyaddr, MII_KSZ8081_OMSO, + (phydata & ~(1 << 5))); + + /* Set Ethernet led to green = activity and yellow = link and */ + + ret = imxrt_readmii(priv, phyaddr, MII_KSZ8081_PHYCTRL2, &phydata); + if (ret < 0) + { + nerr("ERROR: Failed to read MII_KSZ8081_PHYCTRL2\n"); + return ret; + } + + imxrt_writemii(priv, phyaddr, MII_KSZ8081_PHYCTRL2, + (phydata | (1 << 4))); + + imxrt_writemii(priv, phyaddr, MII_ADVERTISE, + MII_ADVERTISE_100BASETXFULL | + MII_ADVERTISE_100BASETXHALF | + MII_ADVERTISE_10BASETXFULL | + MII_ADVERTISE_10BASETXHALF | + MII_ADVERTISE_CSMA); + +#elif defined (CONFIG_ETH0_PHY_LAN8720) + /* Make sure that PHY comes up in correct mode when it's reset */ + + imxrt_writemii(priv, phyaddr, MII_LAN8720_MODES, + MII_LAN8720_MODES_RESV | MII_LAN8720_MODES_ALL | + MII_LAN8720_MODES_PHYAD(BOARD_PHY_ADDR)); + + /* ...and reset PHY */ + + imxrt_writemii(priv, phyaddr, MII_MCR, MII_MCR_RESET); + +#elif defined (CONFIG_ETH0_PHY_DP83825I) + + /* Reset PHY */ + + imxrt_writemii(priv, phyaddr, MII_MCR, MII_MCR_RESET); + + /* Set RMII mode and Indicate 50MHz clock */ + + imxrt_writemii(priv, phyaddr, MII_DP83825I_RCSR, + MII_DP83825I_RCSC_ELAST_2 | MII_DP83825I_RCSC_RMIICS); + + imxrt_writemii(priv, phyaddr, MII_ADVERTISE, + MII_ADVERTISE_100BASETXFULL | + MII_ADVERTISE_100BASETXHALF | + MII_ADVERTISE_10BASETXFULL | + MII_ADVERTISE_10BASETXHALF | + MII_ADVERTISE_CSMA); + +#endif + + /* Start auto negotiation */ + + ninfo("%s: Start Autonegotiation...\n", BOARD_PHY_NAME); + imxrt_writemii(priv, phyaddr, MII_MCR, + (MII_MCR_ANRESTART | MII_MCR_ANENABLE)); + + /* Wait for auto negotiation to complete */ + + for (retries = 0; retries < LINK_NLOOPS; retries++) + { + ret = imxrt_readmii(priv, phyaddr, MII_MSR, &phydata); + if (ret < 0) + { + nerr("ERROR: Failed to read %s MII_MSR: %d\n", + BOARD_PHY_NAME, ret); + return ret; + } + + if (phydata & MII_MSR_ANEGCOMPLETE) + { + break; + } + + nxsig_usleep(LINK_WAITUS); + } + + if (phydata & MII_MSR_ANEGCOMPLETE) + { + ninfo("%s: Autonegotiation complete\n", BOARD_PHY_NAME); + ninfo("%s: MII_MSR: %04x\n", BOARD_PHY_NAME, phydata); + } + else + { + /* TODO: Autonegotiation has right now failed. Maybe the Eth cable + * is not connected. PHY chip have mechanisms to configure link + * OK. We should leave autconf on, and find a way to re-configure + * MCU whenever the link is ready. + */ + + ninfo("%s: Autonegotiation failed [%d] (is cable plugged-in ?), " + "default to 10Mbs mode\n", \ + BOARD_PHY_NAME, retries); + + /* Stop auto negotiation */ + + imxrt_writemii(priv, phyaddr, MII_MCR, 0); + } + } + + /* When we get here we have a (negotiated) speed and duplex. This is also + * the point we enter if renegotiation is turned off, so have multiple + * attempts at reading the status register in case the PHY isn't awake + * properly. + */ + + retries = 0; + do + { + phydata = 0xffff; + ret = imxrt_readmii(priv, phyaddr, BOARD_PHY_STATUS, &phydata); + } + while ((ret < 0 || phydata == 0xffff) && ++retries < 3); + + /* If we didn't successfully read anything and we haven't tried a physical + * renegotiation then lets do that + */ + + if (retries >= 3) + { + if (renogphy == false) + { + /* Give things one more chance with renegotiation turned on */ + + return imxrt_initphy(priv, true); + } + else + { + /* That didn't end well, just give up */ + + nerr("ERROR: Failed to read %s BOARD_PHY_STATUS[%02x]: %d\n", + BOARD_PHY_NAME, BOARD_PHY_STATUS, ret); + return ret; + } + } + + ninfo("%s: BOARD_PHY_STATUS: %04x\n", BOARD_PHY_NAME, phydata); + + /* Set up the transmit and receive control registers based on the + * configuration and the auto negotiation results. + */ + +#ifdef CONFIG_IMXRT_ENETUSEMII + rcr = ENET_RCR_CRCFWD | + (CONFIG_NET_ETH_PKTSIZE + CONFIG_NET_GUARDSIZE) + << ENET_RCR_MAX_FL_SHIFT | + ENET_RCR_MII_MODE; +#else + rcr = ENET_RCR_RMII_MODE | ENET_RCR_CRCFWD | + (CONFIG_NET_ETH_PKTSIZE + CONFIG_NET_GUARDSIZE) + << ENET_RCR_MAX_FL_SHIFT | + ENET_RCR_MII_MODE; +#endif + tcr = 0; + + putreg32(rcr, IMXRT_ENET_RCR); + putreg32(tcr, IMXRT_ENET_TCR); + + /* Enable Discard Of Frames With MAC Layer Errors. + * Enable Discard Of Frames With Wrong Protocol Checksum. + * Bit 1: Enable discard of frames with wrong IPv4 header checksum. + */ + + racc = ENET_RACC_PRODIS | ENET_RACC_LINEDIS | ENET_RACC_IPDIS; + putreg32(racc, IMXRT_ENET_RACC); + + /* Setup half or full duplex */ + + if (BOARD_PHY_ISDUPLEX(phydata)) + { + /* Full duplex */ + + ninfo("%s: Full duplex\n", BOARD_PHY_NAME); + tcr |= ENET_TCR_FDEN; + } + else + { + /* Half duplex */ + + ninfo("%s: Half duplex\n", BOARD_PHY_NAME); + rcr |= ENET_RCR_DRT; + } + + if (BOARD_PHY_10BASET(phydata)) + { + /* 10 Mbps */ + + ninfo("%s: 10 Base-T\n", BOARD_PHY_NAME); + rcr |= ENET_RCR_RMII_10T; + } + else if (BOARD_PHY_100BASET(phydata)) + { + /* 100 Mbps */ + + ninfo("%s: 100 Base-T\n", BOARD_PHY_NAME); + } + else + { + /* This might happen if Autonegotiation did not complete(?) */ + + nerr("ERROR: Neither 10- nor 100-BaseT reported: PHY STATUS=%04x\n", + phydata); + return -EIO; + } + + putreg32(rcr, IMXRT_ENET_RCR); + putreg32(tcr, IMXRT_ENET_TCR); + return OK; +} + +/**************************************************************************** + * Function: imxrt_initbuffers + * + * Description: + * Initialize ENET buffers and descriptors + * + * Input Parameters: + * priv - Reference to the private ENET driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +static void imxrt_initbuffers(struct imxrt_driver_s *priv) +{ + uintptr_t addr; + int i; + + /* Get an aligned TX descriptor (array) address */ + + addr = (uintptr_t)g_desc_pool; + priv->txdesc = (struct enet_desc_s *)addr; + + /* Get an aligned RX descriptor (array) address */ + + addr += CONFIG_IMXRT_ENET_NTXBUFFERS * sizeof(struct enet_desc_s); + priv->rxdesc = (struct enet_desc_s *)addr; + + /* Get the beginning of the first aligned buffer */ + + addr = (uintptr_t)g_buffer_pool; + + /* Then fill in the TX descriptors */ + + for (i = 0; i < CONFIG_IMXRT_ENET_NTXBUFFERS; i++) + { + priv->txdesc[i].status1 = 0; + priv->txdesc[i].length = 0; + priv->txdesc[i].data = (uint8_t *)imxrt_swap32((uint32_t)addr); +#ifdef CONFIG_IMXRT_ENETENHANCEDBD + priv->txdesc[i].status2 = TXDESC_IINS | TXDESC_PINS; +#endif + addr += IMXRT_BUF_SIZE; + } + + /* Then fill in the RX descriptors */ + + for (i = 0; i < CONFIG_IMXRT_ENET_NRXBUFFERS; i++) + { + priv->rxdesc[i].status1 = RXDESC_E; + priv->rxdesc[i].length = 0; + priv->rxdesc[i].data = (uint8_t *)imxrt_swap32((uint32_t)addr); +#ifdef CONFIG_IMXRT_ENETENHANCEDBD + priv->rxdesc[i].bdu = 0; + priv->rxdesc[i].status2 = RXDESC_INT; +#endif + addr += IMXRT_BUF_SIZE; + } + + /* Set the wrap bit in the last descriptors to form a ring */ + + priv->txdesc[CONFIG_IMXRT_ENET_NTXBUFFERS - 1].status1 |= TXDESC_W; + priv->rxdesc[CONFIG_IMXRT_ENET_NRXBUFFERS - 1].status1 |= RXDESC_W; + + /* We start with RX descriptor 0 and with no TX descriptors in use */ + + priv->txtail = 0; + priv->txhead = 0; + priv->rxtail = 0; + + /* Initialize the packet buffer, which is used when sending */ + + priv->dev.d_buf = + (uint8_t *)imxrt_swap32((uint32_t)priv->txdesc[priv->txhead].data); +} + +/**************************************************************************** + * Function: imxrt_reset + * + * Description: + * Put the EMAC in the non-operational, reset state + * + * Input Parameters: + * priv - Reference to the private ENET driver state structure + * + * Returned Value: + * None + * + * Assumptions: + * + ****************************************************************************/ + +static void imxrt_reset(struct imxrt_driver_s *priv) +{ + unsigned int i; + + /* Set the reset bit and clear the enable bit */ + + putreg32(ENET_ECR_RESET, IMXRT_ENET_ECR); + + /* Wait at least 8 clock cycles */ + + for (i = 0; i < 10; i++) + { + asm volatile ("nop"); + } +} + +/**************************************************************************** + * Public Functions + ****************************************************************************/ + +/**************************************************************************** + * Function: imxrt_netinitialize + * + * Description: + * Initialize the Ethernet controller and driver + * + * Input Parameters: + * intf - In the case where there are multiple EMACs, this value + * identifies which EMAC is to be initialized. + * + * Returned Value: + * OK on success; Negated errno on failure. + * + * Assumptions: + * + ****************************************************************************/ + +int imxrt_netinitialize(int intf) +{ + struct imxrt_driver_s *priv; +#ifdef CONFIG_NET_ETHERNET + uint32_t uidl; + uint32_t uidml; + uint8_t *mac; +#endif + uint32_t regval; + int ret; + + /* Get the interface structure associated with this interface number. */ + + DEBUGASSERT(intf < CONFIG_IMXRT_ENET_NETHIFS); + priv = &g_enet[intf]; + + /* Enable ENET1_TX_CLK_DIR (Provides 50MHz clk OUT to PHY) */ + + regval = getreg32(IMXRT_IOMUXC_GPR_GPR1); + regval |= GPR_GPR1_ENET1_TX_CLK_OUT_EN; + putreg32(regval, IMXRT_IOMUXC_GPR_GPR1); + + /* Enable the ENET clock. Clock is on during all modes, + * except STOP mode. + */ + + imxrt_clockall_enet(); + + /* Configure all ENET/MII pins */ + + imxrt_config_gpio(GPIO_ENET_MDIO); + imxrt_config_gpio(GPIO_ENET_MDC); + imxrt_config_gpio(GPIO_ENET_RX_EN); + imxrt_config_gpio(GPIO_ENET_RX_DATA00); + imxrt_config_gpio(GPIO_ENET_RX_DATA01); + imxrt_config_gpio(GPIO_ENET_TX_DATA00); + imxrt_config_gpio(GPIO_ENET_TX_DATA01); + imxrt_config_gpio(GPIO_ENET_TX_CLK); + imxrt_config_gpio(GPIO_ENET_TX_EN); +#ifdef GPIO_ENET_RX_ER + imxrt_config_gpio(GPIO_ENET_RX_ER); +#endif + + /* Attach the Ethernet MAC IEEE 1588 timer interrupt handler */ + +#if 0 + if (irq_attach(IMXRT_IRQ_EMACTMR, imxrt_tmrinterrupt, NULL)) + { + /* We could not attach the ISR to the interrupt */ + + nerr("ERROR: Failed to attach EMACTMR IRQ\n"); + return -EAGAIN; + } +#endif + + /* Attach the Ethernet interrupt handler */ + + if (irq_attach(IMXRT_IRQ_ENET, imxrt_enet_interrupt, NULL)) + { + /* We could not attach the ISR to the interrupt */ + + nerr("ERROR: Failed to attach EMACTX IRQ\n"); + return -EAGAIN; + } + + /* Initialize the driver structure */ + + memset(priv, 0, sizeof(struct imxrt_driver_s)); + priv->dev.d_ifup = imxrt_ifup; /* I/F up (new IP address) callback */ + priv->dev.d_ifdown = imxrt_ifdown; /* I/F down callback */ + priv->dev.d_txavail = imxrt_txavail; /* New TX data callback */ +#ifdef CONFIG_NET_MCASTGROUP + priv->dev.d_addmac = imxrt_addmac; /* Add multicast MAC address */ + priv->dev.d_rmmac = imxrt_rmmac; /* Remove multicast MAC address */ +#endif +#ifdef CONFIG_NETDEV_IOCTL + priv->dev.d_ioctl = imxrt_ioctl; /* Support PHY ioctl() calls */ +#endif + priv->dev.d_private = g_enet; /* Used to recover private state from dev */ + +#ifdef CONFIG_NET_ETHERNET + +#ifdef CONFIG_NET_USE_OTP_ETHERNET_MAC + + /* Boards like the teensy have a unique (official) + * MAC address stored in OTP. + * TODO: hardcoded mem locations: use proper registers and header file + * offsets: 0x620: MAC0, 0x630: MAC1 + */ + + uidl = getreg32(IMXRT_OCOTP_BASE + 0x620); + uidml = getreg32(IMXRT_OCOTP_BASE + 0x630); + mac = priv->dev.d_mac.ether.ether_addr_octet; + + mac[0] = (uidml & 0x0000ff00) >> 8; + mac[1] = (uidml & 0x000000ff) >> 0; + mac[2] = (uidl & 0xff000000) >> 24; + mac[3] = (uidl & 0x00ff0000) >> 16; + mac[4] = (uidl & 0x0000ff00) >> 8; + mac[5] = (uidl & 0x000000ff) >> 0; + +#else + + /* Determine a semi-unique MAC address from MCU UID + * We use UID Low and Mid Low registers to get 64 bits, from which we keep + * 48 bits. We then force unicast and locally administered bits + * (b0 and b1, 1st octet) + */ + + /* hardcoded offset: todo: need proper header file */ + + uidl = getreg32(IMXRT_OCOTP_BASE + 0x410); + uidml = getreg32(IMXRT_OCOTP_BASE + 0x420); + mac = priv->dev.d_mac.ether.ether_addr_octet; + + uidml |= 0x00000200; + uidml &= 0x0000feff; + + mac[0] = (uidml & 0x0000ff00) >> 8; + mac[1] = (uidml & 0x000000ff); + mac[2] = (uidl & 0xff000000) >> 24; + mac[3] = (uidl & 0x00ff0000) >> 16; + mac[4] = (uidl & 0x0000ff00) >> 8; + mac[5] = (uidl & 0x000000ff); + +#endif + +#endif + +#ifdef CONFIG_IMXRT_ENET_PHYINIT + /* Perform any necessary, one-time, board-specific PHY initialization */ + + ret = imxrt_phy_boardinitialize(0); + if (ret < 0) + { + nerr("ERROR: Failed to initialize the PHY: %d\n", ret); + return ret; + } +#endif + + /* Put the interface in the down state. This usually amounts to resetting + * the device and/or calling imxrt_ifdown(). + */ + + imxrt_ifdown(&priv->dev); + + /* Register the device with the OS so that socket IOCTLs can be performed */ + + netdev_register(&priv->dev, NET_LL_ETHERNET); + + UNUSED(ret); + return OK; +} + +/**************************************************************************** + * Name: arm_netinitialize + * + * Description: + * Initialize the first network interface. If there are more than one + * interface in the chip, then board-specific logic will have to provide + * this function to determine which, if any, Ethernet controllers should + * be initialized. + * + ****************************************************************************/ + +#if CONFIG_IMXRT_ENET_NETHIFS == 1 && !defined(CONFIG_NETDEV_LATEINIT) +void arm_netinitialize(void) +{ + imxrt_netinitialize(0); +} +#endif + +#endif /* CONFIG_IMXRT_ENET */ From 0605f45908577c6f0cb88d7fcf95aa6aee75a5a2 Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Wed, 13 Apr 2022 17:15:30 +0800 Subject: [PATCH 17/38] add wifi esp07s --- .../Framework/connection/wifi/adapter_wifi.h | 10 + .../connection/wifi/esp07s_wifi/esp07s_wifi.c | 554 +++++++++--------- 2 files changed, 294 insertions(+), 270 deletions(-) create mode 100644 APP_Framework/Framework/connection/wifi/adapter_wifi.h diff --git a/APP_Framework/Framework/connection/wifi/adapter_wifi.h b/APP_Framework/Framework/connection/wifi/adapter_wifi.h new file mode 100644 index 000000000..986e15b0d --- /dev/null +++ b/APP_Framework/Framework/connection/wifi/adapter_wifi.h @@ -0,0 +1,10 @@ +#ifndef ADAPTER_WIFI_H +#define ADAPTER_WIFI_H + +#define CONFIG_WIFI_RESET (0) +#define CONFIG_WIFI_RESTORE (1) +#define CONFIG_WIFI_BAUDRATE (2) + + + +#endif \ No newline at end of file diff --git a/APP_Framework/Framework/connection/wifi/esp07s_wifi/esp07s_wifi.c b/APP_Framework/Framework/connection/wifi/esp07s_wifi/esp07s_wifi.c index f6ab7feb5..ce1fb1df5 100755 --- a/APP_Framework/Framework/connection/wifi/esp07s_wifi/esp07s_wifi.c +++ b/APP_Framework/Framework/connection/wifi/esp07s_wifi/esp07s_wifi.c @@ -20,24 +20,71 @@ #include #include +#include "../adapter_wifi.h" +#include #define LEN_PARA_BUF 128 +#define SOCKET_PROTOCOL_TCP (6) +#define SOCKET_PROTOCOL_UDP (17) static int Esp07sWifiSetDown(struct Adapter *adapter_at); /** - * @description: enter AT command mode + * @description: check AT startup status * @param at_agent - wifi device agent pointer * @return success: EOK */ -static int Esp07sWifiInitAtCmd(ATAgentType at_agent) +static int Esp07sWifiTestAtCmd(ATAgentType at_agent) { - ATOrderSend(at_agent, REPLY_TIME_OUT, NULL, "+++"); - PrivTaskDelay(100); + int ret = 0; - ATOrderSend(at_agent, REPLY_TIME_OUT, NULL, "a"); - PrivTaskDelay(500); + ret = AtCmdConfigAndCheck(at_agent, "AT", "OK"); + if(ret < 0) { + printf("%s %d cmd[AT] config failed!\n",__func__,__LINE__); + ret = -1; + } + return ret; +} + +static int Esp07sUartOpen(struct Adapter *adapter) +{ + if (NULL == adapter) { + return -1; + } + + /* Open device in read-write mode */ + adapter->fd = PrivOpen(ADAPTER_ESP07S_DRIVER, O_RDWR); + if (adapter->fd < 0) { + printf("Esp07sWifiOpen get serial %s fd error\n", ADAPTER_ESP07S_DRIVER); + return -1; + } + /* set serial config, serial_baud_rate = 115200 */ + + struct SerialDataCfg cfg; + memset(&cfg, 0 ,sizeof(struct SerialDataCfg)); + + cfg.serial_baud_rate = BAUD_RATE_115200; + cfg.serial_data_bits = DATA_BITS_8; + cfg.serial_stop_bits = STOP_BITS_1; + cfg.serial_parity_mode = PARITY_NONE; + cfg.serial_bit_order = BIT_ORDER_LSB; + cfg.serial_invert_mode = NRZ_NORMAL; + cfg.serial_buffer_size = SERIAL_RB_BUFSZ; + +#ifdef ADAPTER_ESP07S_DRIVER_EXT_PORT + cfg.ext_uart_no = ADAPTER_ESP07S_DRIVER_EXT_PORT; + cfg.port_configure = PORT_CFG_INIT; +#endif + + struct PrivIoctlCfg ioctl_cfg; + ioctl_cfg.ioctl_driver_type = SERIAL_TYPE; + ioctl_cfg.args = &cfg; + + PrivIoctl(adapter->fd, OPE_INT, &ioctl_cfg); + PrivTaskDelay(1000); + + printf("esp07s uart config ready\n"); return 0; } @@ -49,11 +96,7 @@ static int Esp07sWifiInitAtCmd(ATAgentType at_agent) static int Esp07sWifiOpen(struct Adapter *adapter) { /*step1: open esp07s serial port*/ - adapter->fd = PrivOpen(ADAPTER_ESP07S_DRIVER, O_RDWR); - if (adapter->fd < 0) { - printf("Esp07sWifiOpen get serial %s fd error\n", ADAPTER_ESP07S_DRIVER); - return -1; - } + Esp07sUartOpen(adapter); /*step2: init AT agent*/ if (!adapter->agent) { @@ -79,7 +122,9 @@ static int Esp07sWifiOpen(struct Adapter *adapter) */ static int Esp07sWifiClose(struct Adapter *adapter) { - return Esp07sWifiSetDown(adapter); + Esp07sWifiSetDown(adapter); + PrivClose(adapter->fd); + return 0; } /** @@ -98,8 +143,6 @@ static int Esp07sWifiSend(struct Adapter *adapter, const void *data, size_t len) printf("Esp07sWifiSend can not find agent!\n"); } -__exit: - return result; } @@ -121,8 +164,6 @@ static int Esp07sWifiReceive(struct Adapter *adapter, void *rev_buffer, size_t b printf("Esp07sWifiReceive can not find agent!\n"); } -__exit: - return result; } @@ -136,46 +177,69 @@ static int Esp07sWifiSetUp(struct Adapter *adapter) uint8 wifi_ssid[LEN_PARA_BUF] = "AIIT-Guest"; uint8 wifi_pwd[LEN_PARA_BUF] = ""; char cmd[LEN_PARA_BUF]; + int ret = 0; + char *result = NULL; struct ATAgent *agent = adapter->agent; /* wait esp07s device startup finish */ - PrivTaskDelay(5000); + PrivTaskDelay(2000); - Esp07sWifiInitAtCmd(agent); + if(Esp07sWifiTestAtCmd(agent) < 0) + { + printf("wifi at cmd startup failed.\n"); + return -1; + } + /* config as softAP+station mode */ + ret = AtCmdConfigAndCheck(agent, "AT+CWMODE=3", "OK"); + if(ret < 0) { + printf("%s %d cmd[AT+CWMODE=3] config failed!\n",__func__,__LINE__); + return -1; + } + /* connect the router */ memset(cmd,0,sizeof(cmd)); - strcpy(cmd,"AT+FCLR\r"); - ATOrderSend(agent, REPLY_TIME_OUT, NULL, cmd); - PrivTaskDelay(20000); + strncpy(cmd,"AT+CWJAP=",strlen("AT+CWJAP=")); + strncat(cmd,"\"",1); + strncat(cmd,wifi_ssid,strlen(wifi_ssid)); + strncat(cmd,"\"",1); + strncat(cmd,",",1); + strncat(cmd,"\"",1); + strncat(cmd,wifi_pwd,strlen(wifi_pwd)); + strncat(cmd,"\"",1); + // strcat(cmd,"\r\n"); - Esp07sWifiInitAtCmd(agent); + ret = AtCmdConfigAndCheck(agent, cmd, "OK"); + if(ret < 0) { + printf("%s %d cmd[%s] connect[%s] failed!\n",__func__,__LINE__,cmd,wifi_ssid); + return -1; + } - memset(cmd,0,sizeof(cmd)); - strcpy(cmd,"AT+WSSSID="); - strcat(cmd,wifi_ssid); - strcat(cmd,"\r"); - ATOrderSend(agent, REPLY_TIME_OUT, NULL, cmd); - PrivTaskDelay(2500); - - memset(cmd,0,sizeof(cmd)); - strcpy(cmd,"AT+WSKEY=OPEN,NONE,"); - strcat(cmd,wifi_pwd); - strcat(cmd,"\r"); - ATOrderSend(agent, REPLY_TIME_OUT, NULL, cmd); - PrivTaskDelay(2500); + /* check the wifi ip address */ + ATReplyType reply = CreateATReply(256); + if (NULL == reply) { + printf("%s %d at_create_resp failed!\n",__func__,__LINE__); + return -1; + } + ret = ATOrderSend(agent, REPLY_TIME_OUT, reply, "AT+CIFSR"); + if(ret < 0){ + printf("%s %d ATOrderSend AT+CIFSR failed.\n",__func__,__LINE__); + ret = -1; + goto __exit; + } - memset(cmd,0,sizeof(cmd)); - strcpy(cmd,"AT+WMODE=sta\r"); - ATOrderSend(agent, REPLY_TIME_OUT, NULL, cmd); - PrivTaskDelay(2500); + result = GetReplyText(reply); + if (!result) { + printf("%s %n get reply failed.\n",__func__,__LINE__); + ret = -1; + goto __exit; + } + printf("[%s]\n", result); - memset(cmd,0,sizeof(cmd)); - strcat(cmd,"AT+Z\r"); - ATOrderSend(agent, REPLY_TIME_OUT, NULL, cmd); - PrivTaskDelay(10000); +__exit: + DeleteATReply(reply); - return 0; + return ret; } /** @@ -185,10 +249,8 @@ static int Esp07sWifiSetUp(struct Adapter *adapter) */ static int Esp07sWifiSetDown(struct Adapter *adapter) { - Esp07sWifiInitAtCmd(adapter->agent); - - ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "AT+FCLR\r"); - PrivTaskDelay(20000); + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "AT+RESTORE"); + PrivTaskDelay(2000); return 0; } @@ -203,50 +265,31 @@ static int Esp07sWifiSetDown(struct Adapter *adapter) */ static int Esp07sWifiSetAddr(struct Adapter *adapter, const char *ip, const char *gateway, const char *netmask) { - #define ESP07S_SET_ADDR_EXPRESSION "+ok=%[^,],%[^,],%[^,],%[^,]\r" - char *dhcp_mode =NULL; - char *ip_str = NULL; - char *gw_str = NULL; - char *mask_str = NULL; + int ret = 0; + char cmd[LEN_PARA_BUF]; - dhcp_mode = (char *) PrivCalloc(1, 8); - ip_str = (char *) PrivCalloc(1, 17); - gw_str = (char *) PrivCalloc(1, 17); - mask_str = (char *) PrivCalloc(1, 17); + /* e.g. AT+CIPSTA_DEF="192.168.6.100","192.168.6.1","255.255.255.0" */ + memset(cmd,0,sizeof(cmd)); + strncpy(cmd,"AT+CIPAP_DEF=",strlen(" AT+CIPAP_DEF=")); + strncat(cmd,"\"",1); + strncat(cmd,ip,strlen(ip)); + strncat(cmd,"\"",1); + strncat(cmd,",",1); + strncat(cmd,"\"",1); + strncat(cmd,gateway,strlen(gateway)); + strncat(cmd,"\"",1); + strncat(cmd,",",1); + strncat(cmd,"\"",1); + strncat(cmd,netmask,strlen(netmask)); + strncat(cmd,"\"",1); - Esp07sWifiInitAtCmd(adapter->agent); - - x_err_t result = EOK; - - ATReplyType reply = CreateATReply(64); - if (NULL == reply) { - printf("at_create_resp failed ! \n"); - result = ENOMEMORY; - goto __exit; + ret = AtCmdConfigAndCheck(adapter->agent, cmd, "OK"); + if(ret < 0) { + printf("%s %d cmd[%s] config ip failed!\n",__func__,__LINE__,cmd); + return -1; } - ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "AT+WANN=%s,%s,%s,%s\r", "dhcp", ip, netmask, gateway); - PrivTaskDelay(2500); - - ATOrderSend(adapter->agent, REPLY_TIME_OUT, reply, "AT+WANN\r"); - PrivTaskDelay(2500); - - ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "AT+Z\r"); - PrivTaskDelay(10000); - - const char * result_buf = GetReplyText(reply); - - char* str = strstr(result_buf, "+ok="); - - ParseATReply(str, ESP07S_SET_ADDR_EXPRESSION, dhcp_mode,ip_str,mask_str,gw_str); - printf("after configure:\n mode:%s\n ip:%s\n netmask:%s\n gateway:%s\n", dhcp_mode, ip_str, mask_str, gw_str); - -__exit: - if (reply) { - DeleteATReply(reply); - } - - return result; + return 0; } /** @@ -257,46 +300,24 @@ __exit: */ static int Esp07sWifiPing(struct Adapter *adapter, const char *destination) { - char *ping_result = NONE; - char *dst = NONE; - ping_result = (char *) PrivCalloc(1, 17); - dst = (char *) PrivCalloc(1, 17); - strcpy(dst, destination); - strcat(dst, "\r"); + char cmd[LEN_PARA_BUF]; + int ret = 0; - Esp07sWifiInitAtCmd(adapter->agent); + memset(cmd,0,sizeof(cmd)); + strncpy(cmd,"AT+PING=",strlen("AT+PING=")); + strncat(cmd,"\"",1); + strncat(cmd,destination,strlen(destination)); + strncat(cmd,"\"",1); - uint32 result = EOK; - - ATReplyType reply = CreateATReply(64); - if (NULL == reply) { - printf("at_create_resp failed ! \n"); - result = ENOMEMORY; - goto __exit; + ret = AtCmdConfigAndCheck(adapter->agent, cmd, "OK"); ///< config as softAP+station mode + if(ret < 0) { + printf("%s %d ping [%s] failed!\n",__func__,__LINE__,destination); + return -1; } - //ping baidu.com - ATOrderSend(adapter->agent, REPLY_TIME_OUT, reply, "AT+PING=%s", dst); + printf("ping [%s] ok\n", destination); - PrivTaskDelay(2500); - - ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "AT+Z\r"); - PrivTaskDelay(10000); - - const char * result_buf = GetReplyText(reply); - - char* str = strstr(result_buf, "+ok="); - - ParseATReply(str, "+ok=%s\r", ping_result); - - printf("ping www.baidu.com(36.152.44.95) result is:%s\n", ping_result); - -__exit: - if (reply) { - DeleteATReply(reply); - } - - return result; + return 0; } /** @@ -306,97 +327,7 @@ __exit: */ static int Esp07sWifiNetstat(struct Adapter *adapter) { - #define ESP07S_NETSTAT_RESP_SIZE 320 - #define ESP07S_NETSTAT_TYPE_SIZE 10 - #define ESP07S_NETSTAT_IPADDR_SIZE 17 - #define ESP07S_WANN_EXPRESSION "+ok=%[^,],%[^,],%[^,],%[^,]\r" - #define ESP07S_LANN_EXPRESSION "+ok=%[^,],%[^,]\r" - #define ESP07S_WMODE_EXPRESSION "+ok=%s\r" - - ATReplyType reply = NULL; - struct ATAgent *agent = adapter->agent; - uint32 result; - char * result_buf = NULL; - char * str = NULL; - - /* sta/ap */ - char *work_mode = NULL; - /* dhcp/static */ - char *ip_mode = NULL; - char *local_ipaddr = NULL; - char *gateway = NULL; - char *netmask = NULL; - local_ipaddr = (char *) PrivCalloc(1, ESP07S_NETSTAT_IPADDR_SIZE); - gateway = (char *) PrivCalloc(1, ESP07S_NETSTAT_IPADDR_SIZE); - netmask = (char *) PrivCalloc(1, ESP07S_NETSTAT_IPADDR_SIZE); - work_mode = (char *) PrivCalloc(1, ESP07S_NETSTAT_IPADDR_SIZE); - ip_mode = (char *) PrivCalloc(1, ESP07S_NETSTAT_IPADDR_SIZE); - - reply = CreateATReply(ESP07S_NETSTAT_RESP_SIZE); - if (reply == NULL) { - result = ENOMEMORY; - goto __exit; - } - - ATOrderSend(agent, REPLY_TIME_OUT, NULL, "+++"); - PrivTaskDelay(100); - - ATOrderSend(agent, REPLY_TIME_OUT, NULL, "a"); - PrivTaskDelay(2500); - - ATOrderSend(agent, REPLY_TIME_OUT, reply, "AT+WMODE\r"); - PrivTaskDelay(2500); - - result_buf = GetReplyText(reply); - - str = strstr(result_buf, "+ok="); - /* parse the third line of response data, get the network connection information */ - ParseATReply(str, ESP07S_WMODE_EXPRESSION, work_mode); - - if (work_mode[0]=='S') { - if (ATOrderSend(agent, REPLY_TIME_OUT, reply, "AT+WANN\r") < 0) { - goto __exit; - } - - PrivTaskDelay(2500); - - GetReplyText(reply); - str = strstr(result_buf, "+ok="); - /* parse the third line of response data, get the network connection information */ - ParseATReply(str, ESP07S_WANN_EXPRESSION, ip_mode, local_ipaddr, netmask, gateway); - } else { - ATOrderSend(agent, REPLY_TIME_OUT, reply, "AT+LANN\r"); - PrivTaskDelay(2500); - - GetReplyText(reply); - - str = strstr(result_buf, "+ok="); - /* parse the third line of response data, get the network connection information */ - ParseATReply(str, ESP07S_LANN_EXPRESSION, local_ipaddr, netmask); - } - - ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "AT+Z\r"); - PrivTaskDelay(10000); - - printf("work mode: %s\n", work_mode); - if (work_mode[0]=='S') - printf("ip mode: %s\nlocal ip: %s\nnetmask: %s\ngateway: %s\n", ip_mode, local_ipaddr, netmask, gateway); - else - printf("local ip: %s\nnetmask: %s\n", local_ipaddr, netmask); - - return EOK; - -__exit: - if (reply) - DeleteATReply(reply); - if (local_ipaddr) - PrivFree(local_ipaddr); - if (netmask) - PrivFree(netmask); - if (gateway) - PrivFree(gateway); - if (work_mode) - PrivFree(work_mode); + return 0; } /** @@ -410,79 +341,161 @@ __exit: */ static int Esp07sWifiConnect(struct Adapter *adapter, enum NetRoleType net_role, const char *ip, const char *port, enum IpType ip_type) { - int result = EOK; - ATReplyType reply = NONE; + int ret = EOK; char cmd[LEN_PARA_BUF]; struct ATAgent *agent = adapter->agent; - - reply = CreateATReply(64); - if (reply == NONE) { - printf("no memory for reply struct."); - return ENOMEMORY; - } - - Esp07sWifiInitAtCmd(adapter->agent); - + memset(cmd,0,sizeof(cmd)); - strcpy(cmd,"AT+NETP=TCP,"); - if(net_role == CLIENT) - strcat(cmd,"CLIENT,"); - else if(net_role == SERVER) - strcat(cmd,"SERVER,"); - strcat(cmd,port); - strcat(cmd,","); - if(ip_type == IPV4) - strcat(cmd,ip); - else if(ip_type == IPV6) + if(adapter->socket.protocal == SOCKET_PROTOCOL_TCP && net_role == CLIENT) //esp07s as tcp client to connect server { - + //e.g. AT+CIPSTART="TCP","192.168.3.116",8080 protocol, server IP and port + strncpy(cmd,"AT+CIPSTART=\"TCP\",",strlen("AT+CIPSTART=\"TCP\",")); + strncat(cmd,"\"",1); + strncpy(cmd, ip, strlen(ip)); + strncat(cmd, "\"", 1); + strncat(cmd, ",", 1); + strncat(cmd, port, strlen(port)); + ret = AtCmdConfigAndCheck(agent, cmd, "OK"); + if(ret < 0) { + printf("%s %d tcp connect [%s] failed!\n",__func__,__LINE__,ip); + return -1; + } + } + else if(adapter->socket.protocal == SOCKET_PROTOCOL_UDP) + { + //e.g. AT+CIPSTART="UDP","192.168.3.116",8080,2233,0 UDP protocol, server IP, port,local port,udp mode + strncpy(cmd,"AT+CIPSTART=\"UDP\",",strlen("AT+CIPSTART=\"UDP\",")); + strncat(cmd,"\"",1); + strncpy(cmd, ip, strlen(ip)); + strncat(cmd, "\"", 1); + strncat(cmd, ",", 1); + strncat(cmd, port, strlen(port)); + strncat(cmd, ",", 1); + strncat(cmd, "2233", strlen("2233")); ///< local port + strncat(cmd, ",", 1); + strncat(cmd, "0", 1); ///< udp transparent transmission mode must be 0 + + ret = AtCmdConfigAndCheck(agent, cmd, "OK"); + if(ret < 0) { + printf("%s %d udp connect [%s] failed!\n",__func__,__LINE__,ip); + return -1; + } } - strcat(cmd,"\r"); - ATOrderSend(agent, REPLY_TIME_OUT, NULL, cmd); - PrivTaskDelay(2500); - ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "AT+Z\r"); - PrivTaskDelay(10000); + ret = AtCmdConfigAndCheck(agent, "AT+CIPMODE=1", "OK"); ///< config as transparent transmission + if(ret < 0) { + printf("%s %d cmd[%s] config as transparent transmission failed!\n",__func__,__LINE__,cmd); + return -1; + } + ATOrderSend(agent, REPLY_TIME_OUT, NULL, "AT+CIPSEND"); + printf("[%s] connection config as transparent transmission\n",adapter->socket.protocal == SOCKET_PROTOCOL_UDP ? "udp" : "tcp"); adapter->net_role = net_role; -__exit: - if (reply) { - DeleteATReply(reply); + return 0; +} + +/** + * @description: wifi disconnect function + * @param adapter - wifi device pointer + * @return success: 0, failure: -1 + */ +static int Esp07sWifiDisconnect(struct Adapter *adapter) +{ + int ret = EOK; + char cmd[LEN_PARA_BUF]; + struct ATAgent *agent = adapter->agent; + memset(cmd,0,sizeof(cmd)); + + /* step1: stop transparent transmission mode */ + ATOrderSend(agent, REPLY_TIME_OUT, NULL, "+++"); + + /* step2: exit transparent transmission mode */ + ret = AtCmdConfigAndCheck(agent, "AT+CIPMODE=0", "OK"); + if(ret < 0) { + printf("%s %d cmd[AT+CIPMODE=0] exit failed!\n",__func__,__LINE__); + return -1; } - return result; + /* step3: disconnect */ + ret = AtCmdConfigAndCheck(agent, "AT+CIPCLOSE", "OK"); + if(ret < 0) { + printf("%s %d cmd [AT+CIPCLOSE] disconnect failed!\n",__func__,__LINE__); + return -1; + } + + return 0; } static int Esp07sWifiIoctl(struct Adapter *adapter, int cmd, void *args) { - if (OPE_INT != cmd) { - printf("Esp07sWifiIoctl only support OPE_INT, do not support %d\n", cmd); - return -1; - } + int32_t ret = 0; + char baud_str[LEN_PARA_BUF]; + struct SerialDataCfg cfg; + char at_cmd[LEN_PARA_BUF]; + uint32_t baud_rate = 0 ; - uint32_t baud_rate = *((uint32_t *)args); + switch (cmd) + { + case CONFIG_WIFI_RESET: /* reset wifi */ + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "AT+RST"); + break; + case CONFIG_WIFI_RESTORE: /* resore wifi */ + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "AT+RESTORE"); + break; + case CONFIG_WIFI_BAUDRATE: + /* step1: config mcu uart*/ + baud_rate = *((uint32_t *)args); + + memset(at_cmd, 0, sizeof(at_cmd)); + memset(baud_str, 0, sizeof(baud_str)); + memset(&cfg, 0 ,sizeof(struct SerialDataCfg)); + + cfg.serial_baud_rate = baud_rate; + cfg.serial_data_bits = DATA_BITS_8; + cfg.serial_stop_bits = STOP_BITS_1; + cfg.serial_parity_mode = PARITY_NONE; + cfg.serial_bit_order = BIT_ORDER_LSB; + cfg.serial_invert_mode = NRZ_NORMAL; + cfg.serial_buffer_size = SERIAL_RB_BUFSZ; - struct SerialDataCfg serial_cfg; - memset(&serial_cfg, 0 ,sizeof(struct SerialDataCfg)); - serial_cfg.serial_baud_rate = baud_rate; - serial_cfg.serial_data_bits = DATA_BITS_8; - serial_cfg.serial_stop_bits = STOP_BITS_1; - serial_cfg.serial_buffer_size = SERIAL_RB_BUFSZ; - serial_cfg.serial_parity_mode = PARITY_NONE; - serial_cfg.serial_bit_order = BIT_ORDER_LSB; - serial_cfg.serial_invert_mode = NRZ_NORMAL; #ifdef ADAPTER_ESP07S_DRIVER_EXT_PORT - serial_cfg.ext_uart_no = ADAPTER_ESP07S_DRIVER_EXT_PORT; - serial_cfg.port_configure = PORT_CFG_INIT; + cfg.ext_uart_no = ADAPTER_ESP07S_DRIVER_EXT_PORT; + cfg.port_configure = PORT_CFG_INIT; #endif - struct PrivIoctlCfg ioctl_cfg; - ioctl_cfg.ioctl_driver_type = SERIAL_TYPE; - ioctl_cfg.args = &serial_cfg; - PrivIoctl(adapter->fd, OPE_INT, &ioctl_cfg); - printf("Esp07sWifiIoctl success\n"); - return 0; + struct PrivIoctlCfg ioctl_cfg; + ioctl_cfg.ioctl_driver_type = SERIAL_TYPE; + ioctl_cfg.args = &cfg; + + PrivIoctl(adapter->fd, OPE_INT, &ioctl_cfg); + + /* step2: config wifi uart*/ + itoa(baud_rate, baud_str, 10); + + strncpy(at_cmd, "AT+UART_DEF=", strlen("AT+UART_DEF=")); + strncat(at_cmd, baud_str, strlen(baud_str)); + strncat(at_cmd, ",", 1); + strncat(at_cmd, "8", 1); + strncat(at_cmd, ",", 1); + strncat(at_cmd, "1", 1); + strncat(at_cmd, ",", 1); + strncat(at_cmd, "0", 1); + strncat(at_cmd, ",", 1); + strncat(at_cmd, "3", 1); + ret = AtCmdConfigAndCheck(adapter->agent, at_cmd, "OK"); + if(ret < 0) { + printf("%s %d cmd [%s] config uart failed!\n",__func__,__LINE__,at_cmd); + ret = -1; + } + + break; + default: + ret = -1; + break; + } + + return ret; } static const struct IpProtocolDone esp07s_wifi_done = @@ -500,7 +513,7 @@ static const struct IpProtocolDone esp07s_wifi_done = .connect = Esp07sWifiConnect, .send = Esp07sWifiSend, .recv = Esp07sWifiReceive, - .disconnect = NULL, + .disconnect = Esp07sWifiDisconnect, }; /** @@ -510,13 +523,14 @@ static const struct IpProtocolDone esp07s_wifi_done = AdapterProductInfoType Esp07sWifiAttach(struct Adapter *adapter) { struct AdapterProductInfo *product_info = PrivMalloc(sizeof(struct AdapterProductInfo)); - if (!product_info) { + if (!product_info) + { printf("Esp07sWifiAttach Attach malloc product_info error\n"); PrivFree(product_info); return NULL; } - strcpy(product_info->model_name, ADAPTER_WIFI_ESP07S); + strncpy(product_info->model_name, ADAPTER_WIFI_ESP07S, strlen(ADAPTER_WIFI_ESP07S)); product_info->model_done = (void *)&esp07s_wifi_done; From cd13e10f5800e914c914eac1b35b13967cb5540a Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Thu, 14 Apr 2022 15:18:45 +0800 Subject: [PATCH 18/38] repair the pin read of E18 for zigbee --- APP_Framework/Framework/connection/wifi/adapter_wifi.c | 6 +++--- APP_Framework/Framework/connection/wifi/esp07s_wifi/Kconfig | 2 +- APP_Framework/Framework/connection/zigbee/e18/e18.c | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/APP_Framework/Framework/connection/wifi/adapter_wifi.c b/APP_Framework/Framework/connection/wifi/adapter_wifi.c index c4fab060a..b1f9f7d1f 100644 --- a/APP_Framework/Framework/connection/wifi/adapter_wifi.c +++ b/APP_Framework/Framework/connection/wifi/adapter_wifi.c @@ -156,14 +156,14 @@ int AdapterWifiTest(void) AdapterDeviceOpen(adapter); - AdapterDeviceControl(adapter, OPE_INT, &baud_rate); + // AdapterDeviceControl(adapter, OPE_INT, &baud_rate); AdapterDeviceSetUp(adapter); - AdapterDeviceSetAddr(adapter, "192.168.66.253", "255.255.255.0", "192.168.66.1"); + AdapterDeviceSetAddr(adapter, "192.168.64.253", "192.168.66.1", "255.255.252.0"); AdapterDevicePing(adapter, "36.152.44.95"); AdapterDeviceNetstat(adapter); - const char *ip = "192.168.66.211"; + const char *ip = "192.168.64.60"; const char *port = "12345"; enum NetRoleType net_role = CLIENT; enum IpType ip_type = IPV4; diff --git a/APP_Framework/Framework/connection/wifi/esp07s_wifi/Kconfig b/APP_Framework/Framework/connection/wifi/esp07s_wifi/Kconfig index 3c2bbfb7e..a54223b9b 100755 --- a/APP_Framework/Framework/connection/wifi/esp07s_wifi/Kconfig +++ b/APP_Framework/Framework/connection/wifi/esp07s_wifi/Kconfig @@ -10,7 +10,7 @@ if ADD_XIZI_FETURES config ADAPTER_ESP07S_DRIVER string "ESP07S device uart driver path" - default "/dev/usart2_dev2" + default "/dev/uart2_dev2" depends on !ADAPTER_ESP07S_DRIVER_EXTUART if ADAPTER_ESP07S_DRIVER_EXTUART diff --git a/APP_Framework/Framework/connection/zigbee/e18/e18.c b/APP_Framework/Framework/connection/zigbee/e18/e18.c index 12a52cf22..6d04f6e94 100644 --- a/APP_Framework/Framework/connection/zigbee/e18/e18.c +++ b/APP_Framework/Framework/connection/zigbee/e18/e18.c @@ -56,7 +56,7 @@ static int E18HardwareModeGet() PrivClose(pin_fd); - if(pin_stat.pin == GPIO_HIGH) { + if(pin_stat.val == GPIO_HIGH) { printf(" E18 as AT mode\n"); return E18_AS_AT_MODE; } else { From 31c536ef8842d23be1290300c53774eb1d87e7fb Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Thu, 14 Apr 2022 17:47:31 +0800 Subject: [PATCH 19/38] =?UTF-8?q?1=E3=80=81repair=20the=20agent=20null=20c?= =?UTF-8?q?har=20parase=20problem;2=E3=80=81repair=20the=20zigbee=20open?= =?UTF-8?q?=20failed=20problem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Framework/connection/adapter_agent.c | 24 +++++++++------ APP_Framework/Framework/connection/at_agent.h | 2 +- .../Framework/connection/zigbee/e18/e18.c | 30 ++++++++++++++----- 3 files changed, 38 insertions(+), 18 deletions(-) diff --git a/APP_Framework/Framework/connection/adapter_agent.c b/APP_Framework/Framework/connection/adapter_agent.c index 8d75767ee..b423e1dcf 100755 --- a/APP_Framework/Framework/connection/adapter_agent.c +++ b/APP_Framework/Framework/connection/adapter_agent.c @@ -33,7 +33,7 @@ #define AT_CMD_MAX_LEN 128 #define AT_AGENT_MAX 2 static char send_buf[AT_CMD_MAX_LEN]; -static uint32 last_cmd_len = 0; +static uint32_t last_cmd_len = 0; static struct ATAgent at_agent_table[AT_AGENT_MAX] = {0}; @@ -126,7 +126,7 @@ void ATSprintf(int fd, const char *format, va_list params) PrivWrite(fd, send_buf, last_cmd_len); } -int ATOrderSend(ATAgentType agent, uint32 timeout_s, ATReplyType reply, const char *cmd_expr, ...) +int ATOrderSend(ATAgentType agent, uint32_t timeout_s, ATReplyType reply, const char *cmd_expr, ...) { if (agent == NULL) { printf("ATAgent is null"); @@ -147,8 +147,8 @@ int ATOrderSend(ATAgentType agent, uint32 timeout_s, ATReplyType reply, const ch agent->entm_recv_len = 0; va_list params; - uint32 cmd_size = 0; - uint32 result = 0; + uint32_t cmd_size = 0; + uint32_t result = 0; const char *cmd = NULL; agent->reply = reply; @@ -317,7 +317,7 @@ int EntmRecv(ATAgentType agent, char *rev_buffer, int buffer_len, int timeout_s) static int GetCompleteATReply(ATAgentType agent) { - uint32 read_len = 0; + uint32_t read_len = 0; char ch = 0, last_ch = 0; bool is_full = false; @@ -335,7 +335,9 @@ static int GetCompleteATReply(ATAgentType agent) { PrivRead(agent->fd, &ch, 1); #ifdef CONNECTION_FRAMEWORK_DEBUG - printf(" %c (0x%x)\n", ch, ch); + if(ch != 0){ + printf(" %c (0x%x)\n", ch, ch); + } #endif PrivMutexObtain(&agent->lock); @@ -365,9 +367,13 @@ static int GetCompleteATReply(ATAgentType agent) { if (read_len < agent->maintain_max) { - agent->maintain_buffer[read_len] = ch; - read_len++; - agent->maintain_len = read_len; + if(ch != 0) ///< if the char is null then do not save it to the buff + { + agent->maintain_buffer[read_len] = ch; + read_len++; + agent->maintain_len = read_len; + } + } else { printf("maintain_len is_full ...\n"); is_full = true; diff --git a/APP_Framework/Framework/connection/at_agent.h b/APP_Framework/Framework/connection/at_agent.h index 3267698cf..6a8a4f5a6 100755 --- a/APP_Framework/Framework/connection/at_agent.h +++ b/APP_Framework/Framework/connection/at_agent.h @@ -87,7 +87,7 @@ int InitATAgent(const char *agent_name, int fd, uint32 maintain_max); int DeleteATAgent(ATAgentType agent); int ParseATReply(char* str, const char *format, ...); void DeleteATReply(ATReplyType reply); -int ATOrderSend(ATAgentType agent, uint32 timeout_s, ATReplyType reply, const char *cmd_expr, ...); +int ATOrderSend(ATAgentType agent, uint32_t timeout_s, ATReplyType reply, const char *cmd_expr, ...); int AtCmdConfigAndCheck(ATAgentType agent, char *cmd, char *check); #endif \ No newline at end of file diff --git a/APP_Framework/Framework/connection/zigbee/e18/e18.c b/APP_Framework/Framework/connection/zigbee/e18/e18.c index 6d04f6e94..bd8d5ef92 100644 --- a/APP_Framework/Framework/connection/zigbee/e18/e18.c +++ b/APP_Framework/Framework/connection/zigbee/e18/e18.c @@ -123,15 +123,22 @@ static int E18UartOpen(struct Adapter *adapter) static int E18NetworkModeConfig(struct Adapter *adapter) { int ret = 0; + int mode = -1; + if (NULL == adapter) { return -1; } - ret = AtCmdConfigAndCheck(adapter->agent, cmd_hex2at, "+OK"); - if(ret < 0) { - printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,cmd_hex2at); - ret = -1; - goto out; + mode = E18HardwareModeGet(); + if(E18_AS_HEX_MODE == mode) + { + ret = AtCmdConfigAndCheck(adapter->agent, cmd_hex2at, "+OK"); + if(ret < 0) { + printf("%s %d cmd[%s] config failed!\n",__func__,__LINE__,cmd_hex2at); + ret = -1; + goto out; + } } + switch (adapter->info->work_mode) { @@ -168,7 +175,10 @@ static int E18NetworkModeConfig(struct Adapter *adapter) } out: - AtCmdConfigAndCheck(adapter->agent, cmd_exit, "+OK"); + if(E18_AS_HEX_MODE == mode){ + AtCmdConfigAndCheck(adapter->agent, cmd_exit, "+OK"); + } + return ret; } @@ -241,6 +251,7 @@ static int E18Open(struct Adapter *adapter) { int ret = 0; int try_times = 5; + int count = 0; if (NULL == adapter) { return -1; @@ -267,9 +278,12 @@ static int E18Open(struct Adapter *adapter) try_again: while(try_times--){ ret = E18NetRoleConfig(adapter); + count++; if(ret < 0){ - printf("E18NetRoleConfig failed [%d] times.\n",try_times); - goto try_again; + printf("E18NetRoleConfig failed [%d] times.\n",count); + continue; + } else { + break; } } From b521274b9f54e6a59572facb3fa0a657f444a92e Mon Sep 17 00:00:00 2001 From: WentaoWong Date: Mon, 18 Apr 2022 16:36:05 +0800 Subject: [PATCH 20/38] Ubiquitous/RT_Thread/: add qsqpi flash support to stm32h743_openmv_h7plus --- .../stm32h743_openmv_h7plus/.config | 32 +- .../board/CubeMX_Config/.mxproject | 4 +- .../board/CubeMX_Config/Core/Inc/main.h | 6 +- .../Core/Inc/stm32h7xx_hal_conf.h | 14 +- .../CubeMX_Config/Core/Inc/stm32h7xx_it.h | 5 + .../board/CubeMX_Config/Core/Src/main.c | 346 ++++++++++- .../Core/Src/stm32h7xx_hal_msp.c | 570 +++++++++++++++++- .../board/CubeMX_Config/CubeMX_Config.ioc | 387 +++++++++--- .../stm32h743_openmv_h7plus/board/Kconfig | 33 +- .../stm32h743_openmv_h7plus/board/SConscript | 3 + .../stm32h743_openmv_h7plus/board/board.c | 7 +- .../stm32h743_openmv_h7plus/board/board.h | 4 +- .../board/ports/drv_qspi_flash.c | 99 +++ .../board/ports/sdram_port.h | 2 +- .../stm32h743_openmv_h7plus/rtconfig.h | 20 +- 15 files changed, 1392 insertions(+), 140 deletions(-) create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/drv_qspi_flash.c diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/.config b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/.config index c5029c9fa..4bf86377c 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/.config +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/.config @@ -153,8 +153,8 @@ CONFIG_RT_DFS_ELM_MAX_SECTOR_SIZE=4096 CONFIG_RT_DFS_ELM_REENTRANT=y CONFIG_RT_DFS_ELM_MUTEX_TIMEOUT=3000 CONFIG_RT_USING_DFS_DEVFS=y -CONFIG_RT_USING_DFS_ROMFS=y -# CONFIG_RT_USING_DFS_RAMFS is not set +# CONFIG_RT_USING_DFS_ROMFS is not set +CONFIG_RT_USING_DFS_RAMFS=y # # Device Drivers @@ -180,8 +180,24 @@ CONFIG_RT_USING_PIN=y # CONFIG_RT_USING_MTD_NAND is not set # CONFIG_RT_USING_PM is not set # CONFIG_RT_USING_RTC is not set -# CONFIG_RT_USING_SDIO is not set -# CONFIG_RT_USING_SPI is not set +CONFIG_RT_USING_SDIO=y +CONFIG_RT_SDIO_STACK_SIZE=512 +CONFIG_RT_SDIO_THREAD_PRIORITY=15 +CONFIG_RT_MMCSD_STACK_SIZE=1024 +CONFIG_RT_MMCSD_THREAD_PREORITY=22 +CONFIG_RT_MMCSD_MAX_PARTITION=16 +# CONFIG_RT_SDIO_DEBUG is not set +CONFIG_RT_USING_SPI=y +CONFIG_RT_USING_QSPI=y +# CONFIG_RT_USING_SPI_MSD is not set +CONFIG_RT_USING_SFUD=y +CONFIG_RT_SFUD_USING_SFDP=y +CONFIG_RT_SFUD_USING_FLASH_INFO_TABLE=y +CONFIG_RT_SFUD_USING_QSPI=y +CONFIG_RT_SFUD_SPI_MAX_HZ=50000000 +# CONFIG_RT_DEBUG_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 is not set # CONFIG_RT_USING_SENSOR is not set @@ -272,11 +288,17 @@ CONFIG_BSP_USING_UART1=y # CONFIG_BSP_UART1_RX_USING_DMA is not set # CONFIG_BSP_USING_UART2 is not set # CONFIG_BSP_USING_LPUART1 is not set -CONFIG_BSP_USING_SDRAM=y +CONFIG_BSP_USING_QSPI=y # CONFIG_BSP_USING_CRC is not set # CONFIG_BSP_USING_RNG is not set # CONFIG_BSP_USING_UDID is not set +# +# Onboard Peripheral Drivers +# +CONFIG_BSP_USING_SDRAM=y +CONFIG_BSP_USING_QSPI_FLASH=y + # # More Drivers # diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/.mxproject b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/.mxproject index bf4101d42..78b5f4088 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/.mxproject +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/.mxproject @@ -1,8 +1,8 @@ [PreviousLibFiles] -LibFiles=Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_cortex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_fmc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_rcc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_rcc_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_flash.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_flash_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_gpio.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_gpio_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_hsem.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_dma.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_dma_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_mdma.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_pwr.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_pwr_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_def.h;Drivers\STM32H7xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_i2c.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_i2c_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_exti.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_sdram.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_tim.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_tim_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_uart.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_uart_ex.h;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_ll_fmc.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_hsem.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_mdma.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_exti.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_sdram.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart_ex.c;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_cortex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_fmc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_rcc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_rcc_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_flash.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_flash_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_gpio.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_gpio_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_hsem.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_dma.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_dma_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_mdma.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_pwr.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_pwr_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_def.h;Drivers\STM32H7xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_i2c.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_i2c_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_exti.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_sdram.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_tim.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_tim_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_uart.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_uart_ex.h;Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h743xx.h;Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h;Drivers\CMSIS\Device\ST\STM32H7xx\Include\system_stm32h7xx.h;Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c;Drivers\CMSIS\Include\cmsis_armcc.h;Drivers\CMSIS\Include\cmsis_armclang.h;Drivers\CMSIS\Include\cmsis_armclang_ltm.h;Drivers\CMSIS\Include\cmsis_compiler.h;Drivers\CMSIS\Include\cmsis_gcc.h;Drivers\CMSIS\Include\cmsis_iccarm.h;Drivers\CMSIS\Include\cmsis_version.h;Drivers\CMSIS\Include\core_armv81mml.h;Drivers\CMSIS\Include\core_armv8mbl.h;Drivers\CMSIS\Include\core_armv8mml.h;Drivers\CMSIS\Include\core_cm0.h;Drivers\CMSIS\Include\core_cm0plus.h;Drivers\CMSIS\Include\core_cm1.h;Drivers\CMSIS\Include\core_cm23.h;Drivers\CMSIS\Include\core_cm3.h;Drivers\CMSIS\Include\core_cm33.h;Drivers\CMSIS\Include\core_cm35p.h;Drivers\CMSIS\Include\core_cm4.h;Drivers\CMSIS\Include\core_cm7.h;Drivers\CMSIS\Include\core_sc000.h;Drivers\CMSIS\Include\core_sc300.h;Drivers\CMSIS\Include\mpu_armv7.h;Drivers\CMSIS\Include\mpu_armv8.h;Drivers\CMSIS\Include\tz_context.h; +LibFiles=Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_cortex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_fmc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_rcc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_rcc_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_flash.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_flash_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_gpio.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_gpio_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_hsem.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_dma.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_dma_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_mdma.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_pwr.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_pwr_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_def.h;Drivers\STM32H7xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_i2c.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_i2c_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_exti.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_sdram.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_qspi.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_sdmmc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_sd.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_delayblock.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_sd_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_tim.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_tim_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_uart.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_uart_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_pcd.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_pcd_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_usb.h;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_ll_fmc.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_hsem.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_mdma.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_exti.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_sdram.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_qspi.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_ll_sdmmc.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_ll_delayblock.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_sd.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_sd_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pcd.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pcd_ex.c;Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_ll_usb.c;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_cortex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_fmc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_rcc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_rcc_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_flash.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_flash_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_gpio.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_gpio_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_hsem.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_dma.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_dma_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_mdma.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_pwr.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_pwr_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_def.h;Drivers\STM32H7xx_HAL_Driver\Inc\Legacy\stm32_hal_legacy.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_i2c.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_i2c_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_exti.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_sdram.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_qspi.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_sdmmc.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_sd.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_delayblock.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_sd_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_tim.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_tim_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_uart.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_uart_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_pcd.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_hal_pcd_ex.h;Drivers\STM32H7xx_HAL_Driver\Inc\stm32h7xx_ll_usb.h;Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h743xx.h;Drivers\CMSIS\Device\ST\STM32H7xx\Include\stm32h7xx.h;Drivers\CMSIS\Device\ST\STM32H7xx\Include\system_stm32h7xx.h;Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c;Drivers\CMSIS\Include\cmsis_armcc.h;Drivers\CMSIS\Include\cmsis_armclang.h;Drivers\CMSIS\Include\cmsis_armclang_ltm.h;Drivers\CMSIS\Include\cmsis_compiler.h;Drivers\CMSIS\Include\cmsis_gcc.h;Drivers\CMSIS\Include\cmsis_iccarm.h;Drivers\CMSIS\Include\cmsis_version.h;Drivers\CMSIS\Include\core_armv81mml.h;Drivers\CMSIS\Include\core_armv8mbl.h;Drivers\CMSIS\Include\core_armv8mml.h;Drivers\CMSIS\Include\core_cm0.h;Drivers\CMSIS\Include\core_cm0plus.h;Drivers\CMSIS\Include\core_cm1.h;Drivers\CMSIS\Include\core_cm23.h;Drivers\CMSIS\Include\core_cm3.h;Drivers\CMSIS\Include\core_cm33.h;Drivers\CMSIS\Include\core_cm35p.h;Drivers\CMSIS\Include\core_cm4.h;Drivers\CMSIS\Include\core_cm7.h;Drivers\CMSIS\Include\core_sc000.h;Drivers\CMSIS\Include\core_sc300.h;Drivers\CMSIS\Include\mpu_armv7.h;Drivers\CMSIS\Include\mpu_armv8.h;Drivers\CMSIS\Include\tz_context.h; [PreviousUsedKeilFiles] -SourceFiles=..\Core\Src\main.c;..\Core\Src\stm32h7xx_it.c;..\Core\Src\stm32h7xx_hal_msp.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_ll_fmc.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_hsem.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_mdma.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_exti.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_sdram.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart_ex.c;..\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c;..\Core\Src\system_stm32h7xx.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_ll_fmc.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_hsem.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_mdma.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_exti.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_sdram.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart_ex.c;..\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c;..\Core\Src\system_stm32h7xx.c;;; +SourceFiles=..\Core\Src\main.c;..\Core\Src\stm32h7xx_it.c;..\Core\Src\stm32h7xx_hal_msp.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_ll_fmc.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_hsem.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_mdma.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_exti.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_sdram.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_qspi.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_ll_sdmmc.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_ll_delayblock.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_sd.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_sd_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pcd.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pcd_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_ll_usb.c;..\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c;..\Core\Src\system_stm32h7xx.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_cortex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_ll_fmc.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_rcc_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_flash_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_gpio.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_hsem.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_dma_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_mdma.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pwr_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_i2c_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_exti.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_sdram.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_qspi.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_ll_sdmmc.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_ll_delayblock.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_sd.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_sd_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_tim_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_uart_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pcd.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_hal_pcd_ex.c;..\Drivers\STM32H7xx_HAL_Driver\Src\stm32h7xx_ll_usb.c;..\Drivers\CMSIS\Device\ST\STM32H7xx\Source\Templates\system_stm32h7xx.c;..\Core\Src\system_stm32h7xx.c;;; HeaderPath=..\Drivers\STM32H7xx_HAL_Driver\Inc;..\Drivers\STM32H7xx_HAL_Driver\Inc\Legacy;..\Drivers\CMSIS\Device\ST\STM32H7xx\Include;..\Drivers\CMSIS\Include;..\Core\Inc; CDefines=USE_HAL_DRIVER;STM32H743xx;USE_HAL_DRIVER;USE_HAL_DRIVER; diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/Core/Inc/main.h b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/Core/Inc/main.h index c2e05f070..2a5f7379f 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/Core/Inc/main.h +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/Core/Inc/main.h @@ -49,6 +49,8 @@ extern "C" { /* USER CODE END EM */ +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + /* Exported functions prototypes ---------------------------------------------*/ void Error_Handler(void); @@ -59,10 +61,6 @@ void Error_Handler(void); /* Private defines -----------------------------------------------------------*/ #define LED_RED_Pin GPIO_PIN_0 #define LED_RED_GPIO_Port GPIOC -#define LED_GREEN_Pin GPIO_PIN_1 -#define LED_GREEN_GPIO_Port GPIOC -#define LED_BLUE_Pin GPIO_PIN_2 -#define LED_BLUE_GPIO_Port GPIOC /* USER CODE BEGIN Private defines */ /* USER CODE END Private defines */ diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/Core/Inc/stm32h7xx_hal_conf.h b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/Core/Inc/stm32h7xx_hal_conf.h index 4e2bd0598..6605d2cac 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/Core/Inc/stm32h7xx_hal_conf.h +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/Core/Inc/stm32h7xx_hal_conf.h @@ -43,7 +43,7 @@ /* #define HAL_CRC_MODULE_ENABLED */ /* #define HAL_CRYP_MODULE_ENABLED */ /* #define HAL_DAC_MODULE_ENABLED */ -/* #define HAL_DCMI_MODULE_ENABLED */ +#define HAL_DCMI_MODULE_ENABLED /* #define HAL_DMA2D_MODULE_ENABLED */ /* #define HAL_ETH_MODULE_ENABLED */ /* #define HAL_NAND_MODULE_ENABLED */ @@ -64,23 +64,23 @@ /* #define HAL_IWDG_MODULE_ENABLED */ /* #define HAL_LPTIM_MODULE_ENABLED */ /* #define HAL_LTDC_MODULE_ENABLED */ -/* #define HAL_QSPI_MODULE_ENABLED */ +#define HAL_QSPI_MODULE_ENABLED /* #define HAL_RAMECC_MODULE_ENABLED */ /* #define HAL_RNG_MODULE_ENABLED */ -/* #define HAL_RTC_MODULE_ENABLED */ +#define HAL_RTC_MODULE_ENABLED /* #define HAL_SAI_MODULE_ENABLED */ -/* #define HAL_SD_MODULE_ENABLED */ +#define HAL_SD_MODULE_ENABLED /* #define HAL_MMC_MODULE_ENABLED */ /* #define HAL_SPDIFRX_MODULE_ENABLED */ /* #define HAL_SPI_MODULE_ENABLED */ /* #define HAL_SWPMI_MODULE_ENABLED */ -/* #define HAL_TIM_MODULE_ENABLED */ +#define HAL_TIM_MODULE_ENABLED #define HAL_UART_MODULE_ENABLED /* #define HAL_USART_MODULE_ENABLED */ /* #define HAL_IRDA_MODULE_ENABLED */ /* #define HAL_SMARTCARD_MODULE_ENABLED */ /* #define HAL_WWDG_MODULE_ENABLED */ -/* #define HAL_PCD_MODULE_ENABLED */ +#define HAL_PCD_MODULE_ENABLED /* #define HAL_HCD_MODULE_ENABLED */ /* #define HAL_DFSDM_MODULE_ENABLED */ /* #define HAL_DSI_MODULE_ENABLED */ @@ -168,7 +168,7 @@ #define TICK_INT_PRIORITY (15UL) /*!< tick interrupt priority */ #define USE_RTOS 0 #define USE_SD_TRANSCEIVER 0U /*!< use uSD Transceiver */ -#define USE_SPI_CRC 0U /*!< use CRC in SPI */ +#define USE_SPI_CRC 0U /*!< use CRC in SPI */ #define USE_HAL_ADC_REGISTER_CALLBACKS 0U /* ADC register callback disabled */ #define USE_HAL_CEC_REGISTER_CALLBACKS 0U /* CEC register callback disabled */ diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/Core/Inc/stm32h7xx_it.h b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/Core/Inc/stm32h7xx_it.h index edc9db7de..63ec9f9ee 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/Core/Inc/stm32h7xx_it.h +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/Core/Inc/stm32h7xx_it.h @@ -55,6 +55,11 @@ void SVC_Handler(void); void DebugMon_Handler(void); void PendSV_Handler(void); void SysTick_Handler(void); +void DMA1_Stream3_IRQHandler(void); +void SDMMC1_IRQHandler(void); +void DCMI_IRQHandler(void); +void OTG_FS_EP1_OUT_IRQHandler(void); +void OTG_FS_EP1_IN_IRQHandler(void); /* USER CODE BEGIN EFP */ /* USER CODE END EFP */ diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/Core/Src/main.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/Core/Src/main.c index 8dfc5fff5..0fadc19f3 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/Core/Src/main.c +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/Core/Src/main.c @@ -40,8 +40,21 @@ /* Private variables ---------------------------------------------------------*/ +DCMI_HandleTypeDef hdcmi; +DMA_HandleTypeDef hdma_dcmi; + +QSPI_HandleTypeDef hqspi; + +RTC_HandleTypeDef hrtc; + +SD_HandleTypeDef hsd1; + +TIM_HandleTypeDef htim1; + UART_HandleTypeDef huart1; +PCD_HandleTypeDef hpcd_USB_OTG_FS; + SDRAM_HandleTypeDef hsdram1; /* USER CODE BEGIN PV */ @@ -53,6 +66,13 @@ void SystemClock_Config(void); static void MX_GPIO_Init(void); static void MX_USART1_UART_Init(void); static void MX_FMC_Init(void); +static void MX_QUADSPI_Init(void); +static void MX_SDMMC1_SD_Init(void); +static void MX_DMA_Init(void); +static void MX_RTC_Init(void); +static void MX_DCMI_Init(void); +static void MX_USB_OTG_FS_PCD_Init(void); +static void MX_TIM1_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ @@ -72,6 +92,12 @@ int main(void) /* USER CODE END 1 */ + /* Enable I-Cache---------------------------------------------------------*/ + SCB_EnableICache(); + + /* Enable D-Cache---------------------------------------------------------*/ + SCB_EnableDCache(); + /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ @@ -92,6 +118,13 @@ int main(void) MX_GPIO_Init(); MX_USART1_UART_Init(); MX_FMC_Init(); + MX_QUADSPI_Init(); + MX_SDMMC1_SD_Init(); + MX_DMA_Init(); + MX_RTC_Init(); + MX_DCMI_Init(); + MX_USB_OTG_FS_PCD_Init(); + MX_TIM1_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ @@ -119,24 +152,25 @@ void SystemClock_Config(void) /** Supply configuration update enable */ HAL_PWREx_ConfigSupply(PWR_LDO_SUPPLY); - /** Configure the main internal regulator output voltage */ __HAL_PWR_VOLTAGESCALING_CONFIG(PWR_REGULATOR_VOLTAGE_SCALE1); while(!__HAL_PWR_GET_FLAG(PWR_FLAG_VOSRDY)) {} - /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48|RCC_OSCILLATORTYPE_LSI + |RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.LSIState = RCC_LSI_ON; + RCC_OscInitStruct.HSI48State = RCC_HSI48_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 3; RCC_OscInitStruct.PLL.PLLN = 200; RCC_OscInitStruct.PLL.PLLP = 2; - RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLQ = 4; RCC_OscInitStruct.PLL.PLLR = 2; RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2; RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE; @@ -145,7 +179,6 @@ void SystemClock_Config(void) { Error_Handler(); } - /** Initializes the CPU, AHB and APB buses clocks */ RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK @@ -165,6 +198,242 @@ void SystemClock_Config(void) } } +/** + * @brief DCMI Initialization Function + * @param None + * @retval None + */ +static void MX_DCMI_Init(void) +{ + + /* USER CODE BEGIN DCMI_Init 0 */ + + /* USER CODE END DCMI_Init 0 */ + + /* USER CODE BEGIN DCMI_Init 1 */ + + /* USER CODE END DCMI_Init 1 */ + hdcmi.Instance = DCMI; + hdcmi.Init.SynchroMode = DCMI_SYNCHRO_HARDWARE; + hdcmi.Init.PCKPolarity = DCMI_PCKPOLARITY_FALLING; + hdcmi.Init.VSPolarity = DCMI_VSPOLARITY_LOW; + hdcmi.Init.HSPolarity = DCMI_HSPOLARITY_LOW; + hdcmi.Init.CaptureRate = DCMI_CR_ALL_FRAME; + hdcmi.Init.ExtendedDataMode = DCMI_EXTEND_DATA_8B; + hdcmi.Init.JPEGMode = DCMI_JPEG_ENABLE; + hdcmi.Init.ByteSelectMode = DCMI_BSM_ALL; + hdcmi.Init.ByteSelectStart = DCMI_OEBS_ODD; + hdcmi.Init.LineSelectMode = DCMI_LSM_ALL; + hdcmi.Init.LineSelectStart = DCMI_OELS_ODD; + if (HAL_DCMI_Init(&hdcmi) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN DCMI_Init 2 */ + + /* USER CODE END DCMI_Init 2 */ + +} + +/** + * @brief QUADSPI Initialization Function + * @param None + * @retval None + */ +static void MX_QUADSPI_Init(void) +{ + + /* USER CODE BEGIN QUADSPI_Init 0 */ + + /* USER CODE END QUADSPI_Init 0 */ + + /* USER CODE BEGIN QUADSPI_Init 1 */ + + /* USER CODE END QUADSPI_Init 1 */ + /* QUADSPI parameter configuration*/ + hqspi.Instance = QUADSPI; + hqspi.Init.ClockPrescaler = 1; + hqspi.Init.FifoThreshold = 3; + hqspi.Init.SampleShifting = QSPI_SAMPLE_SHIFTING_HALFCYCLE; + hqspi.Init.FlashSize = 24; + hqspi.Init.ChipSelectHighTime = QSPI_CS_HIGH_TIME_2_CYCLE; + hqspi.Init.ClockMode = QSPI_CLOCK_MODE_0; + hqspi.Init.FlashID = QSPI_FLASH_ID_1; + hqspi.Init.DualFlash = QSPI_DUALFLASH_DISABLE; + if (HAL_QSPI_Init(&hqspi) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN QUADSPI_Init 2 */ + + /* USER CODE END QUADSPI_Init 2 */ + +} + +/** + * @brief RTC Initialization Function + * @param None + * @retval None + */ +static void MX_RTC_Init(void) +{ + + /* USER CODE BEGIN RTC_Init 0 */ + + /* USER CODE END RTC_Init 0 */ + + RTC_TimeTypeDef sTime = {0}; + RTC_DateTypeDef sDate = {0}; + + /* USER CODE BEGIN RTC_Init 1 */ + + /* USER CODE END RTC_Init 1 */ + /** Initialize RTC Only + */ + hrtc.Instance = RTC; + hrtc.Init.HourFormat = RTC_HOURFORMAT_24; + hrtc.Init.AsynchPrediv = 127; + hrtc.Init.SynchPrediv = 255; + hrtc.Init.OutPut = RTC_OUTPUT_DISABLE; + hrtc.Init.OutPutPolarity = RTC_OUTPUT_POLARITY_HIGH; + hrtc.Init.OutPutType = RTC_OUTPUT_TYPE_OPENDRAIN; + hrtc.Init.OutPutRemap = RTC_OUTPUT_REMAP_NONE; + if (HAL_RTC_Init(&hrtc) != HAL_OK) + { + Error_Handler(); + } + + /* USER CODE BEGIN Check_RTC_BKUP */ + + /* USER CODE END Check_RTC_BKUP */ + + /** Initialize RTC and set the Time and Date + */ + sTime.Hours = 0x0; + sTime.Minutes = 0x0; + sTime.Seconds = 0x0; + sTime.DayLightSaving = RTC_DAYLIGHTSAVING_NONE; + sTime.StoreOperation = RTC_STOREOPERATION_RESET; + if (HAL_RTC_SetTime(&hrtc, &sTime, RTC_FORMAT_BCD) != HAL_OK) + { + Error_Handler(); + } + sDate.WeekDay = RTC_WEEKDAY_MONDAY; + sDate.Month = RTC_MONTH_JANUARY; + sDate.Date = 0x1; + sDate.Year = 0x0; + + if (HAL_RTC_SetDate(&hrtc, &sDate, RTC_FORMAT_BCD) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN RTC_Init 2 */ + + /* USER CODE END RTC_Init 2 */ + +} + +/** + * @brief SDMMC1 Initialization Function + * @param None + * @retval None + */ +static void MX_SDMMC1_SD_Init(void) +{ + + /* USER CODE BEGIN SDMMC1_Init 0 */ + + /* USER CODE END SDMMC1_Init 0 */ + + /* USER CODE BEGIN SDMMC1_Init 1 */ + + /* USER CODE END SDMMC1_Init 1 */ + hsd1.Instance = SDMMC1; + hsd1.Init.ClockEdge = SDMMC_CLOCK_EDGE_RISING; + hsd1.Init.ClockPowerSave = SDMMC_CLOCK_POWER_SAVE_DISABLE; + hsd1.Init.BusWide = SDMMC_BUS_WIDE_4B; + hsd1.Init.HardwareFlowControl = SDMMC_HARDWARE_FLOW_CONTROL_DISABLE; + hsd1.Init.ClockDiv = 4; + if (HAL_SD_Init(&hsd1) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN SDMMC1_Init 2 */ + + /* USER CODE END SDMMC1_Init 2 */ + +} + +/** + * @brief TIM1 Initialization Function + * @param None + * @retval None + */ +static void MX_TIM1_Init(void) +{ + + /* USER CODE BEGIN TIM1_Init 0 */ + + /* USER CODE END TIM1_Init 0 */ + + TIM_MasterConfigTypeDef sMasterConfig = {0}; + TIM_OC_InitTypeDef sConfigOC = {0}; + TIM_BreakDeadTimeConfigTypeDef sBreakDeadTimeConfig = {0}; + + /* USER CODE BEGIN TIM1_Init 1 */ + + /* USER CODE END TIM1_Init 1 */ + htim1.Instance = TIM1; + htim1.Init.Prescaler = 0; + htim1.Init.CounterMode = TIM_COUNTERMODE_UP; + htim1.Init.Period = 7; + htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; + htim1.Init.RepetitionCounter = 0; + htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; + if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) + { + Error_Handler(); + } + sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET; + sMasterConfig.MasterOutputTrigger2 = TIM_TRGO2_RESET; + sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE; + if (HAL_TIMEx_MasterConfigSynchronization(&htim1, &sMasterConfig) != HAL_OK) + { + Error_Handler(); + } + sConfigOC.OCMode = TIM_OCMODE_PWM1; + sConfigOC.Pulse = 3; + sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; + sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH; + sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; + sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; + sConfigOC.OCNIdleState = TIM_OCNIDLESTATE_RESET; + if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) + { + Error_Handler(); + } + sBreakDeadTimeConfig.OffStateRunMode = TIM_OSSR_DISABLE; + sBreakDeadTimeConfig.OffStateIDLEMode = TIM_OSSI_DISABLE; + sBreakDeadTimeConfig.LockLevel = TIM_LOCKLEVEL_OFF; + sBreakDeadTimeConfig.DeadTime = 0; + sBreakDeadTimeConfig.BreakState = TIM_BREAK_DISABLE; + sBreakDeadTimeConfig.BreakPolarity = TIM_BREAKPOLARITY_HIGH; + sBreakDeadTimeConfig.BreakFilter = 0; + sBreakDeadTimeConfig.Break2State = TIM_BREAK2_DISABLE; + sBreakDeadTimeConfig.Break2Polarity = TIM_BREAK2POLARITY_HIGH; + sBreakDeadTimeConfig.Break2Filter = 0; + sBreakDeadTimeConfig.AutomaticOutput = TIM_AUTOMATICOUTPUT_DISABLE; + if (HAL_TIMEx_ConfigBreakDeadTime(&htim1, &sBreakDeadTimeConfig) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN TIM1_Init 2 */ + + /* USER CODE END TIM1_Init 2 */ + HAL_TIM_MspPostInit(&htim1); + +} + /** * @brief USART1 Initialization Function * @param None @@ -213,6 +482,58 @@ static void MX_USART1_UART_Init(void) } +/** + * @brief USB_OTG_FS Initialization Function + * @param None + * @retval None + */ +static void MX_USB_OTG_FS_PCD_Init(void) +{ + + /* USER CODE BEGIN USB_OTG_FS_Init 0 */ + + /* USER CODE END USB_OTG_FS_Init 0 */ + + /* USER CODE BEGIN USB_OTG_FS_Init 1 */ + + /* USER CODE END USB_OTG_FS_Init 1 */ + hpcd_USB_OTG_FS.Instance = USB_OTG_FS; + hpcd_USB_OTG_FS.Init.dev_endpoints = 9; + hpcd_USB_OTG_FS.Init.speed = PCD_SPEED_FULL; + hpcd_USB_OTG_FS.Init.dma_enable = DISABLE; + hpcd_USB_OTG_FS.Init.phy_itface = PCD_PHY_EMBEDDED; + hpcd_USB_OTG_FS.Init.Sof_enable = DISABLE; + hpcd_USB_OTG_FS.Init.low_power_enable = DISABLE; + hpcd_USB_OTG_FS.Init.lpm_enable = DISABLE; + hpcd_USB_OTG_FS.Init.battery_charging_enable = DISABLE; + hpcd_USB_OTG_FS.Init.vbus_sensing_enable = DISABLE; + hpcd_USB_OTG_FS.Init.use_dedicated_ep1 = DISABLE; + if (HAL_PCD_Init(&hpcd_USB_OTG_FS) != HAL_OK) + { + Error_Handler(); + } + /* USER CODE BEGIN USB_OTG_FS_Init 2 */ + + /* USER CODE END USB_OTG_FS_Init 2 */ + +} + +/** + * Enable DMA controller clock + */ +static void MX_DMA_Init(void) +{ + + /* DMA controller clock enable */ + __HAL_RCC_DMA1_CLK_ENABLE(); + + /* DMA interrupt init */ + /* DMA1_Stream3_IRQn interrupt configuration */ + HAL_NVIC_SetPriority(DMA1_Stream3_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DMA1_Stream3_IRQn); + +} + /* FMC initialization function */ static void MX_FMC_Init(void) { @@ -271,24 +592,24 @@ static void MX_GPIO_Init(void) /* GPIO Ports Clock Enable */ __HAL_RCC_GPIOE_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); __HAL_RCC_GPIOG_CLK_ENABLE(); __HAL_RCC_GPIOD_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); __HAL_RCC_GPIOI_CLK_ENABLE(); __HAL_RCC_GPIOH_CLK_ENABLE(); __HAL_RCC_GPIOF_CLK_ENABLE(); - __HAL_RCC_GPIOC_CLK_ENABLE(); - __HAL_RCC_GPIOA_CLK_ENABLE(); - __HAL_RCC_GPIOB_CLK_ENABLE(); /*Configure GPIO pin Output Level */ - HAL_GPIO_WritePin(GPIOC, LED_RED_Pin|LED_GREEN_Pin|LED_BLUE_Pin, GPIO_PIN_RESET); + HAL_GPIO_WritePin(LED_RED_GPIO_Port, LED_RED_Pin, GPIO_PIN_RESET); - /*Configure GPIO pins : LED_RED_Pin LED_GREEN_Pin LED_BLUE_Pin */ - GPIO_InitStruct.Pin = LED_RED_Pin|LED_GREEN_Pin|LED_BLUE_Pin; + /*Configure GPIO pin : LED_RED_Pin */ + GPIO_InitStruct.Pin = LED_RED_Pin; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; - HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + HAL_GPIO_Init(LED_RED_GPIO_Port, &GPIO_InitStruct); } @@ -327,3 +648,4 @@ void assert_failed(uint8_t *file, uint32_t line) /* USER CODE END 6 */ } #endif /* USE_FULL_ASSERT */ + diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/Core/Src/stm32h7xx_hal_msp.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/Core/Src/stm32h7xx_hal_msp.c index c214b85e2..bc295e6c7 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/Core/Src/stm32h7xx_hal_msp.c +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/Core/Src/stm32h7xx_hal_msp.c @@ -25,6 +25,7 @@ #include "drv_common.h" #endif /* USER CODE END Includes */ +extern DMA_HandleTypeDef hdma_dcmi; /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN TD */ @@ -59,7 +60,9 @@ /* USER CODE BEGIN 0 */ /* USER CODE END 0 */ -/** + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef *htim); + /** * Initializes the Global MSP. */ void HAL_MspInit(void) @@ -77,6 +80,484 @@ void HAL_MspInit(void) /* USER CODE END MspInit 1 */ } +/** +* @brief DCMI MSP Initialization +* This function configures the hardware resources used in this example +* @param hdcmi: DCMI handle pointer +* @retval None +*/ +void HAL_DCMI_MspInit(DCMI_HandleTypeDef* hdcmi) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(hdcmi->Instance==DCMI) + { + /* USER CODE BEGIN DCMI_MspInit 0 */ + + /* USER CODE END DCMI_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_DCMI_CLK_ENABLE(); + + __HAL_RCC_GPIOE_CLK_ENABLE(); + __HAL_RCC_GPIOB_CLK_ENABLE(); + __HAL_RCC_GPIOG_CLK_ENABLE(); + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**DCMI GPIO Configuration + PE4 ------> DCMI_D4 + PE5 ------> DCMI_D6 + PE6 ------> DCMI_D7 + PB7 ------> DCMI_VSYNC + PB6 ------> DCMI_D5 + PG11 ------> DCMI_D3 + PG10 ------> DCMI_D2 + PC7 ------> DCMI_D1 + PC6 ------> DCMI_D0 + PA4 ------> DCMI_HSYNC + PA6 ------> DCMI_PIXCLK + */ + GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; + HAL_GPIO_Init(GPIOE, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; + HAL_GPIO_Init(GPIOB, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_11|GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_4|GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF13_DCMI; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* DCMI DMA Init */ + /* DCMI Init */ + hdma_dcmi.Instance = DMA1_Stream3; + hdma_dcmi.Init.Request = DMA_REQUEST_DCMI; + hdma_dcmi.Init.Direction = DMA_PERIPH_TO_MEMORY; + hdma_dcmi.Init.PeriphInc = DMA_PINC_DISABLE; + hdma_dcmi.Init.MemInc = DMA_MINC_ENABLE; + hdma_dcmi.Init.PeriphDataAlignment = DMA_PDATAALIGN_WORD; + hdma_dcmi.Init.MemDataAlignment = DMA_MDATAALIGN_WORD; + hdma_dcmi.Init.Mode = DMA_CIRCULAR; + hdma_dcmi.Init.Priority = DMA_PRIORITY_HIGH; + hdma_dcmi.Init.FIFOMode = DMA_FIFOMODE_ENABLE; + hdma_dcmi.Init.FIFOThreshold = DMA_FIFO_THRESHOLD_FULL; + hdma_dcmi.Init.MemBurst = DMA_MBURST_SINGLE; + hdma_dcmi.Init.PeriphBurst = DMA_PBURST_SINGLE; + if (HAL_DMA_Init(&hdma_dcmi) != HAL_OK) + { + Error_Handler(); + } + + __HAL_LINKDMA(hdcmi,DMA_Handle,hdma_dcmi); + + /* DCMI interrupt Init */ + HAL_NVIC_SetPriority(DCMI_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(DCMI_IRQn); + /* USER CODE BEGIN DCMI_MspInit 1 */ + + /* USER CODE END DCMI_MspInit 1 */ + } + +} + +/** +* @brief DCMI MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hdcmi: DCMI handle pointer +* @retval None +*/ +void HAL_DCMI_MspDeInit(DCMI_HandleTypeDef* hdcmi) +{ + if(hdcmi->Instance==DCMI) + { + /* USER CODE BEGIN DCMI_MspDeInit 0 */ + + /* USER CODE END DCMI_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_DCMI_CLK_DISABLE(); + + /**DCMI GPIO Configuration + PE4 ------> DCMI_D4 + PE5 ------> DCMI_D6 + PE6 ------> DCMI_D7 + PB7 ------> DCMI_VSYNC + PB6 ------> DCMI_D5 + PG11 ------> DCMI_D3 + PG10 ------> DCMI_D2 + PC7 ------> DCMI_D1 + PC6 ------> DCMI_D0 + PA4 ------> DCMI_HSYNC + PA6 ------> DCMI_PIXCLK + */ + HAL_GPIO_DeInit(GPIOE, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6); + + HAL_GPIO_DeInit(GPIOB, GPIO_PIN_7|GPIO_PIN_6); + + HAL_GPIO_DeInit(GPIOG, GPIO_PIN_11|GPIO_PIN_10); + + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_7|GPIO_PIN_6); + + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_4|GPIO_PIN_6); + + /* DCMI DMA DeInit */ + HAL_DMA_DeInit(hdcmi->DMA_Handle); + + /* DCMI interrupt DeInit */ + HAL_NVIC_DisableIRQ(DCMI_IRQn); + /* USER CODE BEGIN DCMI_MspDeInit 1 */ + + /* USER CODE END DCMI_MspDeInit 1 */ + } + +} + +/** +* @brief QSPI MSP Initialization +* This function configures the hardware resources used in this example +* @param hqspi: QSPI handle pointer +* @retval None +*/ +void HAL_QSPI_MspInit(QSPI_HandleTypeDef* hqspi) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + if(hqspi->Instance==QUADSPI) + { + /* USER CODE BEGIN QUADSPI_MspInit 0 */ + + /* USER CODE END QUADSPI_MspInit 0 */ + /** Initializes the peripherals clock + */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_QSPI; + PeriphClkInitStruct.QspiClockSelection = RCC_QSPICLKSOURCE_D1HCLK; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /* Peripheral clock enable */ + __HAL_RCC_QSPI_CLK_ENABLE(); + + __HAL_RCC_GPIOG_CLK_ENABLE(); + __HAL_RCC_GPIOF_CLK_ENABLE(); + /**QUADSPI GPIO Configuration + PG6 ------> QUADSPI_BK1_NCS + PF7 ------> QUADSPI_BK1_IO2 + PF6 ------> QUADSPI_BK1_IO3 + PF10 ------> QUADSPI_CLK + PF9 ------> QUADSPI_BK1_IO1 + PF8 ------> QUADSPI_BK1_IO0 + */ + GPIO_InitStruct.Pin = GPIO_PIN_6; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; + GPIO_InitStruct.Alternate = GPIO_AF10_QUADSPI; + HAL_GPIO_Init(GPIOG, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_7|GPIO_PIN_6|GPIO_PIN_10; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF9_QUADSPI; + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_8; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF10_QUADSPI; + HAL_GPIO_Init(GPIOF, &GPIO_InitStruct); + + /* USER CODE BEGIN QUADSPI_MspInit 1 */ + + /* USER CODE END QUADSPI_MspInit 1 */ + } + +} + +/** +* @brief QSPI MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hqspi: QSPI handle pointer +* @retval None +*/ +void HAL_QSPI_MspDeInit(QSPI_HandleTypeDef* hqspi) +{ + if(hqspi->Instance==QUADSPI) + { + /* USER CODE BEGIN QUADSPI_MspDeInit 0 */ + + /* USER CODE END QUADSPI_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_QSPI_CLK_DISABLE(); + + /**QUADSPI GPIO Configuration + PG6 ------> QUADSPI_BK1_NCS + PF7 ------> QUADSPI_BK1_IO2 + PF6 ------> QUADSPI_BK1_IO3 + PF10 ------> QUADSPI_CLK + PF9 ------> QUADSPI_BK1_IO1 + PF8 ------> QUADSPI_BK1_IO0 + */ + HAL_GPIO_DeInit(GPIOG, GPIO_PIN_6); + + HAL_GPIO_DeInit(GPIOF, GPIO_PIN_7|GPIO_PIN_6|GPIO_PIN_10|GPIO_PIN_9 + |GPIO_PIN_8); + + /* USER CODE BEGIN QUADSPI_MspDeInit 1 */ + + /* USER CODE END QUADSPI_MspDeInit 1 */ + } + +} + +/** +* @brief RTC MSP Initialization +* This function configures the hardware resources used in this example +* @param hrtc: RTC handle pointer +* @retval None +*/ +void HAL_RTC_MspInit(RTC_HandleTypeDef* hrtc) +{ + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + if(hrtc->Instance==RTC) + { + /* USER CODE BEGIN RTC_MspInit 0 */ + + /* USER CODE END RTC_MspInit 0 */ + /** Initializes the peripherals clock + */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_RTC; + PeriphClkInitStruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /* Peripheral clock enable */ + __HAL_RCC_RTC_ENABLE(); + /* USER CODE BEGIN RTC_MspInit 1 */ + + /* USER CODE END RTC_MspInit 1 */ + } + +} + +/** +* @brief RTC MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hrtc: RTC handle pointer +* @retval None +*/ +void HAL_RTC_MspDeInit(RTC_HandleTypeDef* hrtc) +{ + if(hrtc->Instance==RTC) + { + /* USER CODE BEGIN RTC_MspDeInit 0 */ + + /* USER CODE END RTC_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_RTC_DISABLE(); + /* USER CODE BEGIN RTC_MspDeInit 1 */ + + /* USER CODE END RTC_MspDeInit 1 */ + } + +} + +/** +* @brief SD MSP Initialization +* This function configures the hardware resources used in this example +* @param hsd: SD handle pointer +* @retval None +*/ +void HAL_SD_MspInit(SD_HandleTypeDef* hsd) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + if(hsd->Instance==SDMMC1) + { + /* USER CODE BEGIN SDMMC1_MspInit 0 */ + + /* USER CODE END SDMMC1_MspInit 0 */ + /** Initializes the peripherals clock + */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_SDMMC; + PeriphClkInitStruct.SdmmcClockSelection = RCC_SDMMCCLKSOURCE_PLL; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } + + /* Peripheral clock enable */ + __HAL_RCC_SDMMC1_CLK_ENABLE(); + + __HAL_RCC_GPIOC_CLK_ENABLE(); + __HAL_RCC_GPIOD_CLK_ENABLE(); + /**SDMMC1 GPIO Configuration + PC12 ------> SDMMC1_CK + PC11 ------> SDMMC1_D3 + PC10 ------> SDMMC1_D2 + PD2 ------> SDMMC1_CMD + PC9 ------> SDMMC1_D1 + PC8 ------> SDMMC1_D0 + */ + GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_11|GPIO_PIN_10|GPIO_PIN_9 + |GPIO_PIN_8; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_SDIO1; + HAL_GPIO_Init(GPIOC, &GPIO_InitStruct); + + GPIO_InitStruct.Pin = GPIO_PIN_2; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF12_SDIO1; + HAL_GPIO_Init(GPIOD, &GPIO_InitStruct); + + /* SDMMC1 interrupt Init */ + HAL_NVIC_SetPriority(SDMMC1_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(SDMMC1_IRQn); + /* USER CODE BEGIN SDMMC1_MspInit 1 */ + + /* USER CODE END SDMMC1_MspInit 1 */ + } + +} + +/** +* @brief SD MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hsd: SD handle pointer +* @retval None +*/ +void HAL_SD_MspDeInit(SD_HandleTypeDef* hsd) +{ + if(hsd->Instance==SDMMC1) + { + /* USER CODE BEGIN SDMMC1_MspDeInit 0 */ + + /* USER CODE END SDMMC1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_SDMMC1_CLK_DISABLE(); + + /**SDMMC1 GPIO Configuration + PC12 ------> SDMMC1_CK + PC11 ------> SDMMC1_D3 + PC10 ------> SDMMC1_D2 + PD2 ------> SDMMC1_CMD + PC9 ------> SDMMC1_D1 + PC8 ------> SDMMC1_D0 + */ + HAL_GPIO_DeInit(GPIOC, GPIO_PIN_12|GPIO_PIN_11|GPIO_PIN_10|GPIO_PIN_9 + |GPIO_PIN_8); + + HAL_GPIO_DeInit(GPIOD, GPIO_PIN_2); + + /* SDMMC1 interrupt DeInit */ + HAL_NVIC_DisableIRQ(SDMMC1_IRQn); + /* USER CODE BEGIN SDMMC1_MspDeInit 1 */ + + /* USER CODE END SDMMC1_MspDeInit 1 */ + } + +} + +/** +* @brief TIM_PWM MSP Initialization +* This function configures the hardware resources used in this example +* @param htim_pwm: TIM_PWM handle pointer +* @retval None +*/ +void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* htim_pwm) +{ + if(htim_pwm->Instance==TIM1) + { + /* USER CODE BEGIN TIM1_MspInit 0 */ + + /* USER CODE END TIM1_MspInit 0 */ + /* Peripheral clock enable */ + __HAL_RCC_TIM1_CLK_ENABLE(); + /* USER CODE BEGIN TIM1_MspInit 1 */ + + /* USER CODE END TIM1_MspInit 1 */ + } + +} + +void HAL_TIM_MspPostInit(TIM_HandleTypeDef* htim) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + if(htim->Instance==TIM1) + { + /* USER CODE BEGIN TIM1_MspPostInit 0 */ + + /* USER CODE END TIM1_MspPostInit 0 */ + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**TIM1 GPIO Configuration + PA8 ------> TIM1_CH1 + */ + GPIO_InitStruct.Pin = GPIO_PIN_8; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_PULLUP; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF1_TIM1; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* USER CODE BEGIN TIM1_MspPostInit 1 */ + + /* USER CODE END TIM1_MspPostInit 1 */ + } + +} +/** +* @brief TIM_PWM MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param htim_pwm: TIM_PWM handle pointer +* @retval None +*/ +void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* htim_pwm) +{ + if(htim_pwm->Instance==TIM1) + { + /* USER CODE BEGIN TIM1_MspDeInit 0 */ + + /* USER CODE END TIM1_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_TIM1_CLK_DISABLE(); + /* USER CODE BEGIN TIM1_MspDeInit 1 */ + + /* USER CODE END TIM1_MspDeInit 1 */ + } + +} + /** * @brief UART MSP Initialization * This function configures the hardware resources used in this example @@ -92,7 +573,6 @@ void HAL_UART_MspInit(UART_HandleTypeDef* huart) /* USER CODE BEGIN USART1_MspInit 0 */ /* USER CODE END USART1_MspInit 0 */ - /** Initializes the peripherals clock */ PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USART1; @@ -153,6 +633,91 @@ void HAL_UART_MspDeInit(UART_HandleTypeDef* huart) } +/** +* @brief PCD MSP Initialization +* This function configures the hardware resources used in this example +* @param hpcd: PCD handle pointer +* @retval None +*/ +void HAL_PCD_MspInit(PCD_HandleTypeDef* hpcd) +{ + GPIO_InitTypeDef GPIO_InitStruct = {0}; + RCC_PeriphCLKInitTypeDef PeriphClkInitStruct = {0}; + if(hpcd->Instance==USB_OTG_FS) + { + /* USER CODE BEGIN USB_OTG_FS_MspInit 0 */ + + /* USER CODE END USB_OTG_FS_MspInit 0 */ + /** Initializes the peripherals clock + */ + PeriphClkInitStruct.PeriphClockSelection = RCC_PERIPHCLK_USB; + PeriphClkInitStruct.UsbClockSelection = RCC_USBCLKSOURCE_HSI48; + if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInitStruct) != HAL_OK) + { + Error_Handler(); + } + /** Enable USB Voltage detector + */ + HAL_PWREx_EnableUSBVoltageDetector(); + + __HAL_RCC_GPIOA_CLK_ENABLE(); + /**USB_OTG_FS GPIO Configuration + PA12 ------> USB_OTG_FS_DP + PA11 ------> USB_OTG_FS_DM + */ + GPIO_InitStruct.Pin = GPIO_PIN_12|GPIO_PIN_11; + GPIO_InitStruct.Mode = GPIO_MODE_AF_PP; + GPIO_InitStruct.Pull = GPIO_NOPULL; + GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH; + GPIO_InitStruct.Alternate = GPIO_AF10_OTG1_FS; + HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); + + /* Peripheral clock enable */ + __HAL_RCC_USB_OTG_FS_CLK_ENABLE(); + /* USB_OTG_FS interrupt Init */ + HAL_NVIC_SetPriority(OTG_FS_EP1_OUT_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(OTG_FS_EP1_OUT_IRQn); + HAL_NVIC_SetPriority(OTG_FS_EP1_IN_IRQn, 0, 0); + HAL_NVIC_EnableIRQ(OTG_FS_EP1_IN_IRQn); + /* USER CODE BEGIN USB_OTG_FS_MspInit 1 */ + + /* USER CODE END USB_OTG_FS_MspInit 1 */ + } + +} + +/** +* @brief PCD MSP De-Initialization +* This function freeze the hardware resources used in this example +* @param hpcd: PCD handle pointer +* @retval None +*/ +void HAL_PCD_MspDeInit(PCD_HandleTypeDef* hpcd) +{ + if(hpcd->Instance==USB_OTG_FS) + { + /* USER CODE BEGIN USB_OTG_FS_MspDeInit 0 */ + + /* USER CODE END USB_OTG_FS_MspDeInit 0 */ + /* Peripheral clock disable */ + __HAL_RCC_USB_OTG_FS_CLK_DISABLE(); + + /**USB_OTG_FS GPIO Configuration + PA12 ------> USB_OTG_FS_DP + PA11 ------> USB_OTG_FS_DM + */ + HAL_GPIO_DeInit(GPIOA, GPIO_PIN_12|GPIO_PIN_11); + + /* USB_OTG_FS interrupt DeInit */ + HAL_NVIC_DisableIRQ(OTG_FS_EP1_OUT_IRQn); + HAL_NVIC_DisableIRQ(OTG_FS_EP1_IN_IRQn); + /* USER CODE BEGIN USB_OTG_FS_MspDeInit 1 */ + + /* USER CODE END USB_OTG_FS_MspDeInit 1 */ + } + +} + static uint32_t FMC_Initialized = 0; static void HAL_FMC_MspInit(void){ @@ -430,3 +995,4 @@ void HAL_SDRAM_MspDeInit(SDRAM_HandleTypeDef* hsdram){ /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ + diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/CubeMX_Config.ioc b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/CubeMX_Config.ioc index eade1aaf9..81714499b 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/CubeMX_Config.ioc +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/CubeMX_Config/CubeMX_Config.ioc @@ -1,4 +1,32 @@ #MicroXplorer Configuration settings - do not modify +CORTEX_M7.CPU_DCache=Enabled +CORTEX_M7.CPU_ICache=Enabled +CORTEX_M7.IPParameters=CPU_ICache,CPU_DCache +DCMI.IPParameters=JPEGMode +DCMI.JPEGMode=DCMI_JPEG_ENABLE +Dma.DCMI.0.Direction=DMA_PERIPH_TO_MEMORY +Dma.DCMI.0.EventEnable=DISABLE +Dma.DCMI.0.FIFOMode=DMA_FIFOMODE_ENABLE +Dma.DCMI.0.FIFOThreshold=DMA_FIFO_THRESHOLD_FULL +Dma.DCMI.0.Instance=DMA1_Stream3 +Dma.DCMI.0.MemBurst=DMA_MBURST_SINGLE +Dma.DCMI.0.MemDataAlignment=DMA_MDATAALIGN_WORD +Dma.DCMI.0.MemInc=DMA_MINC_ENABLE +Dma.DCMI.0.Mode=DMA_CIRCULAR +Dma.DCMI.0.PeriphBurst=DMA_PBURST_SINGLE +Dma.DCMI.0.PeriphDataAlignment=DMA_PDATAALIGN_WORD +Dma.DCMI.0.PeriphInc=DMA_PINC_DISABLE +Dma.DCMI.0.Polarity=HAL_DMAMUX_REQ_GEN_RISING +Dma.DCMI.0.Priority=DMA_PRIORITY_HIGH +Dma.DCMI.0.RequestNumber=1 +Dma.DCMI.0.RequestParameters=Instance,Direction,PeriphInc,MemInc,PeriphDataAlignment,MemDataAlignment,Mode,Priority,FIFOMode,FIFOThreshold,MemBurst,PeriphBurst,SignalID,Polarity,RequestNumber,SyncSignalID,SyncPolarity,SyncEnable,EventEnable,SyncRequestNumber +Dma.DCMI.0.SignalID=NONE +Dma.DCMI.0.SyncEnable=DISABLE +Dma.DCMI.0.SyncPolarity=HAL_DMAMUX_SYNC_NO_EVENT +Dma.DCMI.0.SyncRequestNumber=1 +Dma.DCMI.0.SyncSignalID=NONE +Dma.Request0=DCMI +Dma.RequestsNb=1 FMC.BankMapConfig=FMC_SWAPBMAP_DISABLE FMC.CASLatency1=FMC_SDRAM_CAS_LATENCY_2 FMC.ColumnBitsNumber1=FMC_SDRAM_COLUMN_BITS_NUM_9 @@ -18,117 +46,189 @@ KeepUserPlacement=false Mcu.CPN=STM32H743IIK6 Mcu.Family=STM32H7 Mcu.IP0=CORTEX_M7 -Mcu.IP1=FMC -Mcu.IP2=NVIC -Mcu.IP3=RCC -Mcu.IP4=SYS -Mcu.IP5=USART1 -Mcu.IPNb=6 +Mcu.IP1=DCMI +Mcu.IP10=TIM1 +Mcu.IP11=USART1 +Mcu.IP12=USB_OTG_FS +Mcu.IP2=DMA +Mcu.IP3=FMC +Mcu.IP4=NVIC +Mcu.IP5=QUADSPI +Mcu.IP6=RCC +Mcu.IP7=RTC +Mcu.IP8=SDMMC1 +Mcu.IP9=SYS +Mcu.IPNb=13 Mcu.Name=STM32H743IIKx Mcu.Package=UFBGA176 Mcu.Pin0=PE1 Mcu.Pin1=PE0 -Mcu.Pin10=PI9 -Mcu.Pin11=PI4 -Mcu.Pin12=PH15 -Mcu.Pin13=PI1 -Mcu.Pin14=PF0 -Mcu.Pin15=PI10 -Mcu.Pin16=PH13 -Mcu.Pin17=PH14 -Mcu.Pin18=PI0 -Mcu.Pin19=PH0-OSC_IN (PH0) -Mcu.Pin2=PG15 -Mcu.Pin20=PH1-OSC_OUT (PH1) -Mcu.Pin21=PF2 -Mcu.Pin22=PF1 -Mcu.Pin23=PG8 -Mcu.Pin24=PF3 -Mcu.Pin25=PF4 -Mcu.Pin26=PF5 -Mcu.Pin27=PH12 -Mcu.Pin28=PG5 -Mcu.Pin29=PG4 -Mcu.Pin3=PD0 -Mcu.Pin30=PH11 -Mcu.Pin31=PH10 -Mcu.Pin32=PD15 -Mcu.Pin33=PC0 -Mcu.Pin34=PC1 -Mcu.Pin35=PC2_C -Mcu.Pin36=PG1 -Mcu.Pin37=PH8 -Mcu.Pin38=PH9 -Mcu.Pin39=PD14 -Mcu.Pin4=PI7 -Mcu.Pin40=PC4 -Mcu.Pin41=PF13 -Mcu.Pin42=PG0 -Mcu.Pin43=PE13 -Mcu.Pin44=PD10 -Mcu.Pin45=PC5 -Mcu.Pin46=PF12 -Mcu.Pin47=PF15 -Mcu.Pin48=PE8 -Mcu.Pin49=PE9 -Mcu.Pin5=PI6 -Mcu.Pin50=PE11 -Mcu.Pin51=PE14 -Mcu.Pin52=PD9 -Mcu.Pin53=PD8 -Mcu.Pin54=PA7 -Mcu.Pin55=PF11 -Mcu.Pin56=PF14 -Mcu.Pin57=PE7 -Mcu.Pin58=PE10 -Mcu.Pin59=PE12 -Mcu.Pin6=PI5 -Mcu.Pin60=PE15 -Mcu.Pin61=PB14 -Mcu.Pin62=PB15 -Mcu.Pin63=VP_SYS_VS_Systick -Mcu.Pin7=PD1 -Mcu.Pin8=PI3 -Mcu.Pin9=PI2 -Mcu.PinsNb=64 +Mcu.Pin10=PG10 +Mcu.Pin11=PD0 +Mcu.Pin12=PC11 +Mcu.Pin13=PC10 +Mcu.Pin14=PA12 +Mcu.Pin15=PI7 +Mcu.Pin16=PI6 +Mcu.Pin17=PI5 +Mcu.Pin18=PD1 +Mcu.Pin19=PI3 +Mcu.Pin2=PC12 +Mcu.Pin20=PI2 +Mcu.Pin21=PA11 +Mcu.Pin22=PI9 +Mcu.Pin23=PI4 +Mcu.Pin24=PD2 +Mcu.Pin25=PH15 +Mcu.Pin26=PI1 +Mcu.Pin27=PF0 +Mcu.Pin28=PI10 +Mcu.Pin29=PH13 +Mcu.Pin3=PE4 +Mcu.Pin30=PH14 +Mcu.Pin31=PI0 +Mcu.Pin32=PC9 +Mcu.Pin33=PA8 +Mcu.Pin34=PH0-OSC_IN (PH0) +Mcu.Pin35=PC8 +Mcu.Pin36=PC7 +Mcu.Pin37=PH1-OSC_OUT (PH1) +Mcu.Pin38=PF2 +Mcu.Pin39=PF1 +Mcu.Pin4=PE5 +Mcu.Pin40=PG8 +Mcu.Pin41=PC6 +Mcu.Pin42=PF3 +Mcu.Pin43=PF4 +Mcu.Pin44=PG6 +Mcu.Pin45=PF7 +Mcu.Pin46=PF6 +Mcu.Pin47=PF5 +Mcu.Pin48=PH12 +Mcu.Pin49=PG5 +Mcu.Pin5=PE6 +Mcu.Pin50=PG4 +Mcu.Pin51=PF10 +Mcu.Pin52=PF9 +Mcu.Pin53=PF8 +Mcu.Pin54=PH11 +Mcu.Pin55=PH10 +Mcu.Pin56=PD15 +Mcu.Pin57=PC0 +Mcu.Pin58=PG1 +Mcu.Pin59=PH8 +Mcu.Pin6=PB7 +Mcu.Pin60=PH9 +Mcu.Pin61=PD14 +Mcu.Pin62=PA4 +Mcu.Pin63=PC4 +Mcu.Pin64=PF13 +Mcu.Pin65=PG0 +Mcu.Pin66=PE13 +Mcu.Pin67=PD10 +Mcu.Pin68=PA6 +Mcu.Pin69=PC5 +Mcu.Pin7=PB6 +Mcu.Pin70=PF12 +Mcu.Pin71=PF15 +Mcu.Pin72=PE8 +Mcu.Pin73=PE9 +Mcu.Pin74=PE11 +Mcu.Pin75=PE14 +Mcu.Pin76=PD9 +Mcu.Pin77=PD8 +Mcu.Pin78=PA7 +Mcu.Pin79=PF11 +Mcu.Pin8=PG15 +Mcu.Pin80=PF14 +Mcu.Pin81=PE7 +Mcu.Pin82=PE10 +Mcu.Pin83=PE12 +Mcu.Pin84=PE15 +Mcu.Pin85=PB14 +Mcu.Pin86=PB15 +Mcu.Pin87=VP_RTC_VS_RTC_Activate +Mcu.Pin88=VP_RTC_VS_RTC_Calendar +Mcu.Pin89=VP_SYS_VS_Systick +Mcu.Pin9=PG11 +Mcu.PinsNb=90 Mcu.ThirdPartyNb=0 Mcu.UserConstants= Mcu.UserName=STM32H743IIKx -MxCube.Version=6.5.0 -MxDb.Version=DB.6.0.50 +MxCube.Version=6.4.0 +MxDb.Version=DB.6.0.40 NVIC.BusFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true +NVIC.DCMI_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true +NVIC.DMA1_Stream3_IRQn=true\:0\:0\:false\:false\:true\:false\:true\:true NVIC.DebugMonitor_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true NVIC.ForceEnableDMAVector=true NVIC.HardFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true NVIC.MemoryManagement_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true NVIC.NonMaskableInt_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true +NVIC.OTG_FS_EP1_IN_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true +NVIC.OTG_FS_EP1_OUT_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.PendSV_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true NVIC.PriorityGroup=NVIC_PRIORITYGROUP_4 +NVIC.SDMMC1_IRQn=true\:0\:0\:false\:false\:true\:true\:true\:true NVIC.SVCall_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true NVIC.SysTick_IRQn=true\:15\:0\:false\:false\:true\:false\:true\:true NVIC.UsageFault_IRQn=true\:0\:0\:false\:false\:true\:false\:false\:true +PA11.GPIOParameters=GPIO_Speed +PA11.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PA11.Mode=Device_Only +PA11.Signal=USB_OTG_FS_DM +PA12.GPIOParameters=GPIO_Speed +PA12.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PA12.Mode=Device_Only +PA12.Signal=USB_OTG_FS_DP +PA4.GPIOParameters=GPIO_Speed,GPIO_PuPd +PA4.GPIO_PuPd=GPIO_PULLUP +PA4.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PA4.Locked=true +PA4.Mode=Slave_8_bits_External_Synchro +PA4.Signal=DCMI_HSYNC +PA6.GPIOParameters=GPIO_Speed,GPIO_PuPd +PA6.GPIO_PuPd=GPIO_PULLUP +PA6.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PA6.Locked=true +PA6.Mode=Slave_8_bits_External_Synchro +PA6.Signal=DCMI_PIXCLK PA7.GPIOParameters=GPIO_PuPd PA7.GPIO_PuPd=GPIO_PULLUP PA7.Locked=true PA7.Signal=FMC_SDNWE +PA8.GPIOParameters=GPIO_Speed,GPIO_PuPd +PA8.GPIO_PuPd=GPIO_PULLUP +PA8.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PA8.Signal=S_TIM1_CH1 PB14.Locked=true PB14.Mode=Asynchronous PB14.Signal=USART1_TX PB15.Locked=true PB15.Mode=Asynchronous PB15.Signal=USART1_RX +PB6.GPIOParameters=GPIO_Speed,GPIO_PuPd +PB6.GPIO_PuPd=GPIO_PULLUP +PB6.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PB6.Locked=true +PB6.Mode=Slave_8_bits_External_Synchro +PB6.Signal=DCMI_D5 +PB7.GPIOParameters=GPIO_Speed,GPIO_PuPd +PB7.GPIO_PuPd=GPIO_PULLUP +PB7.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PB7.Locked=true +PB7.Mode=Slave_8_bits_External_Synchro +PB7.Signal=DCMI_VSYNC PC0.GPIOParameters=GPIO_Label PC0.GPIO_Label=LED_RED PC0.Locked=true PC0.Signal=GPIO_Output -PC1.GPIOParameters=GPIO_Label -PC1.GPIO_Label=LED_GREEN -PC1.Locked=true -PC1.Signal=GPIO_Output -PC2_C.GPIOParameters=GPIO_Label -PC2_C.GPIO_Label=LED_BLUE -PC2_C.Locked=true -PC2_C.Signal=GPIO_Output +PC10.Mode=SD_4_bits_Wide_bus +PC10.Signal=SDMMC1_D2 +PC11.Mode=SD_4_bits_Wide_bus +PC11.Signal=SDMMC1_D3 +PC12.Mode=SD_4_bits_Wide_bus +PC12.Signal=SDMMC1_CK PC4.GPIOParameters=GPIO_PuPd PC4.GPIO_PuPd=GPIO_PULLUP PC4.Locked=true @@ -139,6 +239,22 @@ PC5.GPIO_PuPd=GPIO_PULLUP PC5.Locked=true PC5.Mode=SdramChipSelect1_1 PC5.Signal=FMC_SDCKE0 +PC6.GPIOParameters=GPIO_Speed,GPIO_PuPd +PC6.GPIO_PuPd=GPIO_PULLUP +PC6.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PC6.Locked=true +PC6.Mode=Slave_8_bits_External_Synchro +PC6.Signal=DCMI_D0 +PC7.GPIOParameters=GPIO_Speed,GPIO_PuPd +PC7.GPIO_PuPd=GPIO_PULLUP +PC7.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PC7.Locked=true +PC7.Mode=Slave_8_bits_External_Synchro +PC7.Signal=DCMI_D1 +PC8.Mode=SD_4_bits_Wide_bus +PC8.Signal=SDMMC1_D0 +PC9.Mode=SD_4_bits_Wide_bus +PC9.Signal=SDMMC1_D1 PD0.GPIOParameters=GPIO_PuPd PD0.GPIO_PuPd=GPIO_PULLUP PD0.Signal=FMC_D2_DA2 @@ -154,6 +270,8 @@ PD14.Signal=FMC_D0_DA0 PD15.GPIOParameters=GPIO_PuPd PD15.GPIO_PuPd=GPIO_PULLUP PD15.Signal=FMC_D1_DA1 +PD2.Mode=SD_4_bits_Wide_bus +PD2.Signal=SDMMC1_CMD PD8.GPIOParameters=GPIO_PuPd PD8.GPIO_PuPd=GPIO_PULLUP PD8.Signal=FMC_D13_DA13 @@ -184,6 +302,24 @@ PE14.Signal=FMC_D11_DA11 PE15.GPIOParameters=GPIO_PuPd PE15.GPIO_PuPd=GPIO_PULLUP PE15.Signal=FMC_D12_DA12 +PE4.GPIOParameters=GPIO_Speed,GPIO_PuPd +PE4.GPIO_PuPd=GPIO_PULLUP +PE4.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PE4.Locked=true +PE4.Mode=Slave_8_bits_External_Synchro +PE4.Signal=DCMI_D4 +PE5.GPIOParameters=GPIO_Speed,GPIO_PuPd +PE5.GPIO_PuPd=GPIO_PULLUP +PE5.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PE5.Locked=true +PE5.Mode=Slave_8_bits_External_Synchro +PE5.Signal=DCMI_D6 +PE6.GPIOParameters=GPIO_Speed,GPIO_PuPd +PE6.GPIO_PuPd=GPIO_PULLUP +PE6.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PE6.Locked=true +PE6.Mode=Slave_8_bits_External_Synchro +PE6.Signal=DCMI_D7 PE7.GPIOParameters=GPIO_PuPd PE7.GPIO_PuPd=GPIO_PULLUP PE7.Signal=FMC_D4_DA4 @@ -199,6 +335,11 @@ PF0.Signal=FMC_A0 PF1.GPIOParameters=GPIO_PuPd PF1.GPIO_PuPd=GPIO_PULLUP PF1.Signal=FMC_A1 +PF10.GPIOParameters=GPIO_Speed +PF10.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PF10.Locked=true +PF10.Mode=Single Bank 1 +PF10.Signal=QUADSPI_CLK PF11.GPIOParameters=GPIO_PuPd PF11.GPIO_PuPd=GPIO_PULLUP PF11.Signal=FMC_SDNRAS @@ -226,12 +367,44 @@ PF4.Signal=FMC_A4 PF5.GPIOParameters=GPIO_PuPd PF5.GPIO_PuPd=GPIO_PULLUP PF5.Signal=FMC_A5 +PF6.GPIOParameters=GPIO_Speed +PF6.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PF6.Locked=true +PF6.Mode=Single Bank 1 +PF6.Signal=QUADSPI_BK1_IO3 +PF7.GPIOParameters=GPIO_Speed +PF7.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PF7.Locked=true +PF7.Mode=Single Bank 1 +PF7.Signal=QUADSPI_BK1_IO2 +PF8.GPIOParameters=GPIO_Speed +PF8.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PF8.Locked=true +PF8.Mode=Single Bank 1 +PF8.Signal=QUADSPI_BK1_IO0 +PF9.GPIOParameters=GPIO_Speed +PF9.GPIO_Speed=GPIO_SPEED_FREQ_VERY_HIGH +PF9.Locked=true +PF9.Mode=Single Bank 1 +PF9.Signal=QUADSPI_BK1_IO1 PG0.GPIOParameters=GPIO_PuPd PG0.GPIO_PuPd=GPIO_PULLUP PG0.Signal=FMC_A10 PG1.GPIOParameters=GPIO_PuPd PG1.GPIO_PuPd=GPIO_PULLUP PG1.Signal=FMC_A11 +PG10.GPIOParameters=GPIO_Speed,GPIO_PuPd +PG10.GPIO_PuPd=GPIO_PULLUP +PG10.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PG10.Locked=true +PG10.Mode=Slave_8_bits_External_Synchro +PG10.Signal=DCMI_D2 +PG11.GPIOParameters=GPIO_Speed,GPIO_PuPd +PG11.GPIO_PuPd=GPIO_PULLUP +PG11.GPIO_Speed=GPIO_SPEED_FREQ_HIGH +PG11.Locked=true +PG11.Mode=Slave_8_bits_External_Synchro +PG11.Signal=DCMI_D3 PG15.GPIOParameters=GPIO_PuPd PG15.GPIO_PuPd=GPIO_PULLUP PG15.Signal=FMC_SDNCAS @@ -241,6 +414,11 @@ PG4.Signal=FMC_A14_BA0 PG5.GPIOParameters=GPIO_PuPd PG5.GPIO_PuPd=GPIO_PULLUP PG5.Signal=FMC_A15_BA1 +PG6.GPIOParameters=GPIO_PuPd +PG6.GPIO_PuPd=GPIO_PULLUP +PG6.Locked=true +PG6.Mode=Single Bank 1 +PG6.Signal=QUADSPI_BK1_NCS PG8.GPIOParameters=GPIO_PuPd PG8.GPIO_PuPd=GPIO_PULLUP PG8.Signal=FMC_SDCLK @@ -313,7 +491,7 @@ ProjectManager.CustomerFirmwarePackage= ProjectManager.DefaultFWLocation=true ProjectManager.DeletePrevious=true ProjectManager.DeviceId=STM32H743IIKx -ProjectManager.FirmwarePackage=STM32Cube FW_H7 V1.10.0 +ProjectManager.FirmwarePackage=STM32Cube FW_H7 V1.9.0 ProjectManager.FreePins=false ProjectManager.HalAssertFull=false ProjectManager.HeapSize=0x200 @@ -331,7 +509,13 @@ ProjectManager.StackSize=0x400 ProjectManager.TargetToolchain=MDK-ARM V5.32 ProjectManager.ToolChainLocation= ProjectManager.UnderRoot=false -ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_FMC_Init-FMC-false-HAL-true,0-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true +ProjectManager.functionlistsort=1-MX_GPIO_Init-GPIO-false-HAL-true,2-SystemClock_Config-RCC-false-HAL-false,3-MX_USART1_UART_Init-USART1-false-HAL-true,4-MX_FMC_Init-FMC-false-HAL-true,5-MX_QUADSPI_Init-QUADSPI-false-HAL-true,6-MX_SDMMC1_SD_Init-SDMMC1-false-HAL-true,7-MX_DMA_Init-DMA-false-HAL-true,8-MX_RTC_Init-RTC-false-HAL-true,9-MX_DCMI_Init-DCMI-false-HAL-true,10-MX_USB_OTG_FS_PCD_Init-USB_OTG_FS-false-HAL-true,0-MX_CORTEX_M7_Init-CORTEX_M7-false-HAL-true +QUADSPI.ChipSelectHighTime=QSPI_CS_HIGH_TIME_2_CYCLE +QUADSPI.ClockPrescaler=1 +QUADSPI.FifoThreshold=3 +QUADSPI.FlashSize=24 +QUADSPI.IPParameters=ClockPrescaler,FifoThreshold,SampleShifting,FlashSize,ChipSelectHighTime +QUADSPI.SampleShifting=QSPI_SAMPLE_SHIFTING_HALFCYCLE RCC.ADCFreq_Value=24187500 RCC.AHB12Freq_Value=200000000 RCC.AHB4Freq_Value=200000000 @@ -349,20 +533,21 @@ RCC.D1PPRE=RCC_APB3_DIV2 RCC.D2PPRE1=RCC_APB1_DIV2 RCC.D2PPRE2=RCC_APB2_DIV2 RCC.D3PPRE=RCC_APB4_DIV2 -RCC.DFSDMACLkFreq_Value=400000000 +RCC.DFSDMACLkFreq_Value=200000000 RCC.DFSDMFreq_Value=100000000 RCC.DIVM1=3 RCC.DIVN1=200 RCC.DIVP1Freq_Value=400000000 RCC.DIVP2Freq_Value=24187500 RCC.DIVP3Freq_Value=24187500 -RCC.DIVQ1Freq_Value=400000000 +RCC.DIVQ1=4 +RCC.DIVQ1Freq_Value=200000000 RCC.DIVQ2Freq_Value=24187500 RCC.DIVQ3Freq_Value=24187500 RCC.DIVR1Freq_Value=400000000 RCC.DIVR2Freq_Value=24187500 RCC.DIVR3Freq_Value=24187500 -RCC.FDCANFreq_Value=400000000 +RCC.FDCANFreq_Value=200000000 RCC.FMCFreq_Value=200000000 RCC.FamilyName=M RCC.HCLK3ClockFreq_Value=200000000 @@ -372,7 +557,7 @@ RCC.HRTIMFreq_Value=200000000 RCC.HSE_VALUE=12000000 RCC.I2C123Freq_Value=100000000 RCC.I2C4Freq_Value=100000000 -RCC.IPParameters=ADCFreq_Value,AHB12Freq_Value,AHB4Freq_Value,APB1Freq_Value,APB2Freq_Value,APB3Freq_Value,APB4Freq_Value,AXIClockFreq_Value,CECFreq_Value,CKPERFreq_Value,CortexFreq_Value,CpuClockFreq_Value,D1CPREFreq_Value,D1PPRE,D2PPRE1,D2PPRE2,D3PPRE,DFSDMACLkFreq_Value,DFSDMFreq_Value,DIVM1,DIVN1,DIVP1Freq_Value,DIVP2Freq_Value,DIVP3Freq_Value,DIVQ1Freq_Value,DIVQ2Freq_Value,DIVQ3Freq_Value,DIVR1Freq_Value,DIVR2Freq_Value,DIVR3Freq_Value,FDCANFreq_Value,FMCFreq_Value,FamilyName,HCLK3ClockFreq_Value,HCLKFreq_Value,HPRE,HRTIMFreq_Value,HSE_VALUE,I2C123Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIM345Freq_Value,LPUART1Freq_Value,LTDCFreq_Value,MCO1PinFreq_Value,MCO2PinFreq_Value,PLL2FRACN,PLL3FRACN,PLLFRACN,PLLSourceVirtual,QSPIFreq_Value,RNGFreq_Value,RTCFreq_Value,SAI1Freq_Value,SAI23Freq_Value,SAI4AFreq_Value,SAI4BFreq_Value,SDMMCFreq_Value,SPDIFRXFreq_Value,SPI123Freq_Value,SPI45Freq_Value,SPI6Freq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,Tim1OutputFreq_Value,Tim2OutputFreq_Value,TraceFreq_Value,USART16Freq_Value,USART234578Freq_Value,USBFreq_Value,VCO1OutputFreq_Value,VCO2OutputFreq_Value,VCO3OutputFreq_Value,VCOInput1Freq_Value,VCOInput2Freq_Value,VCOInput3Freq_Value +RCC.IPParameters=ADCFreq_Value,AHB12Freq_Value,AHB4Freq_Value,APB1Freq_Value,APB2Freq_Value,APB3Freq_Value,APB4Freq_Value,AXIClockFreq_Value,CECFreq_Value,CKPERFreq_Value,CortexFreq_Value,CpuClockFreq_Value,D1CPREFreq_Value,D1PPRE,D2PPRE1,D2PPRE2,D3PPRE,DFSDMACLkFreq_Value,DFSDMFreq_Value,DIVM1,DIVN1,DIVP1Freq_Value,DIVP2Freq_Value,DIVP3Freq_Value,DIVQ1,DIVQ1Freq_Value,DIVQ2Freq_Value,DIVQ3Freq_Value,DIVR1Freq_Value,DIVR2Freq_Value,DIVR3Freq_Value,FDCANFreq_Value,FMCFreq_Value,FamilyName,HCLK3ClockFreq_Value,HCLKFreq_Value,HPRE,HRTIMFreq_Value,HSE_VALUE,I2C123Freq_Value,I2C4Freq_Value,LPTIM1Freq_Value,LPTIM2Freq_Value,LPTIM345Freq_Value,LPUART1Freq_Value,LTDCFreq_Value,MCO1PinFreq_Value,MCO2PinFreq_Value,PLL2FRACN,PLL3FRACN,PLLFRACN,PLLSourceVirtual,QSPIFreq_Value,RNGFreq_Value,RTCFreq_Value,SAI1Freq_Value,SAI23Freq_Value,SAI4AFreq_Value,SAI4BFreq_Value,SDMMCFreq_Value,SPDIFRXFreq_Value,SPI123Freq_Value,SPI45Freq_Value,SPI6Freq_Value,SWPMI1Freq_Value,SYSCLKFreq_VALUE,SYSCLKSource,Tim1OutputFreq_Value,Tim2OutputFreq_Value,TraceFreq_Value,USART16Freq_Value,USART234578Freq_Value,USBCLockSelection,USBFreq_Value,VCO1OutputFreq_Value,VCO2OutputFreq_Value,VCO3OutputFreq_Value,VCOInput1Freq_Value,VCOInput2Freq_Value,VCOInput3Freq_Value RCC.LPTIM1Freq_Value=100000000 RCC.LPTIM2Freq_Value=100000000 RCC.LPTIM345Freq_Value=100000000 @@ -387,13 +572,13 @@ RCC.PLLSourceVirtual=RCC_PLLSOURCE_HSE RCC.QSPIFreq_Value=200000000 RCC.RNGFreq_Value=48000000 RCC.RTCFreq_Value=32000 -RCC.SAI1Freq_Value=400000000 -RCC.SAI23Freq_Value=400000000 -RCC.SAI4AFreq_Value=400000000 -RCC.SAI4BFreq_Value=400000000 -RCC.SDMMCFreq_Value=400000000 -RCC.SPDIFRXFreq_Value=400000000 -RCC.SPI123Freq_Value=400000000 +RCC.SAI1Freq_Value=200000000 +RCC.SAI23Freq_Value=200000000 +RCC.SAI4AFreq_Value=200000000 +RCC.SAI4BFreq_Value=200000000 +RCC.SDMMCFreq_Value=200000000 +RCC.SPDIFRXFreq_Value=200000000 +RCC.SPI123Freq_Value=200000000 RCC.SPI45Freq_Value=100000000 RCC.SPI6Freq_Value=100000000 RCC.SWPMI1Freq_Value=100000000 @@ -404,13 +589,16 @@ RCC.Tim2OutputFreq_Value=200000000 RCC.TraceFreq_Value=64000000 RCC.USART16Freq_Value=100000000 RCC.USART234578Freq_Value=100000000 -RCC.USBFreq_Value=400000000 +RCC.USBCLockSelection=RCC_USBCLKSOURCE_HSI48 +RCC.USBFreq_Value=48000000 RCC.VCO1OutputFreq_Value=800000000 RCC.VCO2OutputFreq_Value=48375000 RCC.VCO3OutputFreq_Value=48375000 RCC.VCOInput1Freq_Value=4000000 RCC.VCOInput2Freq_Value=375000 RCC.VCOInput3Freq_Value=375000 +SDMMC1.ClockDiv=4 +SDMMC1.IPParameters=ClockDiv SH.FMC_A0.0=FMC_A0,12b-sda1 SH.FMC_A0.ConfNb=1 SH.FMC_A1.0=FMC_A1,12b-sda1 @@ -519,8 +707,21 @@ SH.FMC_SDNRAS.0=FMC_SDNRAS,12b-sda1 SH.FMC_SDNRAS.ConfNb=1 SH.FMC_SDNWE.0=FMC_SDNWE,12b-sda1 SH.FMC_SDNWE.ConfNb=1 +SH.S_TIM1_CH1.0=TIM1_CH1,PWM Generation1 CH1 +SH.S_TIM1_CH1.ConfNb=1 +TIM1.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_ENABLE +TIM1.Channel-PWM\ Generation1\ CH1=TIM_CHANNEL_1 +TIM1.IPParameters=Channel-PWM Generation1 CH1,Period,AutoReloadPreload,Pulse-PWM Generation1 CH1 +TIM1.Period=7 +TIM1.Pulse-PWM\ Generation1\ CH1=3 USART1.IPParameters=VirtualMode-Asynchronous USART1.VirtualMode-Asynchronous=VM_ASYNC +USB_OTG_FS.IPParameters=VirtualMode +USB_OTG_FS.VirtualMode=Device_Only +VP_RTC_VS_RTC_Activate.Mode=RTC_Enabled +VP_RTC_VS_RTC_Activate.Signal=RTC_VS_RTC_Activate +VP_RTC_VS_RTC_Calendar.Mode=RTC_Calendar +VP_RTC_VS_RTC_Calendar.Signal=RTC_VS_RTC_Calendar VP_SYS_VS_Systick.Mode=SysTick VP_SYS_VS_Systick.Signal=SYS_VS_Systick board=custom diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/Kconfig index cff9e5337..cd80e3973 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/Kconfig +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/Kconfig @@ -18,7 +18,7 @@ menu "On-chip Peripheral Drivers" bool "Enable UART" default y select RT_USING_SERIAL - + if BSP_USING_UART config BSP_USING_UART1 bool "Enable UART1" @@ -37,8 +37,8 @@ menu "On-chip Peripheral Drivers" bool "Enable UART2 RX DMA" depends on BSP_USING_UART2 && RT_SERIAL_USING_DMA default n - - config BSP_USING_LPUART1 + + config BSP_USING_LPUART1 bool "Enable LPUART1" default n @@ -47,13 +47,30 @@ menu "On-chip Peripheral Drivers" depends on BSP_USING_LPUART1 && RT_SERIAL_USING_DMA default n endif - - config BSP_USING_SDRAM - bool "Enable SDRAM" - default n + + config BSP_USING_QSPI + bool "Enable QSPI BUS" + select RT_USING_QSPI + select RT_USING_SPI + default n source "$RTT_DIR/bsp/stm32/libraries/HAL_Drivers/Kconfig" -endmenu + endmenu + + menu "Onboard Peripheral Drivers" + + config BSP_USING_SDRAM + bool "Enable SDRAM" + default n + + config BSP_USING_QSPI_FLASH + bool "Enable QSPI FLASH (W25Q256 qspi)" + select BSP_USING_QSPI + select RT_USING_SFUD + select RT_SFUD_USING_QSPI + default n + + endmenu endmenu diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/SConscript b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/SConscript index 17b3828b1..3d65b0505 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/SConscript +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/SConscript @@ -14,6 +14,9 @@ CubeMX_Config/Core/Src/stm32h7xx_hal_msp.c if GetDepend(['BSP_USING_SDRAM']): src += Glob('ports/sdram_test.c') +if GetDepend(['BSP_USING_QSPI_FLASH']): + src += ['ports/drv_qspi_flash.c'] + path = [cwd] path += [cwd + '/CubeMX_Config/Core/Inc'] diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/board.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/board.c index 195c97cbc..de7268272 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/board.c +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/board.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2021, RT-Thread Development Team + * Copyright (c) 2006-2022, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * @@ -28,14 +28,15 @@ void SystemClock_Config(void) /** Initializes the RCC Oscillators according to the specified parameters * in the RCC_OscInitTypeDef structure. */ - RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE; + RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSI48|RCC_OSCILLATORTYPE_HSE; RCC_OscInitStruct.HSEState = RCC_HSE_ON; + RCC_OscInitStruct.HSI48State = RCC_HSI48_ON; RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON; RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE; RCC_OscInitStruct.PLL.PLLM = 3; RCC_OscInitStruct.PLL.PLLN = 200; RCC_OscInitStruct.PLL.PLLP = 2; - RCC_OscInitStruct.PLL.PLLQ = 2; + RCC_OscInitStruct.PLL.PLLQ = 4; RCC_OscInitStruct.PLL.PLLR = 2; RCC_OscInitStruct.PLL.PLLRGE = RCC_PLL1VCIRANGE_2; RCC_OscInitStruct.PLL.PLLVCOSEL = RCC_PLL1VCOWIDE; diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/board.h b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/board.h index f89013b1e..ab9fda779 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/board.h +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/board.h @@ -1,12 +1,12 @@ /* - * Copyright (c) 2006-2021, RT-Thread Development Team + * Copyright (c) 2006-2022, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * * Change Logs: * Date Author Notes * 2021-12-14 supperthomas first version - * 2022-03-14 wwt add sram2 + * 2022-03-16 Miaowulue add sram2 */ diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/drv_qspi_flash.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/drv_qspi_flash.c new file mode 100644 index 000000000..0e86224e5 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/drv_qspi_flash.c @@ -0,0 +1,99 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2018-11-27 zylx first version + * 2022-03-16 Miaowulue add dfs mount + */ + +#include +#include +#include +#include +#include +#include +#include + +#ifdef BSP_USING_QSPI_FLASH + +#include "spi_flash.h" +#include "spi_flash_sfud.h" + +char w25qxx_read_status_register2(struct rt_qspi_device *device) +{ + /* 0x35 read status register2 */ + char instruction = 0x35, status; + + rt_qspi_send_then_recv(device, &instruction, 1, &status, 1); + + return status; +} + +void w25qxx_write_enable(struct rt_qspi_device *device) +{ + /* 0x06 write enable */ + char instruction = 0x06; + + rt_qspi_send(device, &instruction, 1); +} + +void w25qxx_enter_qspi_mode(struct rt_qspi_device *device) +{ + char status = 0; + /* 0x38 enter qspi mode */ + char instruction = 0x38; + char write_status2_buf[2] = {0}; + + /* 0x31 write status register2 */ + write_status2_buf[0] = 0x31; + + status = w25qxx_read_status_register2(device); + if (!(status & 0x02)) + { + status |= 1 << 1; + w25qxx_write_enable(device); + write_status2_buf[1] = status; + rt_qspi_send(device, &write_status2_buf, 2); + rt_qspi_send(device, &instruction, 1); + rt_kprintf("flash already enter qspi mode\n"); + rt_thread_mdelay(10); + } +} + +static int rt_hw_qspi_flash_with_sfud_init(void) +{ + stm32_qspi_bus_attach_device("qspi1", "qspi10", RT_NULL, 4, w25qxx_enter_qspi_mode, RT_NULL); + + /* init W25Q256 */ + if (RT_NULL == rt_sfud_flash_probe("W25Q256", "qspi10")) + { + return -RT_ERROR; + } + + return RT_EOK; +} +INIT_DEVICE_EXPORT(rt_hw_qspi_flash_with_sfud_init); + +static int mnt_qspi_flash_init(void) +{ + #ifdef RT_USING_DFS_ROMFS + if (dfs_mount("W25Q256", "/FLASH", "elm", 0, 0) == RT_EOK) + #else + if (dfs_mount("W25Q256", "/", "elm", 0, 0) == RT_EOK) + #endif + { + rt_kprintf("Mount spi flash successfully!\n"); + return RT_EOK; + } + else + { + rt_kprintf("Mount spi flash fail!\n"); + return -RT_ERROR; + } +} +INIT_APP_EXPORT(mnt_qspi_flash_init); + +#endif/* BSP_USING_QSPI_FLASH */ diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/sdram_port.h b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/sdram_port.h index ea4afbc2f..80096b3a5 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/sdram_port.h +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/sdram_port.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2006-2021, RT-Thread Development Team + * Copyright (c) 2006-2022, RT-Thread Development Team * * SPDX-License-Identifier: Apache-2.0 * diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/rtconfig.h b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/rtconfig.h index 532e4ae6a..a9ac4eeeb 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/rtconfig.h +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/rtconfig.h @@ -105,7 +105,7 @@ #define RT_DFS_ELM_REENTRANT #define RT_DFS_ELM_MUTEX_TIMEOUT 3000 #define RT_USING_DFS_DEVFS -#define RT_USING_DFS_ROMFS +#define RT_USING_DFS_RAMFS /* Device Drivers */ @@ -116,6 +116,19 @@ #define RT_SERIAL_USING_DMA #define RT_SERIAL_RB_BUFSZ 64 #define RT_USING_PIN +#define RT_USING_SDIO +#define RT_SDIO_STACK_SIZE 512 +#define RT_SDIO_THREAD_PRIORITY 15 +#define RT_MMCSD_STACK_SIZE 1024 +#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_USING_QSPI +#define RT_SFUD_SPI_MAX_HZ 50000000 /* Using USB */ @@ -163,7 +176,12 @@ #define BSP_USING_GPIO #define BSP_USING_UART #define BSP_USING_UART1 +#define BSP_USING_QSPI + +/* Onboard Peripheral Drivers */ + #define BSP_USING_SDRAM +#define BSP_USING_QSPI_FLASH /* More Drivers */ From 09d7d3cd6bb1731655721b0838d5f5e9533dc1b4 Mon Sep 17 00:00:00 2001 From: WentaoWong Date: Mon, 18 Apr 2022 16:38:46 +0800 Subject: [PATCH 21/38] Ubiquitous/RT_Thread/: add sdio support to stm32h743_openmv_h7plus --- .../stm32h743_openmv_h7plus/board/Kconfig | 7 + .../stm32h743_openmv_h7plus/board/SConscript | 2 + .../board/ports/drv_sdio.c | 473 ++++++++++++++++++ .../board/ports/drv_sdio.h | 106 ++++ 4 files changed, 588 insertions(+) create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/drv_sdio.c create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/drv_sdio.h diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/Kconfig index cd80e3973..d986c4ef9 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/Kconfig +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/Kconfig @@ -71,6 +71,13 @@ menu "On-chip Peripheral Drivers" select RT_SFUD_USING_QSPI default n + config BSP_USING_SDMMC + bool "Enable SDMMC (SD card)" + select RT_USING_SDIO + select RT_USING_DFS + select RT_USING_DFS_ELMFAT + default n + endmenu endmenu diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/SConscript b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/SConscript index 3d65b0505..fe13b7166 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/SConscript +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/SConscript @@ -16,6 +16,8 @@ if GetDepend(['BSP_USING_SDRAM']): src += Glob('ports/sdram_test.c') if GetDepend(['BSP_USING_QSPI_FLASH']): src += ['ports/drv_qspi_flash.c'] +if GetDepend(['BSP_USING_SDMMC']): + src += ['ports/drv_sdio.c'] path = [cwd] diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/drv_sdio.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/drv_sdio.c new file mode 100644 index 000000000..54c6e212d --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/drv_sdio.c @@ -0,0 +1,473 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-05-23 liuduanfei first version + * 2022-03-16 Miaowulue change prompt message + */ + +#include "board.h" +#include "drv_sdio.h" +#include + +#ifdef BSP_USING_SDMMC + +#define DBG_TAG "drv.sdio" +#ifdef DRV_DEBUG +#define DBG_LVL DBG_LOG +#else +#define DBG_LVL DBG_INFO +#endif /* DRV_DEBUG */ +#include + +static struct rt_mmcsd_host *host; +#define SDIO_TX_RX_COMPLETE_TIMEOUT_LOOPS (100000) + +struct sdio_pkg +{ + struct rt_mmcsd_cmd *cmd; + void *buff; + rt_uint32_t flag; +}; + +struct rthw_sdio +{ + struct rt_mmcsd_host *host; + struct stm32_sdio_des sdio_des; + struct rt_event event; + struct sdio_pkg *pkg; +}; + +ALIGN(SDIO_ALIGN_LEN) +static rt_uint8_t cache_buf[SDIO_BUFF_SIZE]; + +/** + * @brief This function get order from sdio. + * @param data + * @retval sdio order + */ +static int get_order(rt_uint32_t data) +{ + int order = 0; + + switch (data) + { + case 1: + order = 0; + break; + case 2: + order = 1; + break; + case 4: + order = 2; + break; + case 8: + order = 3; + break; + case 16: + order = 4; + break; + case 32: + order = 5; + break; + case 64: + order = 6; + break; + case 128: + order = 7; + break; + case 256: + order = 8; + break; + case 512: + order = 9; + break; + case 1024: + order = 10; + break; + case 2048: + order = 11; + break; + case 4096: + order = 12; + break; + case 8192: + order = 13; + break; + case 16384: + order = 14; + break; + default : + order = 0; + break; + } + return order; +} + +/** + * @brief This function wait sdio cmd completed. + * @param sdio rthw_sdio + * @retval None + */ +static void rthw_sdio_wait_completed(struct rthw_sdio *sdio) +{ + rt_uint32_t status; + struct rt_mmcsd_cmd *cmd = sdio->pkg->cmd; + struct stm32_sdio *hw_sdio = sdio->sdio_des.hw_sdio; + + if (rt_event_recv(&sdio->event, 0xffffffff, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, + rt_tick_from_millisecond(5000), &status) != RT_EOK) + { + LOG_E("wait cmd completed timeout"); + cmd->err = -RT_ETIMEOUT; + return; + } + + cmd->resp[0] = hw_sdio->resp1; + if (resp_type(cmd) == RESP_R2) + { + cmd->resp[1] = hw_sdio->resp2; + cmd->resp[2] = hw_sdio->resp3; + cmd->resp[3] = hw_sdio->resp4; + } + + if (status & SDIO_ERRORS) + { + if ((status & SDMMC_STA_CCRCFAIL) && (resp_type(cmd) & (RESP_R3 | RESP_R4))) + { + cmd->err = RT_EOK; + } + else + { + cmd->err = -RT_ERROR; + } + } + + if (cmd->err == RT_EOK) + { + LOG_D("sta:0x%08X [%08X %08X %08X %08X]", status, cmd->resp[0], cmd->resp[1], cmd->resp[2], cmd->resp[3]); + } + else + { + LOG_D("send command error = %d", cmd->err); + } +} + +/** + * @brief This function send command. + * @param sdio rthw_sdio + * @param pkg sdio package + * @retval None + */ +static void rthw_sdio_send_command(struct rthw_sdio *sdio, struct sdio_pkg *pkg) +{ + struct rt_mmcsd_cmd *cmd = pkg->cmd; + struct rt_mmcsd_data *data = cmd->data; + struct stm32_sdio *hw_sdio = sdio->sdio_des.hw_sdio; + rt_uint32_t reg_cmd; + + /* save pkg */ + sdio->pkg = pkg; + + LOG_D("CMD:%d ARG:0x%08x RES:%s%s%s%s%s%s%s%s%s rw:%c len:%d blksize:%d\n", + cmd->cmd_code, + cmd->arg, + resp_type(cmd) == RESP_NONE ? "NONE" : "", + resp_type(cmd) == RESP_R1 ? "R1" : "", + resp_type(cmd) == RESP_R1B ? "R1B" : "", + resp_type(cmd) == RESP_R2 ? "R2" : "", + resp_type(cmd) == RESP_R3 ? "R3" : "", + resp_type(cmd) == RESP_R4 ? "R4" : "", + resp_type(cmd) == RESP_R5 ? "R5" : "", + resp_type(cmd) == RESP_R6 ? "R6" : "", + resp_type(cmd) == RESP_R7 ? "R7" : "", + data ? (data->flags & DATA_DIR_WRITE ? 'w' : 'r') : '-', + data ? data->blks * data->blksize : 0, + data ? data->blksize : 0 + ); + + hw_sdio->mask |= SDIO_MASKR_ALL; + reg_cmd = cmd->cmd_code | SDMMC_CMD_CPSMEN; + + /* data pre configuration */ + if (data != RT_NULL) + { + SCB_CleanInvalidateDCache(); + + reg_cmd |= SDMMC_CMD_CMDTRANS; + hw_sdio->mask &= ~(SDMMC_MASK_CMDRENDIE | SDMMC_MASK_CMDSENTIE); + hw_sdio->dtimer = HW_SDIO_DATATIMEOUT; + hw_sdio->dlen = data->blks * data->blksize; + hw_sdio->dctrl = (get_order(data->blksize)<<4) | (data->flags & DATA_DIR_READ ? SDMMC_DCTRL_DTDIR : 0); + hw_sdio->idmabase0r = (rt_uint32_t)cache_buf; + hw_sdio->idmatrlr = SDMMC_IDMA_IDMAEN; + } + + if (resp_type(cmd) == RESP_R2) + reg_cmd |= SDMMC_CMD_WAITRESP; + else if(resp_type(cmd) != RESP_NONE) + reg_cmd |= SDMMC_CMD_WAITRESP_0; + + hw_sdio->arg = cmd->arg; + hw_sdio->cmd = reg_cmd; + /* wait completed */ + rthw_sdio_wait_completed(sdio); + + /* Waiting for data to be sent to completion */ + if (data != RT_NULL) + { + volatile rt_uint32_t count = SDIO_TX_RX_COMPLETE_TIMEOUT_LOOPS; + + while (count && (hw_sdio->sta & SDMMC_STA_DPSMACT)) + { + count--; + } + if ((count == 0) || (hw_sdio->sta & SDIO_ERRORS)) + { + cmd->err = -RT_ERROR; + } + } + + /* data post configuration */ + if (data != RT_NULL) + { + if (data->flags & DATA_DIR_READ) + { + rt_memcpy(data->buf, cache_buf, data->blks * data->blksize); + SCB_CleanInvalidateDCache(); + } + } +} + +/** + * @brief This function send sdio request. + * @param sdio rthw_sdio + * @param req request + * @retval None + */ +static void rthw_sdio_request(struct rt_mmcsd_host *host, struct rt_mmcsd_req *req) +{ + struct sdio_pkg pkg; + struct rthw_sdio *sdio = host->private_data; + struct rt_mmcsd_data *data; + + if (req->cmd != RT_NULL) + { + rt_memset(&pkg, 0, sizeof(pkg)); + data = req->cmd->data; + pkg.cmd = req->cmd; + + if (data != RT_NULL) + { + rt_uint32_t size = data->blks * data->blksize; + + RT_ASSERT(size <= SDIO_BUFF_SIZE); + + if (data->flags & DATA_DIR_WRITE) + { + rt_memcpy(cache_buf, data->buf, size); + } + } + + rthw_sdio_send_command(sdio, &pkg); + } + + if (req->stop != RT_NULL) + { + rt_memset(&pkg, 0, sizeof(pkg)); + pkg.cmd = req->stop; + rthw_sdio_send_command(sdio, &pkg); + } + + mmcsd_req_complete(sdio->host); +} + + +/** + * @brief This function interrupt process function. + * @param host rt_mmcsd_host + * @retval None + */ +void rthw_sdio_irq_process(struct rt_mmcsd_host *host) +{ + struct rthw_sdio *sdio = host->private_data; + struct stm32_sdio *hw_sdio = sdio->sdio_des.hw_sdio; + rt_uint32_t intstatus = hw_sdio->sta; + + /* clear irq flag*/ + hw_sdio->icr = intstatus; + + rt_event_send(&sdio->event, intstatus); +} + +/** + * @brief This function config sdio. + * @param host rt_mmcsd_host + * @param io_cfg rt_mmcsd_io_cfg + * @retval None + */ +static void rthw_sdio_iocfg(struct rt_mmcsd_host *host, struct rt_mmcsd_io_cfg *io_cfg) +{ + rt_uint32_t temp, clk_src; + rt_uint32_t clk = io_cfg->clock; + struct rthw_sdio *sdio = host->private_data; + struct stm32_sdio *hw_sdio = sdio->sdio_des.hw_sdio; + + LOG_D("clk:%dK width:%s%s%s power:%s%s%s", + clk/1000, + io_cfg->bus_width == MMCSD_BUS_WIDTH_8 ? "8" : "", + io_cfg->bus_width == MMCSD_BUS_WIDTH_4 ? "4" : "", + io_cfg->bus_width == MMCSD_BUS_WIDTH_1 ? "1" : "", + io_cfg->power_mode == MMCSD_POWER_OFF ? "OFF" : "", + io_cfg->power_mode == MMCSD_POWER_UP ? "UP" : "", + io_cfg->power_mode == MMCSD_POWER_ON ? "ON" : "" + ); + + clk_src = SDIO_CLOCK_FREQ; + + if (clk > 0) + { + if (clk > host->freq_max) + clk = host->freq_max; + temp = DIV_ROUND_UP(clk_src, 2 * clk); + if (temp > 0x3FF) + temp = 0x3FF; + } + + if (io_cfg->bus_width == MMCSD_BUS_WIDTH_4) + temp |= SDMMC_CLKCR_WIDBUS_0; + else if (io_cfg->bus_width == MMCSD_BUS_WIDTH_8) + temp |= SDMMC_CLKCR_WIDBUS_1; + + hw_sdio->clkcr = temp; + + if (io_cfg->power_mode == MMCSD_POWER_ON) + hw_sdio->power |= SDMMC_POWER_PWRCTRL; +} + +static const struct rt_mmcsd_host_ops ops = +{ + rthw_sdio_request, + rthw_sdio_iocfg, + RT_NULL, + RT_NULL, +}; + +/** + * @brief This function create mmcsd host. + * @param sdio_des stm32_sdio_des + * @retval rt_mmcsd_host + */ +struct rt_mmcsd_host *sdio_host_create(struct stm32_sdio_des *sdio_des) +{ + struct rt_mmcsd_host *host; + struct rthw_sdio *sdio = RT_NULL; + + if (sdio_des == RT_NULL) + { + return RT_NULL; + } + + sdio = rt_malloc(sizeof(struct rthw_sdio)); + if (sdio == RT_NULL) + { + LOG_E("malloc rthw_sdio fail"); + return RT_NULL; + } + rt_memset(sdio, 0, sizeof(struct rthw_sdio)); + + host = mmcsd_alloc_host(); + if (host == RT_NULL) + { + LOG_E("alloc host fail"); + goto err; + } + + rt_memcpy(&sdio->sdio_des, sdio_des, sizeof(struct stm32_sdio_des)); + + sdio->sdio_des.hw_sdio = (struct stm32_sdio *)SDIO_BASE_ADDRESS; + + rt_event_init(&sdio->event, "sdio", RT_IPC_FLAG_FIFO); + + /* set host default attributes */ + host->ops = &ops; + host->freq_min = 400 * 1000; + host->freq_max = SDIO_MAX_FREQ; + host->valid_ocr = VDD_32_33 | VDD_33_34;/* The voltage range supported is 3.2v-3.4v */ +#ifndef SDIO_USING_1_BIT + host->flags = MMCSD_BUSWIDTH_4 | MMCSD_MUTBLKWRITE | MMCSD_SUP_HIGHSPEED; +#else + host->flags = MMCSD_MUTBLKWRITE | MMCSD_SUP_HIGHSPEED; +#endif + + host->max_seg_size = SDIO_BUFF_SIZE; + host->max_dma_segs = 1; + host->max_blk_size = 512; + host->max_blk_count = 512; + + /* link up host and sdio */ + sdio->host = host; + host->private_data = sdio; + + /* ready to change */ + mmcsd_change(host); + + return host; + +err: + if (sdio) rt_free(sdio); + + return RT_NULL; +} + +void SDMMC1_IRQHandler(void) +{ + /* enter interrupt */ + rt_interrupt_enter(); + /* Process All SDIO Interrupt Sources */ + rthw_sdio_irq_process(host); + /* leave interrupt */ + rt_interrupt_leave(); +} + +int rt_hw_sdio_init(void) +{ + struct stm32_sdio_des sdio_des; + SD_HandleTypeDef hsd; + hsd.Instance = SDMMC1; + HAL_SD_MspInit(&hsd); + + host = sdio_host_create(&sdio_des); + if (host == RT_NULL) + { + LOG_E("host create fail"); + return RT_NULL; + } + return 0; +} +INIT_DEVICE_EXPORT(rt_hw_sdio_init); + +int mnt_init(void) +{ + rt_thread_delay(RT_TICK_PER_SECOND); + #ifdef RT_USING_DFS_ROMFS + if (dfs_mount("sd0", "/SD", "elm", 0, 0) == RT_EOK) + #else + if (dfs_mount("sd0", "/", "elm", 0, 0) == RT_EOK) + #endif + { + rt_kprintf("Mount sd card successfully!\n"); + } + else + { + rt_kprintf("Mount sd card fail!\n"); + } + + return 0; +} +INIT_APP_EXPORT(mnt_init); + +#endif /* BSP_USING_SDMMC */ diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/drv_sdio.h b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/drv_sdio.h new file mode 100644 index 000000000..fb4f531e3 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/drv_sdio.h @@ -0,0 +1,106 @@ +/* + * Copyright (c) 2006-2022, RT-Thread Development Team + * + * SPDX-License-Identifier: Apache-2.0 + * + * Change Logs: + * Date Author Notes + * 2020-05-23 liuduanfei first version + */ + +#ifndef __DRV_SDIO_H__ +#define __DRV_SDIO_H__ + +#include +#include "rtdevice.h" +#include +#include +#include +#include +#include + +#define SDIO_BUFF_SIZE 4096 +#define SDIO_ALIGN_LEN 32 + +#ifndef SDIO_BASE_ADDRESS +#define SDIO_BASE_ADDRESS (0x52007000) +#endif + +#ifndef SDIO_CLOCK_FREQ +#define SDIO_CLOCK_FREQ (200U * 1000 * 1000) +#endif + +#ifndef SDIO_BUFF_SIZE +#define SDIO_BUFF_SIZE (4096) +#endif + +#ifndef SDIO_ALIGN_LEN +#define SDIO_ALIGN_LEN (32) +#endif + +#ifndef SDIO_MAX_FREQ +#define SDIO_MAX_FREQ (25 * 1000 * 1000) +#endif + +#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d)) + +#define SDIO_ERRORS \ + (SDMMC_STA_IDMATE | SDMMC_STA_ACKTIMEOUT | \ + SDMMC_STA_RXOVERR | SDMMC_STA_TXUNDERR | \ + SDMMC_STA_DTIMEOUT | SDMMC_STA_CTIMEOUT | \ + SDMMC_STA_DCRCFAIL | SDMMC_STA_CCRCFAIL) + +#define SDIO_MASKR_ALL \ + (SDMMC_MASK_CCRCFAILIE | SDMMC_MASK_DCRCFAILIE | SDMMC_MASK_CTIMEOUTIE | \ + SDMMC_MASK_TXUNDERRIE | SDMMC_MASK_RXOVERRIE | SDMMC_MASK_CMDRENDIE | \ + SDMMC_MASK_CMDSENTIE | SDMMC_MASK_DATAENDIE | SDMMC_MASK_ACKTIMEOUTIE) + +#define HW_SDIO_DATATIMEOUT (0xFFFFFFFFU) + +struct stm32_sdio +{ + volatile rt_uint32_t power; /* offset 0x00 */ + volatile rt_uint32_t clkcr; /* offset 0x04 */ + volatile rt_uint32_t arg; /* offset 0x08 */ + volatile rt_uint32_t cmd; /* offset 0x0C */ + volatile rt_uint32_t respcmd; /* offset 0x10 */ + volatile rt_uint32_t resp1; /* offset 0x14 */ + volatile rt_uint32_t resp2; /* offset 0x18 */ + volatile rt_uint32_t resp3; /* offset 0x1C */ + volatile rt_uint32_t resp4; /* offset 0x20 */ + volatile rt_uint32_t dtimer; /* offset 0x24 */ + volatile rt_uint32_t dlen; /* offset 0x28 */ + volatile rt_uint32_t dctrl; /* offset 0x2C */ + volatile rt_uint32_t dcount; /* offset 0x30 */ + volatile rt_uint32_t sta; /* offset 0x34 */ + volatile rt_uint32_t icr; /* offset 0x38 */ + volatile rt_uint32_t mask; /* offset 0x3C */ + volatile rt_uint32_t acktimer; /* offset 0x40 */ + volatile rt_uint32_t reserved0[3]; /* offset 0x44 ~ 0x4C */ + volatile rt_uint32_t idmatrlr; /* offset 0x50 */ + volatile rt_uint32_t idmabsizer; /* offset 0x54 */ + volatile rt_uint32_t idmabase0r; /* offset 0x58 */ + volatile rt_uint32_t idmabase1r; /* offset 0x5C */ + volatile rt_uint32_t reserved1[8]; /* offset 0x60 ~ 7C */ + volatile rt_uint32_t fifo; /* offset 0x80 */ +}; + +typedef rt_uint32_t (*sdio_clk_get)(struct stm32_sdio *hw_sdio); + +struct stm32_sdio_des +{ + struct stm32_sdio *hw_sdio; + sdio_clk_get clk_get; +}; + +/* stm32 sdio dirver class */ +struct stm32_sdio_class +{ + struct stm32_sdio_des *des; + const struct stm32_sdio_config *cfg; + struct rt_mmcsd_host host; +}; + +extern void stm32_mmcsd_change(void); + +#endif /* __DRV_SDIO_H__ */ From 5a6e8537129f1f8e001036db2ab8d60d0a42a838 Mon Sep 17 00:00:00 2001 From: WentaoWong Date: Mon, 18 Apr 2022 16:42:50 +0800 Subject: [PATCH 22/38] Ubiquitous/RT_Thread/: add RomFS and RamFS support to stm32h743_openmv_h7plus --- .../stm32h743_openmv_h7plus/board/SConscript | 6 ++++- .../board/ports/mnt_ramfs.c | 22 ++++++++++++++++++ .../board/ports/mnt_romfs.c | 22 ++++++++++++++++++ .../board/ports/romfs.c | 23 +++++++++++++++++++ 4 files changed, 72 insertions(+), 1 deletion(-) create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/mnt_ramfs.c create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/mnt_romfs.c create mode 100644 Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/romfs.c diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/SConscript b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/SConscript index fe13b7166..2f288f5d2 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/SConscript +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/SConscript @@ -18,7 +18,11 @@ if GetDepend(['BSP_USING_QSPI_FLASH']): src += ['ports/drv_qspi_flash.c'] if GetDepend(['BSP_USING_SDMMC']): src += ['ports/drv_sdio.c'] - +if GetDepend(['RT_USING_DFS_ROMFS']): + src += ['ports/romfs.c'] + src += ['ports/mnt_romfs.c'] +if GetDepend(['RT_USING_DFS_RAMFS']): + src += ['ports/mnt_ramfs.c'] path = [cwd] path += [cwd + '/CubeMX_Config/Core/Inc'] diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/mnt_ramfs.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/mnt_ramfs.c new file mode 100644 index 000000000..3a0680bf8 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/mnt_ramfs.c @@ -0,0 +1,22 @@ +#include + +#if defined RT_USING_DFS && defined RT_USING_DFS_RAMFS +#include +#include "dfs_ramfs.h" + +int mnt_ramfs_init(void) +{ + if (dfs_mount(RT_NULL, "/", "ram", 0, dfs_ramfs_create(rt_malloc(1024),1024)) == 0) + { + rt_kprintf("RAM file system initializated!\n"); + } + else + { + rt_kprintf("RAM file system initializate failed!\n"); + } + + return 0; +} +INIT_ENV_EXPORT(mnt_ramfs_init); + +#endif \ No newline at end of file diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/mnt_romfs.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/mnt_romfs.c new file mode 100644 index 000000000..b0a4fc1f6 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/mnt_romfs.c @@ -0,0 +1,22 @@ +#include + +#if defined RT_USING_DFS && defined RT_USING_DFS_ROMFS +#include +#include "dfs_romfs.h" + +int mnt_romfs_init(void) +{ + if (dfs_mount(RT_NULL, "/", "rom", 0, &(romfs_root)) == 0) + { + rt_kprintf("ROM file system initializated!\n"); + } + else + { + rt_kprintf("ROM file system initializate failed!\n"); + } + + return 0; +} +INIT_ENV_EXPORT(mnt_romfs_init); + +#endif \ No newline at end of file diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/romfs.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/romfs.c new file mode 100644 index 000000000..892a591b0 --- /dev/null +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/ports/romfs.c @@ -0,0 +1,23 @@ +/* Generated by mkromfs. Edit with caution. */ +#include +#include + +#ifdef RT_USING_DFS_ROMFS +static const rt_uint8_t _romfs_root_hello_txt[] = { +0x58,0x49,0x55,0x4f,0x53,0x20,0x73,0x74,0x6d,0x33,0x32,0x68,0x37,0x20,0x52,0x6f,0x6d,0x46,0x53,0x20,0x73,0x75,0x63,0x63,0x65,0x73,0x73,0x21 +}; + +static const struct romfs_dirent _romfs_root[] = { + #ifdef BSP_USING_QSPI_FLASH + {ROMFS_DIRENT_DIR, "FLASH", RT_NULL, 0}, + #endif + #ifdef BSP_USING_SDMMC + {ROMFS_DIRENT_DIR, "SD", RT_NULL, 0}, + #endif + {ROMFS_DIRENT_FILE, "hello.txt", (rt_uint8_t *)_romfs_root_hello_txt, sizeof(_romfs_root_hello_txt)/sizeof(_romfs_root_hello_txt[0])} +}; + +const struct romfs_dirent romfs_root = { + ROMFS_DIRENT_DIR, "/", (rt_uint8_t *)_romfs_root, sizeof(_romfs_root)/sizeof(_romfs_root[0]) +}; +#endif \ No newline at end of file From d74cb3bdb631536895ee05582db752eed44aca63 Mon Sep 17 00:00:00 2001 From: WentaoWong Date: Mon, 18 Apr 2022 16:47:09 +0800 Subject: [PATCH 23/38] Ubiquitous/RT_Thread/: add rtc support to stm32h743_openmv_h7plus --- .../aiit_board/stm32h743_openmv_h7plus/rtconfig.h | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/rtconfig.h b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/rtconfig.h index a9ac4eeeb..bb619c0c8 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/rtconfig.h +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/rtconfig.h @@ -116,6 +116,7 @@ #define RT_SERIAL_USING_DMA #define RT_SERIAL_RB_BUFSZ 64 #define RT_USING_PIN +#define RT_USING_RTC #define RT_USING_SDIO #define RT_SDIO_STACK_SIZE 512 #define RT_SDIO_THREAD_PRIORITY 15 @@ -177,11 +178,12 @@ #define BSP_USING_UART #define BSP_USING_UART1 #define BSP_USING_QSPI +#define BSP_USING_ONCHIP_RTC /* Onboard Peripheral Drivers */ #define BSP_USING_SDRAM -#define BSP_USING_QSPI_FLASH +#define BSP_USING_SDMMC /* More Drivers */ From 00c17e96621469676a27967b13aaf004122e3325 Mon Sep 17 00:00:00 2001 From: WentaoWong Date: Mon, 18 Apr 2022 17:12:52 +0800 Subject: [PATCH 24/38] Ubiquitous/RT_Thread/: add usbcdc support to stm32h743_openmv_h7plus, vcom console need update rt-thread --- .../stm32h743_openmv_h7plus/.config | 125 ++++++++++-------- .../applications/main.c | 4 +- .../stm32h743_openmv_h7plus/board/Kconfig | 10 ++ .../stm32h743_openmv_h7plus/rtconfig.h | 68 +++++----- .../stm32h743_openmv_h7plus/rtconfig.py | 2 +- 5 files changed, 116 insertions(+), 93 deletions(-) diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/.config b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/.config index 4bf86377c..0f63cb237 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/.config +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/.config @@ -11,7 +11,6 @@ CONFIG_RTT_DIR="../../rt-thread" # RT-Thread Kernel # CONFIG_RT_NAME_MAX=8 -# CONFIG_RT_USING_BIG_ENDIAN is not set # CONFIG_RT_USING_ARCH_DATA_TYPE is not set # CONFIG_RT_USING_SMP is not set CONFIG_RT_ALIGN_SIZE=4 @@ -22,6 +21,7 @@ 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=256 @@ -32,7 +32,8 @@ CONFIG_IDLE_THREAD_STACK_SIZE=256 # # CONFIG_RT_KSERVICE_USING_STDLIB is not set # CONFIG_RT_KSERVICE_USING_TINY_SIZE is not set -# CONFIG_RT_USING_ASM_MEMCPY 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 @@ -60,14 +61,19 @@ CONFIG_RT_USING_MESSAGEQUEUE=y # Memory Management # CONFIG_RT_USING_MEMPOOL=y -CONFIG_RT_USING_MEMHEAP=y -CONFIG_RT_USING_MEMHEAP_AUTO_BINDING=y -# CONFIG_RT_USING_NOHEAP is not set # CONFIG_RT_USING_SMALL_MEM is not set # 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_USING_SMALL_MEM_AS_HEAP is not set CONFIG_RT_USING_MEMHEAP_AS_HEAP=y +CONFIG_RT_USING_MEMHEAP_AUTO_BINDING=y +# 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 # @@ -79,8 +85,7 @@ CONFIG_RT_USING_DEVICE=y CONFIG_RT_USING_CONSOLE=y CONFIG_RT_CONSOLEBUF_SIZE=256 CONFIG_RT_CONSOLE_DEVICE_NAME="uart1" -# CONFIG_RT_PRINTF_LONGLONG is not set -CONFIG_RT_VER_NUM=0x40004 +CONFIG_RT_VER_NUM=0x40100 CONFIG_ARCH_ARM=y CONFIG_RT_USING_CPU_FFS=y CONFIG_ARCH_ARM_CORTEX_M=y @@ -94,18 +99,9 @@ CONFIG_RT_USING_COMPONENTS_INIT=y CONFIG_RT_USING_USER_MAIN=y CONFIG_RT_MAIN_THREAD_STACK_SIZE=2048 CONFIG_RT_MAIN_THREAD_PRIORITY=10 - -# -# C++ features -# -CONFIG_RT_USING_CPLUSPLUS=y -# CONFIG_RT_USING_CPLUSPLUS11 is not set - -# -# Command shell -# -CONFIG_RT_USING_FINSH=y +# CONFIG_RT_USING_LEGACY is not set 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 @@ -119,11 +115,8 @@ 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 - -# -# Device virtual file system -# CONFIG_RT_USING_DFS=y +CONFIG_DFS_USING_POSIX=y CONFIG_DFS_USING_WORKDIR=y CONFIG_DFS_FILESYSTEMS_MAX=4 CONFIG_DFS_FILESYSTEM_TYPES_MAX=4 @@ -155,12 +148,13 @@ 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_RAMFS=y +# CONFIG_RT_USING_FAL is not set +# CONFIG_RT_USING_LWP is not set # # Device Drivers # CONFIG_RT_USING_DEVICE_IPC=y -CONFIG_RT_PIPE_BUFSZ=512 # CONFIG_RT_USING_SYSTEM_WORKQUEUE is not set CONFIG_RT_USING_SERIAL=y CONFIG_RT_USING_SERIAL_V1=y @@ -179,7 +173,9 @@ CONFIG_RT_USING_PIN=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_RTC 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=512 CONFIG_RT_SDIO_THREAD_PRIORITY=15 @@ -188,6 +184,7 @@ CONFIG_RT_MMCSD_THREAD_PREORITY=22 CONFIG_RT_MMCSD_MAX_PARTITION=16 # 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=y @@ -210,53 +207,64 @@ CONFIG_RT_SFUD_SPI_MAX_HZ=50000000 # # Using USB # +CONFIG_RT_USING_USB=y # CONFIG_RT_USING_USB_HOST is not set -# CONFIG_RT_USING_USB_DEVICE is not set +CONFIG_RT_USING_USB_DEVICE=y +CONFIG_RT_USBD_THREAD_STACK_SZ=4096 +CONFIG_USB_VENDOR_ID=0x0FFE +CONFIG_USB_PRODUCT_ID=0x0001 +# CONFIG_RT_USB_DEVICE_COMPOSITE is not set +# CONFIG__RT_USB_DEVICE_NONE is not set +CONFIG__RT_USB_DEVICE_CDC=y +# CONFIG__RT_USB_DEVICE_MSTORAGE is not set +# CONFIG__RT_USB_DEVICE_HID is not set +# CONFIG__RT_USB_DEVICE_WINUSB is not set +# CONFIG__RT_USB_DEVICE_AUDIO is not set +CONFIG_RT_USB_DEVICE_CDC=y +CONFIG_RT_VCOM_TASK_STK_SIZE=512 +CONFIG_RT_CDC_RX_BUFSIZE=128 +# CONFIG_RT_VCOM_TX_USE_DMA is not set +CONFIG_RT_VCOM_SERNO="32021919830108" +CONFIG_RT_VCOM_SER_LEN=14 +CONFIG_RT_VCOM_TX_TIMEOUT=1000 # -# POSIX layer and C standard library +# C/C++ and POSIX layer # -CONFIG_RT_USING_LIBC=y +CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8 + +# +# POSIX (Portable Operating System Interface) layer +# +# CONFIG_RT_USING_POSIX_FS 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_POSIX=y -# CONFIG_RT_USING_POSIX_MMAP is not set -# CONFIG_RT_USING_POSIX_TERMIOS is not set -# CONFIG_RT_USING_POSIX_GETLINE is not set -# CONFIG_RT_USING_POSIX_AIO is not set -CONFIG_RT_LIBC_USING_TIME=y # CONFIG_RT_USING_MODULE is not set -CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8 + +# +# 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=y +# CONFIG_RT_USING_CPLUSPLUS11 is not set # # Network # - -# -# Socket abstraction layer -# # CONFIG_RT_USING_SAL is not set - -# -# Network interface device -# # CONFIG_RT_USING_NETDEV is not set - -# -# light weight TCP/IP stack -# # CONFIG_RT_USING_LWIP is not set - -# -# AT commands -# # CONFIG_RT_USING_AT is not set -# -# VBUS(Virtual Software BUS) -# -# CONFIG_RT_USING_VBUS is not set - # # Utilities # @@ -265,7 +273,7 @@ CONFIG_RT_LIBC_DEFAULT_TIMEZONE=8 # CONFIG_RT_USING_UTEST is not set # CONFIG_RT_USING_VAR_EXPORT is not set # CONFIG_RT_USING_RT_LINK is not set -# CONFIG_RT_USING_LWP is not set +# CONFIG_RT_USING_VBUS is not set # # RT-Thread Utestcases @@ -289,6 +297,7 @@ CONFIG_BSP_USING_UART1=y # CONFIG_BSP_USING_UART2 is not set # CONFIG_BSP_USING_LPUART1 is not set CONFIG_BSP_USING_QSPI=y +CONFIG_BSP_USING_ONCHIP_RTC=y # CONFIG_BSP_USING_CRC is not set # CONFIG_BSP_USING_RNG is not set # CONFIG_BSP_USING_UDID is not set @@ -297,7 +306,9 @@ CONFIG_BSP_USING_QSPI=y # Onboard Peripheral Drivers # CONFIG_BSP_USING_SDRAM=y -CONFIG_BSP_USING_QSPI_FLASH=y +# CONFIG_BSP_USING_QSPI_FLASH is not set +CONFIG_BSP_USING_SDMMC=y +CONFIG_BSP_USING_USBD=y # # More Drivers diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/applications/main.c b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/applications/main.c index 7a43f472d..dd727ca37 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/applications/main.c +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/applications/main.c @@ -31,9 +31,11 @@ extern int FrameworkInit(); int main(void) { rt_pin_mode(LEDR_PIN, PIN_MODE_OUTPUT); - rt_thread_mdelay(100); FrameworkInit(); printf("XIUOS stm32h7 build %s %s\n",__DATE__,__TIME__); + #ifdef BSP_USING_USBD + //rt_console_set_device("vcom"); + #endif while (1) { rt_pin_write(LEDR_PIN, PIN_HIGH); diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/Kconfig b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/Kconfig index d986c4ef9..604094a85 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/Kconfig +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/board/Kconfig @@ -54,6 +54,11 @@ menu "On-chip Peripheral Drivers" select RT_USING_SPI default n + config BSP_USING_ONCHIP_RTC + bool "Enable RTC" + select RT_USING_RTC + default n + source "$RTT_DIR/bsp/stm32/libraries/HAL_Drivers/Kconfig" endmenu @@ -77,6 +82,11 @@ menu "On-chip Peripheral Drivers" select RT_USING_DFS select RT_USING_DFS_ELMFAT default n + + config BSP_USING_USBD + bool "Enable OTGFS as USB device" + select RT_USING_USB_DEVICE + default n endmenu diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/rtconfig.h b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/rtconfig.h index bb619c0c8..8ebd6580e 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/rtconfig.h +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/rtconfig.h @@ -18,6 +18,7 @@ #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 256 @@ -39,8 +40,9 @@ #define RT_USING_MEMPOOL #define RT_USING_MEMHEAP -#define RT_USING_MEMHEAP_AUTO_BINDING +#define RT_MEMHEAP_FAST_MODE #define RT_USING_MEMHEAP_AS_HEAP +#define RT_USING_MEMHEAP_AUTO_BINDING #define RT_USING_HEAP /* Kernel Device Object */ @@ -49,7 +51,7 @@ #define RT_USING_CONSOLE #define RT_CONSOLEBUF_SIZE 256 #define RT_CONSOLE_DEVICE_NAME "uart1" -#define RT_VER_NUM 0x40004 +#define RT_VER_NUM 0x40100 #define ARCH_ARM #define RT_USING_CPU_FFS #define ARCH_ARM_CORTEX_M @@ -61,15 +63,8 @@ #define RT_USING_USER_MAIN #define RT_MAIN_THREAD_STACK_SIZE 2048 #define RT_MAIN_THREAD_PRIORITY 10 - -/* C++ features */ - -#define RT_USING_CPLUSPLUS - -/* Command shell */ - -#define RT_USING_FINSH #define RT_USING_MSH +#define RT_USING_FINSH #define FINSH_USING_MSH #define FINSH_THREAD_NAME "tshell" #define FINSH_THREAD_PRIORITY 20 @@ -81,10 +76,8 @@ #define MSH_USING_BUILT_IN_COMMANDS #define FINSH_USING_DESCRIPTION #define FINSH_ARG_MAX 10 - -/* Device virtual file system */ - #define RT_USING_DFS +#define DFS_USING_POSIX #define DFS_USING_WORKDIR #define DFS_FILESYSTEMS_MAX 4 #define DFS_FILESYSTEM_TYPES_MAX 4 @@ -110,7 +103,6 @@ /* Device Drivers */ #define RT_USING_DEVICE_IPC -#define RT_PIPE_BUFSZ 512 #define RT_USING_SERIAL #define RT_USING_SERIAL_V1 #define RT_SERIAL_USING_DMA @@ -133,32 +125,39 @@ /* 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_CDC +#define RT_USB_DEVICE_CDC +#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 -/* POSIX layer and C standard library */ +/* C/C++ and POSIX layer */ -#define RT_USING_LIBC -#define RT_USING_PTHREADS -#define PTHREAD_NUM_MAX 8 -#define RT_USING_POSIX -#define RT_LIBC_USING_TIME #define RT_LIBC_DEFAULT_TIMEZONE 8 +/* POSIX (Portable Operating System Interface) layer */ + +#define RT_USING_POSIX_DELAY +#define RT_USING_POSIX_CLOCK +#define RT_USING_PTHREADS +#define PTHREAD_NUM_MAX 8 + +/* Interprocess Communication (IPC) */ + + +/* Socket is in the 'Network' category */ + +#define RT_USING_CPLUSPLUS + /* Network */ -/* Socket abstraction layer */ - - -/* Network interface device */ - - -/* light weight TCP/IP stack */ - - -/* AT commands */ - - -/* VBUS(Virtual Software BUS) */ - /* Utilities */ @@ -184,6 +183,7 @@ #define BSP_USING_SDRAM #define BSP_USING_SDMMC +#define BSP_USING_USBD /* More Drivers */ diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/rtconfig.py b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/rtconfig.py index 1e094c54c..f060650ff 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/rtconfig.py +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/rtconfig.py @@ -2,7 +2,7 @@ import os SRC_APP_DIR = '../../../../APP_Framework' # toolchains options ARCH='arm' -CPU='cortex-m4' +CPU='cortex-m7' CROSS_TOOL='gcc' # bsp lib config From 3c42d161c00a32072df8683af6b3495cd77a1120 Mon Sep 17 00:00:00 2001 From: WentaoWong Date: Tue, 19 Apr 2022 09:45:16 +0800 Subject: [PATCH 25/38] Ubiquitous/RT_Thread/: update README of stm32h743_openmv_h7plus --- .../stm32h743_openmv_h7plus/README.md | 31 ++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/README.md b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/README.md index 121f7eef3..82647c59c 100644 --- a/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/README.md +++ b/Ubiquitous/RT-Thread_Fusion_XiUOS/aiit_board/stm32h743_openmv_h7plus/README.md @@ -82,4 +82,33 @@ | PC5 | FMC_SDCKE0 | | PG8 | FMC_SDCLK | | PG15 | FMC_SDNCAS | -| PF11 | FMC_SDNRAS | \ No newline at end of file +| PF11 | FMC_SDNRAS | + +### QSPI FLASH W25Q256JV + +| 引脚 | 作用 | +| ---- | --------------- | +| PF6 | QUADSPI_BK1_IO3 | +| PF7 | QUADSPI_BK1_IO2 | +| PF8 | QUADSPI_BK1_IO0 | +| PF9 | QUADSPI_BK1_IO1 | +| PF10 | QUADSPI_CLK | +| PG6 | QUADSPI_BK1_NCS | + +### SDIO USD-1040310811 + +| 引脚 | 作用 | +| ---- | ---------- | +| PC8 | SDMMC1_D0 | +| PC9 | SDMMC1_D1 | +| PC10 | SDMMC1_D2 | +| PC11 | SDMMC1_D3 | +| PC12 | SDMMC1_CK | +| PD2 | SDMMC1_CMD | + +### USBCDC + +| 引脚 | 作用 | +| ---- | ------------- | +| PA11 | USB_OTG_FS_DM | +| PA12 | USB_OTG_FS_DP | \ No newline at end of file From f693fa78af2612c00f1be1aebf3bfe55dbb45971 Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Tue, 19 Apr 2022 10:06:44 +0800 Subject: [PATCH 26/38] add 4g defconfig --- .../xidatong/configs/4gnsh/defconfig | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/4gnsh/defconfig diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/4gnsh/defconfig b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/4gnsh/defconfig new file mode 100644 index 000000000..aa097de86 --- /dev/null +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/4gnsh/defconfig @@ -0,0 +1,59 @@ +# +# This file is autogenerated: PLEASE DO NOT EDIT IT. +# +# You can use "make menuconfig" to make any modifications to the installed .config file. +# You can then do "make savedefconfig" to generate a new defconfig file that includes your +# modifications. +# +CONFIG_ADD_NUTTX_FETURES=y +CONFIG_ARCH="arm" +CONFIG_ARCH_BOARD="xidatong" +CONFIG_ARCH_BOARD_XIDATONG=y +CONFIG_ARCH_CHIP="imxrt" +CONFIG_ARCH_CHIP_IMXRT=y +CONFIG_ARCH_CHIP_MIMXRT1052CVL5B=y +CONFIG_ARCH_INTERRUPTSTACK=10240 +CONFIG_ARCH_STACKDUMP=y +CONFIG_ARMV7M_DCACHE=y +CONFIG_ARMV7M_DCACHE_WRITETHROUGH=y +CONFIG_ARMV7M_ICACHE=y +CONFIG_ARMV7M_USEBASEPRI=y +CONFIG_BOARD_LOOPSPERMSEC=104926 +CONFIG_BUILTIN=y +CONFIG_CLOCK_MONOTONIC=y +CONFIG_EXAMPLES_HELLO=y +CONFIG_FS_PROCFS=y +CONFIG_IDLETHREAD_STACKSIZE=2048 +CONFIG_IMXRT_LPUART1=y +CONFIG_INTELHEX_BINARY=y +CONFIG_LPUART1_SERIAL_CONSOLE=y +CONFIG_NSH_ARCHINIT=y +CONFIG_NSH_BUILTIN_APPS=y +CONFIG_NSH_DISABLE_IFUPDOWN=y +CONFIG_NSH_FILEIOSIZE=512 +CONFIG_NSH_LINELEN=64 +CONFIG_NSH_READLINE=y +CONFIG_RAM_SIZE=524288 +CONFIG_RAM_START=0x20200000 +CONFIG_RAW_BINARY=y +CONFIG_SCHED_HPWORK=y +CONFIG_SCHED_WAITPID=y +CONFIG_START_DAY=14 +CONFIG_START_MONTH=3 +CONFIG_SYSTEM_NSH=y +CONFIG_DEV_GPIO=y +CONFIG_IMXRT_LPUART8=y +CONFIG_LPUART8_RXBUFSIZE=128 +CONFIG_LPUART8_TXBUFSIZE=128 +CONFIG_LPUART8_BAUD=115200 +CONFIG_LPUART8_BITS=8 +CONFIG_LPUART8_PARITY=0 +CONFIG_LPUART8_2STOP=0 +CONFIG_LPUART8_NOIFLOWCONTROL=y +CONFIG_SUPPORT_CONNECTION_FRAMEWORK=y +CONFIG_CONNECTION_FRAMEWORK_DEBUG=y +CONFIG_CONNECTION_ADAPTER_4G=y +CONFIG_ADAPTER_EC200T=y +CONFIG_ADAPTER_4G_EC200T="ec200t" +CONFIG_ADAPTER_EC200T_DRIVER="/dev/ttyS8" +CONFIG_USER_ENTRYPOINT="nsh_main" From 51dbbc2e8da9c61836bc32352404fb8d5c710a8c Mon Sep 17 00:00:00 2001 From: Liu_Weichao Date: Tue, 19 Apr 2022 17:25:37 +0800 Subject: [PATCH 27/38] feat add lwext4 fs register --- Ubiquitous/XiZi/board/xidatong/Kconfig | 2 +- Ubiquitous/XiZi/kernel/include/xs_init.h | 1 + Ubiquitous/XiZi/kernel/thread/init.c | 3 +++ 3 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Ubiquitous/XiZi/board/xidatong/Kconfig b/Ubiquitous/XiZi/board/xidatong/Kconfig index 629a1c18a..9653b4851 100644 --- a/Ubiquitous/XiZi/board/xidatong/Kconfig +++ b/Ubiquitous/XiZi/board/xidatong/Kconfig @@ -42,7 +42,7 @@ menu "xidatong feature" menu "config board peripheral" config MOUNT_SDCARD - bool "mount cd card" + bool "mount sd card" default n endmenu diff --git a/Ubiquitous/XiZi/kernel/include/xs_init.h b/Ubiquitous/XiZi/kernel/include/xs_init.h index 745377e91..09e813178 100644 --- a/Ubiquitous/XiZi/kernel/include/xs_init.h +++ b/Ubiquitous/XiZi/kernel/include/xs_init.h @@ -40,6 +40,7 @@ extern int FlashW25qxxSpiDeviceInit(void); extern int LoraSx12xxSpiDeviceInit(void); extern int FatfsInit(void); extern int Ch376fsInit(void); +extern int Lwext4Init(void); extern int LibcSystemInit(void); extern int RtcNtpSyncInit(void); extern int MountSDCard(void); diff --git a/Ubiquitous/XiZi/kernel/thread/init.c b/Ubiquitous/XiZi/kernel/thread/init.c index 4813111cd..00e255d26 100644 --- a/Ubiquitous/XiZi/kernel/thread/init.c +++ b/Ubiquitous/XiZi/kernel/thread/init.c @@ -95,6 +95,9 @@ struct InitSequenceDesc components_init[] = #endif #ifdef FS_CH376 { "ch376", Ch376fsInit }, +#endif +#ifdef FS_LWEXT4 + { "lwext4", Lwext4Init }, #endif { "libc_system", LibcSystemInit }, #ifdef RTC_SYNC_USING_NTP From 7f12a1892b38dd2e65ce70dec4e5c57969a01b7c Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Tue, 19 Apr 2022 19:38:11 +0800 Subject: [PATCH 28/38] support 4g on xidatong --- .../Framework/connection/4g/Make.defs | 7 ++ .../Framework/connection/4g/Makefile | 18 +++- .../Framework/connection/4g/adapter_4g.c | 4 +- .../Framework/connection/4g/ec200t/Kconfig | 3 + .../Framework/connection/4g/ec200t/Make.defs | 6 ++ .../Framework/connection/4g/ec200t/Makefile | 15 +++- .../Framework/connection/4g/ec200t/ec200t.c | 82 ++++++++++++++++++- .../Framework/connection/adapter_agent.c | 13 ++- APP_Framework/Framework/connection/at_agent.h | 6 +- .../app_match_nuttx/apps/nshlib/Kconfig | 4 + .../app_match_nuttx/apps/nshlib/nsh.h | 4 + .../apps/nshlib/nsh_Applicationscmd.c | 11 +++ .../app_match_nuttx/apps/nshlib/nsh_command.c | 4 + 13 files changed, 164 insertions(+), 13 deletions(-) create mode 100644 APP_Framework/Framework/connection/4g/Make.defs create mode 100644 APP_Framework/Framework/connection/4g/ec200t/Make.defs diff --git a/APP_Framework/Framework/connection/4g/Make.defs b/APP_Framework/Framework/connection/4g/Make.defs new file mode 100644 index 000000000..c355d00f7 --- /dev/null +++ b/APP_Framework/Framework/connection/4g/Make.defs @@ -0,0 +1,7 @@ +############################################################################ +# APP_Framework/Framework/connection/4g/Make.defs +############################################################################ +ifneq ($(CONFIG_CONNECTION_ADAPTER_4G),) +CONFIGURED_APPS += $(APPDIR)/../../../APP_Framework/Framework/connection/4g +endif +include $(wildcard $(APPDIR)/../../../APP_Framework/Framework/connection/4g/*/Make.defs) diff --git a/APP_Framework/Framework/connection/4g/Makefile b/APP_Framework/Framework/connection/4g/Makefile index 436b7d97f..f5c4a138e 100644 --- a/APP_Framework/Framework/connection/4g/Makefile +++ b/APP_Framework/Framework/connection/4g/Makefile @@ -1,7 +1,17 @@ -SRC_FILES := adapter_4g.c +include $(KERNEL_ROOT)/.config +ifeq ($(CONFIG_ADD_NUTTX_FETURES),y) + include $(APPDIR)/Make.defs + CSRCS += adapter_4g.c + include $(APPDIR)/Application.mk -ifeq ($(CONFIG_ADAPTER_EC200T),y) - SRC_DIR += ec200t endif -include $(KERNEL_ROOT)/compiler.mk \ No newline at end of file +ifeq ($(CONFIG_ADD_XIZI_FETURES),y) + SRC_FILES := adapter_4g.c + + ifeq ($(CONFIG_ADAPTER_EC200T),y) + SRC_DIR += ec200t + endif + + include $(KERNEL_ROOT)/compiler.mk +endif \ No newline at end of file diff --git a/APP_Framework/Framework/connection/4g/adapter_4g.c b/APP_Framework/Framework/connection/4g/adapter_4g.c index ab288a654..6dac34951 100644 --- a/APP_Framework/Framework/connection/4g/adapter_4g.c +++ b/APP_Framework/Framework/connection/4g/adapter_4g.c @@ -92,8 +92,8 @@ int Adapter4GTest(void) #ifdef ADAPTER_EC200T //Using Hang Xiao server to test 4G Socket connection - uint8 server_addr[64] = "101.68.82.219"; - uint8 server_port[64] = "9898"; + uint8 server_addr[64] = "120.76.100.197"; + uint8 server_port[64] = "10002"; adapter->socket.socket_id = 0; diff --git a/APP_Framework/Framework/connection/4g/ec200t/Kconfig b/APP_Framework/Framework/connection/4g/ec200t/Kconfig index 445db290d..71f692f27 100644 --- a/APP_Framework/Framework/connection/4g/ec200t/Kconfig +++ b/APP_Framework/Framework/connection/4g/ec200t/Kconfig @@ -32,6 +32,9 @@ if ADD_XIZI_FETURES endif if ADD_NUTTX_FETURES + config ADAPTER_EC200T_DRIVER + string "EC200T device uart driver path" + default "/dev/ttyS8" endif diff --git a/APP_Framework/Framework/connection/4g/ec200t/Make.defs b/APP_Framework/Framework/connection/4g/ec200t/Make.defs new file mode 100644 index 000000000..3bc3ea830 --- /dev/null +++ b/APP_Framework/Framework/connection/4g/ec200t/Make.defs @@ -0,0 +1,6 @@ +############################################################################ +# APP_Framework/Framework/connection/4g/ec200t/Make.defs +############################################################################ +ifneq ($(CONFIG_ADAPTER_4G_EC200T),) +CONFIGURED_APPS += $(APPDIR)/../../../APP_Framework/Framework/connection/4g/ec200t +endif diff --git a/APP_Framework/Framework/connection/4g/ec200t/Makefile b/APP_Framework/Framework/connection/4g/ec200t/Makefile index 83a948038..5b2bff1fe 100644 --- a/APP_Framework/Framework/connection/4g/ec200t/Makefile +++ b/APP_Framework/Framework/connection/4g/ec200t/Makefile @@ -1,3 +1,14 @@ -SRC_FILES := ec200t.c +include $(KERNEL_ROOT)/.config +ifeq ($(CONFIG_ADD_NUTTX_FETURES),y) + include $(APPDIR)/Make.defs + CSRCS += ec200t.c + include $(APPDIR)/Application.mk -include $(KERNEL_ROOT)/compiler.mk +endif + +ifeq ($(CONFIG_ADD_XIZI_FETURES),y) + SRC_FILES := ec200t.c + + include $(KERNEL_ROOT)/compiler.mk + +endif diff --git a/APP_Framework/Framework/connection/4g/ec200t/ec200t.c b/APP_Framework/Framework/connection/4g/ec200t/ec200t.c index 5ba720edc..c04cf1db2 100644 --- a/APP_Framework/Framework/connection/4g/ec200t/ec200t.c +++ b/APP_Framework/Framework/connection/4g/ec200t/ec200t.c @@ -36,6 +36,9 @@ #define EC200T_CREG_REPLY ",1" #define EC200T_CONNECT_REPLY "CONNECT" +#ifdef ADD_NUTTX_FETURES +static void Ec200tPowerSet(void){ return; } +#else static void Ec200tPowerSet(void) { int pin_fd; @@ -69,6 +72,7 @@ static void Ec200tPowerSet(void) PrivTaskDelay(10000); } +#endif static int Ec200tOpen(struct Adapter *adapter) { @@ -82,7 +86,7 @@ static int Ec200tOpen(struct Adapter *adapter) /*step2: init AT agent*/ if (!adapter->agent) { char *agent_name = "4G_uart_client"; - if (EOK != InitATAgent(agent_name, adapter->fd, 512)) { + if (0 != InitATAgent(agent_name, adapter->fd, 512)) { printf("at agent init failed !\n"); return -1; } @@ -137,6 +141,10 @@ out: return ret; } + +#ifdef ADD_NUTTX_FETURES +static int Ec200tIoctl(struct Adapter *adapter, int cmd, void *args){ return 0;} +#else static int Ec200tIoctl(struct Adapter *adapter, int cmd, void *args) { if (OPE_INT != cmd) { @@ -169,7 +177,77 @@ static int Ec200tIoctl(struct Adapter *adapter, int cmd, void *args) return 0; } +#endif +#ifdef ADD_NUTTX_FETURES +static int Ec200tConnect(struct Adapter *adapter, enum NetRoleType net_role, const char *ip, const char *port, enum IpType ip_type) +{ + int ret = 0; + uint8_t ec200t_cmd[64]; + + AtSetReplyEndChar(adapter->agent, 0x4F, 0x4B); + + /*step1: serial write "+++", quit transparent mode*/ + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "+++"); + + PrivTaskDelay(3000); + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "ATE0\r\n"); + + /*step2: serial write "AT+CCID", get SIM ID*/ + PrivTaskDelay(3000); + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, EC200T_GET_CCID_CMD); + + /*step3: serial write "AT+CPIN?", check SIM status*/ + PrivTaskDelay(3000); + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, EC200T_GET_CPIN_CMD); + + /*step4: serial write "AT+CREG?", check whether registered to GSM net*/ + PrivTaskDelay(3000); + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, EC200T_GET_CREG_CMD); + + /*step5: serial write "AT+QICSGP", connect to China Mobile using ipv4 or ipv6*/ + memset(ec200t_cmd, 0, sizeof(ec200t_cmd)); + + if (IPV4 == ip_type) { + strcpy(ec200t_cmd, "AT+QICSGP=1,1,\"CMNET\",\"\",\"\",1\r\n"); + } else if (IPV6 == ip_type) { + strcpy(ec200t_cmd, "AT+QICSGP=1,2,\"CMNET\",\"\",\"\",1\r\n"); + } + PrivTaskDelay(3000); + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, ec200t_cmd); + + /*step6: serial write "AT+QICLOSE", close socket connect before open socket*/ + memset(ec200t_cmd, 0, sizeof(ec200t_cmd)); + sprintf(ec200t_cmd, EC200T_CLOSE_SOCKET_CMD, adapter->socket.socket_id); + PrivTaskDelay(3000); + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, ec200t_cmd); + + /*step7: serial write "AT+QIDEACT", close TCP net before open socket*/ + PrivTaskDelay(3000); + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, EC200T_DEACTIVE_PDP_CMD); + + /*step8: serial write "AT+QIACT", open TCP net*/ + PrivTaskDelay(3000); + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, EC200T_ACTIVE_PDP_CMD); + + /*step9: serial write "AT+QIOPEN", connect socket using TCP*/ + memset(ec200t_cmd, 0, sizeof(ec200t_cmd)); + sprintf(ec200t_cmd, EC200T_OPEN_SOCKET_CMD, adapter->socket.socket_id); + strcat(ec200t_cmd, ",\"TCP\",\""); + strcat(ec200t_cmd, ip); + strcat(ec200t_cmd, "\","); + strcat(ec200t_cmd, port); + strcat(ec200t_cmd, ",0,2\r\n"); + + AtSetReplyEndChar(adapter->agent, 0x43, 0x54); + PrivTaskDelay(3000); + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, ec200t_cmd); + + ADAPTER_DEBUG("Ec200t connect TCP done\n"); + + return 0; +} +#else static int Ec200tConnect(struct Adapter *adapter, enum NetRoleType net_role, const char *ip, const char *port, enum IpType ip_type) { int ret = 0; @@ -257,10 +335,10 @@ out: Ec200tPowerSet(); return -1; } +#endif static int Ec200tSend(struct Adapter *adapter, const void *buf, size_t len) { - x_err_t result = EOK; if (adapter->agent) { EntmSend(adapter->agent, (const char *)buf, len); } else { diff --git a/APP_Framework/Framework/connection/adapter_agent.c b/APP_Framework/Framework/connection/adapter_agent.c index 8d75767ee..cd846129f 100755 --- a/APP_Framework/Framework/connection/adapter_agent.c +++ b/APP_Framework/Framework/connection/adapter_agent.c @@ -194,13 +194,15 @@ int AtCmdConfigAndCheck(ATAgentType agent, char *cmd, char *check) ret = -1; goto __exit; } + ret = ATOrderSend(agent, REPLY_TIME_OUT, reply, cmd); if(ret < 0){ printf("%s %d ATOrderSend failed.\n",__func__,__LINE__); ret = -1; goto __exit; } - // PrivTaskDelay(3000); + + PrivTaskDelay(3000); result = GetReplyText(reply); if (!result) { @@ -295,7 +297,7 @@ int EntmRecv(ATAgentType agent, char *rev_buffer, int buffer_len, int timeout_s) agent->receive_mode = ENTM_MODE; agent->read_len = buffer_len; PrivMutexAbandon(&agent->lock); - // PrivTaskDelay(1000); + PrivTaskDelay(1000); if (PrivSemaphoreObtainWait(&agent->entm_rx_notice, &abstime)) { printf("wait sem[%d] timeout\n",agent->entm_rx_notice); return -ERROR; @@ -424,10 +426,17 @@ int DeleteATAgent(ATAgentType agent) PrivClose(agent->fd); } +#ifdef ADD_NUTTX_FETURES + if (agent->lock.sem.semcount > 0) { + printf("delete agent lock = %d\n",agent->lock.sem.semcount); + PrivMutexDelete(&agent->lock); + } +#else if (agent->lock) { printf("delete agent lock = %d\n",agent->lock); PrivMutexDelete(&agent->lock); } +#endif if (agent->entm_rx_notice) { printf("delete agent entm_rx_notice = %d\n",agent->entm_rx_notice); diff --git a/APP_Framework/Framework/connection/at_agent.h b/APP_Framework/Framework/connection/at_agent.h index 3267698cf..0148abbe8 100755 --- a/APP_Framework/Framework/connection/at_agent.h +++ b/APP_Framework/Framework/connection/at_agent.h @@ -52,8 +52,12 @@ struct ATAgent char *maintain_buffer; uint32 maintain_len; uint32 maintain_max; - + +#ifdef ADD_NUTTX_FETURES + pthread_mutex_t lock; +#else int lock; +#endif ATReplyType reply; char reply_lr_end; diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/apps/nshlib/Kconfig b/Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/apps/nshlib/Kconfig index 7b7c97034..3c98cda38 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/apps/nshlib/Kconfig +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/apps/nshlib/Kconfig @@ -655,6 +655,10 @@ config NSH_DISABLE_ADAPTER_LORATEST bool "Disable sx1278 AdapterLoraTest." default n +config NSH_DISABLE_ADAPTER_4GTEST + bool "Disable ec200t Adapter4GTest." + default n + config NSH_DISABLE_K210_FFT bool "Disable the K210 fft device." default n diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/apps/nshlib/nsh.h b/Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/apps/nshlib/nsh.h index f23773552..d46be3f42 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/apps/nshlib/nsh.h +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/apps/nshlib/nsh.h @@ -1486,6 +1486,10 @@ int nsh_foreach_var(FAR struct nsh_vtbl_s *vtbl, nsh_foreach_var_t cb, int cmd_AdapterLoraTest(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv); #endif +#if defined(CONFIG_ADAPTER_4G_EC200T) && !defined(CONFIG_NSH_DISABLE_ADAPTER_4GTEST) + int cmd_Adapter4GTest(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv); +#endif + #if defined(CONFIG_K210_FFT_TEST) && !defined(CONFIG_NSH_DISABLE_K210_FFT) int cmd_fft(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv); #endif diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/apps/nshlib/nsh_Applicationscmd.c b/Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/apps/nshlib/nsh_Applicationscmd.c index 68a5da9d4..326eb3d75 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/apps/nshlib/nsh_Applicationscmd.c +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/apps/nshlib/nsh_Applicationscmd.c @@ -283,6 +283,17 @@ int cmd_AdapterLoraTest(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) } #endif +#if defined(CONFIG_ADAPTER_4G_EC200T) && !defined(CONFIG_NSH_DISABLE_ADAPTER_4GTEST) +extern int Adapter4GTest(void); +int cmd_Adapter4GTest(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) +{ + nsh_output(vtbl, "Hello, world!\n"); + FrameworkInit(); + Adapter4GTest(); + return OK; +} +#endif + #if defined(CONFIG_K210_FFT_TEST) && !defined(CONFIG_NSH_DISABLE_K210_FFT) extern void nuttx_k210_fft_test(void); int cmd_fft(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/apps/nshlib/nsh_command.c b/Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/apps/nshlib/nsh_command.c index 8cd21e468..d44347b2d 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/apps/nshlib/nsh_command.c +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/app_match_nuttx/apps/nshlib/nsh_command.c @@ -658,6 +658,10 @@ static const struct cmdmap_s g_cmdmap[] = { "AdapterLoraTest", cmd_AdapterLoraTest, 1, 1, "[Lora sx128 test.]" }, #endif +#if defined(CONFIG_ADAPTER_4G_EC200T) && !defined(CONFIG_NSH_DISABLE_ADAPTER_4GTEST) + { "Adapter4GTest", cmd_Adapter4GTest, 1, 1, "[4G ec200t test.]" }, +#endif + #if defined(CONFIG_K210_FFT_TEST) && !defined(CONFIG_NSH_DISABLE_K210_FFT) { "fft", cmd_fft, 1, 1, "[K210 fft function.]" }, #endif From aedd1e046e0aa914a801daca1560605a044caf00 Mon Sep 17 00:00:00 2001 From: Liu_Weichao Date: Wed, 20 Apr 2022 16:24:13 +0800 Subject: [PATCH 29/38] fix InitBoardMemory and InstallConsole bug for XiZi bsp/board --- Ubiquitous/XiZi/board/aiit-riscv64-board/board.c | 6 ++++-- Ubiquitous/XiZi/board/cortex-m0-emulator/board.c | 4 +++- Ubiquitous/XiZi/board/cortex-m3-emulator/board.c | 4 ++-- Ubiquitous/XiZi/board/cortex-m4-emulator/board.c | 5 +++-- Ubiquitous/XiZi/board/hifive1-emulator/board.c | 5 +++-- Ubiquitous/XiZi/board/hifive1-rev-B/board.c | 5 +++-- Ubiquitous/XiZi/board/k210-emulator/board.c | 6 ++++-- Ubiquitous/XiZi/board/kd233/board.c | 6 ++++-- Ubiquitous/XiZi/board/maix-go/board.c | 7 ++++--- Ubiquitous/XiZi/board/rv32m1_vega/board.c | 4 +++- Ubiquitous/XiZi/board/stm32f103-nano/board.c | 4 +++- Ubiquitous/XiZi/board/stm32f407-st-discovery/board.c | 5 +++-- 12 files changed, 39 insertions(+), 22 deletions(-) diff --git a/Ubiquitous/XiZi/board/aiit-riscv64-board/board.c b/Ubiquitous/XiZi/board/aiit-riscv64-board/board.c index 18bab5060..6b5837103 100644 --- a/Ubiquitous/XiZi/board/aiit-riscv64-board/board.c +++ b/Ubiquitous/XiZi/board/aiit-riscv64-board/board.c @@ -222,6 +222,9 @@ void InitBoardHardware(void) DmacInit(); #endif + /* initialize memory system */ + InitBoardMemory(MEMORY_START_ADDRESS, MEMORY_END_ADDRESS); + /* initalize interrupt */ InitHwinterrupt(); #ifdef BSP_USING_UART @@ -239,8 +242,7 @@ void InitBoardHardware(void) #ifdef ARCH_SMP EnableHwclintIpi(); #endif - /* initialize memory system */ - InitBoardMemory(MEMORY_START_ADDRESS, MEMORY_END_ADDRESS); + #ifdef KERNEL_COMPONENTS_INIT for(i = 0; _board_init[i].fn != NONE; i++) { diff --git a/Ubiquitous/XiZi/board/cortex-m0-emulator/board.c b/Ubiquitous/XiZi/board/cortex-m0-emulator/board.c index 3d1e5d76b..0c2515688 100644 --- a/Ubiquitous/XiZi/board/cortex-m0-emulator/board.c +++ b/Ubiquitous/XiZi/board/cortex-m0-emulator/board.c @@ -34,6 +34,8 @@ void InitBoardHardware() { extern int InitHwUart(void); InitHwUart(); - InstallConsole(SERIAL_BUS_NAME_1, SERIAL_DRV_NAME_1, SERIAL_DEVICE_NAME_1); + InitBoardMemory((void*)LM3S_SRAM_START, (void*)LM3S_SRAM_END); + + InstallConsole(SERIAL_BUS_NAME_1, SERIAL_DRV_NAME_1, SERIAL_DEVICE_NAME_1); } diff --git a/Ubiquitous/XiZi/board/cortex-m3-emulator/board.c b/Ubiquitous/XiZi/board/cortex-m3-emulator/board.c index 4f99f34de..9ec3d5ec6 100644 --- a/Ubiquitous/XiZi/board/cortex-m3-emulator/board.c +++ b/Ubiquitous/XiZi/board/cortex-m3-emulator/board.c @@ -34,7 +34,7 @@ void InitBoardHardware() { extern int InitHwUart(void); InitHwUart(); - InstallConsole(SERIAL_BUS_NAME_1, SERIAL_DRV_NAME_1, SERIAL_DEVICE_NAME_1); - InitBoardMemory((void*)LM3S_SRAM_START, (void*)LM3S_SRAM_END); + InitBoardMemory((void*)LM3S_SRAM_START, (void*)LM3S_SRAM_END); + InstallConsole(SERIAL_BUS_NAME_1, SERIAL_DRV_NAME_1, SERIAL_DEVICE_NAME_1); } diff --git a/Ubiquitous/XiZi/board/cortex-m4-emulator/board.c b/Ubiquitous/XiZi/board/cortex-m4-emulator/board.c index 5af339730..526638636 100644 --- a/Ubiquitous/XiZi/board/cortex-m4-emulator/board.c +++ b/Ubiquitous/XiZi/board/cortex-m4-emulator/board.c @@ -109,6 +109,9 @@ void InitBoardHardware() #ifdef BSP_USING_UART Stm32HwUsartInit(); #endif + + InitBoardMemory((void*)MEMORY_START_ADDRESS, (void*)MEMORY_END_ADDRESS); + #ifdef KERNEL_CONSOLE InstallConsole(KERNEL_CONSOLE_BUS_NAME, KERNEL_CONSOLE_DRV_NAME, KERNEL_CONSOLE_DEVICE_NAME); @@ -119,7 +122,5 @@ void InitBoardHardware() KPrintf("\nconsole init completed.\n"); KPrintf("board initialization......\n"); #endif - - InitBoardMemory((void*)MEMORY_START_ADDRESS, (void*)MEMORY_END_ADDRESS); } diff --git a/Ubiquitous/XiZi/board/hifive1-emulator/board.c b/Ubiquitous/XiZi/board/hifive1-emulator/board.c index 99fd47f63..174860df2 100644 --- a/Ubiquitous/XiZi/board/hifive1-emulator/board.c +++ b/Ubiquitous/XiZi/board/hifive1-emulator/board.c @@ -54,6 +54,9 @@ void InitBoardHardware(void) CLINT_MTIMECMP_ADDR = CLINT_MTIME_ADDR + TICK; SET_CSR(mie, MIP_MTIP); + /* initialize memory system */ + InitBoardMemory(MEMORY_START_ADDRESS, MEMORY_END_ADDRESS); + extern int InitHwUart(void); InitHwUart(); InstallConsole(SERIAL_BUS_NAME, SERIAL_DRV_NAME, SERIAL_DEVICE_NAME); @@ -62,8 +65,6 @@ void InitBoardHardware(void) KPrintf("board initialization......\n"); KPrintf("memory address range: [0x%08x - 0x%08x], size: %d\n", (x_ubase) MEMORY_START_ADDRESS, (x_ubase) MEMORY_END_ADDRESS, MEMORY_SIZE); - /* initialize memory system */ - InitBoardMemory(MEMORY_START_ADDRESS, MEMORY_END_ADDRESS); return; } diff --git a/Ubiquitous/XiZi/board/hifive1-rev-B/board.c b/Ubiquitous/XiZi/board/hifive1-rev-B/board.c index 99fd47f63..174860df2 100644 --- a/Ubiquitous/XiZi/board/hifive1-rev-B/board.c +++ b/Ubiquitous/XiZi/board/hifive1-rev-B/board.c @@ -54,6 +54,9 @@ void InitBoardHardware(void) CLINT_MTIMECMP_ADDR = CLINT_MTIME_ADDR + TICK; SET_CSR(mie, MIP_MTIP); + /* initialize memory system */ + InitBoardMemory(MEMORY_START_ADDRESS, MEMORY_END_ADDRESS); + extern int InitHwUart(void); InitHwUart(); InstallConsole(SERIAL_BUS_NAME, SERIAL_DRV_NAME, SERIAL_DEVICE_NAME); @@ -62,8 +65,6 @@ void InitBoardHardware(void) KPrintf("board initialization......\n"); KPrintf("memory address range: [0x%08x - 0x%08x], size: %d\n", (x_ubase) MEMORY_START_ADDRESS, (x_ubase) MEMORY_END_ADDRESS, MEMORY_SIZE); - /* initialize memory system */ - InitBoardMemory(MEMORY_START_ADDRESS, MEMORY_END_ADDRESS); return; } diff --git a/Ubiquitous/XiZi/board/k210-emulator/board.c b/Ubiquitous/XiZi/board/k210-emulator/board.c index 8a6a9d558..f38e504fe 100644 --- a/Ubiquitous/XiZi/board/k210-emulator/board.c +++ b/Ubiquitous/XiZi/board/k210-emulator/board.c @@ -153,6 +153,10 @@ void InitBoardHardware(void) #ifdef BSP_USING_UART HwUartInit(); #endif + + /* initialize memory system */ + InitBoardMemory(MEMORY_START_ADDRESS, MEMORY_END_ADDRESS); + #ifdef KERNEL_CONSOLE /* set console device */ InstallConsole(KERNEL_CONSOLE_BUS_NAME, KERNEL_CONSOLE_DRV_NAME, KERNEL_CONSOLE_DEVICE_NAME); @@ -165,8 +169,6 @@ void InitBoardHardware(void) #ifdef ARCH_SMP EnableHwclintIpi(); #endif - /* initialize memory system */ - InitBoardMemory(MEMORY_START_ADDRESS, MEMORY_END_ADDRESS); #ifdef KERNEL_COMPONENTS_INIT for(i = 0; _board_init[i].fn != NONE; i++) { diff --git a/Ubiquitous/XiZi/board/kd233/board.c b/Ubiquitous/XiZi/board/kd233/board.c index 673939c8b..a3d3786f3 100644 --- a/Ubiquitous/XiZi/board/kd233/board.c +++ b/Ubiquitous/XiZi/board/kd233/board.c @@ -202,6 +202,10 @@ void InitBoardHardware(void) #ifdef BSP_USING_UART HwUartInit(); #endif + + /* initialize memory system */ + InitBoardMemory(MEMORY_START_ADDRESS, MEMORY_END_ADDRESS); + #ifdef KERNEL_CONSOLE /* set console device */ InstallConsole(KERNEL_CONSOLE_BUS_NAME, KERNEL_CONSOLE_DRV_NAME, KERNEL_CONSOLE_DEVICE_NAME); @@ -214,8 +218,6 @@ void InitBoardHardware(void) #ifdef ARCH_SMP EnableHwclintIpi(); #endif - /* initialize memory system */ - InitBoardMemory(MEMORY_START_ADDRESS, MEMORY_END_ADDRESS); #ifdef KERNEL_COMPONENTS_INIT for(i = 0; _board_init[i].fn != NONE; i++) { diff --git a/Ubiquitous/XiZi/board/maix-go/board.c b/Ubiquitous/XiZi/board/maix-go/board.c index 9dcb652e4..efb51204c 100644 --- a/Ubiquitous/XiZi/board/maix-go/board.c +++ b/Ubiquitous/XiZi/board/maix-go/board.c @@ -146,6 +146,10 @@ void InitBoardHardware(void) #ifdef BSP_USING_UART HwUartInit(); #endif + + /* initialize memory system */ + InitBoardMemory(MEMORY_START_ADDRESS, MEMORY_END_ADDRESS); + #ifdef KERNEL_CONSOLE /* set console device */ InstallConsole(KERNEL_CONSOLE_BUS_NAME, KERNEL_CONSOLE_DRV_NAME, KERNEL_CONSOLE_DEVICE_NAME); @@ -158,9 +162,6 @@ void InitBoardHardware(void) #ifdef ARCH_SMP EnableHwclintIpi(); #endif - /* initialize memory system */ - InitBoardMemory(MEMORY_START_ADDRESS, MEMORY_END_ADDRESS); - KPrintf("board init done.\n"); KPrintf("start kernel...\n"); diff --git a/Ubiquitous/XiZi/board/rv32m1_vega/board.c b/Ubiquitous/XiZi/board/rv32m1_vega/board.c index ab7e9d662..02a596ca2 100644 --- a/Ubiquitous/XiZi/board/rv32m1_vega/board.c +++ b/Ubiquitous/XiZi/board/rv32m1_vega/board.c @@ -63,10 +63,12 @@ void InitBoardHardware(void) InitHwUart(); InitHwTick(); + + InitBoardMemory(MEMORY_START_ADDRESS, MEMORY_END_ADDRESS); + InstallConsole("uart0", "uart0_drv", "uart0_dev0"); KPrintf("console init completed.\n"); - InitBoardMemory(MEMORY_START_ADDRESS, MEMORY_END_ADDRESS); KPrintf("memory address range: [0x%08x - 0x%08x], size: %d\n", (x_ubase) MEMORY_START_ADDRESS, (x_ubase) MEMORY_END_ADDRESS, RV32M1VEGA_SRAM_SIZE); KPrintf("board init done.\n"); KPrintf("start kernel...\n"); diff --git a/Ubiquitous/XiZi/board/stm32f103-nano/board.c b/Ubiquitous/XiZi/board/stm32f103-nano/board.c index c624668ae..8949def96 100644 --- a/Ubiquitous/XiZi/board/stm32f103-nano/board.c +++ b/Ubiquitous/XiZi/board/stm32f103-nano/board.c @@ -89,6 +89,8 @@ void InitBoardHardware() __set_PRIMASK(1); InitHwUart(); - InstallConsole(KERNEL_CONSOLE_BUS_NAME, KERNEL_CONSOLE_DRV_NAME, KERNEL_CONSOLE_DEVICE_NAME); + InitBoardMemory((void*)HEAP_START, (void*)HEAP_END); + InstallConsole(KERNEL_CONSOLE_BUS_NAME, KERNEL_CONSOLE_DRV_NAME, KERNEL_CONSOLE_DEVICE_NAME); + } diff --git a/Ubiquitous/XiZi/board/stm32f407-st-discovery/board.c b/Ubiquitous/XiZi/board/stm32f407-st-discovery/board.c index 78ceee6ce..491e61240 100644 --- a/Ubiquitous/XiZi/board/stm32f407-st-discovery/board.c +++ b/Ubiquitous/XiZi/board/stm32f407-st-discovery/board.c @@ -156,6 +156,9 @@ void InitBoardHardware() #ifdef BSP_USING_UART Stm32HwUsartInit(); #endif + + InitBoardMemory((void*)MEMORY_START_ADDRESS, (void*)MEMORY_END_ADDRESS); + #ifdef KERNEL_CONSOLE InstallConsole(KERNEL_CONSOLE_BUS_NAME, KERNEL_CONSOLE_DRV_NAME, KERNEL_CONSOLE_DEVICE_NAME); @@ -166,8 +169,6 @@ void InitBoardHardware() KPrintf("\nconsole init completed.\n"); KPrintf("board initialization......\n"); #endif - - InitBoardMemory((void*)MEMORY_START_ADDRESS, (void*)MEMORY_END_ADDRESS); for(i = 0; _board_init[i].fn != NONE; i++) { ret = _board_init[i].fn(); From 85ff8877d450682ff75f91d789c88151890e2962 Mon Sep 17 00:00:00 2001 From: Wang_Weigen Date: Thu, 21 Apr 2022 16:44:28 +0800 Subject: [PATCH 30/38] =?UTF-8?q?1=E3=80=81repair=20the=20uart=20irq=20pro?= =?UTF-8?q?blem;2=E3=80=81add=20wifi=20esp07s=20test=20cmd=20and=20repair?= =?UTF-8?q?=20the=20socket=20connect=20problem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Framework/connection/adapter_agent.c | 2 +- .../Framework/connection/wifi/adapter_wifi.c | 98 +++++++++++++++- .../Framework/connection/wifi/adapter_wifi.h | 9 ++ .../connection/wifi/esp07s_wifi/esp07s_wifi.c | 105 +++++++++++++----- .../third_party_driver/uart/connect_uart.c | 11 ++ 5 files changed, 194 insertions(+), 31 deletions(-) diff --git a/APP_Framework/Framework/connection/adapter_agent.c b/APP_Framework/Framework/connection/adapter_agent.c index b423e1dcf..9948eeb2e 100755 --- a/APP_Framework/Framework/connection/adapter_agent.c +++ b/APP_Framework/Framework/connection/adapter_agent.c @@ -522,7 +522,7 @@ static int ATAgentInit(ATAgentType agent) #else pthread_attr_t attr; - attr.schedparam.sched_priority = 18; + attr.schedparam.sched_priority = 25; attr.stacksize = 4096; #endif diff --git a/APP_Framework/Framework/connection/wifi/adapter_wifi.c b/APP_Framework/Framework/connection/wifi/adapter_wifi.c index b1f9f7d1f..cf1ed7a96 100644 --- a/APP_Framework/Framework/connection/wifi/adapter_wifi.c +++ b/APP_Framework/Framework/connection/wifi/adapter_wifi.c @@ -19,6 +19,7 @@ */ #include +#include "adapter_wifi.h" #include #ifdef ADAPTER_HFA21_WIFI @@ -99,7 +100,7 @@ int AdapterWifiInit(void) } /******************wifi TEST*********************/ -int AdapterWifiTest(void) +int AdapterwifiTest(void) { char cmd[64]; int baud_rate = BAUD_RATE_57600; @@ -182,4 +183,97 @@ int AdapterWifiTest(void) } } -SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0)|SHELL_CMD_DISABLE_RETURN, AdapterWifiTest, AdapterWifiTest, show adapter wifi information); +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0)|SHELL_CMD_DISABLE_RETURN, AdapterwifiTest, AdapterwifiTest, show adapter wifi information); + +int wifiopen(void) +{ + struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_WIFI_NAME); + + AdapterDeviceOpen(adapter); +} +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0)|SHELL_CMD_DISABLE_RETURN, wifiopen, wifiopen, open adapter wifi ); +int wificlose(void) +{ + struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_WIFI_NAME); + + AdapterDeviceClose(adapter); +} +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_FUNC)|SHELL_CMD_PARAM_NUM(0)|SHELL_CMD_DISABLE_RETURN, wificlose, wificlose, close adapter wifi ); + +int wifisetup(int argc, char *argv[]) +{ + struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_WIFI_NAME); + struct WifiParam param; + memset(¶m,0,sizeof(struct WifiParam)); + strncpy(param.wifi_ssid, argv[1], strlen(argv[1])); + strncpy(param.wifi_pwd, argv[2], strlen(argv[2])); + + adapter->adapter_param = ¶m; + + AdapterDeviceSetUp(adapter); +} +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN)|SHELL_CMD_PARAM_NUM(3)|SHELL_CMD_DISABLE_RETURN, wifisetup, wifisetup, setup adapter wifi ); +int wifiaddrset(int argc, char *argv[]) +{ + struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_WIFI_NAME); + char *ip = argv[1]; + char *gateway = argv[2]; + char *netmask = argv[3]; + + AdapterDeviceSetAddr(adapter, ip, gateway, netmask); + AdapterDevicePing(adapter, "36.152.44.95");///< ping www.baidu.com + AdapterDeviceNetstat(adapter); +} +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN)|SHELL_CMD_PARAM_NUM(4)|SHELL_CMD_DISABLE_RETURN, wifiaddrset, wifiaddrset, addrset adapter wifi); + +int wifiping(int argc, char *argv[]) +{ + struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_WIFI_NAME); + printf("ping %s\n",argv[1]); + AdapterDevicePing(adapter, argv[1]); +} +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN)|SHELL_CMD_PARAM_NUM(3), wifiping, wifiping, wifiping adapter ); + +int wificonnect(int argc, char *argv[]) +{ + struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_WIFI_NAME); + char *ip = argv[1]; + char *port = argv[2]; + enum NetRoleType net_role = CLIENT; + enum IpType ip_type = IPV4; + + if(0 == strncmp("tcp",argv[3],strlen("tcp"))) { + adapter->socket.protocal = SOCKET_PROTOCOL_TCP; + } + + if(0 == strncmp("udp",argv[3],strlen("udp"))) { + adapter->socket.protocal = SOCKET_PROTOCOL_UDP; + } + + AdapterDeviceConnect(adapter, net_role, ip, port, ip_type); +} +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN)|SHELL_CMD_PARAM_NUM(4)|SHELL_CMD_DISABLE_RETURN, wificonnect, wificonnect, wificonnect adapter); +int wifisend(int argc, char *argv[]) +{ + struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_WIFI_NAME); + + const char *wifi_msg = argv[1]; + int len = strlen(wifi_msg); + for(int i = 0;i < 10; ++i) { + AdapterDeviceSend(adapter, wifi_msg, len); + PrivTaskDelay(1000); + } +} +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN)|SHELL_CMD_PARAM_NUM(3)|SHELL_CMD_DISABLE_RETURN, wifisend, wifisend, wifisend adapter wifi information); +int wifirecv(int argc, char *argv[]) +{ + struct Adapter* adapter = AdapterDeviceFindByName(ADAPTER_WIFI_NAME); + + char wifi_recv_msg[128]; + while (1) { + AdapterDeviceRecv(adapter, wifi_recv_msg, 128); + PrivTaskDelay(1000); + printf("wifi recv [%s]\n",wifi_recv_msg); + } +} +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN)|SHELL_CMD_PARAM_NUM(3)|SHELL_CMD_DISABLE_RETURN, wifirecv, wifirecv, wifirecv adapter wifi information); diff --git a/APP_Framework/Framework/connection/wifi/adapter_wifi.h b/APP_Framework/Framework/connection/wifi/adapter_wifi.h index 986e15b0d..e0ea7a9ee 100644 --- a/APP_Framework/Framework/connection/wifi/adapter_wifi.h +++ b/APP_Framework/Framework/connection/wifi/adapter_wifi.h @@ -6,5 +6,14 @@ #define CONFIG_WIFI_BAUDRATE (2) +#define SOCKET_PROTOCOL_TCP (6) +#define SOCKET_PROTOCOL_UDP (17) + +struct WifiParam +{ + uint8_t wifi_ssid[128]; + uint8_t wifi_pwd[128]; +}; + #endif \ No newline at end of file diff --git a/APP_Framework/Framework/connection/wifi/esp07s_wifi/esp07s_wifi.c b/APP_Framework/Framework/connection/wifi/esp07s_wifi/esp07s_wifi.c index ce1fb1df5..b634f7d6e 100755 --- a/APP_Framework/Framework/connection/wifi/esp07s_wifi/esp07s_wifi.c +++ b/APP_Framework/Framework/connection/wifi/esp07s_wifi/esp07s_wifi.c @@ -24,8 +24,6 @@ #include #define LEN_PARA_BUF 128 -#define SOCKET_PROTOCOL_TCP (6) -#define SOCKET_PROTOCOL_UDP (17) static int Esp07sWifiSetDown(struct Adapter *adapter_at); @@ -38,12 +36,18 @@ static int Esp07sWifiTestAtCmd(ATAgentType at_agent) { int ret = 0; - ret = AtCmdConfigAndCheck(at_agent, "AT", "OK"); + ret = AtCmdConfigAndCheck(at_agent, "ATE0\r\n", "OK"); ///< close echo function + if(ret < 0) { + printf("%s %d cmd[ATE0] config failed!\n",__func__,__LINE__); + ret = -1; + } + + PrivTaskDelay(2000); + ret = AtCmdConfigAndCheck(at_agent, "AT\r\n", "OK"); if(ret < 0) { printf("%s %d cmd[AT] config failed!\n",__func__,__LINE__); ret = -1; } - return ret; } @@ -110,7 +114,9 @@ static int Esp07sWifiOpen(struct Adapter *adapter) adapter->agent = at_agent; } - ADAPTER_DEBUG("Esp07sWifi open done\n"); + AtSetReplyEndChar(adapter->agent,'O','K'); + + ADAPTER_DEBUG("Esp07sWifi open done\n"); return 0; } @@ -174,15 +180,13 @@ static int Esp07sWifiReceive(struct Adapter *adapter, void *rev_buffer, size_t b */ static int Esp07sWifiSetUp(struct Adapter *adapter) { - uint8 wifi_ssid[LEN_PARA_BUF] = "AIIT-Guest"; - uint8 wifi_pwd[LEN_PARA_BUF] = ""; char cmd[LEN_PARA_BUF]; int ret = 0; char *result = NULL; + struct WifiParam *param = (struct WifiParam *)adapter->adapter_param; struct ATAgent *agent = adapter->agent; - /* wait esp07s device startup finish */ PrivTaskDelay(2000); if(Esp07sWifiTestAtCmd(agent) < 0) @@ -190,28 +194,31 @@ static int Esp07sWifiSetUp(struct Adapter *adapter) printf("wifi at cmd startup failed.\n"); return -1; } + PrivTaskDelay(2000); /* config as softAP+station mode */ - ret = AtCmdConfigAndCheck(agent, "AT+CWMODE=3", "OK"); + ret = AtCmdConfigAndCheck(agent, "AT+CWMODE=3\r\n", "OK"); if(ret < 0) { printf("%s %d cmd[AT+CWMODE=3] config failed!\n",__func__,__LINE__); return -1; } - + PrivTaskDelay(2000); /* connect the router */ memset(cmd,0,sizeof(cmd)); strncpy(cmd,"AT+CWJAP=",strlen("AT+CWJAP=")); strncat(cmd,"\"",1); - strncat(cmd,wifi_ssid,strlen(wifi_ssid)); + strncat(cmd,param->wifi_ssid,strlen(param->wifi_ssid)); + strncat(cmd,"\"",1); strncat(cmd,",",1); strncat(cmd,"\"",1); - strncat(cmd,wifi_pwd,strlen(wifi_pwd)); + strncat(cmd,param->wifi_pwd,strlen(param->wifi_pwd)); + strncat(cmd,"\"",1); - // strcat(cmd,"\r\n"); + strcat(cmd,"\r\n"); ret = AtCmdConfigAndCheck(agent, cmd, "OK"); if(ret < 0) { - printf("%s %d cmd[%s] connect[%s] failed!\n",__func__,__LINE__,cmd,wifi_ssid); + printf("%s %d cmd[%s] connect[%s] failed!\n",__func__,__LINE__,cmd,param->wifi_ssid); return -1; } @@ -221,7 +228,7 @@ static int Esp07sWifiSetUp(struct Adapter *adapter) printf("%s %d at_create_resp failed!\n",__func__,__LINE__); return -1; } - ret = ATOrderSend(agent, REPLY_TIME_OUT, reply, "AT+CIFSR"); + ret = ATOrderSend(agent, REPLY_TIME_OUT, reply, "AT+CIFSR\r\n"); if(ret < 0){ printf("%s %d ATOrderSend AT+CIFSR failed.\n",__func__,__LINE__); ret = -1; @@ -249,7 +256,7 @@ __exit: */ static int Esp07sWifiSetDown(struct Adapter *adapter) { - ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "AT+RESTORE"); + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "AT+RESTORE\r\n"); PrivTaskDelay(2000); return 0; @@ -282,6 +289,7 @@ static int Esp07sWifiSetAddr(struct Adapter *adapter, const char *ip, const char strncat(cmd,"\"",1); strncat(cmd,netmask,strlen(netmask)); strncat(cmd,"\"",1); + strcat(cmd,"\r\n"); ret = AtCmdConfigAndCheck(adapter->agent, cmd, "OK"); if(ret < 0) { @@ -308,6 +316,7 @@ static int Esp07sWifiPing(struct Adapter *adapter, const char *destination) strncat(cmd,"\"",1); strncat(cmd,destination,strlen(destination)); strncat(cmd,"\"",1); + strcat(cmd,"\r\n"); ret = AtCmdConfigAndCheck(adapter->agent, cmd, "OK"); ///< config as softAP+station mode if(ret < 0) { @@ -327,7 +336,34 @@ static int Esp07sWifiPing(struct Adapter *adapter, const char *destination) */ static int Esp07sWifiNetstat(struct Adapter *adapter) { - return 0; + int ret = 0; + char *result = NULL; + + /* check the wifi ip address */ + ATReplyType reply = CreateATReply(256); + if (NULL == reply) { + printf("%s %d at_create_resp failed!\n",__func__,__LINE__); + return -1; + } + ret = ATOrderSend(adapter->agent, REPLY_TIME_OUT, reply, "AT+CIFSR\r\n"); + if(ret < 0){ + printf("%s %d ATOrderSend AT+CIFSR failed.\n",__func__,__LINE__); + ret = -1; + goto __exit; + } + + result = GetReplyText(reply); + if (!result) { + printf("%s %n get reply failed.\n",__func__,__LINE__); + ret = -1; + goto __exit; + } + printf("[%s]\n", result); + +__exit: + DeleteATReply(reply); + + return ret; } /** @@ -349,12 +385,18 @@ static int Esp07sWifiConnect(struct Adapter *adapter, enum NetRoleType net_role, if(adapter->socket.protocal == SOCKET_PROTOCOL_TCP && net_role == CLIENT) //esp07s as tcp client to connect server { //e.g. AT+CIPSTART="TCP","192.168.3.116",8080 protocol, server IP and port - strncpy(cmd,"AT+CIPSTART=\"TCP\",",strlen("AT+CIPSTART=\"TCP\",")); + strncpy(cmd,"AT+CIPSTART=",strlen("AT+CIPSTART=")); strncat(cmd,"\"",1); - strncpy(cmd, ip, strlen(ip)); + strncat(cmd,"TCP",strlen("TCP")); + strncat(cmd,"\"",1); + strncat(cmd, ",", 1); + strncat(cmd,"\"",1); + strncat(cmd, ip, strlen(ip)); strncat(cmd, "\"", 1); strncat(cmd, ",", 1); strncat(cmd, port, strlen(port)); + strcat(cmd,"\r\n"); + ret = AtCmdConfigAndCheck(agent, cmd, "OK"); if(ret < 0) { printf("%s %d tcp connect [%s] failed!\n",__func__,__LINE__,ip); @@ -364,9 +406,13 @@ static int Esp07sWifiConnect(struct Adapter *adapter, enum NetRoleType net_role, else if(adapter->socket.protocal == SOCKET_PROTOCOL_UDP) { //e.g. AT+CIPSTART="UDP","192.168.3.116",8080,2233,0 UDP protocol, server IP, port,local port,udp mode - strncpy(cmd,"AT+CIPSTART=\"UDP\",",strlen("AT+CIPSTART=\"UDP\",")); + strncpy(cmd,"AT+CIPSTART=",strlen("AT+CIPSTART=")); strncat(cmd,"\"",1); - strncpy(cmd, ip, strlen(ip)); + strncat(cmd,"UDP",strlen("UDP")); + strncat(cmd,"\"",1); + strncat(cmd, ",", 1); + strncat(cmd,"\"",1); + strncat(cmd, ip, strlen(ip)); strncat(cmd, "\"", 1); strncat(cmd, ",", 1); strncat(cmd, port, strlen(port)); @@ -374,6 +420,7 @@ static int Esp07sWifiConnect(struct Adapter *adapter, enum NetRoleType net_role, strncat(cmd, "2233", strlen("2233")); ///< local port strncat(cmd, ",", 1); strncat(cmd, "0", 1); ///< udp transparent transmission mode must be 0 + strcat(cmd,"\r\n"); ret = AtCmdConfigAndCheck(agent, cmd, "OK"); if(ret < 0) { @@ -382,12 +429,12 @@ static int Esp07sWifiConnect(struct Adapter *adapter, enum NetRoleType net_role, } } - ret = AtCmdConfigAndCheck(agent, "AT+CIPMODE=1", "OK"); ///< config as transparent transmission + ret = AtCmdConfigAndCheck(agent, "AT+CIPMODE=1\r\n", "OK"); ///< config as transparent transmission if(ret < 0) { printf("%s %d cmd[%s] config as transparent transmission failed!\n",__func__,__LINE__,cmd); return -1; } - ATOrderSend(agent, REPLY_TIME_OUT, NULL, "AT+CIPSEND"); + ATOrderSend(agent, REPLY_TIME_OUT, NULL, "AT+CIPSEND\r\n"); printf("[%s] connection config as transparent transmission\n",adapter->socket.protocal == SOCKET_PROTOCOL_UDP ? "udp" : "tcp"); adapter->net_role = net_role; @@ -408,17 +455,17 @@ static int Esp07sWifiDisconnect(struct Adapter *adapter) memset(cmd,0,sizeof(cmd)); /* step1: stop transparent transmission mode */ - ATOrderSend(agent, REPLY_TIME_OUT, NULL, "+++"); + ATOrderSend(agent, REPLY_TIME_OUT, NULL, "+++\r\n"); /* step2: exit transparent transmission mode */ - ret = AtCmdConfigAndCheck(agent, "AT+CIPMODE=0", "OK"); + ret = AtCmdConfigAndCheck(agent, "AT+CIPMODE=0\r\n", "OK"); if(ret < 0) { printf("%s %d cmd[AT+CIPMODE=0] exit failed!\n",__func__,__LINE__); return -1; } /* step3: disconnect */ - ret = AtCmdConfigAndCheck(agent, "AT+CIPCLOSE", "OK"); + ret = AtCmdConfigAndCheck(agent, "AT+CIPCLOSE\r\n", "OK"); if(ret < 0) { printf("%s %d cmd [AT+CIPCLOSE] disconnect failed!\n",__func__,__LINE__); return -1; @@ -438,10 +485,10 @@ static int Esp07sWifiIoctl(struct Adapter *adapter, int cmd, void *args) switch (cmd) { case CONFIG_WIFI_RESET: /* reset wifi */ - ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "AT+RST"); + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "AT+RST\r\n"); break; case CONFIG_WIFI_RESTORE: /* resore wifi */ - ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "AT+RESTORE"); + ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "AT+RESTORE\r\n"); break; case CONFIG_WIFI_BAUDRATE: /* step1: config mcu uart*/ @@ -483,6 +530,8 @@ static int Esp07sWifiIoctl(struct Adapter *adapter, int cmd, void *args) strncat(at_cmd, "0", 1); strncat(at_cmd, ",", 1); strncat(at_cmd, "3", 1); + strcat(at_cmd,"\r\n"); + ret = AtCmdConfigAndCheck(adapter->agent, at_cmd, "OK"); if(ret < 0) { printf("%s %d cmd [%s] config uart failed!\n",__func__,__LINE__,at_cmd); diff --git a/Ubiquitous/XiZi/board/xidatong/third_party_driver/uart/connect_uart.c b/Ubiquitous/XiZi/board/xidatong/third_party_driver/uart/connect_uart.c index 2be209890..69157a5d9 100644 --- a/Ubiquitous/XiZi/board/xidatong/third_party_driver/uart/connect_uart.c +++ b/Ubiquitous/XiZi/board/xidatong/third_party_driver/uart/connect_uart.c @@ -186,6 +186,13 @@ static uint32 SerialInit(struct SerialDriver *serial_drv, struct BusConfigureInf LPUART_Init(uart_base, &config, GetUartSrcFreq()); + if (configure_info->private_data) { + DisableIRQ(serial_cfg->hw_cfg.serial_irq_interrupt); + LPUART_EnableInterrupts(uart_base, kLPUART_RxDataRegFullInterruptEnable); + NVIC_SetPriority(serial_cfg->hw_cfg.serial_irq_interrupt, NVIC_EncodePriority(NVIC_GetPriorityGrouping(), 4, 0)); + EnableIRQ(serial_cfg->hw_cfg.serial_irq_interrupt); + } + return EOK; } @@ -195,6 +202,10 @@ static uint32 SerialConfigure(struct SerialDriver *serial_drv, int serial_operat struct SerialCfgParam *serial_cfg = (struct SerialCfgParam *)serial_drv->private_data; LPUART_Type *uart_base = (LPUART_Type *)serial_cfg->hw_cfg.private_data; + struct BusConfigureInfo configure_info; + configure_info.private_data = NONE; + + SerialInit(serial_drv, &configure_info); switch (serial_operation_cmd) { From 275d2387d4c60d7f98715df0eb681a1415416b58 Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Fri, 22 Apr 2022 10:56:32 +0800 Subject: [PATCH 31/38] repair some problems for 4g on xidatong --- .../Framework/connection/4g/ec200t/ec200t.c | 130 +++++++----------- .../Framework/connection/adapter_agent.c | 4 +- .../transform_layer/nuttx/transform.c | 10 +- .../transform_layer/nuttx/transform.h | 1 + 4 files changed, 64 insertions(+), 81 deletions(-) diff --git a/APP_Framework/Framework/connection/4g/ec200t/ec200t.c b/APP_Framework/Framework/connection/4g/ec200t/ec200t.c index c04cf1db2..cdf55707a 100644 --- a/APP_Framework/Framework/connection/4g/ec200t/ec200t.c +++ b/APP_Framework/Framework/connection/4g/ec200t/ec200t.c @@ -36,6 +36,8 @@ #define EC200T_CREG_REPLY ",1" #define EC200T_CONNECT_REPLY "CONNECT" +#define TRY_TIMES 10 + #ifdef ADD_NUTTX_FETURES static void Ec200tPowerSet(void){ return; } #else @@ -120,6 +122,7 @@ static int Ec200tClose(struct Adapter *adapter) /*step2: serial write "AT+QICLOSE", close socket connect before open socket*/ memset(ec200t_cmd, 0, sizeof(ec200t_cmd)); sprintf(ec200t_cmd, EC200T_CLOSE_SOCKET_CMD, adapter->socket.socket_id); + ret = AtCmdConfigAndCheck(adapter->agent, ec200t_cmd, EC200T_OK_REPLY); if (ret < 0) { goto out; @@ -179,78 +182,10 @@ static int Ec200tIoctl(struct Adapter *adapter, int cmd, void *args) } #endif -#ifdef ADD_NUTTX_FETURES -static int Ec200tConnect(struct Adapter *adapter, enum NetRoleType net_role, const char *ip, const char *port, enum IpType ip_type) -{ - int ret = 0; - uint8_t ec200t_cmd[64]; - - AtSetReplyEndChar(adapter->agent, 0x4F, 0x4B); - - /*step1: serial write "+++", quit transparent mode*/ - ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "+++"); - - PrivTaskDelay(3000); - ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "ATE0\r\n"); - - /*step2: serial write "AT+CCID", get SIM ID*/ - PrivTaskDelay(3000); - ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, EC200T_GET_CCID_CMD); - - /*step3: serial write "AT+CPIN?", check SIM status*/ - PrivTaskDelay(3000); - ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, EC200T_GET_CPIN_CMD); - - /*step4: serial write "AT+CREG?", check whether registered to GSM net*/ - PrivTaskDelay(3000); - ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, EC200T_GET_CREG_CMD); - - /*step5: serial write "AT+QICSGP", connect to China Mobile using ipv4 or ipv6*/ - memset(ec200t_cmd, 0, sizeof(ec200t_cmd)); - - if (IPV4 == ip_type) { - strcpy(ec200t_cmd, "AT+QICSGP=1,1,\"CMNET\",\"\",\"\",1\r\n"); - } else if (IPV6 == ip_type) { - strcpy(ec200t_cmd, "AT+QICSGP=1,2,\"CMNET\",\"\",\"\",1\r\n"); - } - PrivTaskDelay(3000); - ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, ec200t_cmd); - - /*step6: serial write "AT+QICLOSE", close socket connect before open socket*/ - memset(ec200t_cmd, 0, sizeof(ec200t_cmd)); - sprintf(ec200t_cmd, EC200T_CLOSE_SOCKET_CMD, adapter->socket.socket_id); - PrivTaskDelay(3000); - ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, ec200t_cmd); - - /*step7: serial write "AT+QIDEACT", close TCP net before open socket*/ - PrivTaskDelay(3000); - ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, EC200T_DEACTIVE_PDP_CMD); - - /*step8: serial write "AT+QIACT", open TCP net*/ - PrivTaskDelay(3000); - ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, EC200T_ACTIVE_PDP_CMD); - - /*step9: serial write "AT+QIOPEN", connect socket using TCP*/ - memset(ec200t_cmd, 0, sizeof(ec200t_cmd)); - sprintf(ec200t_cmd, EC200T_OPEN_SOCKET_CMD, adapter->socket.socket_id); - strcat(ec200t_cmd, ",\"TCP\",\""); - strcat(ec200t_cmd, ip); - strcat(ec200t_cmd, "\","); - strcat(ec200t_cmd, port); - strcat(ec200t_cmd, ",0,2\r\n"); - - AtSetReplyEndChar(adapter->agent, 0x43, 0x54); - PrivTaskDelay(3000); - ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, ec200t_cmd); - - ADAPTER_DEBUG("Ec200t connect TCP done\n"); - - return 0; -} -#else static int Ec200tConnect(struct Adapter *adapter, enum NetRoleType net_role, const char *ip, const char *port, enum IpType ip_type) { int ret = 0; + int try = 0; uint8_t ec200t_cmd[64]; AtSetReplyEndChar(adapter->agent, 0x4F, 0x4B); @@ -259,19 +194,34 @@ static int Ec200tConnect(struct Adapter *adapter, enum NetRoleType net_role, con ATOrderSend(adapter->agent, REPLY_TIME_OUT, NULL, "+++"); /*step2: serial write "AT+CCID", get SIM ID*/ - ret = AtCmdConfigAndCheck(adapter->agent, EC200T_GET_CCID_CMD, EC200T_OK_REPLY); + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, EC200T_GET_CCID_CMD, EC200T_OK_REPLY); + if (ret == 0) { + break; + } + } if (ret < 0) { goto out; } /*step3: serial write "AT+CPIN?", check SIM status*/ - ret = AtCmdConfigAndCheck(adapter->agent, EC200T_GET_CPIN_CMD, EC200T_READY_REPLY); + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, EC200T_GET_CPIN_CMD, EC200T_READY_REPLY); + if (ret == 0) { + break; + } + } if (ret < 0) { goto out; } /*step4: serial write "AT+CREG?", check whether registered to GSM net*/ - ret = AtCmdConfigAndCheck(adapter->agent, EC200T_GET_CREG_CMD, EC200T_CREG_REPLY); + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, EC200T_GET_CREG_CMD, EC200T_CREG_REPLY); + if (ret == 0) { + break; + } + } if (ret < 0) { goto out; } @@ -285,7 +235,12 @@ static int Ec200tConnect(struct Adapter *adapter, enum NetRoleType net_role, con strcpy(ec200t_cmd, "AT+QICSGP=1,2,\"CMNET\",\"\",\"\",1\r\n"); } - ret = AtCmdConfigAndCheck(adapter->agent, ec200t_cmd, EC200T_OK_REPLY); + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, ec200t_cmd, EC200T_OK_REPLY); + if (ret == 0) { + break; + } + } if (ret < 0) { goto out; } @@ -293,19 +248,34 @@ static int Ec200tConnect(struct Adapter *adapter, enum NetRoleType net_role, con /*step6: serial write "AT+QICLOSE", close socket connect before open socket*/ memset(ec200t_cmd, 0, sizeof(ec200t_cmd)); sprintf(ec200t_cmd, EC200T_CLOSE_SOCKET_CMD, adapter->socket.socket_id); - ret = AtCmdConfigAndCheck(adapter->agent, ec200t_cmd, EC200T_OK_REPLY); + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, ec200t_cmd, EC200T_OK_REPLY); + if (ret == 0) { + break; + } + } if (ret < 0) { goto out; } /*step7: serial write "AT+QIDEACT", close TCP net before open socket*/ - ret = AtCmdConfigAndCheck(adapter->agent, EC200T_DEACTIVE_PDP_CMD, EC200T_OK_REPLY); + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, EC200T_DEACTIVE_PDP_CMD, EC200T_OK_REPLY); + if (ret == 0) { + break; + } + } if (ret < 0) { goto out; } /*step8: serial write "AT+QIACT", open TCP net*/ - ret = AtCmdConfigAndCheck(adapter->agent, EC200T_ACTIVE_PDP_CMD, EC200T_OK_REPLY); + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, EC200T_ACTIVE_PDP_CMD, EC200T_OK_REPLY); + if (ret == 0) { + break; + } + } if (ret < 0) { goto out; } @@ -321,7 +291,12 @@ static int Ec200tConnect(struct Adapter *adapter, enum NetRoleType net_role, con AtSetReplyEndChar(adapter->agent, 0x43, 0x54); - ret = AtCmdConfigAndCheck(adapter->agent, ec200t_cmd, EC200T_CONNECT_REPLY); + for(try = 0; try < TRY_TIMES; try++){ + ret = AtCmdConfigAndCheck(adapter->agent, ec200t_cmd, EC200T_CONNECT_REPLY); + if (ret == 0) { + break; + } + } if (ret < 0) { goto out; } @@ -335,7 +310,6 @@ out: Ec200tPowerSet(); return -1; } -#endif static int Ec200tSend(struct Adapter *adapter, const void *buf, size_t len) { diff --git a/APP_Framework/Framework/connection/adapter_agent.c b/APP_Framework/Framework/connection/adapter_agent.c index cd846129f..91b1ca04e 100755 --- a/APP_Framework/Framework/connection/adapter_agent.c +++ b/APP_Framework/Framework/connection/adapter_agent.c @@ -202,7 +202,7 @@ int AtCmdConfigAndCheck(ATAgentType agent, char *cmd, char *check) goto __exit; } - PrivTaskDelay(3000); + //PrivTaskDelay(3000); result = GetReplyText(reply); if (!result) { @@ -297,7 +297,7 @@ int EntmRecv(ATAgentType agent, char *rev_buffer, int buffer_len, int timeout_s) agent->receive_mode = ENTM_MODE; agent->read_len = buffer_len; PrivMutexAbandon(&agent->lock); - PrivTaskDelay(1000); + //PrivTaskDelay(1000); if (PrivSemaphoreObtainWait(&agent->entm_rx_notice, &abstime)) { printf("wait sem[%d] timeout\n",agent->entm_rx_notice); return -ERROR; diff --git a/APP_Framework/Framework/transform_layer/nuttx/transform.c b/APP_Framework/Framework/transform_layer/nuttx/transform.c index 1a176fddb..45d8d30ec 100644 --- a/APP_Framework/Framework/transform_layer/nuttx/transform.c +++ b/APP_Framework/Framework/transform_layer/nuttx/transform.c @@ -55,7 +55,15 @@ int PrivSemaphoreDelete(sem_t *sem) int PrivSemaphoreObtainWait(sem_t *sem, const struct timespec *abstime) { - return sem_timedwait(sem, abstime); + struct timespec timeout; + clock_gettime(CLOCK_REALTIME, &timeout); + timeout.tv_sec += abstime->tv_sec; + return sem_timedwait(sem, &timeout); +} + +int PrivSemaphoreObtainWaitForever(sem_t *sem) +{ + return sem_wait(sem); } int PrivSemaphoreObtainNoWait(sem_t *sem) diff --git a/APP_Framework/Framework/transform_layer/nuttx/transform.h b/APP_Framework/Framework/transform_layer/nuttx/transform.h index 49603f4ab..1cf6b83fc 100644 --- a/APP_Framework/Framework/transform_layer/nuttx/transform.h +++ b/APP_Framework/Framework/transform_layer/nuttx/transform.h @@ -180,6 +180,7 @@ int PrivMutexAbandon(pthread_mutex_t *p_mutex); int PrivSemaphoreCreate(sem_t *sem, int pshared, unsigned int value); int PrivSemaphoreDelete(sem_t *sem); int PrivSemaphoreObtainWait(sem_t *sem, const struct timespec *abstime); +int PrivSemaphoreObtainWaitForever(sem_t *sem); int PrivSemaphoreObtainNoWait(sem_t *sem); int PrivSemaphoreAbandon(sem_t *sem); int32_t PrivSemaphoreSetValue(int32_t sem, uint16_t val); From e1fe48b96f2189300b60360f33d11a549e40dc98 Mon Sep 17 00:00:00 2001 From: Liu_Weichao Date: Fri, 22 Apr 2022 15:50:18 +0800 Subject: [PATCH 32/38] feat add lora device e220 in connection framework --- .../Framework/connection/4g/adapter_4g.c | 2 - APP_Framework/Framework/connection/adapter.h | 9 + .../connection/bluetooth/adapter_bluetooth.c | 2 - .../connection/ethernet/adapter_ethernet.c | 2 - .../ethercat/adapter_ethercat.c | 2 - .../ethercat/hfa21_ethercat/hfa21_ethercat.c | 2 +- .../Framework/connection/lora/Kconfig | 18 +- .../Framework/connection/lora/Makefile | 5 + .../Framework/connection/lora/adapter_lora.c | 24 +- .../Framework/connection/lora/e220/Kconfig | 44 ++ .../Framework/connection/lora/e220/Makefile | 3 + .../Framework/connection/lora/e220/e220.c | 522 ++++++++++++++++++ .../connection/nbiot/adapter_nbiot.c | 2 - .../Framework/connection/wifi/adapter_wifi.c | 2 - .../connection/zigbee/adapter_zigbee.c | 2 - Ubiquitous/XiZi/resources/bus.c | 2 +- 16 files changed, 618 insertions(+), 25 deletions(-) create mode 100644 APP_Framework/Framework/connection/lora/e220/Kconfig create mode 100644 APP_Framework/Framework/connection/lora/e220/Makefile create mode 100644 APP_Framework/Framework/connection/lora/e220/e220.c diff --git a/APP_Framework/Framework/connection/4g/adapter_4g.c b/APP_Framework/Framework/connection/4g/adapter_4g.c index ab288a654..60272c666 100644 --- a/APP_Framework/Framework/connection/4g/adapter_4g.c +++ b/APP_Framework/Framework/connection/4g/adapter_4g.c @@ -24,8 +24,6 @@ extern AdapterProductInfoType Ec200tAttach(struct Adapter *adapter); #endif -#define ADAPTER_4G_NAME "4G" - static int Adapter4GRegister(struct Adapter *adapter) { int ret = 0; diff --git a/APP_Framework/Framework/connection/adapter.h b/APP_Framework/Framework/connection/adapter.h index a70c1e6e9..ea0ed6f06 100644 --- a/APP_Framework/Framework/connection/adapter.h +++ b/APP_Framework/Framework/connection/adapter.h @@ -45,6 +45,15 @@ extern "C" { #define ADAPTER_DEBUG #endif +#define ADAPTER_4G_NAME "4G" +#define ADAPTER_BLUETOOTH_NAME "bluetooth" +#define ADAPTER_ETHERNET_NAME "ethernet" +#define ADAPTER_ETHERCAT_NAME "ethercat" +#define ADAPTER_LORA_NAME "lora" +#define ADAPTER_NBIOT_NAME "nbiot" +#define ADAPTER_WIFI_NAME "wifi" +#define ADAPTER_ZIGBEE_NAME "zigbee" + struct Adapter; struct AdapterProductInfo; typedef struct Adapter *AdapterType; diff --git a/APP_Framework/Framework/connection/bluetooth/adapter_bluetooth.c b/APP_Framework/Framework/connection/bluetooth/adapter_bluetooth.c index ace054b49..b8cc0694e 100644 --- a/APP_Framework/Framework/connection/bluetooth/adapter_bluetooth.c +++ b/APP_Framework/Framework/connection/bluetooth/adapter_bluetooth.c @@ -24,8 +24,6 @@ extern AdapterProductInfoType Hc08Attach(struct Adapter *adapter); #endif -#define ADAPTER_BLUETOOTH_NAME "bluetooth" - static int AdapterBlueToothRegister(struct Adapter *adapter) { int ret = 0; diff --git a/APP_Framework/Framework/connection/ethernet/adapter_ethernet.c b/APP_Framework/Framework/connection/ethernet/adapter_ethernet.c index 654166ac7..239472e38 100644 --- a/APP_Framework/Framework/connection/ethernet/adapter_ethernet.c +++ b/APP_Framework/Framework/connection/ethernet/adapter_ethernet.c @@ -24,8 +24,6 @@ extern AdapterProductInfoType Hfa21EthernetAttach(struct Adapter *adapter); #endif -#define ADAPTER_ETHERNET_NAME "ethernet" - static int AdapterEthernetRegister(struct Adapter *adapter) { int ret = 0; diff --git a/APP_Framework/Framework/connection/industrial_ethernet/ethercat/adapter_ethercat.c b/APP_Framework/Framework/connection/industrial_ethernet/ethercat/adapter_ethercat.c index 640151505..05c4b3c40 100644 --- a/APP_Framework/Framework/connection/industrial_ethernet/ethercat/adapter_ethercat.c +++ b/APP_Framework/Framework/connection/industrial_ethernet/ethercat/adapter_ethercat.c @@ -25,8 +25,6 @@ extern AdapterProductInfoType Hfa21EthercatAttach(struct Adapter *adapter); #endif -#define ADAPTER_ETHERCAT_NAME "ethercat" - /** * @description: clear the datagram in ethercat frame, do not free the frame itself, since it may be a memory space on stack * @param frame - ethercat frame pointer diff --git a/APP_Framework/Framework/connection/industrial_ethernet/ethercat/hfa21_ethercat/hfa21_ethercat.c b/APP_Framework/Framework/connection/industrial_ethernet/ethercat/hfa21_ethercat/hfa21_ethercat.c index 820f391c2..4e6cf11e2 100644 --- a/APP_Framework/Framework/connection/industrial_ethernet/ethercat/hfa21_ethercat/hfa21_ethercat.c +++ b/APP_Framework/Framework/connection/industrial_ethernet/ethercat/hfa21_ethercat/hfa21_ethercat.c @@ -26,7 +26,7 @@ // therefore, only the TCP/UDP datagrams are considered, // here EtherCAT is in fact an application layer protocol. -#define ADAPTER_ETHERNET_NAME "ethernet" //"wifi" +// #define ADAPTER_ETHERNET_NAME "ethernet" //"wifi" EcatFrame ecat_data; static struct Adapter *ethernet; uint32_t self_address; diff --git a/APP_Framework/Framework/connection/lora/Kconfig b/APP_Framework/Framework/connection/lora/Kconfig index fd8c8fda9..7dd6b6c43 100644 --- a/APP_Framework/Framework/connection/lora/Kconfig +++ b/APP_Framework/Framework/connection/lora/Kconfig @@ -1,6 +1,10 @@ config ADAPTER_SX1278 bool "Using lora adapter device SX1278" - default y + default n + +config ADAPTER_E220 + bool "Using lora adapter device E220-400T22S" + default n choice prompt "Lora device adapter select net role type " @@ -15,16 +19,20 @@ endchoice if AS_LORA_GATEWAY_ROLE config ADAPTER_LORA_NET_ROLE_ID - hex "if Lora device config as a gateway, set gateway net id" - default "0x10" + hex "if Lora device config as a gateway, set gateway net id" + default "0xFF" endif if AS_LORA_CLIENT_ROLE config ADAPTER_LORA_NET_ROLE_ID - hex "if Lora device config as a client, set client net id" - default "0x01" + hex "if Lora device config as a client, set client net id" + default "0x01" endif if ADAPTER_SX1278 source "$APP_DIR/Framework/connection/lora/sx1278/Kconfig" endif + +if ADAPTER_E220 + source "$APP_DIR/Framework/connection/lora/e220/Kconfig" +endif diff --git a/APP_Framework/Framework/connection/lora/Makefile b/APP_Framework/Framework/connection/lora/Makefile index 9fb8f1a2f..e1b055274 100644 --- a/APP_Framework/Framework/connection/lora/Makefile +++ b/APP_Framework/Framework/connection/lora/Makefile @@ -8,9 +8,14 @@ endif ifeq ($(CONFIG_ADD_XIZI_FETURES),y) SRC_FILES := adapter_lora.c + ifeq ($(CONFIG_ADAPTER_SX1278),y) SRC_DIR += sx1278 endif + + ifeq ($(CONFIG_ADAPTER_E220),y) + SRC_DIR += e220 + endif include $(KERNEL_ROOT)/compiler.mk endif diff --git a/APP_Framework/Framework/connection/lora/adapter_lora.c b/APP_Framework/Framework/connection/lora/adapter_lora.c index a91e0fdec..0f1a0c6bd 100644 --- a/APP_Framework/Framework/connection/lora/adapter_lora.c +++ b/APP_Framework/Framework/connection/lora/adapter_lora.c @@ -24,8 +24,11 @@ extern AdapterProductInfoType Sx1278Attach(struct Adapter *adapter); #endif -#define ADAPTER_LORA_NAME "lora" -#define ADAPTER_LORA_CLIENT_NUM 6 +#ifdef ADAPTER_E220 +extern AdapterProductInfoType E220Attach(struct Adapter *adapter); +#endif + +#define ADAPTER_LORA_CLIENT_NUM 255 #define ADAPTER_LORA_DATA_LENGTH 128 #define ADAPTER_LORA_RECV_DATA_LENGTH 256 @@ -422,7 +425,7 @@ static int LoraClientDataAnalyze(struct Adapter *adapter, void *send_buf, int le LoraReceiveDataCheck(lora_recv_data, ADAPTER_LORA_RECV_DATA_LENGTH, client_recv_data); - printf("%s:client_recv_data\n",__func__); + printf("%s:client_recv_data\n", __func__); printf("head 0x%x length %d panid 0x%x data_type 0x%x client_id 0x%x gateway_id 0x%x crc 0x%x\n", client_recv_data->flame_head, client_recv_data->length, client_recv_data->panid, client_recv_data->data_type, client_recv_data->client_id, client_recv_data->gateway_id, client_recv_data->crc16); @@ -476,7 +479,7 @@ static int LoraClientJoinNet(struct Adapter *adapter, unsigned short panid) client_join_data.client_id = adapter->net_role_id; client_join_data.crc16 = LoraCrc16((uint8 *)&client_join_data, sizeof(struct LoraDataFormat) - 2); - printf("%s:client_join_data\n",__func__); + printf("%s:client_join_data\n", __func__); printf("head 0x%x length %d panid 0x%x data_type 0x%x client_id 0x%x gateway_id 0x%x crc 0x%x\n", client_join_data.flame_head, client_join_data.length, client_join_data.panid, client_join_data.data_type, client_join_data.client_id, client_join_data.gateway_id, client_join_data.crc16); @@ -786,6 +789,19 @@ int AdapterLoraInit(void) #endif +#ifdef ADAPTER_E220 + AdapterProductInfoType product_info = E220Attach(adapter); + if (!product_info) { + printf("AdapterLoraInit e220 attach error\n"); + PrivFree(adapter); + return -1; + } + + adapter->product_info_flag = 1; + adapter->info = product_info; + adapter->done = product_info->model_done; +#endif + return ret; } diff --git a/APP_Framework/Framework/connection/lora/e220/Kconfig b/APP_Framework/Framework/connection/lora/e220/Kconfig new file mode 100644 index 000000000..050a8ea9b --- /dev/null +++ b/APP_Framework/Framework/connection/lora/e220/Kconfig @@ -0,0 +1,44 @@ +config ADAPTER_LORA_E220 + string "E220-400T22S adapter name" + default "e220" + +if ADD_XIZI_FETURES + config ADAPTER_E220_M0 + int "E220 M0 pin number" + default "11" + + config ADAPTER_E220_M1 + int "E220 M1 pin number" + default "9" + + config ADAPTER_E220_PIN_DRIVER + string "E220 device pin driver path" + default "/dev/pin_dev" + + config ADAPTER_E220_DRIVER_EXTUART + bool "Using extra uart to support lora" + default y + + config ADAPTER_E220_DRIVER + string "E220 device uart driver path" + default "/dev/uart1_dev1" + depends on !ADAPTER_E220_DRIVER_EXTUART + + if ADAPTER_E220_DRIVER_EXTUART + config ADAPTER_E220_DRIVER + string "E220 device extra uart driver path" + default "/dev/extuart_dev3" + + config ADAPTER_E220_DRIVER_EXT_PORT + int "if E220 device using extuart, choose port" + default "3" + endif +endif + +if ADD_NUTTX_FETURES + +endif + +if ADD_RTTHREAD_FETURES + +endif diff --git a/APP_Framework/Framework/connection/lora/e220/Makefile b/APP_Framework/Framework/connection/lora/e220/Makefile new file mode 100644 index 000000000..734805688 --- /dev/null +++ b/APP_Framework/Framework/connection/lora/e220/Makefile @@ -0,0 +1,3 @@ +SRC_FILES := e220.c + +include $(KERNEL_ROOT)/compiler.mk diff --git a/APP_Framework/Framework/connection/lora/e220/e220.c b/APP_Framework/Framework/connection/lora/e220/e220.c new file mode 100644 index 000000000..94bf81a84 --- /dev/null +++ b/APP_Framework/Framework/connection/lora/e220/e220.c @@ -0,0 +1,522 @@ +/* +* Copyright (c) 2020 AIIT XUOS Lab +* XiUOS is licensed under Mulan PSL v2. +* You can use this software according to the terms and conditions of the Mulan PSL v2. +* You may obtain a copy of Mulan PSL v2 at: +* http://license.coscl.org.cn/MulanPSL2 +* THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, +* EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, +* MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE. +* See the Mulan PSL v2 for more details. +*/ + +/** + * @file e220.c + * @brief Implement the connection E220-400T22S lora adapter function + * @version 2.0 + * @author AIIT XUOS Lab + * @date 2022.4.20 + */ + +#include + +#define E220_GATEWAY_ADDRESS 0xFFFF +#define E220_CHANNEL 0x04 + +#ifdef AS_LORA_GATEWAY_ROLE +#define E220_ADDRESS E220_GATEWAY_ADDRESS +#endif + +#ifdef AS_LORA_CLIENT_ROLE +#define E220_ADDRESS 0xFFFF +#endif + +#define E220_UART_BAUD_RATE 9600 + +enum E220LoraMode +{ + DATA_TRANSFER_MODE = 0, //M1 : M0 = 0 : 0 + WOR_SEND_MODE, //M1 : M0 = 0 : 1 + WOR_RECEIVE_MODE, //M1 : M0 = 1 : 0 + CONFIGURE_MODE_MODE, //M1 : M0 = 1 : 1 +}; + +/** + * @description: Config E220 work mode by set M1/M0 pin + * @param mode Lora working mode + * @return NULL + */ +static void E220LoraModeConfig(enum E220LoraMode mode) +{ + //delay 1s , wait AUX ready + PrivTaskDelay(1000); + + int pin_fd; + pin_fd = PrivOpen(ADAPTER_E220_PIN_DRIVER, O_RDWR); + if (pin_fd < 0) { + printf("open %s error\n", ADAPTER_E220_PIN_DRIVER); + return; + } + + //Step1: config M0 and M1 GPIO + struct PinParam pin_param; + pin_param.cmd = GPIO_CONFIG_MODE; + pin_param.mode = GPIO_CFG_OUTPUT; + pin_param.pin = ADAPTER_E220_M0; + + struct PrivIoctlCfg ioctl_cfg; + ioctl_cfg.ioctl_driver_type = PIN_TYPE; + ioctl_cfg.args = &pin_param; + PrivIoctl(pin_fd, OPE_CFG, &ioctl_cfg); + + pin_param.pin = ADAPTER_E220_M1; + ioctl_cfg.args = &pin_param; + PrivIoctl(pin_fd, OPE_CFG, &ioctl_cfg); + + //Step2 : set M0 and M1 high or low + struct PinStat pin_stat; + + switch (mode) + { + case DATA_TRANSFER_MODE: + pin_stat.pin = ADAPTER_E220_M1; + pin_stat.val = GPIO_LOW; + PrivWrite(pin_fd, &pin_stat, 1); + + pin_stat.pin = ADAPTER_E220_M0; + pin_stat.val = GPIO_LOW; + PrivWrite(pin_fd, &pin_stat, 1); + break; + + case WOR_SEND_MODE: + pin_stat.pin = ADAPTER_E220_M1; + pin_stat.val = GPIO_LOW; + PrivWrite(pin_fd, &pin_stat, 1); + + pin_stat.pin = ADAPTER_E220_M0; + pin_stat.val = GPIO_HIGH; + PrivWrite(pin_fd, &pin_stat, 1); + break; + + case WOR_RECEIVE_MODE: + pin_stat.pin = ADAPTER_E220_M1; + pin_stat.val = GPIO_HIGH; + PrivWrite(pin_fd, &pin_stat, 1); + + pin_stat.pin = ADAPTER_E220_M0; + pin_stat.val = GPIO_LOW; + PrivWrite(pin_fd, &pin_stat, 1); + break; + + case CONFIGURE_MODE_MODE: + pin_stat.pin = ADAPTER_E220_M1; + pin_stat.val = GPIO_HIGH; + PrivWrite(pin_fd, &pin_stat, 1); + + pin_stat.pin = ADAPTER_E220_M0; + pin_stat.val = GPIO_HIGH; + PrivWrite(pin_fd, &pin_stat, 1); + break; + default: + break; + } + + PrivClose(pin_fd); + + //delay 20ms , wait mode switch done + PrivTaskDelay(20); +} + +/** + * @description: Switch baud rate to register bit + * @param baud_rate - baud_rate + * @return baud_rate_bit + */ +static uint8 E220BaudRateSwitch(uint32 baud_rate) +{ + uint8 baud_rate_bit; + + switch (baud_rate) + { + case 1200: + baud_rate_bit = 0x0; + break; + + case 2400: + baud_rate_bit = 0x1; + break; + + case 4800: + baud_rate_bit = 0x2; + break; + + case 9600: + baud_rate_bit = 0x3; + break; + + case 19200: + baud_rate_bit = 0x4; + break; + + case 38400: + baud_rate_bit = 0x5; + break; + + case 57600: + baud_rate_bit = 0x6; + break; + + case 115200: + baud_rate_bit = 0x7; + break; + + default: + break; + } + + return baud_rate_bit; +} + +/** + * @description: Set E220 register, such as address、channel、baud rate... + * @param adapter - lora adapter + * @param address - address + * @param channel - channel + * @param baud_rate - baud_rate + * @return success: 0, failure: -1 + */ +static int E220SetRegisterParam(struct Adapter *adapter, uint16 address, uint8 channel, uint32 baud_rate) +{ + int ret; + uint8 buffer[50] = {0}; + uint8 baud_rate_bit = E220BaudRateSwitch(baud_rate); + + E220LoraModeConfig(CONFIGURE_MODE_MODE); + PrivTaskDelay(30); + + buffer[0] = 0xC0; //write register order + buffer[1] = 0x00; //register start-address + buffer[2] = 0x08; //register length + + buffer[3] = (address >> 8) & 0xFF; //high address + buffer[4] = address & 0xFF; //low adderss + + buffer[5] = ((baud_rate_bit << 5) & 0xE0) | 0x00; + + buffer[6] = 0x00; + buffer[7] = channel; //channel + buffer[8] = 0x03; + buffer[9] = 0; //high-cipher + buffer[10] = 0; //low-cipher + + ret = PrivWrite(adapter->fd, (void *)buffer, 11); + if(ret < 0){ + printf("E220SetRegisterParam send failed %d!\n", ret); + } + + PrivRead(adapter->fd, buffer, 11); + + E220LoraModeConfig(DATA_TRANSFER_MODE); + PrivTaskDelay(1000); + + return 0; +} + +/** + * @description: Get E220 register, such as address、channel、baud rate... + * @param buf - data buf + * @return success: 0, failure: -1 + */ +static int E220GetRegisterParam(uint8 *buf) +{ + int ret; + uint8 buffer[3] = {0}; + + struct Adapter *adapter = AdapterDeviceFindByName(ADAPTER_LORA_NAME); + if (NULL == adapter) { + printf("E220GetRegisterParam find lora adapter error\n"); + return -1; + } + + E220LoraModeConfig(CONFIGURE_MODE_MODE); + PrivTaskDelay(30); + + buffer[0] = 0xC1; //read register order + buffer[1] = 0x00; //register start-address + buffer[2] = 0x08; //register length + + ret = PrivWrite(adapter->fd, (void *)buffer, 3); + if(ret < 0){ + printf("E220GetRegisterParam send failed %d!\n", ret); + } + + PrivRead(adapter->fd, buf, 11); + + E220LoraModeConfig(DATA_TRANSFER_MODE); + PrivTaskDelay(30); + + return 0; +} + +/** + * @description: Open E220 uart function + * @param adapter - Lora device pointer + * @return success: 0, failure: -1 + */ +static int E220Open(struct Adapter *adapter) +{ + /*step1: open e220 uart port*/ + adapter->fd = PrivOpen(ADAPTER_E220_DRIVER, O_RDWR); + if (adapter->fd < 0) { + printf("E220Open get uart %s fd error\n", ADAPTER_E220_DRIVER); + return -1; + } + + struct SerialDataCfg cfg; + memset(&cfg, 0 ,sizeof(struct SerialDataCfg)); + + cfg.serial_baud_rate = BAUD_RATE_9600; + cfg.serial_data_bits = DATA_BITS_8; + cfg.serial_stop_bits = STOP_BITS_1; + cfg.serial_parity_mode = PARITY_NONE; + cfg.serial_bit_order = BIT_ORDER_LSB; + cfg.serial_invert_mode = NRZ_NORMAL; + cfg.serial_buffer_size = SERIAL_RB_BUFSZ; + + /*aiit board use ch438, so it needs more serial configuration*/ +#ifdef ADAPTER_E220_DRIVER_EXTUART + cfg.ext_uart_no = ADAPTER_E220_DRIVER_EXT_PORT; + cfg.port_configure = PORT_CFG_INIT; +#endif + + struct PrivIoctlCfg ioctl_cfg; + ioctl_cfg.ioctl_driver_type = SERIAL_TYPE; + ioctl_cfg.args = &cfg; + + PrivIoctl(adapter->fd, OPE_INT, &ioctl_cfg); + + E220SetRegisterParam(adapter, E220_ADDRESS, E220_CHANNEL, E220_UART_BAUD_RATE); + + ADAPTER_DEBUG("E220Open done\n"); + + return 0; +} + +/** + * @description: Close E220 uart function + * @param adapter - Lora device pointer + * @return success: 0, failure: -1 + */ +static int E220Close(struct Adapter *adapter) +{ + /*step1: close e220 uart port*/ + int ret; + ret = PrivClose(adapter->fd); + if(ret < 0) { + printf("E220 close failed: %d!\n", ret); + return -1; + } + + ADAPTER_DEBUG("E220 Close done\n"); + + return 0; +} + +/** + * @description: E220 ioctl function + * @param adapter - Lora device pointer + * @param cmd - ioctl cmd + * @param args - iotl params + * @return success: 0, failure: -1 + */ +static int E220Ioctl(struct Adapter *adapter, int cmd, void *args) +{ + /*to do*/ + return 0; +} + +/** + * @description: E220 join lora net group function + * @param adapter - Lora device pointer + * @param priv_net_group - priv_net_group params + * @return success: 0, failure: -1 + */ +static int E220Join(struct Adapter *adapter, unsigned char *priv_net_group) +{ + int ret; + + uint16 len = 144; + + ret = PrivWrite(adapter->fd, (void *)priv_net_group, len); + if(ret < 0) { + printf("E220 Join net group failed: %d!\n", ret); + } + + return ret; +} + +/** + * @description: E220 send data function + * @param adapter - Lora device pointer + * @param buf - data buffers + * @param len - data len + * @return success: 0, failure: -1 + */ +static int E220Send(struct Adapter *adapter, const void *buf, size_t len) +{ + int ret; + + ret = PrivWrite(adapter->fd, (void *)buf, len); + if(ret < 0){ + printf("send failed %d!\n", ret); + } + + return ret; +} + +/** + * @description: E220 receive data function + * @param adapter - Lora device pointer + * @param buf - data buffers + * @param len - data len + * @return success: 0, failure: -1 + */ +static int E220Recv(struct Adapter *adapter, void *buf, size_t len) +{ + return PrivRead(adapter->fd, buf, len); +} + +/** + * @description: E220 quit lora net group function + * @param adapter - Lora device pointer + * @param priv_net_group - priv_net_group params + * @return success: 0, failure: -1 + */ +static int E220Quit(struct Adapter *adapter, unsigned char *priv_net_group) +{ + int ret; + + uint16 len = 144; + + ret = PrivWrite(adapter->fd, (void *)priv_net_group, len); + if(ret < 0){ + printf("E220 quit net group failed %d!\n", ret); + } + + return ret; +} + +static const struct PrivProtocolDone e220_done = +{ + .open = E220Open, + .close = E220Close, + .ioctl = E220Ioctl, + .setup = NULL, + .setdown = NULL, + .setaddr = NULL, + .setdns = NULL, + .setdhcp = NULL, + .ping = NULL, + .netstat = NULL, + .join = E220Join, + .send = E220Send, + .recv = E220Recv, + .quit = E220Quit, +}; + +AdapterProductInfoType E220Attach(struct Adapter *adapter) +{ + struct AdapterProductInfo *product_info = malloc(sizeof(struct AdapterProductInfo)); + if (!product_info) { + printf("E220Attach malloc product_info error\n"); + return NULL; + } + + strncpy(product_info->model_name, ADAPTER_LORA_E220,sizeof(product_info->model_name)); + product_info->model_done = (void *)&e220_done; + + return product_info; +} + +//###################TEST#################### +static void LoraOpen(void) +{ + struct Adapter *adapter = AdapterDeviceFindByName(ADAPTER_LORA_NAME); + if (NULL == adapter) { + printf("LoraReceive find lora adapter error\n"); + return; + } + + E220Open(adapter); +} + +static void LoraRead(void *parameter) +{ + int RevLen; + uint8 i, cnt = 0; + + uint8 buffer[256]; + + memset(buffer, 0, 256); + + struct Adapter *adapter = AdapterDeviceFindByName(ADAPTER_LORA_NAME); + if (NULL == adapter) { + printf("LoraRead find lora adapter error\n"); + return; + } + + while (1) + { + KPrintf("ready to read lora data\n"); + + RevLen = E220Recv(adapter, buffer, 256); + if (RevLen) { + KPrintf("lora get data %u\n", RevLen); + for (i = 0; i < RevLen; i ++) { + printf("i %u data 0x%x\n", i, buffer[i]); + } + + memset(buffer, 0, 256); + + PrivTaskDelay(30); + + cnt ++; + E220Send(adapter, &cnt, 1); + } + } +} + +static void LoraTest(void) +{ + int ret; + + LoraOpen(); + + int task_lora_read = KTaskCreate("task_lora_read", LoraRead, NONE, 2048, 10); + ret = StartupKTask(task_lora_read); + if (ret != EOK) { + KPrintf("StartupKTask task_lora_read failed .\n"); + return; + } +} +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), +LoraTest, LoraTest, lora send and receive message); + +static void LoraSend(int argc, char *argv[]) +{ + struct Adapter *adapter = AdapterDeviceFindByName(ADAPTER_LORA_NAME); + if (NULL == adapter) { + printf("LoraRead find lora adapter error\n"); + return; + } + + char Msg[256] = {0}; + + if (argc == 2) { + strncpy(Msg, argv[1], 256); + + E220Send(adapter, Msg, strlen(Msg)); + } +} +SHELL_EXPORT_CMD(SHELL_CMD_PERMISSION(0)|SHELL_CMD_TYPE(SHELL_TYPE_CMD_MAIN), +LoraSend, LoraSend, lora send message); diff --git a/APP_Framework/Framework/connection/nbiot/adapter_nbiot.c b/APP_Framework/Framework/connection/nbiot/adapter_nbiot.c index 6126a723a..873ff6d1f 100644 --- a/APP_Framework/Framework/connection/nbiot/adapter_nbiot.c +++ b/APP_Framework/Framework/connection/nbiot/adapter_nbiot.c @@ -25,8 +25,6 @@ extern AdapterProductInfoType BC28Attach(struct Adapter *adapter); #endif -#define ADAPTER_NBIOT_NAME "nbiot" - static int AdapterNbiotRegister(struct Adapter *adapter) { int ret = 0; diff --git a/APP_Framework/Framework/connection/wifi/adapter_wifi.c b/APP_Framework/Framework/connection/wifi/adapter_wifi.c index ab6ea8ca6..eac806b4a 100644 --- a/APP_Framework/Framework/connection/wifi/adapter_wifi.c +++ b/APP_Framework/Framework/connection/wifi/adapter_wifi.c @@ -25,8 +25,6 @@ extern AdapterProductInfoType Hfa21WifiAttach(struct Adapter *adapter); #endif -#define ADAPTER_WIFI_NAME "wifi" - static int AdapterWifiRegister(struct Adapter *adapter) { int ret = 0; diff --git a/APP_Framework/Framework/connection/zigbee/adapter_zigbee.c b/APP_Framework/Framework/connection/zigbee/adapter_zigbee.c index adfe8dedc..e3577cf22 100644 --- a/APP_Framework/Framework/connection/zigbee/adapter_zigbee.c +++ b/APP_Framework/Framework/connection/zigbee/adapter_zigbee.c @@ -26,8 +26,6 @@ extern AdapterProductInfoType E18Attach(struct Adapter *adapter); #endif -#define ADAPTER_ZIGBEE_NAME "zigbee" - static int AdapterZigbeeRegister(struct Adapter *adapter) { int ret = 0; diff --git a/Ubiquitous/XiZi/resources/bus.c b/Ubiquitous/XiZi/resources/bus.c index fc1df7002..31f87ebd8 100644 --- a/Ubiquitous/XiZi/resources/bus.c +++ b/Ubiquitous/XiZi/resources/bus.c @@ -52,7 +52,7 @@ static int BusMatchDrvDev(struct Driver *driver, struct HardwareDev *device) NULL_PARAM_CHECK(device); if(!strncmp(driver->owner_bus->bus_name, device->owner_bus->bus_name, NAME_NUM_MAX)) { - KPrintf("BusMatchDrvDev match successfully, bus name %s\n", driver->owner_bus->bus_name); + //KPrintf("BusMatchDrvDev match successfully, bus name %s\n", driver->owner_bus->bus_name); driver->private_data = device->private_data;//driver get the device param device->owner_bus->owner_driver = driver; From 99b5c0d9a0ee5d8c0153de60c607e922d05c96df Mon Sep 17 00:00:00 2001 From: Liu_Weichao Date: Sun, 24 Apr 2022 13:54:54 +0800 Subject: [PATCH 33/38] lora send and receive p2p ok --- .../Framework/connection/lora/e220/e220.c | 4 +- .../third_party_driver/ch438/connect_ch438.c | 80 ++++++++----------- 2 files changed, 37 insertions(+), 47 deletions(-) diff --git a/APP_Framework/Framework/connection/lora/e220/e220.c b/APP_Framework/Framework/connection/lora/e220/e220.c index 94bf81a84..2fec48457 100644 --- a/APP_Framework/Framework/connection/lora/e220/e220.c +++ b/APP_Framework/Framework/connection/lora/e220/e220.c @@ -201,7 +201,7 @@ static int E220SetRegisterParam(struct Adapter *adapter, uint16 address, uint8 c buffer[3] = (address >> 8) & 0xFF; //high address buffer[4] = address & 0xFF; //low adderss - buffer[5] = ((baud_rate_bit << 5) & 0xE0) | 0x00; + buffer[5] = ((baud_rate_bit << 5) & 0xE0) | 0x04; buffer[6] = 0x00; buffer[7] = channel; //channel @@ -478,7 +478,7 @@ static void LoraRead(void *parameter) memset(buffer, 0, 256); - PrivTaskDelay(30); + PrivTaskDelay(1000); cnt ++; E220Send(adapter, &cnt, 1); diff --git a/Ubiquitous/XiZi/board/xidatong/third_party_driver/ch438/connect_ch438.c b/Ubiquitous/XiZi/board/xidatong/third_party_driver/ch438/connect_ch438.c index 500a54fa7..851f5fa4e 100644 --- a/Ubiquitous/XiZi/board/xidatong/third_party_driver/ch438/connect_ch438.c +++ b/Ubiquitous/XiZi/board/xidatong/third_party_driver/ch438/connect_ch438.c @@ -974,6 +974,7 @@ static uint32 ImxrtCh438ReadData(void *dev, struct BusBlockReadParam *read_param x_err_t result; uint8 rcv_num = 0; uint8 gInterruptStatus; + uint8 interrupt_done = 0; uint8 InterruptStatus; static uint8 dat; uint8 REG_LCR_ADDR; @@ -991,54 +992,43 @@ static uint32 ImxrtCh438ReadData(void *dev, struct BusBlockReadParam *read_param struct SerialHardwareDevice *serial_dev = (struct SerialHardwareDevice *)dev; struct SerialDevParam *dev_param = (struct SerialDevParam *)serial_dev->haldev.private_data; - result = KSemaphoreObtain(ch438_sem, WAITING_FOREVER); - if (EOK == result) { - gInterruptStatus = ReadCH438Data(REG_SSR_ADDR); - if (!gInterruptStatus) { - dat = ReadCH438Data(REG_LCR0_ADDR); - dat = ReadCH438Data(REG_IER0_ADDR); - dat = ReadCH438Data(REG_MCR0_ADDR); - dat = ReadCH438Data(REG_LSR0_ADDR); - dat = ReadCH438Data(REG_MSR0_ADDR); - dat = ReadCH438Data(REG_RBR0_ADDR); - dat = ReadCH438Data(REG_THR0_ADDR); - dat = ReadCH438Data(REG_IIR0_ADDR); - dat = dat ; - } else { - if (gInterruptStatus & interrupt_num[dev_param->ext_uart_no]) { /* check which uart port triggers interrupt*/ - REG_LCR_ADDR = offset_addr[dev_param->ext_uart_no] | REG_LCR0_ADDR; - REG_DLL_ADDR = offset_addr[dev_param->ext_uart_no] | REG_DLL0_ADDR; - REG_DLM_ADDR = offset_addr[dev_param->ext_uart_no] | REG_DLM0_ADDR; - REG_IER_ADDR = offset_addr[dev_param->ext_uart_no] | REG_IER0_ADDR; - REG_MCR_ADDR = offset_addr[dev_param->ext_uart_no] | REG_MCR0_ADDR; - REG_FCR_ADDR = offset_addr[dev_param->ext_uart_no] | REG_FCR0_ADDR; - REG_RBR_ADDR = offset_addr[dev_param->ext_uart_no] | REG_RBR0_ADDR; - REG_THR_ADDR = offset_addr[dev_param->ext_uart_no] | REG_THR0_ADDR; - REG_IIR_ADDR = offset_addr[dev_param->ext_uart_no] | REG_IIR0_ADDR; - REG_LSR_ADDR = offset_addr[dev_param->ext_uart_no] | REG_LSR0_ADDR; - REG_MSR_ADDR = offset_addr[dev_param->ext_uart_no] | REG_MSR0_ADDR; - - InterruptStatus = ReadCH438Data( REG_IIR_ADDR ) & 0x0f; /* read the status of the uart port*/ + while (!interrupt_done) { + result = KSemaphoreObtain(ch438_sem, WAITING_FOREVER); + if (EOK == result) { + gInterruptStatus = ReadCH438Data(REG_SSR_ADDR); + if (!gInterruptStatus) { + // dat = ReadCH438Data(REG_LCR0_ADDR); + // dat = ReadCH438Data(REG_IER0_ADDR); + // dat = ReadCH438Data(REG_MCR0_ADDR); + // dat = ReadCH438Data(REG_LSR0_ADDR); + // dat = ReadCH438Data(REG_MSR0_ADDR); + // dat = ReadCH438Data(REG_RBR0_ADDR); + // dat = ReadCH438Data(REG_THR0_ADDR); + // dat = ReadCH438Data(REG_IIR0_ADDR); + // dat = dat; + interrupt_done = 0; + } else { + if (gInterruptStatus & interrupt_num[dev_param->ext_uart_no]) { /* check which uart port triggers interrupt*/ + REG_LCR_ADDR = offset_addr[dev_param->ext_uart_no] | REG_LCR0_ADDR; + REG_DLL_ADDR = offset_addr[dev_param->ext_uart_no] | REG_DLL0_ADDR; + REG_DLM_ADDR = offset_addr[dev_param->ext_uart_no] | REG_DLM0_ADDR; + REG_IER_ADDR = offset_addr[dev_param->ext_uart_no] | REG_IER0_ADDR; + REG_MCR_ADDR = offset_addr[dev_param->ext_uart_no] | REG_MCR0_ADDR; + REG_FCR_ADDR = offset_addr[dev_param->ext_uart_no] | REG_FCR0_ADDR; + REG_RBR_ADDR = offset_addr[dev_param->ext_uart_no] | REG_RBR0_ADDR; + REG_THR_ADDR = offset_addr[dev_param->ext_uart_no] | REG_THR0_ADDR; + REG_IIR_ADDR = offset_addr[dev_param->ext_uart_no] | REG_IIR0_ADDR; + REG_LSR_ADDR = offset_addr[dev_param->ext_uart_no] | REG_LSR0_ADDR; + REG_MSR_ADDR = offset_addr[dev_param->ext_uart_no] | REG_MSR0_ADDR; + + InterruptStatus = ReadCH438Data( REG_IIR_ADDR ) & 0x0f; /* read the status of the uart port*/ - switch( InterruptStatus ) - { - case INT_NOINT: /* NO INTERRUPT */ - break; - case INT_THR_EMPTY: /* THR EMPTY INTERRUPT*/ - break; - case INT_RCV_OVERTIME: /* RECV OVERTIME INTERRUPT*/ - case INT_RCV_SUCCESS: /* RECV INTERRUPT SUCCESSFULLY*/ + if ((INT_RCV_OVERTIME == InterruptStatus) || (INT_RCV_SUCCESS == InterruptStatus)) { rcv_num = Ch438UartRcv(dev_param->ext_uart_no, (uint8 *)read_param->buffer, read_param->size); read_param->read_length = rcv_num; - break; - case INT_RCV_LINES: /* RECV LINES INTERRUPT */ - ReadCH438Data( REG_LSR_ADDR ); - break; - case INT_MODEM_CHANGE: /* MODEM CHANGE INTERRUPT */ - ReadCH438Data( REG_MSR_ADDR ); - break; - default: - break; + + interrupt_done = 1; + } } } } From 8b0deacc4e12b8dc796276ab63a72c82f218bc6a Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Mon, 25 Apr 2022 09:47:22 +0800 Subject: [PATCH 34/38] support table key autocompletion and cmd history on xidatong --- .../aiit_board/xidatong/configs/4gnsh/defconfig | 4 ++++ .../aiit_board/xidatong/configs/knsh/defconfig | 4 ++++ .../aiit_board/xidatong/configs/libcxxtest/defconfig | 4 ++++ .../aiit_board/xidatong/configs/netnsh/defconfig | 4 ++++ .../aiit_board/xidatong/configs/nsh/defconfig | 4 ++++ .../aiit_board/xidatong/configs/sdionsh/defconfig | 4 ++++ .../aiit_board/xidatong/configs/usbnsh/defconfig | 4 ++++ 7 files changed, 28 insertions(+) diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/4gnsh/defconfig b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/4gnsh/defconfig index aa097de86..7ccdce5c2 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/4gnsh/defconfig +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/4gnsh/defconfig @@ -56,4 +56,8 @@ CONFIG_CONNECTION_ADAPTER_4G=y CONFIG_ADAPTER_EC200T=y CONFIG_ADAPTER_4G_EC200T="ec200t" CONFIG_ADAPTER_EC200T_DRIVER="/dev/ttyS8" +CONFIG_READLINE_CMD_HISTORY=y +CONFIG_READLINE_CMD_HISTORY_LEN=100 +CONFIG_READLINE_CMD_HISTORY_LINELEN=120 +CONFIG_READLINE_TABCOMPLETION=y CONFIG_USER_ENTRYPOINT="nsh_main" diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/knsh/defconfig b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/knsh/defconfig index 62ba4cf76..c437eaefd 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/knsh/defconfig +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/knsh/defconfig @@ -45,4 +45,8 @@ CONFIG_START_MONTH=6 CONFIG_SYSTEM_NSH=y CONFIG_SYS_RESERVED=9 CONFIG_DEV_GPIO=y +CONFIG_READLINE_CMD_HISTORY=y +CONFIG_READLINE_CMD_HISTORY_LEN=100 +CONFIG_READLINE_CMD_HISTORY_LINELEN=120 +CONFIG_READLINE_TABCOMPLETION=y CONFIG_USER_ENTRYPOINT="nsh_main" diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/libcxxtest/defconfig b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/libcxxtest/defconfig index 149feb1ce..8af50f5da 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/libcxxtest/defconfig +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/libcxxtest/defconfig @@ -44,4 +44,8 @@ CONFIG_START_DAY=14 CONFIG_START_MONTH=3 CONFIG_SYSTEM_NSH=y CONFIG_DEV_GPIO=y +CONFIG_READLINE_CMD_HISTORY=y +CONFIG_READLINE_CMD_HISTORY_LEN=100 +CONFIG_READLINE_CMD_HISTORY_LINELEN=120 +CONFIG_READLINE_TABCOMPLETION=y CONFIG_USER_ENTRYPOINT="nsh_main" diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/netnsh/defconfig b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/netnsh/defconfig index 40dc3d0a9..3c1d4d2b5 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/netnsh/defconfig +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/netnsh/defconfig @@ -67,4 +67,8 @@ CONFIG_SYSTEM_NSH=y CONFIG_SYSTEM_PING6=y CONFIG_SYSTEM_PING=y CONFIG_DEV_GPIO=y +CONFIG_READLINE_CMD_HISTORY=y +CONFIG_READLINE_CMD_HISTORY_LEN=100 +CONFIG_READLINE_CMD_HISTORY_LINELEN=120 +CONFIG_READLINE_TABCOMPLETION=y CONFIG_USER_ENTRYPOINT="nsh_main" diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/nsh/defconfig b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/nsh/defconfig index 4dd3554b8..cab544ee5 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/nsh/defconfig +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/nsh/defconfig @@ -42,4 +42,8 @@ CONFIG_START_DAY=14 CONFIG_START_MONTH=3 CONFIG_SYSTEM_NSH=y CONFIG_DEV_GPIO=y +CONFIG_READLINE_CMD_HISTORY=y +CONFIG_READLINE_CMD_HISTORY_LEN=100 +CONFIG_READLINE_CMD_HISTORY_LINELEN=120 +CONFIG_READLINE_TABCOMPLETION=y CONFIG_USER_ENTRYPOINT="nsh_main" diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/sdionsh/defconfig b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/sdionsh/defconfig index eeccb4f50..9d95b4ca1 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/sdionsh/defconfig +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/sdionsh/defconfig @@ -64,4 +64,8 @@ CONFIG_SYSTEM_CLE_CMD_HISTORY=y CONFIG_SYSTEM_COLOR_CLE=y CONFIG_FS_AUTOMOUNTER=y CONFIG_SYSTEM_NSH=y +CONFIG_READLINE_CMD_HISTORY=y +CONFIG_READLINE_CMD_HISTORY_LEN=100 +CONFIG_READLINE_CMD_HISTORY_LINELEN=120 +CONFIG_READLINE_TABCOMPLETION=y CONFIG_USER_ENTRYPOINT="nsh_main" diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/usbnsh/defconfig b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/usbnsh/defconfig index 5f71e3f57..aea83efa7 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/usbnsh/defconfig +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/usbnsh/defconfig @@ -62,4 +62,8 @@ CONFIG_USBHOST=y CONFIG_USBHOST_MSC=y CONFIG_USBHOST_MSC_NOTIFIER=y CONFIG_DEV_GPIO=y +CONFIG_READLINE_CMD_HISTORY=y +CONFIG_READLINE_CMD_HISTORY_LEN=100 +CONFIG_READLINE_CMD_HISTORY_LINELEN=120 +CONFIG_READLINE_TABCOMPLETION=y CONFIG_USER_ENTRYPOINT="nsh_main" From 4bfa154ed67afc3c3c6c1ff261081eba9e06d1ff Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Mon, 25 Apr 2022 10:33:42 +0800 Subject: [PATCH 35/38] support Start script automatically(romfs) on xidatong --- .../xidatong/configs/4gnsh/defconfig | 3 + .../xidatong/configs/knsh/defconfig | 3 + .../xidatong/configs/libcxxtest/defconfig | 3 + .../xidatong/configs/netnsh/defconfig | 3 + .../aiit_board/xidatong/configs/nsh/defconfig | 3 + .../xidatong/configs/sdionsh/defconfig | 3 + .../xidatong/configs/usbnsh/defconfig | 3 + .../xidatong/etc/init.d/Adapter4GTest | 4 + .../aiit_board/xidatong/etc/init.d/hello | 3 + .../aiit_board/xidatong/etc/init.d/rcS | 3 + .../xidatong/include/nsh_romfsimg.h | 89 +++++++++++++++++++ 11 files changed, 120 insertions(+) create mode 100644 Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/etc/init.d/Adapter4GTest create mode 100644 Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/etc/init.d/hello create mode 100644 Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/etc/init.d/rcS create mode 100644 Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/include/nsh_romfsimg.h diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/4gnsh/defconfig b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/4gnsh/defconfig index 7ccdce5c2..baf142aa9 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/4gnsh/defconfig +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/4gnsh/defconfig @@ -60,4 +60,7 @@ CONFIG_READLINE_CMD_HISTORY=y CONFIG_READLINE_CMD_HISTORY_LEN=100 CONFIG_READLINE_CMD_HISTORY_LINELEN=120 CONFIG_READLINE_TABCOMPLETION=y +CONFIG_FS_ROMFS=y +CONFIG_NSH_ROMFSETC=y +CONFIG_NSH_ARCHROMFS=y CONFIG_USER_ENTRYPOINT="nsh_main" diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/knsh/defconfig b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/knsh/defconfig index c437eaefd..03eb965cc 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/knsh/defconfig +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/knsh/defconfig @@ -49,4 +49,7 @@ CONFIG_READLINE_CMD_HISTORY=y CONFIG_READLINE_CMD_HISTORY_LEN=100 CONFIG_READLINE_CMD_HISTORY_LINELEN=120 CONFIG_READLINE_TABCOMPLETION=y +CONFIG_FS_ROMFS=y +CONFIG_NSH_ROMFSETC=y +CONFIG_NSH_ARCHROMFS=y CONFIG_USER_ENTRYPOINT="nsh_main" diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/libcxxtest/defconfig b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/libcxxtest/defconfig index 8af50f5da..2737d7971 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/libcxxtest/defconfig +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/libcxxtest/defconfig @@ -48,4 +48,7 @@ CONFIG_READLINE_CMD_HISTORY=y CONFIG_READLINE_CMD_HISTORY_LEN=100 CONFIG_READLINE_CMD_HISTORY_LINELEN=120 CONFIG_READLINE_TABCOMPLETION=y +CONFIG_FS_ROMFS=y +CONFIG_NSH_ROMFSETC=y +CONFIG_NSH_ARCHROMFS=y CONFIG_USER_ENTRYPOINT="nsh_main" diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/netnsh/defconfig b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/netnsh/defconfig index 3c1d4d2b5..c0d86ffac 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/netnsh/defconfig +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/netnsh/defconfig @@ -71,4 +71,7 @@ CONFIG_READLINE_CMD_HISTORY=y CONFIG_READLINE_CMD_HISTORY_LEN=100 CONFIG_READLINE_CMD_HISTORY_LINELEN=120 CONFIG_READLINE_TABCOMPLETION=y +CONFIG_FS_ROMFS=y +CONFIG_NSH_ROMFSETC=y +CONFIG_NSH_ARCHROMFS=y CONFIG_USER_ENTRYPOINT="nsh_main" diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/nsh/defconfig b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/nsh/defconfig index cab544ee5..1eab6804c 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/nsh/defconfig +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/nsh/defconfig @@ -46,4 +46,7 @@ CONFIG_READLINE_CMD_HISTORY=y CONFIG_READLINE_CMD_HISTORY_LEN=100 CONFIG_READLINE_CMD_HISTORY_LINELEN=120 CONFIG_READLINE_TABCOMPLETION=y +CONFIG_FS_ROMFS=y +CONFIG_NSH_ROMFSETC=y +CONFIG_NSH_ARCHROMFS=y CONFIG_USER_ENTRYPOINT="nsh_main" diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/sdionsh/defconfig b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/sdionsh/defconfig index 9d95b4ca1..3cad4773c 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/sdionsh/defconfig +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/sdionsh/defconfig @@ -68,4 +68,7 @@ CONFIG_READLINE_CMD_HISTORY=y CONFIG_READLINE_CMD_HISTORY_LEN=100 CONFIG_READLINE_CMD_HISTORY_LINELEN=120 CONFIG_READLINE_TABCOMPLETION=y +CONFIG_FS_ROMFS=y +CONFIG_NSH_ROMFSETC=y +CONFIG_NSH_ARCHROMFS=y CONFIG_USER_ENTRYPOINT="nsh_main" diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/usbnsh/defconfig b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/usbnsh/defconfig index aea83efa7..be725e890 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/usbnsh/defconfig +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/configs/usbnsh/defconfig @@ -66,4 +66,7 @@ CONFIG_READLINE_CMD_HISTORY=y CONFIG_READLINE_CMD_HISTORY_LEN=100 CONFIG_READLINE_CMD_HISTORY_LINELEN=120 CONFIG_READLINE_TABCOMPLETION=y +CONFIG_FS_ROMFS=y +CONFIG_NSH_ROMFSETC=y +CONFIG_NSH_ARCHROMFS=y CONFIG_USER_ENTRYPOINT="nsh_main" diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/etc/init.d/Adapter4GTest b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/etc/init.d/Adapter4GTest new file mode 100644 index 000000000..bed04f1c1 --- /dev/null +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/etc/init.d/Adapter4GTest @@ -0,0 +1,4 @@ +#start up Adapter4GTest +echo "start 4g Adapter!" + +Adapter4GTest diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/etc/init.d/hello b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/etc/init.d/hello new file mode 100644 index 000000000..d3a08a579 --- /dev/null +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/etc/init.d/hello @@ -0,0 +1,3 @@ +#start up hello + +hello diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/etc/init.d/rcS b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/etc/init.d/rcS new file mode 100644 index 000000000..c108c0181 --- /dev/null +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/etc/init.d/rcS @@ -0,0 +1,3 @@ +#default start up nsh shell + +nsh diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/include/nsh_romfsimg.h b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/include/nsh_romfsimg.h new file mode 100644 index 000000000..3df54fcc8 --- /dev/null +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/include/nsh_romfsimg.h @@ -0,0 +1,89 @@ +unsigned char romfs_img[] = { + 0x2d, 0x72, 0x6f, 0x6d, 0x31, 0x66, 0x73, 0x2d, 0x00, 0x00, 0x01, 0xb0, + 0xf9, 0xaf, 0xcc, 0x42, 0x78, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x6e, 0x67, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x49, + 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0xd1, 0xff, 0xff, 0x97, + 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x00, 0xd1, 0xd1, 0xff, 0x80, 0x2e, 0x2e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x00, + 0x68, 0x2d, 0x96, 0x03, 0x69, 0x6e, 0x69, 0x74, 0x2e, 0x64, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x17, 0x28, 0x9a, 0x92, 0xbb, + 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x23, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x75, + 0x70, 0x20, 0x68, 0x65, 0x6c, 0x6c, 0x6f, 0x0a, 0x0a, 0x68, 0x65, 0x6c, + 0x6c, 0x6f, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x01, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, + 0x8e, 0xe1, 0xc5, 0x87, 0x41, 0x64, 0x61, 0x70, 0x74, 0x65, 0x72, 0x34, + 0x47, 0x54, 0x65, 0x73, 0x74, 0x00, 0x00, 0x00, 0x23, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x20, 0x75, 0x70, 0x20, 0x41, 0x64, 0x61, 0x70, 0x74, 0x65, + 0x72, 0x34, 0x47, 0x54, 0x65, 0x73, 0x74, 0x0a, 0x65, 0x63, 0x68, 0x6f, + 0x20, 0x22, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x34, 0x67, 0x20, 0x41, + 0x64, 0x61, 0x70, 0x74, 0x65, 0x72, 0x21, 0x22, 0x0a, 0x0a, 0x41, 0x64, + 0x61, 0x70, 0x74, 0x65, 0x72, 0x34, 0x47, 0x54, 0x65, 0x73, 0x74, 0x0a, + 0x00, 0x00, 0x01, 0x40, 0x00, 0x00, 0x00, 0x60, 0x00, 0x00, 0x00, 0x00, + 0xd1, 0xff, 0xfe, 0x60, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x92, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x8d, 0x9c, 0xab, 0x4d, + 0x72, 0x63, 0x53, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x23, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x20, 0x73, 0x74, 0x61, 0x72, 0x74, 0x20, 0x75, 0x70, 0x20, 0x6e, 0x73, + 0x68, 0x20, 0x73, 0x68, 0x65, 0x6c, 0x6c, 0x0a, 0x0a, 0x6e, 0x73, 0x68, + 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, + 0x00, 0x00, 0x00, 0x00, 0xd1, 0xd1, 0xff, 0xe0, 0x2e, 0x2e, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00 +}; +unsigned int romfs_img_len = 1024; From e5296efa919e0d59f132eeb5511acd64cf499cac Mon Sep 17 00:00:00 2001 From: Liu_Weichao Date: Mon, 25 Apr 2022 10:52:05 +0800 Subject: [PATCH 36/38] fix e220 lora send and receive bug using ch438 uart in xidatong board --- APP_Framework/Framework/connection/adapter.h | 6 +++ .../Framework/connection/lora/adapter_lora.c | 39 ++++++++++--------- .../Framework/connection/lora/e220/e220.c | 26 ++++++++++--- .../Framework/connection/lora/sx1278/sx1278.c | 16 ++++++-- .../third_party_driver/ch438/connect_ch438.c | 35 ++++++++++++++++- 5 files changed, 91 insertions(+), 31 deletions(-) diff --git a/APP_Framework/Framework/connection/adapter.h b/APP_Framework/Framework/connection/adapter.h index ea0ed6f06..aefb0df1f 100644 --- a/APP_Framework/Framework/connection/adapter.h +++ b/APP_Framework/Framework/connection/adapter.h @@ -117,6 +117,12 @@ enum IpType IPV6, }; +struct AdapterData +{ + uint32 len; + uint8 *buffer; +}; + struct AdapterProductInfo { uint32_t functions; diff --git a/APP_Framework/Framework/connection/lora/adapter_lora.c b/APP_Framework/Framework/connection/lora/adapter_lora.c index 0f1a0c6bd..397e89e26 100644 --- a/APP_Framework/Framework/connection/lora/adapter_lora.c +++ b/APP_Framework/Framework/connection/lora/adapter_lora.c @@ -29,8 +29,8 @@ extern AdapterProductInfoType E220Attach(struct Adapter *adapter); #endif #define ADAPTER_LORA_CLIENT_NUM 255 -#define ADAPTER_LORA_DATA_LENGTH 128 -#define ADAPTER_LORA_RECV_DATA_LENGTH 256 +#define ADAPTER_LORA_DATA_LENGTH 256 +#define ADAPTER_LORA_RECV_DATA_LENGTH ADAPTER_LORA_DATA_LENGTH + 16 #define ADAPTER_LORA_DATA_HEAD 0x3C #define ADAPTER_LORA_NET_PANID 0x0102 @@ -167,13 +167,7 @@ static int LoraReceiveDataCheck(uint8 *data, uint16 length, struct LoraDataForma uint32 recv_data_length = 0; for ( i = 0; i < length; i ++) { if (ADAPTER_LORA_DATA_HEAD == data[i]) { -#ifdef ADD_NUTTX_FETURES - /*Big-Endian*/ recv_data_length = (data[i + 4] & 0xFF) | ((data[i + 5] & 0xFF) << 8) | ((data[i + 6] & 0xFF) << 16) | ((data[i + 7] & 0xFF) << 24); -#else - /*Little-Endian*/ - recv_data_length = ((data[i + 4] & 0xFF) << 24) | ((data[i + 5] & 0xFF) << 16) | ((data[i + 6] & 0xFF) << 8) | (data[i + 7] & 0xFF); -#endif if (sizeof(struct LoraDataFormat) == recv_data_length) { memcpy(recv_data, (uint8 *)(data + i), sizeof(struct LoraDataFormat)); return 0; @@ -469,6 +463,7 @@ static int LoraClientDataAnalyze(struct Adapter *adapter, void *send_buf, int le static int LoraClientJoinNet(struct Adapter *adapter, unsigned short panid) { struct LoraDataFormat client_join_data; + struct AdapterData priv_lora_net; memset(&client_join_data, 0, sizeof(struct LoraDataFormat)); @@ -484,7 +479,10 @@ static int LoraClientJoinNet(struct Adapter *adapter, unsigned short panid) client_join_data.flame_head, client_join_data.length, client_join_data.panid, client_join_data.data_type, client_join_data.client_id, client_join_data.gateway_id, client_join_data.crc16); - if (AdapterDeviceJoin(adapter, (uint8 *)&client_join_data) < 0) { + priv_lora_net.len = sizeof(struct LoraDataFormat); + priv_lora_net.buffer = (uint8 *)&client_join_data; + + if (AdapterDeviceJoin(adapter, (uint8 *)&priv_lora_net) < 0) { return -1; } @@ -498,18 +496,22 @@ static int LoraClientJoinNet(struct Adapter *adapter, unsigned short panid) */ static int LoraClientQuitNet(struct Adapter *adapter, unsigned short panid) { - struct LoraDataFormat client_join_data; + struct LoraDataFormat client_quit_data; + struct AdapterData priv_lora_net; - memset(&client_join_data, 0, sizeof(struct LoraDataFormat)); + memset(&client_quit_data, 0, sizeof(struct LoraDataFormat)); - client_join_data.flame_head = ADAPTER_LORA_DATA_HEAD; - client_join_data.length = sizeof(struct LoraDataFormat); - client_join_data.panid = panid; - client_join_data.data_type = ADAPTER_LORA_DATA_TYPE_QUIT; - client_join_data.client_id = adapter->net_role_id; - client_join_data.crc16 = LoraCrc16((uint8 *)&client_join_data, sizeof(struct LoraDataFormat) - 2); + client_quit_data.flame_head = ADAPTER_LORA_DATA_HEAD; + client_quit_data.length = sizeof(struct LoraDataFormat); + client_quit_data.panid = panid; + client_quit_data.data_type = ADAPTER_LORA_DATA_TYPE_QUIT; + client_quit_data.client_id = adapter->net_role_id; + client_quit_data.crc16 = LoraCrc16((uint8 *)&client_quit_data, sizeof(struct LoraDataFormat) - 2); - if (AdapterDeviceDisconnect(adapter, (uint8 *)&client_join_data) < 0) { + priv_lora_net.len = sizeof(struct LoraDataFormat); + priv_lora_net.buffer = (uint8 *)&client_quit_data; + + if (AdapterDeviceDisconnect(adapter, (uint8 *)&priv_lora_net) < 0) { return -1; } @@ -623,7 +625,6 @@ static void *LoraGatewayTask(void *parameter) static void *LoraClientDataTask(void *parameter) { int i, ret = 0; - int join_times = 10; struct Adapter *lora_adapter = (struct Adapter *)parameter; struct LoraClientParam *client = (struct LoraClientParam *)lora_adapter->adapter_param; diff --git a/APP_Framework/Framework/connection/lora/e220/e220.c b/APP_Framework/Framework/connection/lora/e220/e220.c index 2fec48457..3a028817e 100644 --- a/APP_Framework/Framework/connection/lora/e220/e220.c +++ b/APP_Framework/Framework/connection/lora/e220/e220.c @@ -344,10 +344,9 @@ static int E220Ioctl(struct Adapter *adapter, int cmd, void *args) static int E220Join(struct Adapter *adapter, unsigned char *priv_net_group) { int ret; + struct AdapterData *priv_net_group_data = (struct AdapterData *)priv_net_group; - uint16 len = 144; - - ret = PrivWrite(adapter->fd, (void *)priv_net_group, len); + ret = PrivWrite(adapter->fd, (void *)priv_net_group_data->buffer, priv_net_group_data->len); if(ret < 0) { printf("E220 Join net group failed: %d!\n", ret); } @@ -383,7 +382,22 @@ static int E220Send(struct Adapter *adapter, const void *buf, size_t len) */ static int E220Recv(struct Adapter *adapter, void *buf, size_t len) { - return PrivRead(adapter->fd, buf, len); + int recv_len, recv_len_continue; + + uint8 *recv_buf = PrivMalloc(len); + + recv_len = PrivRead(adapter->fd, recv_buf, len); + while (recv_len < len) { + recv_len_continue = PrivRead(adapter->fd, recv_buf + recv_len, len - recv_len); + + recv_len += recv_len_continue; + } + + memcpy(buf, recv_buf, recv_len); + + PrivFree(recv_buf); + + return recv_len; } /** @@ -396,9 +410,9 @@ static int E220Quit(struct Adapter *adapter, unsigned char *priv_net_group) { int ret; - uint16 len = 144; + struct AdapterData *priv_net_group_data = (struct AdapterData *)priv_net_group; - ret = PrivWrite(adapter->fd, (void *)priv_net_group, len); + ret = PrivWrite(adapter->fd, (void *)priv_net_group_data->buffer, priv_net_group_data->len); if(ret < 0){ printf("E220 quit net group failed %d!\n", ret); } diff --git a/APP_Framework/Framework/connection/lora/sx1278/sx1278.c b/APP_Framework/Framework/connection/lora/sx1278/sx1278.c index 914db8998..dda8b54e0 100644 --- a/APP_Framework/Framework/connection/lora/sx1278/sx1278.c +++ b/APP_Framework/Framework/connection/lora/sx1278/sx1278.c @@ -108,7 +108,9 @@ static int Sx1278Ioctl(struct Adapter *adapter, int cmd, void *args) static int Sx1278Join(struct Adapter *adapter, unsigned char *priv_net_group) { int ret; - ret = Sx127x_Nuttx_Write(adapter->fd, (void *)priv_net_group, 144); + struct AdapterData *priv_net_group_data = (struct AdapterData *)priv_net_group; + + ret = Sx127x_Nuttx_Write(adapter->fd, (void *)priv_net_group_data->buffer, priv_net_group_data->len); if(ret < 0){ printf("Sx1278 Join net group failed: %d!\n", ret); } @@ -119,7 +121,9 @@ static int Sx1278Join(struct Adapter *adapter, unsigned char *priv_net_group) static int Sx1278Join(struct Adapter *adapter, unsigned char *priv_net_group) { int ret; - ret = PrivWrite(adapter->fd, (void *)priv_net_group, 144); + struct AdapterData *priv_net_group_data = (struct AdapterData *)priv_net_group; + + ret = PrivWrite(adapter->fd, (void *)priv_net_group_data->buffer, priv_net_group_data->len); if(ret < 0){ printf("Sx1278 Join net group failed: %d!\n", ret); } @@ -196,7 +200,9 @@ static int Sx1278Recv(struct Adapter *adapter, void *buf, size_t len) static int Sx1278Quit(struct Adapter *adapter, unsigned char *priv_net_group) { int ret; - ret = Sx127x_Nuttx_Write(adapter->fd, (void *)priv_net_group, 144); + struct AdapterData *priv_net_group_data = (struct AdapterData *)priv_net_group; + + ret = Sx127x_Nuttx_Write(adapter->fd, (void *)priv_net_group_data->buffer, priv_net_group_data->len); if(ret < 0){ printf("Sx1278 quit net group failed %d!\n", ret); } @@ -207,7 +213,9 @@ static int Sx1278Quit(struct Adapter *adapter, unsigned char *priv_net_group) static int Sx1278Quit(struct Adapter *adapter, unsigned char *priv_net_group) { int ret; - ret = PrivWrite(adapter->fd, (void *)priv_net_group, 144); + struct AdapterData *priv_net_group_data = (struct AdapterData *)priv_net_group; + + ret = PrivWrite(adapter->fd, (void *)priv_net_group_data->buffer, priv_net_group_data->len); if(ret < 0){ printf("Sx1278 quit net group failed %d!\n", ret); } diff --git a/Ubiquitous/XiZi/board/xidatong/third_party_driver/ch438/connect_ch438.c b/Ubiquitous/XiZi/board/xidatong/third_party_driver/ch438/connect_ch438.c index 851f5fa4e..a022c32b3 100644 --- a/Ubiquitous/XiZi/board/xidatong/third_party_driver/ch438/connect_ch438.c +++ b/Ubiquitous/XiZi/board/xidatong/third_party_driver/ch438/connect_ch438.c @@ -629,7 +629,7 @@ void WriteCH438Block(uint8 maddr, uint8 mlen, uint8 *mbuf) ** date: **------------------------------------------------------------------------------------------------------- ********************************************************************************************************/ -void Ch438UartSend( uint8 ext_uart_no,uint8 *data, uint8 Num ) +void Ch438UartSend(uint8 ext_uart_no, uint8 *data, uint16 Num) { uint8 REG_LSR_ADDR,REG_THR_ADDR; @@ -958,10 +958,35 @@ static uint32 ImxrtCh438WriteData(void *dev, struct BusBlockWriteParam *write_pa NULL_PARAM_CHECK(dev); NULL_PARAM_CHECK(write_param); + int write_len, write_len_continue; + int i, write_index; + uint8 *write_buffer; + struct SerialHardwareDevice *serial_dev = (struct SerialHardwareDevice *)dev; struct SerialDevParam *dev_param = (struct SerialDevParam *)serial_dev->haldev.private_data; - Ch438UartSend(dev_param->ext_uart_no, (uint8 *)write_param->buffer, write_param->size); + write_len = write_param->size; + write_len_continue = write_param->size; + write_buffer = (uint8 *)write_param->buffer; + + if (write_len > 256) { + if (0 == write_len % 256) { + write_index = write_len / 256; + for (i = 0; i < write_index; i ++) { + Ch438UartSend(dev_param->ext_uart_no, write_buffer + i * 256, 256); + } + } else { + write_index = 0; + while (write_len_continue > 256) { + Ch438UartSend(dev_param->ext_uart_no, write_buffer + write_index * 256, 256); + write_index++; + write_len_continue = write_len - write_index * 256; + } + Ch438UartSend(dev_param->ext_uart_no, write_buffer + write_index * 256, write_len_continue); + } + } else { + Ch438UartSend(dev_param->ext_uart_no, write_buffer, write_len); + } return EOK; } @@ -1028,6 +1053,12 @@ static uint32 ImxrtCh438ReadData(void *dev, struct BusBlockReadParam *read_param read_param->read_length = rcv_num; interrupt_done = 1; + + // int i; + // uint8 *buffer = (uint8 *)read_param->buffer; + // for (i = 0; i < rcv_num; i ++) { + // KPrintf("Ch438UartRcv i %u data 0x%x\n", i, buffer[i]); + // } } } } From d62179932b5fd7741b577645856f659a384306c1 Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Mon, 25 Apr 2022 14:42:26 +0800 Subject: [PATCH 37/38] change set E220-400T22S M0 and M1 pin for xidatong --- .../Nuttx_Fusion_XiUOS/aiit_board/xidatong/src/xidatong.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/src/xidatong.h b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/src/xidatong.h index f4a88b1e2..1cf5a0051 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/src/xidatong.h +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/src/xidatong.h @@ -71,10 +71,10 @@ #define BOARD_NGPIOINT 0 /* Amount of GPIO Input w/ Interruption pins */ #define GPIO_E220_M0 (GPIO_OUTPUT | GPIO_OUTPUT_ZERO | IOMUX_GOUT_DEFAULT | \ - GPIO_PIN9 | GPIO_PORT1) + GPIO_PIN11 | GPIO_PORT1) #define GPIO_E220_M1 (GPIO_OUTPUT | GPIO_OUTPUT_ZERO | IOMUX_GOUT_DEFAULT | \ - GPIO_PIN11 | GPIO_PORT1) + GPIO_PIN9 | GPIO_PORT1) /* Backlight */ From 8c788f676b48f70ff528833405bfa23f10946a31 Mon Sep 17 00:00:00 2001 From: wgzAIIT <820906721@qq.com> Date: Mon, 25 Apr 2022 18:40:45 +0800 Subject: [PATCH 38/38] Revert "change set E220-400T22S M0 and M1 pin for xidatong" This reverts commit d62179932b5fd7741b577645856f659a384306c1. --- .../Nuttx_Fusion_XiUOS/aiit_board/xidatong/src/xidatong.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/src/xidatong.h b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/src/xidatong.h index 1cf5a0051..f4a88b1e2 100644 --- a/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/src/xidatong.h +++ b/Ubiquitous/Nuttx_Fusion_XiUOS/aiit_board/xidatong/src/xidatong.h @@ -71,10 +71,10 @@ #define BOARD_NGPIOINT 0 /* Amount of GPIO Input w/ Interruption pins */ #define GPIO_E220_M0 (GPIO_OUTPUT | GPIO_OUTPUT_ZERO | IOMUX_GOUT_DEFAULT | \ - GPIO_PIN11 | GPIO_PORT1) + GPIO_PIN9 | GPIO_PORT1) #define GPIO_E220_M1 (GPIO_OUTPUT | GPIO_OUTPUT_ZERO | IOMUX_GOUT_DEFAULT | \ - GPIO_PIN9 | GPIO_PORT1) + GPIO_PIN11 | GPIO_PORT1) /* Backlight */