From 7095608f7c9b8b45741bebf9ad878b50571ae52a Mon Sep 17 00:00:00 2001 From: Chun-Chieh Li Date: Mon, 12 May 2025 10:38:17 +0800 Subject: [PATCH] drivers: usb: udc: support numaker m55m1x series soc This supports nuvoton numaker m55m1x series soc. Besides, it also has relevant modifications, including: 1. Fix failure to enable HICR48M, which is to clock usbd and phy 2. Support HWINFO for USB device serial number Signed-off-by: Chun-Chieh Li --- .../numaker_m55m1/numaker_m55m1-pinctrl.dtsi | 10 ++++++++++ boards/nuvoton/numaker_m55m1/numaker_m55m1.dts | 15 +++++++++++++++ drivers/hwinfo/Kconfig | 2 +- drivers/usb/udc/udc_numaker.c | 10 +++++++++- dts/arm/nuvoton/m55m1x.dtsi | 14 ++++++++++++++ soc/nuvoton/numaker/m55m1x/soc.c | 10 +++++----- 6 files changed, 54 insertions(+), 7 deletions(-) diff --git a/boards/nuvoton/numaker_m55m1/numaker_m55m1-pinctrl.dtsi b/boards/nuvoton/numaker_m55m1/numaker_m55m1-pinctrl.dtsi index ee406e19da8..b364e4e3d79 100644 --- a/boards/nuvoton/numaker_m55m1/numaker_m55m1-pinctrl.dtsi +++ b/boards/nuvoton/numaker_m55m1/numaker_m55m1-pinctrl.dtsi @@ -51,4 +51,14 @@ slew-rate = "fast"; }; }; + + /* USBD multi-function pins for VBUS, D+, D-, and ID pins */ + usbd_default: usbd_default { + group0 { + pinmux = , + , + , + ; + }; + }; }; diff --git a/boards/nuvoton/numaker_m55m1/numaker_m55m1.dts b/boards/nuvoton/numaker_m55m1/numaker_m55m1.dts index c6232597b42..257414a3548 100644 --- a/boards/nuvoton/numaker_m55m1/numaker_m55m1.dts +++ b/boards/nuvoton/numaker_m55m1/numaker_m55m1.dts @@ -49,6 +49,14 @@ status = "okay"; }; +&gpioh { + status = "okay"; +}; + +&gpioi { + status = "okay"; +}; + &flash0 { partitions { compatible = "fixed-partitions"; @@ -99,3 +107,10 @@ pinctrl-names = "default"; status = "okay"; }; + +/* On enabled, usbd is required to be clocked in 48MHz. */ +zephyr_udc0: &usbd { + pinctrl-0 = <&usbd_default>; + pinctrl-names = "default"; + status = "okay"; +}; diff --git a/drivers/hwinfo/Kconfig b/drivers/hwinfo/Kconfig index 1436aca538b..4a4abfac14b 100644 --- a/drivers/hwinfo/Kconfig +++ b/drivers/hwinfo/Kconfig @@ -265,7 +265,7 @@ config HWINFO_AMBIQ config HWINFO_NUMAKER bool "NuMaker hwinfo" default y - depends on SOC_SERIES_M46X + depends on SOC_SERIES_M46X || SOC_SERIES_M55M1X select HWINFO_HAS_DRIVER select HAS_NUMAKER_FMC help diff --git a/drivers/usb/udc/udc_numaker.c b/drivers/usb/udc/udc_numaker.c index 983a9210b36..bbc016ecf70 100644 --- a/drivers/usb/udc/udc_numaker.c +++ b/drivers/usb/udc/udc_numaker.c @@ -299,9 +299,17 @@ static int numaker_usbd_hw_setup(const struct device *dev) SYS_UnlockReg(); - /* Configure USB PHY for USBD */ + /* Configure USB role as USB Device and enable USB PHY */ +#if defined(CONFIG_SOC_SERIES_M46X) SYS->USBPHY = (SYS->USBPHY & ~SYS_USBPHY_USBROLE_Msk) | (SYS_USBPHY_USBROLE_STD_USBD | SYS_USBPHY_USBEN_Msk | SYS_USBPHY_SBO_Msk); +#elif defined(CONFIG_SOC_SERIES_M2L31X) + SYS->USBPHY = (SYS->USBPHY & ~SYS_USBPHY_USBROLE_Msk) | + (SYS_USBPHY_USBROLE_STD_USBD | SYS_USBPHY_USBEN_Msk | SYS_USBPHY_SBO_Msk); +#elif defined(CONFIG_SOC_SERIES_M55M1X) + SYS->USBPHY = (SYS->USBPHY & ~SYS_USBPHY_USBROLE_Msk) | + ((0 << SYS_USBPHY_USBROLE_Pos) | SYS_USBPHY_OTGPHYEN_Msk); +#endif /* Invoke Clock controller to enable module clock */ memset(&scc_subsys, 0x00, sizeof(scc_subsys)); diff --git a/dts/arm/nuvoton/m55m1x.dtsi b/dts/arm/nuvoton/m55m1x.dtsi index 6aee45bcd4d..d4ced4c40aa 100644 --- a/dts/arm/nuvoton/m55m1x.dtsi +++ b/dts/arm/nuvoton/m55m1x.dtsi @@ -45,6 +45,7 @@ reg = <0x40001000 0x100>; #clock-cells = <0>; lxt = "enable"; + hirc48m = "enable"; clk-pclkdiv = <(NUMAKER_CLK_PCLKDIV_PCLK0DIV(2) | NUMAKER_CLK_PCLKDIV_PCLK1DIV(2) | NUMAKER_CLK_PCLKDIV_PCLK2DIV(2) | @@ -460,6 +461,19 @@ #pwm-cells = <3>; status = "disabled"; }; + + usbd: usbd@4025c000 { + compatible = "nuvoton,numaker-usbd"; + reg = <0x4025c000 0x1000>; + interrupts = <58 0>; + resets = <&rst NUMAKER_SYS_USBD0RST>; + clocks = <&pcc NUMAKER_USBD0_MODULE NUMAKER_CLK_USBSEL_USBSEL_HIRC48M + NUMAKER_CLK_USBDIV_USBDIV(1)>; + dma-buffer-size = <1536>; + status = "disabled"; + num-bidir-endpoints = <25>; + disallow-iso-in-out-same-number; + }; }; }; diff --git a/soc/nuvoton/numaker/m55m1x/soc.c b/soc/nuvoton/numaker/m55m1x/soc.c index 19722c9058c..b38bbaea53a 100644 --- a/soc/nuvoton/numaker/m55m1x/soc.c +++ b/soc/nuvoton/numaker/m55m1x/soc.c @@ -141,13 +141,13 @@ void soc_reset_hook(void) /* Wait for LIRC clock ready */ CLK_WaitClockReady(CLK_STATUS_LIRCSTB_Msk); -#if DT_NODE_HAS_PROP(DT_NODELABEL(scc), hirc48) - /* Enable/disable 48 MHz high-speed internal RC oscillator (HIRC48) */ - if (DT_ENUM_IDX(DT_NODELABEL(scc), hirc48) == NUMAKER_SCC_CLKSW_ENABLE) { +#if DT_NODE_HAS_PROP(DT_NODELABEL(scc), hirc48m) + /* Enable/disable 48 MHz high-speed internal RC oscillator (HIRC48M) */ + if (DT_ENUM_IDX(DT_NODELABEL(scc), hirc48m) == NUMAKER_SCC_CLKSW_ENABLE) { CLK_EnableXtalRC(CLK_SRCCTL_HIRC48MEN_Msk); - /* Wait for HIRC48 clock ready */ + /* Wait for HIRC48M clock ready */ CLK_WaitClockReady(CLK_STATUS_HIRC48MSTB_Msk); - } else if (DT_ENUM_IDX(DT_NODELABEL(scc), hirc48) == NUMAKER_SCC_CLKSW_DISABLE) { + } else if (DT_ENUM_IDX(DT_NODELABEL(scc), hirc48m) == NUMAKER_SCC_CLKSW_DISABLE) { CLK_DisableXtalRC(CLK_SRCCTL_HIRC48MEN_Msk); } #endif