Загрузчик для SPI NOR Flash одноплатного ПК OrangePi Zero2


  Intro     SPL     Shell     Env     FDT       USB       Net     SPI  

Работа с USB-портом

На плате OrangePi Zero2 имеется четыре USB-порта:

  • 1) USB-OTG порт с базовым адресом 0x05100000, физически он представлен разъемом Type C, который обычно используется для подачи питания от БП.

  • 2) Порт USB1 (хост-контроллер) с базовым адресом 0x05200000, физически он представлен разъемом типа A (USB 2.0), расположенным рядом с разъемом HDMI. На контакт +5в этого разъема питание подается не с шины VCC, а через программно-управляемый ключ, т.е. на этом контакте не будет питания, если оно не включено программно.

  • 3)Порт USB3 (хост-контроллер) с базовым адресом 0x05310000

  • 4)Порт USB4 (хост-контроллер) с базовым адресом 0x05311000

    Порты USB3 и USB4 не имеют на плате собственных USB-разъемов, их сигнальные цепи (D+ и D-) выведены на 13-контактный разъем (гребенка), к которому можно подключать внешние USB-розетки с подачей +5В и GND с этой же гребенки.

    Для загрузки через USB внешний диск или флешка подключаются к разъему порта USB1.

    Описание хост-контроллера USB 2.0 и его регистров:

  • Хост-контроллер USB2.0
  • Регистры хост-контроллера

    В дереве устройств SPI-SPL USB1 описан в узле /soc следующим образом:



    usb@5200000 {
    compatible = "allwinner,sun50i-h616-ehci", "generic-ehci";
    reg = <0x05200000 0x00000100>;
    interrupts = <0x00000000 0x0000001c 0x00000004>;
    clocks = <0x00000002 0x00000069 0x00000002 0x0000006d 0x00000002 0x00000062>;
    resets = <0x00000002 0x0000002b 0x00000002 0x0000002f>;
    phys = <0x00000015 0x00000001>;
    phy-names = "usb";
    status = "okay";
    phandle = <0x00000038>;
    };


    usb@5200400 {
    compatible = "allwinner,sun50i-h616-ohci", "generic-ohci";
    reg = <0x05200400 0x00000100>;
    interrupts = <0x00000000 0x0000001d 0x00000004>;
    clocks = <0x00000002 0x00000069 0x00000002 0x00000062>;
    resets = <0x00000002 0x0000002b>;
    phys = <0x00000015 0x00000001>;
    phy-names = "usb";
    status = "okay";
    phandle = <0x00000039>;
    };


    Для сравнения - этот же узел в дереве устройств OpiZero2 для Android: Узел ehci1-controller@0x05200000

    В переменных окружения ENV для загрузки через USB используются следующие переменные:


    boot_targets=fel mmc0 usb0 pxe dhcp

    distro_bootcmd=
    for target in ;
    do run bootcmd_;

    bootcmd_usb0=
    devnum=0; run usb_boot

    preboot=usb start

    usb_boot=
    usb start;
    if usb dev ; then
    devtype=usb;
    run scan_dev_for_boot_part;
    fi


    Из анализа этих команд следует, что для загрузки будет использован порт USB0, т.е. OTG, и это очень странно...

    В оболочке U-Boot для работы с USB предназначены команды:



    => help usb
    usb - USB sub-system

    Usage:
    usb start - start (scan) USB controller
    usb reset - reset (rescan) USB controller
    usb stop [f] - stop USB [f]=force stop
    usb tree - show USB device tree
    usb info [dev] - show available USB devices
    usb test [dev] [port] [mode] - set USB 2.0 test mode
    (specify port 0 to indicate the device's upstream port)
    Available modes: J, K, S[E0_NAK], P[acket], F[orce_Enable]
    usb storage - show details of USB storage devices
    usb dev [dev] - show or set current USB storage device
    usb part [dev] - print partition table of one or all USB storage devices
    usb read addr blk# cnt - read `cnt' blocks starting at block `blk#'
    to memory address `addr'
    usb write addr blk# cnt - write `cnt' blocks starting at block `blk#'
    from memory address `addr'

    Информационные команды показывают:



    => usb tree
    USB device tree:
    1 Hub (12 Mb/s, 0mA)
    U-Boot Root Hub

    1 Hub (12 Mb/s, 0mA)
    U-Boot Root Hub

    => usb info
    1: Hub, USB Revision 1.10
    - U-Boot Root Hub
    - Class: Hub
    - PacketSize: 8 Configurations: 1
    - Vendor: 0x0000 Product 0x0000 Version 0.0
    Configuration: 1
    - Interfaces: 1 Self Powered 0mA
    Interface: 0
    - Alternate Setting 0, Endpoints: 1
    - Class Hub
    - Endpoint 1 In Interrupt MaxPacket 2 Interval 255ms

    1: Hub, USB Revision 1.10
    - U-Boot Root Hub
    - Class: Hub
    - PacketSize: 8 Configurations: 1
    - Vendor: 0x0000 Product 0x0000 Version 0.0
    Configuration: 1
    - Interfaces: 1 Self Powered 0mA
    Interface: 0
    - Alternate Setting 0, Endpoints: 1
    - Class Hub
    - Endpoint 1 In Interrupt MaxPacket 2 Interval 255ms

    => usb dev
    no usb devices available
    =>
    => usb storage
    No storage devices, perhaps not 'usb start'ed..?
    =>

    Таким образом, данная версия пока не поддерживает полноценную работу с USB, поэтому загрузка системы с USB-диска не представляется возможной.




  •   Intro     SPL     Shell     Env     FDT       USB       Net     SPI