File indexing completed on 2025-05-11 08:23:02
0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028 #include <bsp.h>
0029 #include <bsp/fdt.h>
0030 #include <bsp/imx-gpio.h>
0031 #include <chip.h>
0032 #include <fsl_clock.h>
0033 #include <libfdt.h>
0034 #include <rtems/counter.h>
0035
0036 void imxrt_ffec_init(void)
0037 {
0038 volatile IOMUXC_GPR_Type *iomuxc_gpr = IOMUXC_GPR;
0039 const void *fdt;
0040 int node;
0041
0042 fdt = bsp_fdt_get();
0043
0044 #if IMXRT_IS_MIMXRT10xx
0045 const clock_enet_pll_config_t config = {
0046 .enableClkOutput = true,
0047 .enableClkOutput25M = false,
0048 .loopDivider = 1
0049 };
0050
0051 CLOCK_InitEnetPll(&config);
0052
0053 iomuxc_gpr->GPR1 |= IOMUXC_GPR_GPR1_ENET_REF_CLK_DIR_MASK;
0054 #else
0055 iomuxc_gpr->GPR4 |= IOMUXC_GPR_GPR4_ENET_REF_CLK_DIR_MASK;
0056 #endif
0057
0058 node = fdt_node_offset_by_compatible(fdt, -1, "fsl,imxrt-fec");
0059 if (node >= 0) {
0060 struct imx_gpio_pin reset;
0061 struct imx_gpio_pin interrupt;
0062 rtems_status_code sc;
0063
0064 sc = imx_gpio_init_from_fdt_property(
0065 &reset, node, "phy-reset-gpios",
0066 IMX_GPIO_MODE_OUTPUT, 0);
0067
0068 if (sc == RTEMS_SUCCESSFUL) {
0069 sc = imx_gpio_init_from_fdt_property(
0070 &interrupt, node, "rtems,phy-interrupt-gpios",
0071 IMX_GPIO_MODE_INPUT, 0);
0072
0073 imx_gpio_set_output(&reset, 0);
0074 if (sc == RTEMS_SUCCESSFUL) {
0075
0076
0077 interrupt.mode = IMX_GPIO_MODE_OUTPUT;
0078 imx_gpio_init(&interrupt);
0079 imx_gpio_set_output(&interrupt, 1);
0080 }
0081 rtems_counter_delay_nanoseconds(100000);
0082 imx_gpio_set_output(&reset, 1);
0083 rtems_counter_delay_nanoseconds(5);
0084 if (sc == RTEMS_SUCCESSFUL) {
0085 interrupt.mode = IMX_GPIO_MODE_INPUT;
0086 imx_gpio_init(&interrupt);
0087 }
0088 }
0089 }
0090 }