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.

AM3358: USB1 otg mode is not working when USB1_ID pin is grounded

Part Number: AM3358

Hi,

I would like to activate OTG on our board based on beaglebone black. In device tree I mentioned this:

&usb {
	status = "okay";
};

&usb_ctrl_mod {
	status = "okay";
};

&usb0_phy {
	status = "okay";
};

&usb1_phy {
	status = "okay";
};

&usb0 {
	status = "okay";
	dr_mode = "peripheral";
	interrupts-extended = <&intc 18 &tps 0>;
	interrupt-names = "mc", "vbus";
};

&usb1 {
	status = "okay";
	dr_mode = "otg";
};

&cppi41dma  {
	status = "okay";
};

When I boot and check the register USB1MODE I got value 0x00000100. According the TRM it should be driven by the USB1_ID pin.

However when I grounded the USB1_ID pin, USB_DRVVBUS is not raised.

If I set the dr_mode to "host" then after boot I have USB_DRVVBUS pin high and I can connect usb flash drive. The USB1MODE register is 0x00000080.

I am using mainline linux 4.19.68.

Here is the USB snippet of my defconfig:

# CONFIG_USB_NET_DRIVERS is not set
# CONFIG_SND_USB is not set
# CONFIG_USB_HID is not set
CONFIG_USB=y
CONFIG_USB_ANNOUNCE_NEW_DEVICES=y
CONFIG_USB_OTG=y
CONFIG_USB_XHCI_HCD=y
CONFIG_USB_XHCI_PLATFORM=y
CONFIG_USB_EHCI_HCD=y
CONFIG_USB_OHCI_HCD=y
CONFIG_USB_OHCI_HCD_PLATFORM=y
CONFIG_USB_STORAGE=y
CONFIG_USB_MUSB_HDRC=y
CONFIG_USB_MUSB_OMAP2PLUS=y
CONFIG_USB_MUSB_DSPS=y
CONFIG_USB_INVENTRA_DMA=y
CONFIG_USB_TI_CPPI41_DMA=y
CONFIG_NOP_USB_XCEIV=y
CONFIG_AM335X_PHY_USB=y
CONFIG_USB_GPIO_VBUS=m
CONFIG_USB_GADGET=y
CONFIG_USB_GADGET_STORAGE_NUM_BUFFERS=32
CONFIG_USB_CONFIGFS=y
CONFIG_USB_CONFIGFS_SERIAL=y
CONFIG_USB_CONFIGFS_ACM=y
CONFIG_USB_CONFIGFS_OBEX=y
CONFIG_USB_CONFIGFS_NCM=y
CONFIG_USB_CONFIGFS_ECM=y
CONFIG_USB_CONFIGFS_ECM_SUBSET=y
CONFIG_USB_CONFIGFS_RNDIS=y
CONFIG_USB_CONFIGFS_EEM=y
CONFIG_USB_CONFIGFS_MASS_STORAGE=y
CONFIG_USB_CONFIGFS_F_LB_SS=y
CONFIG_USB_CONFIGFS_F_FS=y
CONFIG_USB_CONFIGFS_F_UAC1=y
CONFIG_USB_CONFIGFS_F_UAC1_LEGACY=y
CONFIG_USB_CONFIGFS_F_UAC2=y
CONFIG_USB_CONFIGFS_F_MIDI=y
CONFIG_USB_CONFIGFS_F_HID=y
CONFIG_USB_CONFIGFS_F_PRINTER=y
CONFIG_USB_ETH=y
CONFIG_USB_ROLE_SWITCH=y
CONFIG_OMAP_USB2=m

Any idea what can be wrong?

  • Hi Petr,

    For dr_mode = 'peripheral' and dr_mode = 'otg', please ensure you have loaded a USB gadget driver. This is also required for otg port to detect attached USB devices.

    Since your DT shows usb0 is in peripheral mode, and usb1 is in otg mode, you would have to load two different USB gadget drivers, one for each port.

  • Hi Bin,

    I changed dr_mode to 'otg' for usb0. But it still doesn't work. USB Gadget driver is included in the kernel.

    Is there a way how to force driver via SW way to initiate host mode over otg?

  • I noticed one thing that USB1_ID when floating is aprox. at 377mV level. Shoud not this pin be high?

    How the usb module recognizes that the pin was grounded?

  • Hi Petr,

    I changed dr_mode to 'otg' for usb0.

    I didn't mean you need to change this. You set the mode based on your usecase.

    USB Gadget driver is included in the kernel.

    I mentioned a gadget driver should be "loaded" to memory, not just sits in the root filesystem. Please run the following commands on linux console then test your usb device.

    # modprobe g_zero
    # modprobe g_ether

  • Hi Bin,

    after execution I got following answer:

    modprobe: module g_zero not found in modules.dep

    But as I said usb gadget is built in in a kernel so its not an module.

  • Hi Petr,

    Okay, please run the following script on your board 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.2
    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 -L $DTPATH -name 'usb@48390000')"
                USB1DT="$(find -L $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/ti/phy-omap-control'
    
        check_kernel_config "$_opts" CONFIG_OMAP_USB2
        [ $? != 1 ] || check_module 'phy/ti/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
    

  • oh I see now, as I use nfs over usb I set USB_ETH and I can't select now USB_ZERO or USB_MASS_STORAGE.

    I will try it without nfs boot over usb to use usb as module and let you know.

    Am I right if I say that its not possible to use nfs over usb and otg with mass storage together?

  • Am I right if I say that its not possible to use nfs over usb and otg with mass storage together?

    It is not directly associated with nfs over usb, but about kernel built in usb gadget driver, which is needed for nfs over usb.

    In your USB configuration, each of the USB ports needs a USB gadget driver, but there is only one gadget driver available when built usb gadget into the kernel image, so this is the conflict.

  • Clear I will try without nfs boot over USB to check.

    Meanwhile I executed your script but as I do not have bash in my rootfs I got following error

    root@tsp-transceiver:~# ./usb_check.sh
    ./usb_check.sh: line 234: DBG_PRINT: not found
    ./usb_check.sh: line 5: syntax error: unterminated quoted string

  • Okay, then ignore this script. It basically exam many factors in usb configuration in Linux, but I believe your issue is due to usb gadget built in kernel. Let me know if it works when build usb gadget as modules and load two different usb gadget drivers.

  • Hi Bin,

    I compiled USB as module based and indeed grounding the USB1_ID pin will raise the USB_DRVVBUS. However my flash disk is not loaded and within a second or two USB_DRVVBUS falls to low. After a second it raises again to high and it repeats like this all the time.

    Here is lsmod result:

        Not tainted
    roles 16384 0 - Live 0xbf39b000
    ohci_platform 16384 0 - Live 0xbf392000
    ohci_hcd 40960 1 ohci_platform, Live 0xbf382000
    ehci_omap 16384 0 - Live 0xbf379000
    ehci_hcd 57344 1 ehci_omap, Live 0xbf365000
    usb_storage 53248 0 - Live 0xbf34e000
    usb_f_mass_storage 40960 0 - Live 0xbf33d000
    usb_f_ecm 16384 1 - Live 0xbf334000
    g_ether 16384 0 - Live 0xbf32b000
    usb_f_rndis 24576 2 g_ether, Live 0xbf31f000
    u_ether 20480 3 usb_f_ecm,g_ether,usb_f_rndis, Live 0xbf316000
    usb_f_ss_lb 24576 2 - Live 0xbf30b000
    g_zero 16384 0 - Live 0xbf302000
    libcomposite 53248 6 usb_f_mass_storage,usb_f_ecm,g_ether,usb_f_rndis,usb_f_ss_lb,g_zero, Live 0xbf2ed000
    arc4 16384 2 - Live 0xbf2e5000
    wl18xx 98304 0 - Live 0xbf2c3000
    wlcore 188416 1 wl18xx, Live 0xbf288000
    mac80211 385024 2 wl18xx,wlcore, Live 0xbf213000
    sha256_arm 24576 0 - Live 0xbf209000
    sha256_generic 20480 0 - Live 0xbf200000
    cfg80211 262144 3 wl18xx,wlcore,mac80211, Live 0xbf1ae000
    musb_dsps 20480 0 - Live 0xbf19a000
    musb_hdrc 102400 1 musb_dsps, Live 0xbf178000
    usbcore 208896 6 ohci_platform,ohci_hcd,ehci_omap,ehci_hcd,usb_storage,musb_hdrc, Live 0xbf0ec000
    phy_am335x 16384 2 - Live 0xbf0dc000
    udc_core 28672 8 usb_f_mass_storage,usb_f_ecm,usb_f_rndis,u_ether,usb_f_ss_lb,g_zero,libcomposite,musb_hdrc, Live 0xbf0cf000
    phy_generic 16384 1 phy_am335x, Live 0xbf0bf000
    usb_common 16384 6 libcomposite,musb_dsps,musb_hdrc,usbcore,phy_am335x,udc_core, Live 0xbf0b1000
    phy_am335x_control 16384 1 phy_am335x, Live 0xbf0a9000
    pm33xx 16384 0 - Live 0xbf0a1000
    wkup_m3_ipc 16384 1 pm33xx, Live 0xbf098000
    wkup_m3_rproc 16384 1 - Live 0xbf090000
    remoteproc 40960 2 wkup_m3_ipc,wkup_m3_rproc, Live 0xbf07f000
    omap_aes_driver 24576 0 - Live 0xbf074000
    virtio 16384 1 remoteproc, Live 0xbf06c000
    crypto_engine 16384 1 omap_aes_driver, Live 0xbf064000
    virtio_ring 24576 1 remoteproc, Live 0xbf05a000
    omap_crypto 16384 1 omap_aes_driver, Live 0xbf053000
    omap_sham 28672 0 - Live 0xbf047000
    ti_emif_sram 16384 1 pm33xx, Live 0xbf03f000
    bq27xxx_battery_i2c 20480 0 - Live 0xbf035000
    bq27xxx_battery 20480 1 bq27xxx_battery_i2c, Live 0xbf02c000
    wlcore_sdio 16384 0 - Live 0xbf012000
    musb_am335x 16384 0 [permanent], Live 0xbf00a000
    at24 20480 0 - Live 0xbf000000
    

  • Oh very strange thing. When I rotated my USB-C flash drive by 180 degree it works now. It seems that my flash drive is connected only for one side or our usb-c port is wrongly connected. Nevertheless with good orientation it works and flash drive is loaded.

  • Hi Petr,

    Glad to hear the sw issue is solved. Thanks for the update.