您的位置:首页 > 其它

【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 #
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: