This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

AM3356: USB OTG Configuration (Linux SDK)

Part Number: AM3356

Hello team,

Customer is trying to evaluate USB OTG function., however, AM3356 does not work fine. When USB Flash memory is inserted, AM3356 does not recognize it, I mean, although Customer checked this by dmesf/lsusb command, there is not any message which is related to USB. However, once SUSPEND/RESUME is attempted, AM3356 seems to work as USB host. And then, customer implemented “Serial Gadget (CDC class?)” as USB Device, however, Laptop-PC does not recognize AM3356.

Customer is asking how customer should do the USB OTG Configuration. Could you elaborate it, please? Also it will be appreciated if you will share helpful document/User-Guide.

I attached customer’s dts file(am335x-usb0.zip) If Experts find any issue, please let us know.

Best regards,

Miyazaki

  • Hi Miyazaki,

    Does it happen on custom board not TI EVM? If so please provide the board schematics.

    Which Processor SDK release does the customer use?

    Please run the following script on the board linux console, and provide its output.

    #!/bin/bash
    #
    # Util to check USB subsystem for Linux kernel 3.12+ on TI Sitara devices
    #
    # Copyright (C) 2018 Texas Instruments Incorporated - http://www.ti.com/
    #
    #
    #  Redistribution and use in source and binary forms, with or without
    #  modification, are permitted provided that the following conditions
    #  are met:
    #
    #    Redistributions of source code must retain the above copyright
    #    notice, this list of conditions and the following disclaimer.
    #
    #    Redistributions in binary form must reproduce the above copyright
    #    notice, this list of conditions and the following disclaimer in the
    #    documentation and/or other materials provided with the
    #    distribution.
    #
    #    Neither the name of Texas Instruments Incorporated nor the names of
    #    its contributors may be used to endorse or promote products derived
    #    from this software without specific prior written permission.
    #
    #  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
    #  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
    #  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
    #  A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
    #  OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
    #  SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
    #  LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
    #  DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
    #  THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    #  (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    #  OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    
    VERSION=0.3.0
    DTPATH=/proc/device-tree
    DEVPATH=/sys/devices/platform
    KMODPATH="/lib/modules/`uname -r`"
    
    ### ENV
    # $V: debug flag
    # $PLATFORM: force g_plaform if not found in device tree
    
    ### functions ###
    
    # $1 commands to be checked
    check_command() {
        local _lst="$*"
        local _cmd
    
        for _cmd in $_lst; do
            which $_cmd > /dev/null || {
                echo "Error: $_cmd command not found"
                exit 1
            }
        done
    }
    
    # check if the kernel is supported
    # this tool only runs on v4.0+ kernel
    # return 0 - if kernel version >= 4.0
    #        1 - if kernel version < 4.0
    has_supported_kernel() {
    	local _ver
    	local _t
    
        check_command uname
        uname -a
    	_ver=`uname -r`
        _t=${_ver%%.*}
        # 3.x.x or older, unsupported
        [ $_t -ge 4 ] || return 1
        return 0
    }
    
    # define variables for musb entries in sysfs and device tree
    # output variables: USB_DT_PARENT, USB0DT, USB1DT
    #                   USB_DEV_PARENT, USB0DEV, USB1DEV
    query_musb_entries() {
        local _lst
        local _t
        local _intr
    
        check_command find
    
        # find usb entry names in device-tree
        _t=$(find ${DTPATH}/ -maxdepth 2 -name '*47400000*')
        [ -n "$_t" ] && USB_DT_PARENT=$_t || {
            echo "usb parent DT node not found in device-tree"
            exit 1
        }
    
        _lst=$(find ${USB_DT_PARENT}/ -maxdepth 1 -name 'usb@*')
        [ -n "$_lst" ] || {
            echo "usb0 and usb1 DT node not found in device-tree"
            exit 1
        }
    
        # find USB child DT node based on its interrupt number
        for _t in $_lst; do
            [[ -f "${_t}/interrupts" ]] || continue
            _intr=$(hexdump ${_t}/interrupts | head -1 | cut -d' ' -f3)
            case $_intr in
                "1200") USB0DT=$_t;;
                "1300") USB1DT=$_t;;
                *)  echo "unkown usb interrupt number $_intr"
                    exit 1
            esac
        done
    
        # find device names in sysfs
        _t=$(find ${DEVPATH}/ -maxdepth 2 -name '*47400000*')
        [ -n "$_t" ] && USB_DEV_PARENT=$_t || {
            echo "usb device not found in sysfs"
            exit 1
        }
    
        _t=$(find ${USB_DEV_PARENT}/47401400.usb/ -maxdepth 1 -name 'musb-hdrc.*')
        [ -n "$_t" ] && USB0DEV=$_t || echo "usb0 device not found in sysfs"
    
        _t=$(find ${USB_DEV_PARENT}/47401c00.usb/ -maxdepth 1 -name 'musb-hdrc.*')
        [ -n "$_t" ] && USB1DEV=$_t || echo "usb1 device not found in sysfs"
    }
    
    # check if the platform is supported
    # return 0 - if platform is supported
    #        1 - if platform is not supported
    check_platform () {
    	local _hw
    
        check_command grep
        _hw=`cat ${DTPATH}/compatible | tr '\0' ' '`
        DBG_PRINT "DT compatible: $_hw"
    
        if [[ "$_hw" == *"ti,am33xx"* ]]; then
            g_platform="am335x"
        elif [[ "$_hw" == *"ti,am43"* ]]; then
            g_platform="am437x"
        else
            # read from ENV
            g_platform=$PLATFORM
        fi
    
        DBG_PRINT "g_platform: $g_platform"
        case $g_platform in
            "am335x")
                query_musb_entries
                return 0;;
            "am437x")
                USB0DT="$(find $DTPATH -name 'usb@48390000')"
                USB1DT="$(find $DTPATH -name 'usb@483d0000')"
                return 0;;
            *)
                echo "Unsupported \"$g_platform\""
                return 1;;
        esac
    }
    
    # get kernel config options from /proc/config.gz
    # params $@ - the list of config options to query, without 'CONFIG_'
    # return - the config options settings in /proc/config.gz
    get_kernel_configs() {
        local _opts="$@"
        local _lst=""
        local _t
    
        check_command zcat grep
        for _t in $_opts; do
            [ -z "$_lst" ] &&
                _lst="^CONFIG_${_t}\>" ||
                _lst="${_lst}\|^CONFIG_${_t}\>"
        done
        [ -z "$_lst" ] || zcat /proc/config.gz | grep "$_lst"
    }
    
    # check a kernel CONFIG option
    # params $1 - the config option list returned from get_kernel_config()
    #             if "", directly check $2 from /proc/config.gz
    #        $2 - the config option to check
    #        $3 = '-q', quiet output
    # return 0 - undefined
    #        1 - defined as 'm', kernel module
    #        2 - defined as 'y', kernel builtin
    check_kernel_config() {
        local _cfg
        local _t
    
        [ -n "$2" ] || return 0
    
        if [ -z "$1" ]; then
            check_command zcat
            _cfg=`zcat /proc/config.gz | grep "^$2\>"`
        else
            for _t in $1; do
                [[ "$_t" != "${2}="? ]] || { _cfg=$_t; break; }
            done
        fi
    
        case ${_cfg#*=} in
            "y") return 2;;
            "m") return 1;;
              *) [ "$3" = "-q" ] ||
                  echo "Error: $2 is undefined in kernel config"
              return 0;;
        esac
    }
    
    # check a kernel module
    # $1 - module name, relative path from drivers/, without .ko surfix
    # return 0 - found
    #        1 - error
    check_module() {
        local _modname
        local _moddep
    
        [ -n "$1" ] || return 1
    
        _modname="${KMODPATH}/kernel/drivers/${1}.ko"
        _moddep="${KMODPATH}/modules.dep"
    
        DBG_PRINT "${1}.ko checking..."
        [ -f $_modname ] || {
            echo "Error: $_modname not found."
            echo "       Please ensure 'make module_install' is done properly."
            return 1
        }
    
        DBG_PRINT "${1}.ko found"
        [ -f $_moddep ] || $g_printed_once || {
            echo "Error: $_moddep not found."
            echo "       Please ensure 'make module_install' is done properly."
            g_printed_once=true
        }
    
        DBG_PRINT "${1}.ko moddep checked"
        check_command lsmod basename tr
    
        lsmod | grep `basename $1 | tr '-' '_'` > /dev/null || {
            DBG_PRINT ">>>> ${1}.ko not found in lsmod:"
            if grep "${1}.ko:" $_moddep > /dev/null; then
                echo "Error: $_moddep seems to be valid,"
                echo "       but `basename $1`.ko is not loaded."
                echo "       Please provide /proc/config.gz and ${KMODPATH}/*"
                echo "       for further investigation."
            else
                echo "Error: `basename $1`: $_moddep is invalid."
                echo "       Please run command 'depmod' on the target to re-generate it,"
                echo "       then reboot the target. If the issue still exists, please"
                echo "       ensure 'make module_install' is done properly."
            fi
    
            return 1
        }
        DBG_PRINT "${1}.ko done"
        return 0
    }
    
    # check kernel config, and modules (if CONFIG_*=M) for musb
    check_musb_drivers() {
        local _lst=("USB_MUSB_HDRC" "USB_MUSB_DUAL_ROLE" "USB_OTG" "USB_MUSB_DSPS" \
                    "AM335X_PHY_USB" "MUSB_PIO_ONLY" "TI_CPPI41")
        local _opts
    
        _opts=$(get_kernel_configs ${_lst[*]})
    
        check_kernel_config "$_opts" CONFIG_USB_MUSB_HDRC
        [ $? != 1 ] || check_module 'usb/musb/musb_hdrc'
    
        check_kernel_config "$_opts" CONFIG_USB_MUSB_DUAL_ROLE -q
        [ $? != 0 ] || echo "Warning: CONFIG_USB_MUSB_DUAL_ROLE undefined."
    
        check_kernel_config "$_opts" CONFIG_USB_OTG -q
        [ $? == 0 ] || echo "Warning: CONFIG_USB_OTG defined."
    
        check_kernel_config "$_opts" CONFIG_USB_MUSB_DSPS
        [ $? != 1 ] || {
            check_module 'usb/musb/musb_dsps'
        }
    
        check_kernel_config "$_opts" CONFIG_AM335X_PHY_USB
        [ $? != 1 ] || {
            check_module 'usb/phy/phy-am335x'
            check_module 'usb/phy/phy-am335x-control'
        }
    
        check_kernel_config "$_opts" CONFIG_MUSB_PIO_ONLY -q
        [ $? != 0 ] || {
           if check_kernel_config "$_opts" CONFIG_TI_CPPI41 -q; then
               echo "Error: MUSB CPPI DMA mode is enabled, but CPPI moudle is not enabled in DMA Engine."
               echo "       Please enable CONFIG_TI_CPPI41 under DMA Engine Support in kernel config."
           fi
        }
    }
    
    # check kernel config, and modules (if CONFIG_*=M) for dwc3
    check_dwc3_drivers() {
        local _lst=("USB_DWC3" "USB_DWC3_DUAL_ROLE" "USB_OTG" "USB_DWC3_OMAP" \
                    "USB_XHCI_HCD" "OMAP_CONTROL_PHY" "OMAP_USB2")
        local _opts
    
        _opts=$(get_kernel_configs ${_lst[*]})
    
        check_kernel_config "$_opts" CONFIG_USB_DWC3
        [ $? != 1 ] || check_module 'usb/dwc3/dwc3'
    
        check_kernel_config "$_opts" CONFIG_USB_DWC3_DUAL_ROLE -q
        [ $? != 0 ] || echo "Warning: CONFIG_USB_DWC3_DUAL_ROLE undefined."
    
        check_kernel_config "$_opts" CONFIG_USB_OTG -q
        [ $? == 0 ] || echo "Warning: CONFIG_USB_OTG defined."
    
        check_kernel_config "$_opts" CONFIG_USB_DWC3_OMAP
        [ $? != 1 ] || check_module 'usb/dwc3/dwc3-omap'
    
        check_kernel_config "$_opts" CONFIG_USB_XHCI_HCD
        [ $? != 1 ] || {
            check_module 'usb/host/xhci-plat-hcd'
            check_module 'usb/host/xhci-hcd'
        }
    
        check_kernel_config "$_opts" CONFIG_OMAP_CONTROL_PHY
        [ $? != 1 ] || check_module 'phy/phy-omap-control'
    
        check_kernel_config "$_opts" CONFIG_OMAP_USB2
        [ $? != 1 ] || check_module 'phy/phy-omap-usb2'
    }
    
    check_musb_dt() {
        local _dt_dir
        local _ent
        local _sts
        local _t
    
        case $USB_DT_PARENT in
            *"usb@"*)
                _ent=("control@44e10620" "usb-phy@47401300" "usb-phy@47401b00" \
                      "usb@47401000" "usb@47401800" "dma-controller@47402000")
                ;;
            *"target-module@"*)
                _ent=("usb-phy@1300" "usb-phy@1b00" "usb@1400" "usb@1800" \
                      "dma-controller@2000")
                ;;
            *)
                echo "Warning: unknown USB DT ($USB_DT_PARENT)"
                return
        esac
    
        echo "Device Tree USB node status:"
        for _t in '.' ${_ent[*]}; do
            [ -d "${USB_DT_PARENT}/${_t}/" ] || {
                echo -e "\tWarning: USB DT node $_t not found"
                continue
            }
            [ -f "${USB_DT_PARENT}/${_t}/status" ] &&
                _sts=$(tr -d '\0' <${USB_DT_PARENT}/${_t}/status) ||
                _sts="(enabled)"
            echo -e "\t$_t: $_sts"
        done
    }
    
    dump_sysfs_debugfs() {
        local _debugfs
        local _l
        local _f
    
        _debugfs=`sed -ne 's/^debugfs \(.*\) debugfs.*/\1/p' /proc/mounts`
        [ -n "$_debugfs" ] || return
    
        case $g_platform in
            am335x)
                _debugfs=$(find $_debugfs -name 'musb-hdrc.*')
                _debugfs=${_debugfs%/*}
    
                for _f in $USB0DEV $USB1DEV; do
                    _l=$(basename $_f)
                    echo "$_l: mode $(cat ${_f}/mode), $(cat ${_f}/vbus)"
                    grep -i 'power\|devctl\|testmode' ${_debugfs}/${_l}/regdump
                done
                ;;
        esac
    }
    
    check_gadget_kernel_config() {
        local _lst=("USB_ZERO" "USB_AUDIO" "USB_ETH" "USB_G_NCM" "USB_MASS_STORAGE" \
                    "USB_G_SERIAL" "USB_G_PRINTER")
        local _opts
    
        _opts=$(get_kernel_configs ${_lst[*]})
    
        check_kernel_config "$_opts" CONFIG_USB_ZERO -q ||
            echo "Gadget Kernel Config: g_zero is enabled"
        check_kernel_config "$_opts" CONFIG_USB_AUDIO -q ||
            echo "Gadget Kernel Config: g_audio is enabled"
        check_kernel_config "$_opts" CONFIG_USB_ETH -q ||
            echo "Gadget Kernel Config: g_ether is enabled"
        check_kernel_config "$_opts" CONFIG_USB_G_NCM -q ||
            echo "Gadget Kernel Config: g_ncm is enabled"
        check_kernel_config "$_opts" CONFIG_USB_MASS_STORAGE -q ||
            echo "Gadget Kernel Config: g_mass_storage is enabled"
        check_kernel_config "$_opts" CONFIG_USB_G_SERIAL -q ||
            echo "Gadget Kernel Config: g_serial is enabled"
        check_kernel_config "$_opts" CONFIG_USB_G_PRINTER -q ||
            echo "Gadget Kernel Config: g_printer is enabled"
    }
    
    ### debug ###
    
    g_log_file=/tmp/chkusb.log
    
    DBG_ENABLE() { g_dbg_enabled=true; }
    DBG_DISABLE() { g_dbg_enabled=false; }
    DBG_LOG_RESET() { ! $g_dbg_enabled || echo > $g_log_file; }
    DBG_PRINT() { ! $g_dbg_enabled || echo "$(date +%H:%M:%S) [$(basename $0)]: $*"; }
    DBG_LOG() { DBG_PRINT $* >> $g_log_file; }
    DBG_LOG_MARK() { DBG_PRINT "----------------" >> $g_log_file; }
    
    
    ### main ####
    
    g_printed_once=false
    
    echo "chkusb.sh Version $VERSION"
    
    [ "$V" = "1" ] && DBG_ENABLE && DBG_LOG_RESET || DBG_DISABLE
    
    has_supported_kernel ||
        { echo "Unsupported kernel version: `uname -r`"; exit 1; }
    check_platform || exit 2
    DBG_PRINT device: $g_platform
    [ -d ${DTPATH} ] || { echo "Error: ${DTPATH} not found"; exit 3; }
    
    check_command lsusb
    if lsusb > /dev/null 2>&1; then
        echo "USB is initialized"
    else
        echo "USB initialization failed"
    fi
    
    # check kernel configs
    
    if [ -f /proc/config.gz ]; then
        case $g_platform in
            am335x) check_musb_drivers;;
            am437x) check_dwc3_drivers;;
        esac
    else
        echo "Error: /proc/config.gz not found"
    fi
    
    dump_sysfs_debugfs
    
    # check dr_mode & gadget drivers
    
    check_command basename
    for _usb_dir in "${USB0DT}" "${USB1DT}"; do
        [ -n "$_usb_dir" ] || continue
    
        [ -f "$_usb_dir/status" ] &&
            _status=`tr -d '\0' <$_usb_dir/status` ||
            _status='(enabled)'
        _dr_mode=`tr -d '\0'  <$_usb_dir/dr_mode`
        echo `basename $_usb_dir`: $_dr_mode, $_status
    
        [ "$_status" = "disabled" -o "$_dr_mode" = "host" ] || gadget_mode=true
    done
    
    case $g_platform in
        am335x) check_musb_dt;;
        *) ;;
    esac
    
    DBG_PRINT $gadget_mode
    $gadget_mode || exit 0
    
    echo
    
    check_kernel_config "" CONFIG_USB_LIBCOMPOSITE
    case $? in
        0) echo "Error: no any gadget driver enabled"
           exit 6;;
        1) is_gadget_builtin=false;;
        2) echo "The gadget driver is built-in"
           is_gadget_builtin=true;;
    esac
    
    [[ ! -f /proc/config.gz ]] || check_gadget_kernel_config
    
    g_driver=`grep '^DRIVER=' /sys/class/udc/*/uevent 2>/dev/null`
    echo "gadget driver loaded: ${g_driver:-(none)}"
    
    [[ $is_gadget_builtin == false ]] || exit 0
    
    echo
    
    if [ -d "$KMODPATH" ]; then
        echo "The list of USB gadget drivers installed:"
        ls -1Rp ${KMODPATH}/kernel/drivers/usb/gadget/{function,legacy}/
    else
        echo "Error: $KMODPATH not found"
        echo "       Please ensure 'make modules_install' is done properly."
        exit 7
    fi
    
    # vim: ft=sh:ts=4:sw=4:et
    

  • Hi Bin,

    This issue occurs on customer’s board. The version of “Processor SDK Linux” is 06_03_00_106. I requested customer to run the script and got this log. I attached it (

    chkusb.sh Version 0.3.0
    Linux am335x-evm 4.19.94-gbe5389fd85 #1 PREEMPT Thu Oct 8 00:26:37 UTC 2020 armv7l GNU/Linux
    USB is initialized
    Warning: CONFIG_USB_OTG defined.
    musb-hdrc.0: mode b_idle, Vbus off, timeout 1100 msec
    /sys/kernel/debug/musb-hdrc.0/regdump:Power       : 20
    /sys/kernel/debug/musb-hdrc.0/regdump:Testmode    : 00
    /sys/kernel/debug/musb-hdrc.0/regdump:DevCtl      : 80
    musb-hdrc.1: mode a_host, Vbus on, timeout 1100 msec
    /sys/kernel/debug/musb-hdrc.1/regdump:Power       : f0
    /sys/kernel/debug/musb-hdrc.1/regdump:Testmode    : 00
    /sys/kernel/debug/musb-hdrc.1/regdump:DevCtl      : 5d
    usb@47401000: otg, okay
    usb@47401800: host, okay
    Device Tree USB node status:
    	.: okay
    	control@44e10620: okay
    	usb-phy@47401300: okay
    	usb-phy@47401b00: okay
    	usb@47401000: okay
    	usb@47401800: okay
    	dma-controller@47402000: okay
    
    Gadget Kernel Config: g_zero is enabled
    Gadget Kernel Config: g_audio is enabled
    Gadget Kernel Config: g_ether is enabled
    Gadget Kernel Config: g_ncm is enabled
    Gadget Kernel Config: g_mass_storage is enabled
    Gadget Kernel Config: g_serial is enabled
    Gadget Kernel Config: g_printer is enabled
    gadget driver loaded: (none)
    
    The list of USB gadget drivers installed:
    /lib/modules/4.19.94-gbe5389fd85/kernel/drivers/usb/gadget/function/:
    u_audio.ko
    u_ether.ko
    u_serial.ko
    usb_f_acm.ko
    usb_f_ecm.ko
    usb_f_ecm_subset.ko
    usb_f_eem.ko
    usb_f_fs.ko
    usb_f_hid.ko
    usb_f_mass_storage.ko
    usb_f_midi.ko
    usb_f_ncm.ko
    usb_f_obex.ko
    usb_f_printer.ko
    usb_f_rndis.ko
    usb_f_serial.ko
    usb_f_ss_lb.ko
    usb_f_uac1.ko
    usb_f_uac1_legacy.ko
    usb_f_uac2.ko
    usb_f_uvc.ko
    
    /lib/modules/4.19.94-gbe5389fd85/kernel/drivers/usb/gadget/legacy/:
    g_acm_ms.ko
    g_audio.ko
    g_cdc.ko
    g_dbgp.ko
    g_ether.ko
    g_ffs.ko
    g_hid.ko
    g_mass_storage.ko
    g_midi.ko
    g_multi.ko
    g_ncm.ko
    g_printer.ko
    g_serial.ko
    g_webcam.ko
    g_zero.ko
    gadgetfs.ko
    
    ).

    Thanks for your supporting for this.

    Best regards,

    Miyazaki

  • Hi Miyazaki,

    Thanks for sending over the board schematics. the log chkusb.log shows USB1 port in host mode has a USB device attached, but the board schematics only shows the design of USB0 port, which is configured in dual-role mode in Linux. Which USB port is used for the host and device testing you mentioned in your first post?

  • Hi Bin,

    I had not confirm their schematic and shared this with you.. sorry. I'm asking customer again.

    Best regards,

    Miyazaki

  • Hi Bin,

    I received customer's feedback. Customer configured USB0 port to dual-role mode in Linux and customer is verifying USB0 port (Host/Device).

    Best regards,

    Miyazaki

  • Hi Miyazaki,

    The output of the script chkusb.sh shows USB Serial gadget driver is not loaded. Please load this driver before verify the USB0 port for host and device mode.

    Why something is attached to USB1 port? what is the device attached?

  • Hi Bin,

    Customer tried to load " USB Serial gadget driver ", however, it appears that they could not load it with the following error message. Customer confirmed this error from dmesg. Would you able to share any advice for this, please?

       udc-core: couldn't find an available UDC - added [g_serial] to list of pending drivers

    Regarding USB port1, I heard, communication-module is attached to this port.

    Best regards,

    Miyazaki

  • Miyazaki,

    Takayuki Miyazaki said:
     udc-core: couldn't find an available UDC - added [g_serial] to list of pending drivers

    This doesn't make sense. Has the customer changed anything in software since 11/01? Is the chkusb.sh script output still the same as before which you attached on 11/1? When this error happens, what is the output of command "ls /sys/class/udc/"?

    Takayuki Miyazaki said:
    Regarding USB port1, I heard, communication-module is attached to this port.

    Okay. Thanks.

  • Hi Bin,

    when customer carried out "modprobe g_serial", it seems the error occurs. I don't believe customer changed anything on software, however, please let me confirm it. An then, I'll ask customer your questions. 

    Best regards,

    Miyazaki

  • Hi Bin,

    I received customer’s response. Regarding above error-message, it seems customer has verified this with other board which did not have OTG device tree configuration. sorry for confusing you… Customer was verifying OGT function again, after they configured OTG device tree / they added “modeprobe g_serial” to execute-script “/etc/rc.local”. However, OTG function does not work well, yet..

    1. After boot-up, customer attached USB-Flash to their board and customer was able to confirm it worked fine.
    2. And then, customer has done “umount” for USB-Flash and customer connected their board to PC with OTG-cable.
    3. However, PCs (Ubuntu 18.04 or Windows10) did not recognize their board (Serial-port). Customer already confirmed there was “/dev/ttyGS0” in their AM335x Linux

    Can we have your Expert’s advice/comments on this, please?

    When customer connected their board to PC with OTG-cable after boot-up, PC was able to recognize their board as Serial-port. After that, when customer attached USB-Flash to their board, AM335x was able to work as Host.

    Best regards, Miyazaki

  • Hi Miyazaki,

    Sounds like some cases work but some don't.

    Takayuki Miyazaki said:
    • After boot-up, customer attached USB-Flash to their board and customer was able to confirm it worked fine.
    • And then, customer has done “umount” for USB-Flash and customer connected their board to PC with OTG-cable.

    In this failure case, after umount the USB-Flash and before connect the board to PC, please run the following command on the board and provide its output.

    root@am335x-evm:~# grep -i 'power\|devctl' /sys/kernel/debug/musb-hdrc.0/regdump

    then connect the board to the PC, run the same command again and provide its output. I want to check the register values before and after connect the board to the PC.

  • Hi Bin,

    Thanks for your comments on this quickly. I'm requesting customer to get those logs with above command. I'll share them after I'll get them.

    Best regards, Miyazaki

  • Hi Bin,

    I received output-logs from customer.

    //after umount the USB-Flash and before connect the board to PC
    
    [ 3194.283007] [EXFAT] unmounted successfully
    
    $ grep -i 'power\|devctl' /sys/kernel/debug/musb-hdrc.0/regdump
    
    Power       : f0
    
    DevCtl     : 5d
    
     
    # unplug USB Flash
    
    $ [ 3200.158024] usb 1-1: USB disconnect, device number 12
    
    [ 3200.186537] sd 0:0:0:0: [sda] Synchronizing SCSI cache
    
    [ 3200.199669] sd 0:0:0:0: [sda] Synchronize Cache(10) failed: Result: hostbyte=0x01 driverbyte=0x00
    
    $ grepp -i 'power\|devctl' /sys/kernel/debug/musb-hdrc.0/regdump
    
    Power       : f0
    
    DevCtl     : 98
    
     
    # connect cable to pc
    
    $ grep -i 'power\|devctl' /sys/kernel/debug/musb-hdrc.0/regdump
    
    Power       : f0
    
    DevCtl     : 99
    

    Also, customer noticed the following behavior.

    Customer is waiting for about 25 seconds after removing USB Flash. And then, when their board connected to PC with OTG cable, PC(Host) recognized their board as USB device successfully. Of cause, customer is not able to accept this behavior... Anyway, since this log may include hints of solution, I'd like to share it.

    [ 3399.962818] [EXFAT] unmounted successfully
    
    $ grep -i 'power\|devctl' /sys/kernel/debug/musb-hdrc.0/regdump
    
    Power       : f0
    
    DevCtl     : 5d
    
    
    # unplug USB Flash
    
    $ [ 3418.381622] usb 1-1: USB disconnect, device number 13
    
    [ 3418.412787] sd 0:0:0:0: [sda] Synchronizing SCSI cache
    
    [ 3418.418273] sd 0:0:0:0: [sda] Synchronize Cache(10) failed: Result: hostbyte=0x01 driverbyte=0x00
     
    
    $ grep -i 'power\|devctl' /sys/kernel/debug/musb-hdrc.0/regdump
    
    Power       : f0
    
    DevCtl     : 91
     
    
    $ grep -i 'power\|devctl' /sys/kernel/debug/musb-hdrc.0/regdump
    
    Power       : e0
    
    DevCtl     : 88
     
    
    # connect cable to PC
    
    
    $ [ 3492.298995] g_serial gadget: high-speed config #2: CDC ACM config
    
    
    $ grep -i 'power\|devctl' /sys/kernel/debug/musb-hdrc.0/regdump
    
    Power       : f0
    
    DevCtl     : 99
    

     

    Best regards,

    Miyazaki

  • Hi Miyazaki,

    Thanks for the update. The register dump tells the VBUS discharge is too slow when unplugged the USB flash drive. The USB port works after waited for 25 seconds also confirms the root cause. Please improve the VBUS discharge path.

    I reviewed the custom board schematics and noticed the CAP C903 shouldn't be there. The 150uF CAP should only be used on a host-only port, but not on a dual-role port. Please remove either C903 or R905.

  • Hi Bin,

    Thank you for your consideration of this issue. It makes sense. I’ll share your advice with customer. I’d like to wait for their feedback a couple of days.

    Best regards,

    Miyazaki

  • Hi Bin,

    Customer confirmed this issue was resolved. I really appreciate your help.

    Thanks a lot.

    Best regards, Miyazaki

  • I am glad the issue is solved. Thanks for the update.