On Fri, 2023-03-10 at 22:58 +0000, Thinh Nguyen wrote: > On Fri, Mar 10, 2023, Joakim Tjernlund wrote: > > On Thu, 2023-03-09 at 21:09 +0000, Thinh Nguyen wrote: > > > On Thu, Mar 09, 2023, Joakim Tjernlund wrote: > > > > On Thu, 2023-03-09 at 19:56 +0000, Thinh Nguyen wrote: > > > > > On Thu, Mar 09, 2023, Joakim Tjernlund wrote: > > > > > > On Thu, 2023-03-09 at 17:32 +0100, Joakim Tjernlund wrote: > > > > > > > On Wed, 2023-03-08 at 22:26 +0100, Joakim Tjernlund wrote: > > > > > > > > On Wed, 2023-03-08 at 19:58 +0100, gregkh@xxxxxxxxxxxxxxxxxxx wrote: > > > > > > > > > On Wed, Mar 08, 2023 at 06:12:51PM +0000, Joakim Tjernlund wrote: > > > > > > > > > > On Wed, 2023-03-08 at 18:25 +0100, Greg KH wrote: > > > > > > > > > > > On Wed, Mar 08, 2023 at 05:10:17PM +0000, Joakim Tjernlund wrote: > > > > > > > > > > > > SNIP ... > > > > > > While I remember, I tried to create both a NCM and a ttyACM on top of my dwc3 gadget > > but then I got som bind error when activating the UDC. Is that expected ? > > I figured both could live on the same device and would just mux the two protocols. > > > > I'm not clear what you meant here. The gadget driver and the UDC driver > should be separated and abstracted from each other. > > Also, please note that all this talking points are based on the > assumption that the issue is due to the host putting the device in > suspend base on your experiment. We didn't review the logs. > > IMO, the best option should be to prevent suspend from the host side as > it looks like your device may operate in usb3 speed also? > > BR, > Thinh This script best explain I think: #! /bin/sh stop() { g="/sys/kernel/config/usb_gadget/g1" if [ -e "${g}"/UDC ]; then echo "" > "${g}"/UDC rm -f "${g}"/os_desc/c.1 rm -f "${g}"/configs/c.1/ncm.usb0 rm -f "${g}"/configs/c.1/acm.GS0 [ -d "${g}"/configs/c.1/strings/0x409 ] && rmdir "${g}"/configs/c.1/strings/0x409 [ -d "${g}"/functions/acm.GS0 ] && rmdir "${g}"/functions/acm.GS0 [ -d "${g}"/functions/ncm.usb0 ] && rmdir "${g}"/functions/ncm.usb0 [ -d "${g}"/c.1/strings ] && rmdir "${g}"/c.1/strings [ -d "${g}"/c.1/strings/0x409 ] && rmdir "${g}"/c.1/strings/0x409 [ -d "${g}"/configs/c.1 ] && rmdir "${g}"/configs/c.1 [ -d "${g}" ] && rmdir "${g}" fi } start() { mkdir -p /sys/kernel/config/usb_gadget/g1 cd /sys/kernel/config/usb_gadget/g1 ############################### # Populate Device-Level Stuff # ############################### #Setting device class/subclass/protocol to these values # alerts the OS that this is a composite device with # IADs in it's firmware. # ref: https://docs.microsoft.com/en-us/windows-hardware/drivers/usbcon/usb-interface-association-descriptor echo "0xEF" > bDeviceClass echo "0x02" > bDeviceSubClass echo "0x01" > bDeviceProtocol echo "0x15A2" > idVendor echo "0x0001" > idProduct #mkdir strings/0x409 #echo "1234567" > strings/0x409/serialnumber #echo "Infinera" > strings/0x409/manufacturer #echo "NDU" > strings/0x409/product #enable use of os_desc's (important for RNDIS & NCM enablement on Windows): echo 1 > os_desc/use echo 0xbc > os_desc/b_vendor_code #or 0xcd ? echo MSFT100 > os_desc/qw_sign ################################# # Populate Individual Functions # ################################# #The order functions are populated here will be reflected in the # order of descriptors written. ######### # RNDIS # ######### #Note! If RNDIS is enabled, it *has* to be the first function! Otherwise, Windows 10 will report error 10 (failed to start device). # (It's unclear why this is the case..) # https://docs.microsoft.com/en-us/answers/questions/474108/does-rndis-need-to-be-listed-as-the-first-function.html # https://stackoverflow.com/questions/68365739/windows-rndis-compatible-device-does-rndis-need-to-be-listed-as-the-first-funct if [ 0 = 1 ] then mkdir functions/rndis.usb0 mkdir -p functions/rndis.usb0/os_desc/interface.rndis # Set compatible / sub-compatible id's so that Windows can match this # function to RNDIS6 driver more easily. echo RNDIS > functions/rndis.usb0/os_desc/interface.rndis/compatible_id echo 5162001 > functions/rndis.usb0/os_desc/interface.rndis/sub_compatible_id mkdir -p configs/c.1 mkdir -p configs/c.1/strings/0x409 echo "0xC0" > configs/c.1/bmAttributes # Self powered echo "conf1" > configs/c.1/strings/0x409/configuration ln -s functions/rndis.usb0 configs/c.1 if [ ! -L os_desc/c.1 ] then ln -s configs/c.1 os_desc fi fi ######### # NCM # ######### #Usually I test with *either* RNDIS or NCM enabled, but not both, hence the if(0) here.. if [ 1 = 1 ] then mkdir functions/ncm.usb0 mkdir -p functions/ncm.usb0/os_desc/interface.ncm # Set compatible id so that Windows 10 can match this function to # NCM driver more easily. echo WINNCM > functions/ncm.usb0/os_desc/interface.ncm/compatible_id mkdir -p configs/c.1 mkdir -p configs/c.1/strings/0x409 echo "0xC0" > configs/c.1/bmAttributes # Self powered echo "conf1" > configs/c.1/strings/0x409/configuration ln -s functions/ncm.usb0 configs/c.1 if [ ! -L os_desc/c.1 ] then ln -s configs/c.1 os_desc fi fi ######### # ACM # ######### if [ 1 = 1 ] then mkdir -p functions/acm.GS0 mkdir -p configs/c.1 mkdir -p configs/c.1/strings/0x409 echo "0xC0" > configs/c.1/bmAttributes # Self powered ln -fs functions/acm.GS0 configs/c.1 if [ ! -L os_desc/c.1 ] then ln -s configs/c.1 os_desc fi fi #Activate/bind USB gadget echo 2f00000.usb > UDC } command=$@ case ${command} in start) echo "Starting usb-lc" start #ifconfig lc 169.254.100.101 netmask 255.255.255.252 # for debug ;; stop) echo "Stopping usb-lc" stop ;; restart) stop start ;; *) echo "Create USB Gadget device dual NCM and rndis V0.1.1 for MAC, Linux and Windows" exit 1 ;; esac This gives me an error: ./config_gadget.sh start Starting usb-lc sh: write error: Device or resource busy the line causing that is: echo 2f00000.usb > UDC Just create either NCM or ACM works, but not both