From 0a3be62703788641cf92e12677fc76c70f500fef Mon Sep 17 00:00:00 2001 From: xiao xie <335266746@qq.com> Date: Thu, 1 Sep 2022 09:19:02 +0800 Subject: [PATCH] Support flexcan (#6355) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * add ignore files and directories * add flexcan support;fix build problem * 优化格式,消除编译警告 * 增加can引脚分配;支持imxrt1170 * 优化格式 --- bsp/imxrt/imxrt1170-nxp-evk/board/Kconfig | 10 +++++++ bsp/imxrt/imxrt1170-nxp-evk/board/board.c | 20 +++++++++++++ bsp/imxrt/libraries/MIMXRT1170/SConscript | 3 ++ bsp/imxrt/libraries/drivers/drv_can.c | 36 ++++++++++++++++++++--- bsp/imxrt/libraries/drivers/drv_gpio.c | 15 +++++++++- 5 files changed, 79 insertions(+), 5 deletions(-) diff --git a/bsp/imxrt/imxrt1170-nxp-evk/board/Kconfig b/bsp/imxrt/imxrt1170-nxp-evk/board/Kconfig index f5f7bb73a4..e95de4d96d 100644 --- a/bsp/imxrt/imxrt1170-nxp-evk/board/Kconfig +++ b/bsp/imxrt/imxrt1170-nxp-evk/board/Kconfig @@ -85,6 +85,16 @@ menu "On-chip Peripheral Drivers" int "Set LPUART3 TX DMA channel (0-32)" default 1 endif + + menuconfig BSP_USING_CAN + bool "Enable CAN" + select RT_USING_CAN + default n + if BSP_USING_CAN + config BSP_USING_CAN3 + bool "Enable FLEXCAN3" + default n + endif endmenu menu "Onboard Peripheral Drivers" diff --git a/bsp/imxrt/imxrt1170-nxp-evk/board/board.c b/bsp/imxrt/imxrt1170-nxp-evk/board/board.c index 584637b8a0..e75cee49cf 100644 --- a/bsp/imxrt/imxrt1170-nxp-evk/board/board.c +++ b/bsp/imxrt/imxrt1170-nxp-evk/board/board.c @@ -8,6 +8,7 @@ * 2009-01-05 Bernard first implementation * 2022-08-15 xjy198903 add sdram pin config * 2022-08-17 xjy198903 add rgmii pins + * 2022-09-01 xjy198903 add can pins */ #include @@ -1256,6 +1257,21 @@ void imxrt_sdram_pins_init(void) } #endif +#ifdef BSP_USING_CAN +void imxrt_can_pins_init(void) +{ +#ifdef BSP_USING_CAN3 + CLOCK_EnableClock(kCLOCK_Iomuxc_Lpsr); /* LPCG on: LPCG is ON. */ + IOMUXC_SetPinMux( + IOMUXC_GPIO_LPSR_00_FLEXCAN3_TX, /* GPIO_LPSR_00 is configured as FLEXCAN3_TX */ + 0U); /* Software Input On Field: Input Path is determined by functionality */ + IOMUXC_SetPinMux( + IOMUXC_GPIO_LPSR_01_FLEXCAN3_RX, /* GPIO_LPSR_01 is configured as FLEXCAN3_RX */ + 0U); /* Software Input On Field: Input Path is determined by functionality */ +#endif +} +#endif + void rt_hw_us_delay(rt_uint32_t us) { } @@ -1296,5 +1312,9 @@ void rt_hw_board_init() #ifdef BSP_USING_ETH imxrt_eth_pins_init(); #endif + +#ifdef BSP_USING_CAN + imxrt_can_pins_init(); +#endif } diff --git a/bsp/imxrt/libraries/MIMXRT1170/SConscript b/bsp/imxrt/libraries/MIMXRT1170/SConscript index 232eadc268..c6fb05a68b 100644 --- a/bsp/imxrt/libraries/MIMXRT1170/SConscript +++ b/bsp/imxrt/libraries/MIMXRT1170/SConscript @@ -46,6 +46,9 @@ if GetDepend(['BSP_USING_SDRAM']): if GetDepend(['BSP_USING_ETH']): src += ['MIMXRT1176/drivers/fsl_enet.c'] +if GetDepend(['RT_USING_CAN']): + src += ['MIMXRT1176/drivers/fsl_flexcan.c'] + if rtconfig.PLATFORM in ['gcc']: group = DefineGroup('Libraries', src, depend = [''], CPPPATH = path, ASFLAGS = '$ASFLAGS -D __STARTUP_CLEAR_BSS') else: diff --git a/bsp/imxrt/libraries/drivers/drv_can.c b/bsp/imxrt/libraries/drivers/drv_can.c index 6af614418c..4b6a26f951 100644 --- a/bsp/imxrt/libraries/drivers/drv_can.c +++ b/bsp/imxrt/libraries/drivers/drv_can.c @@ -6,6 +6,7 @@ * Change Logs: * Date Author Notes * 2019-06-27 misonyo the first version. + * 2022-09-01 xjy198903 add support for imxrt1170 */ #include @@ -36,6 +37,9 @@ enum #ifdef BSP_USING_CAN2 CAN2_INDEX, #endif +#ifdef BSP_USING_CAN3 + CAN3_INDEX, +#endif }; struct imxrt_can @@ -63,14 +67,38 @@ struct imxrt_can flexcans[] = .irqn = CAN2_IRQn, }, #endif +#ifdef BSP_USING_CAN3 + { + .name = "can3", + .base = CAN3, + .irqn = CAN3_IRQn, + }, +#endif }; -uint32_t GetCanSrcFreq(void) +uint32_t GetCanSrcFreq(CAN_Type *can_base) { uint32_t freq; - +#ifdef SOC_IMXRT1170_SERIES + uint32_t base = (uint32_t) can_base; + switch (base) + { + case CAN1_BASE: + freq = (CLOCK_GetRootClockFreq(kCLOCK_Root_Can1) / 100000U) * 100000U; + break; + case CAN2_BASE: + freq = (CLOCK_GetRootClockFreq(kCLOCK_Root_Can2) / 100000U) * 100000U; + break; + case CAN3_BASE: + freq = (CLOCK_GetRootClockFreq(kCLOCK_Root_Can3) / 100000U) * 100000U; + break; + default: + freq = (CLOCK_GetRootClockFreq(kCLOCK_Root_Can3) / 100000U) * 100000U; + break; + } +#else freq = (CLOCK_GetFreq(kCLOCK_Usb1PllClk) / 6) / (CLOCK_GetDiv(kCLOCK_CanDiv) + 1U); - +#endif return freq; } @@ -143,7 +171,7 @@ static rt_err_t can_cfg(struct rt_can_device *can_dev, struct can_configure *cfg case RT_CAN_MODE_LOOPBACKANLISTEN: break; } - FLEXCAN_Init(can->base, &config, GetCanSrcFreq()); + FLEXCAN_Init(can->base, &config, GetCanSrcFreq(can->base)); FLEXCAN_TransferCreateHandle(can->base, &can->handle, flexcan_callback, can); /* init RX_MB_COUNT RX MB to default status */ mbConfig.format = kFLEXCAN_FrameFormatStandard; /* standard ID */ diff --git a/bsp/imxrt/libraries/drivers/drv_gpio.c b/bsp/imxrt/libraries/drivers/drv_gpio.c index ecc6ed9b3b..d88f6b3672 100644 --- a/bsp/imxrt/libraries/drivers/drv_gpio.c +++ b/bsp/imxrt/libraries/drivers/drv_gpio.c @@ -522,9 +522,12 @@ void GPIO13_Combined_0_31_IRQHandler(void) static void imxrt_pin_mode(rt_device_t dev, rt_base_t pin, rt_base_t mode) { gpio_pin_config_t gpio; - rt_uint32_t config_value = 0; rt_int8_t port, pin_num; +#ifndef SOC_IMXRT1170_SERIES + rt_uint32_t config_value = 0; +#endif + port = pin >> 5; pin_num = pin & 31; @@ -542,35 +545,45 @@ static void imxrt_pin_mode(rt_device_t dev, rt_base_t pin, rt_base_t mode) case PIN_MODE_OUTPUT: { gpio.direction = kGPIO_DigitalOutput; +#ifndef SOC_IMXRT1170_SERIES config_value = 0x0030U; /* Drive Strength R0/6 */ +#endif } break; case PIN_MODE_INPUT: { gpio.direction = kGPIO_DigitalInput; +#ifndef SOC_IMXRT1170_SERIES config_value = 0x0830U; /* Open Drain Enable */ +#endif } break; case PIN_MODE_INPUT_PULLDOWN: { gpio.direction = kGPIO_DigitalInput; +#ifndef SOC_IMXRT1170_SERIES config_value = 0x3030U; /* 100K Ohm Pull Down */ +#endif } break; case PIN_MODE_INPUT_PULLUP: { gpio.direction = kGPIO_DigitalInput; +#ifndef SOC_IMXRT1170_SERIES config_value = 0xB030U; /* 100K Ohm Pull Up */ +#endif } break; case PIN_MODE_OUTPUT_OD: { gpio.direction = kGPIO_DigitalOutput; +#ifndef SOC_IMXRT1170_SERIES config_value = 0x0830U; /* Open Drain Enable */ +#endif } break; }