【TINY4412】U-BOOT移植笔记:(13)USB驱动

【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 @@
     /* 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 # 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
更新说明: V1.70 1.改进了对于大容量U盘的操作 ================================================ V1.68 1.增加导出重要扇区功能,供改进软件用 ================================================ V1.67 1.支持多合一读卡器的制作,能找到读卡器的有卡插槽 2.在多处增加了数据可能丢失的警告 ================================================ V1.66 1.增加写保护跳过对话框,允许用户跳过写保护提示 2.增加备份和恢复磁盘的功能,类似克隆 3.可自定制启动文件包 ================================================ V1.65 1.增加写保护检测功能 2.提示拔盘时首先软件弹出U盘 3.在WMI不能使用时枚举磁盘 ================================================ V1.64 1.在C盘根目录生成日志文件,以调查打不开磁盘的问题 ================================================ V1.63 1.对设备名太长不予列出 2.提示文字考虑其长度,以免超出提示框 3.对不支持的方式不禁用 4.增加TIP提示完整信息 5.增加了多语言支持功能 ================================================ V1.62 1.解决了ZIP模式兼容性问题 2.增加了“固定磁盘”和“移动磁盘”的图标提示 3.对HDD/ZIP/FDD模式的应用范围做了限制 4.向磁盘中增加MSDOS.SYS以避免启动时出现WINDOWS菜单 ================================================ V1.61 1.解决了取消格式化后无法操作的问题 2.编写了使用说明 ================================================ V1.6 1.解决了磁盘容量问题,现在可以准确计算出U盘的容量 了,已在多种U盘上进行试验 2.增设了“引导处理”功能,可以不损伤原有数据使其 能够引导,类似DOS的SYS.COM命令 3.读取U盘的名称 4.根据接口类型判断U盘,而不是根据容量或者移动属性 判断,这样USB硬盘盒也可处理,而IDE硬盘不会被误操作 5.更新了引导区启动代码,USB-FDD模式可用了,在SIS630 主板上验证通过(AMI BIOS,仅支持USB-FDD) ================================================ V1.5 1.解决了“磁盘未格式化”的问题,凡是使用USBoot后 提示说磁盘未格式化的朋友请重新试用。 ================================================ V1.4 各位热心网友,请试用新的ZIP方式和FDD方式,HDD方 式未作变更,不必试验了。 1.增加了“重置”功能,如果发现USBOOT设置的参数不对 可以使用此功能将U盘的引导扇清空,然后用原配工具重 新格式化; 2.将原来的ZIP方式更名为FDD方式,增加了ZIP方式,ZIP 方式和HDD方式均有分区表,但ZIP方式参数和HDD方式不 同;从一些热心网友反馈的数据看,各种不同U盘之间参 数差别很大,大体分为32扇和63扇两类。 3.增加了自动停止U盘功能,不用等待U盘灯灭,只要提示 拔盘即可动手了; 其实和ZIP或HDD并无实质区别,一些PC根本就不设置 USB-ZIP还是USB-HDD,只有一个USB-STORAGE启动; U盘启动和PC关系很大,有的PC无论用什么参数都可以 启动,有的则很挑;同样的U盘在这台机器可以,在另 一台试遍FDD/ZIP/HDD都不行;筹划采用一种统一的方式, 彻底解决这个问题; ================================================ V1.3 由于暂时无法获得磁盘“剩余扇”,因此做了一个 额外处理,将用柱面数弥补剩余扇,这样可以减少磁盘 空间减少的情况,但是请大家注意,磁盘空间可能会多 计算!对于16M的盘误差很小,对于32M的盘误差在4M左 右,对于128M的盘误差在8M左右。后果是当磁盘接近满 时,会提示找不到对应扇区,但是不会浪费U盘的空间了! ================================================ V1.2
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值