【TINY4412】U-BOOT移植笔记:(13)USB驱动
2018-01-13 08:42
411 查看
【TINY4412】U-BOOT移植笔记:(13)USB驱动
宿主机 : 虚拟机 Ubuntu 16.04 LTS / X64目标板[底板]: Tiny4412SDK - 1506
目标板[核心板]: Tiny4412 - 1412
U-BOOT版本: 2017.03
交叉编译器: gcc-arm-none-eabi-5_4-2016q3
日期: 2017-6-10 17:28:33
作者: SY
USB驱动
git diff da4612 6c81ce diff --git a/arch/arm/dts/exynos4412-tiny4412.dts b/arch/arm/dts/exynos4412-tiny4412.dts index 3b80246..75e9292 100644 --- a/arch/arm/dts/exynos4412-tiny4412.dts +++ b/arch/arm/dts/exynos4412-tiny4412.dts @@ -9,6 +9,8 @@ /dts-v1/; #include "exynos4412.dtsi" +#include <dt-bindings/gpio/gpio.h> + / { model = "Tiny4412 based on Exynos4412"; @@ -19,7 +21,20 @@ stdout-path = "serial0"; }; + memory { + reg = <0x40000000 0x80000000>; + }; + aliases { + i2c0 = "/i2c@13860000"; + i2c1 = "/i2c@13870000"; + i2c2 = "/i2c@13880000"; + i2c3 = "/i2c@13890000"; + i2c4 = "/i2c@138a0000"; + i2c5 = "/i2c@138b0000"; + i2c6 = "/i2c@138c0000"; + i2c7 = "/i2c@138d0000"; + serial0 = "/serial@13800000"; console = "/serial@13800000"; @@ -86,5 +101,35 @@ div = <0x3>; index = <4>; }; + + emmc-reset { + compatible = "samsung,emmc-reset"; + reset-gpio = <&gpx1 1 GPIO_ACTIVE_LOW>; + }; + + pwm@139D0000 { + compatible = "samsung,exynos4210-pwm"; + reg = <0x139D0000 0x100>; + samsung,pwm-outputs = <0>,<1>; + #pwm-cells = <3>; + enable-gpios = <&gpd0 0 GPIO_ACTIVE_HIGH>; + }; + + ehci@12580000 { + compatible = "samsung,exynos-ehci"; + reg = <0x12580000 0x100>; + + #address-cells = <1>; + #size-cells = <1>; + phy { + compatible = "samsung,exynos-usb-phy"; + reg = <0x125B0000 0x100>; + }; + }; + + usb-phy-reset { + compatible = "smsc,usb-phy-reset"; + reset-gpio = <&gpm2 4 GPIO_ACTIVE_LOW>; + }; }; diff --git a/drivers/usb/host/ehci-exynos.c b/drivers/usb/host/ehci-exynos.c index 981543e..d1dd9d9 100644 --- a/drivers/usb/host/ehci-exynos.c +++ b/drivers/usb/host/ehci-exynos.c @@ -145,7 +145,7 @@ static void exynos5_setup_usb_phy(struct exynos_usb_phy *usb) static void exynos4412_setup_usb_phy(struct exynos4412_usb_phy *usb) { writel(CLK_24MHZ, &usb->usbphyclk); - + clrbits_le32(&usb->usbphyctrl, (PHYPWR_NORMAL_MASK_HSIC0 | PHYPWR_NORMAL_MASK_HSIC1 | PHYPWR_NORMAL_MASK_PHY1 | PHYPWR_NORMAL_MASK_PHY0)); @@ -225,6 +225,7 @@ static int ehci_usb_probe(struct udevice *dev) dm_gpio_set_value(&plat->vbus_gpio, 1); setup_usb_phy(ctx->usb); + mdelay(1); //By.SY hcor = (struct ehci_hcor *)((uint32_t)ctx->hcd + HC_LENGTH(ehci_readl(&ctx->hcd->cr_capbase))); diff --git a/drivers/usb/host/usb-uclass.c b/drivers/usb/host/usb-uclass.c index 5cf1e9a..46eb38c 100644 --- a/drivers/usb/host/usb-uclass.c +++ b/drivers/usb/host/usb-uclass.c @@ -219,6 +219,28 @@ static void remove_inactive_children(struct uclass *uc, struct udevice *bus) } } +#include <asm/gpio.h> +void usb_phy_reset(void) +{ + struct gpio_desc gpio = {}; + int node; + + node = fdt_node_offset_by_compatible(gd->fdt_blob, 0, + "smsc,usb-phy-reset"); + if (node < 0) + return; + + gpio_request_by_name_nodev(gd->fdt_blob, node, "reset-gpio", 0, &gpio, + GPIOD_IS_OUT); + + if (dm_gpio_is_valid(&gpio)) { + dm_gpio_set_value(&gpio, 1); + mdelay(50); + dm_gpio_set_value(&gpio, 0); + dm_gpio_free(gpio.dev, &gpio); + } +} + int usb_init(void) { int controllers_initialized = 0; @@ -231,6 +253,7 @@ int usb_init(void) asynch_allowed = 1; usb_hub_reset(); + usb_phy_reset(); ret = uclass_get(UCLASS_USB, &uc); if (ret) @@ -242,6 +265,7 @@ int usb_init(void) /* init low_level USB */ printf("USB%d: ", count); count++; + ret = device_probe(bus); if (ret == -ENODEV) { /* No such device. */ puts("Port not available.\n"); diff --git a/include/configs/tiny4412.h b/include/configs/tiny4412.h index 994ba15..655c2d0 100644 --- a/include/configs/tiny4412.h +++ b/include/configs/tiny4412.h @@ -37,6 +37,12 @@ e6a0 /* MMC CONFIG */ #define CONFIG_BLK 1 +/* USB */ +#define CONFIG_USB_EHCI_EXYNOS 1 + +/* USB-KEYBOARD */ +#define CONFIG_SYS_STDIO_DEREGISTER 1 + #define CONFIG_SYS_DCACHE_OFF 1 /* ORIGEN has 4 bank of DRAM */ diff --git a/tiny4412_config b/tiny4412_config index f1528c0..347effb 100644 --- a/tiny4412_config +++ b/tiny4412_config @@ -392,11 +392,12 @@ CONFIG_CMD_PART=y # CONFIG_CMD_SF is not set # CONFIG_CMD_SPI is not set # CONFIG_CMD_I2C is not set -# CONFIG_CMD_USB is not set +CONFIG_CMD_USB=y CONFIG_CMD_DFU=y -CONFIG_CMD_USB_MASS_STORAGE=y +# CONFIG_CMD_USB_MASS_STORAGE is not set # CONFIG_CMD_FPGA is not set # CONFIG_CMD_GPIO is not set +CONFIG_CMD_BEEP=y # # Shell scripting commands @@ -515,7 +516,9 @@ CONFIG_OF_TRANSLATE=y # # Clock # -# CONFIG_CLK is not set +CONFIG_CLK=y +# CONFIG_SPL_CLK is not set +# CONFIG_CLK_AT91 is not set # CONFIG_CPU is not set # @@ -535,7 +538,7 @@ CONFIG_OF_TRANSLATE=y # CONFIG_USB_FUNCTION_DFU=y # CONFIG_DFU_TFTP is not set -CONFIG_DFU_MMC=y +# CONFIG_DFU_MMC is not set # CONFIG_DFU_NAND is not set # CONFIG_DFU_RAM is not set # CONFIG_DFU_SF is not set @@ -725,7 +728,10 @@ CONFIG_DM_SPI_FLASH=y # CONFIG_DM_PMIC is not set # CONFIG_POWER_MC34VR500 is not set # CONFIG_DM_REGULATOR is not set -# CONFIG_DM_PWM is not set +CONFIG_DM_PWM=y +CONFIG_PWM_EXYNOS=y +# CONFIG_PWM_ROCKCHIP is not set +# CONFIG_PWM_TEGRA is not set # CONFIG_RAM is not set # @@ -812,9 +818,12 @@ CONFIG_DM_USB=y # # USB Host Controller Drivers # +CONFIG_USB_HOST=y # CONFIG_USB_XHCI_HCD is not set -# CONFIG_USB_EHCI_HCD is not set -# CONFIG_USB_EHCI is not set +CONFIG_USB_EHCI_HCD=y +CONFIG_USB_EHCI=y +# CONFIG_USB_EHCI_MSM is not set +CONFIG_USB_EHCI_GENERIC=y # CONFIG_USB_OHCI_HCD is not set # CONFIG_USB_UHCI_HCD is not set # CONFIG_USB_DWC3 is not set @@ -833,7 +842,7 @@ CONFIG_DM_USB=y # # USB peripherals # -# CONFIG_USB_STORAGE is not set +CONFIG_USB_STORAGE=y # CONFIG_USB_KEYBOARD is not set CONFIG_USB_GADGET=y # CONFIG_USB_GADGET_ATMEL_USBA is not set @@ -844,9 +853,9 @@ CONFIG_USB_GADGET_DWC2_OTG=y CONFIG_USB_GADGET_VBUS_DRAW=2 CONFIG_USB_GADGET_DUALSPEED=y CONFIG_USB_GADGET_DOWNLOAD=y -CONFIG_G_DNL_MANUFACTURER="Samsung" -CONFIG_G_DNL_VENDOR_NUM=0x04e8 -CONFIG_G_DNL_PRODUCT_NUM=0x6601 +CONFIG_G_DNL_MANUFACTURER="samsung" +CONFIG_G_DNL_VENDOR_NUM=0x04E8 +CONFIG_G_DNL_PRODUCT_NUM=0x685D CONFIG_USBNET_DEVADDR="de:ad:be:ef:00:01" # (END)
根据调试输出,必须在
setup_usb_phy(ctx->usb); mdelay(1); //By.SY
加上延时,否则读取的数据
HC_LENGTH(ehci_readl(&ctx->hcd->cr_capbase)));不对。
+ 在初始化USB之前,必须调用 usb_phy_reset(),初始化usb hub芯片。
+ 支持U盘、鼠标。键盘还有点问题
输出:
usb start starting USB... USB0: USB EHCI 1.00 scanning bus 0 for devices... 5 USB Device(s) found scanning usb for storage devices... 0 Storage Device(s) found TINY4412 # usb tree USB device tree: 1 Hub (480 Mb/s, 0mA) | u-boot EHCI Host Controller | +-2 Hub (480 Mb/s, 2mA) | +-3 Mass Storage (480 Mb/s, 200mA) | SanDisk Firebird USB Flash Drive 4C532000051126117203 | +-4 See Interface (480 Mb/s, 180mA) | ? | +-5 Vendor specific (480 Mb/s, 0mA) Bridge device TINY4412 # usb write 0x50000000 100 1 USB write: device 0 block # 256, count 1 ... 1 blocks write: OK TINY4412 # usb read 0x50000000 100 1 USB read: device 0 block # 256, count 1 ... 1 blocks read: OK TINY4412 # usb stop stopping USB.. TINY4412 #
相关文章推荐
- 【TINY4412】U-BOOT移植笔记:(14)USB-OTG驱动
- 【TINY4412】U-BOOT移植笔记:(11)LED驱动
- 【TINY4412】U-BOOT移植笔记:(12)BEEP驱动
- 【TINY4412】U-BOOT移植笔记:(6)串口驱动
- 【TINY4412】U-BOOT移植笔记:(7)SDRAM驱动
- 【TINY4412】U-BOOT移植笔记:(8)SD卡驱动
- 【TINY4412】U-BOOT移植笔记:(16)DM9621驱动
- 【TINY4412】U-BOOT移植笔记:(10)EMMC驱动
- 【TINY4412】LINUX移植笔记:(13)SD卡驱动
- 【TINY4412】LINUX移植笔记:(9)USB驱动
- 【TINY4412】U-BOOT移植笔记:(3)点灯
- 【TINY4412】U-BOOT移植笔记:(4)U-BOOT执行流程
- u-boot移植到mini2440,增加DM9000驱动的学习笔记
- 【TINY4412】U-BOOT移植笔记:(5)时钟分析
- Zynq-Linux移植学习笔记之13-i2c驱动配置
- 【TINY4412】U-BOOT移植笔记:(15)DFU更新固件
- 【TINY4412】LINUX移植笔记:(22)设备树LCD按键驱动
- 【TINY4412】LINUX移植笔记:(23)设备树LCD触摸屏驱动
- 【TINY4412】U-BOOT移植笔记:(9)SD卡启动U-BOOT
- 【TINY4412】U-BOOT移植笔记:(17)BOOTP更新固件