Modern USB Gadget with Custom USB Functions

Modern USB Gadget with Custom USB Functions

Modern USB Gadget with Custom USB Functions... ...and its integration with systemd Andrzej Pietrasiewicz <[email protected]> Linux Piter 2019 USB Device user? A Linux machine connected to a PC 2 Overview ● Composition and components + your own USB functionality ● Tools ● systemd integration + your own USB functionality 3 Composition and components 4 Endpoints ● Control 0 0 1 1 2 2 ● Bulk USB Data for “1” USB HOST DEVICE ● Interrupt ● Isochronous 5 Interface ● Collection of endpoints for a particular purpose ● Implemented as “USB function” in Linux kernel 6 Configuration ● Collection of 1+ interface(s) ● Device contains 1+ configuration(s) – Only 1 active at a time – Rarely > 1 7 FunctionFS ● A USB function ● A filesystem with ep0 and epX…. 8 Theoretical # combinations 20 + 20 + 20 +...+ 20 =A LOT ( 1 ) ( 2 ) ( 3 ) (20) 9 Tools 10 Configfs ● /sys/kernel/config/usb_gadget ● mkdir, echo, ln -s, rmdir 11 mkdir g1 cd g1 echo 0x1d6b > idVendor echo 0x104 > idProduct mkdir strings/0x409 # US English, others rarely seen echo "Collabora" > strings/0x409/manufacturer echo "ECM" > strings/0x409/product mkdir configs/c.1 # dot and number mandatory mkdir functions/ecm.usb0 ln -s functions/ecm.usb0/ configs/c.1/ # bind! # ls /sys/class/udc to see available UDCs echo 12480000.hsotg > UDC 12 mkdir g1 cd g1 echo 0x1d6b > idVendor echo 0x104 > idProduct mkdir strings/0x409 # US English, others rarely seen echo "Collabora" > strings/0x409/manufacturer echo "ECM" > strings/0x409/product mkdir configs/c.1 # dot and number mandatory mkdir functions/ecm.usb0 ln -s functions/ecm.usb0/ configs/c.1/ # bind! # ls /sys/class/udc to see available UDCs echo 12480000.hsotg > UDC 13 mkdir g1 cd g1 echo 0x1d6b > idVendor echo 0x104 > idProduct mkdir strings/0x409 # US English, others rarely seen echo "Collabora" > strings/0x409/manufacturer echo "ECM" > strings/0x409/product mkdir configs/c.1 # dot and number mandatory mkdir functions/ecm.usb0 ln -s functions/ecm.usb0/ configs/c.1/ # bind! # ls /sys/class/udc to see available UDCs echo 12480000.hsotg > UDC 14 mkdir g1 cd g1 echo 0x1d6b > idVendor echo 0x104 > idProduct mkdir strings/0x409 # US English, others rarely seen echo "Collabora" > strings/0x409/manufacturer echo "ECM" > strings/0x409/product mkdir configs/c.1 # dot and number mandatory mkdir functions/ecm.usb0 ln -s functions/ecm.usb0/ configs/c.1/ # bind! # ls /sys/class/udc to see available UDCs echo 12480000.hsotg > UDC 15 mkdir g1 cd g1 echo 0x1d6b > idVendor echo 0x104 > idProduct mkdir strings/0x409 # US English, others rarely seen echo "Collabora" > strings/0x409/manufacturer echo "ECM" > strings/0x409/product mkdir configs/c.1 # dot and number mandatory mkdir functions/ecm.usb0 ln -s functions/ecm.usb0/ configs/c.1/ # bind! # ls /sys/class/udc to see available UDCs echo 12480000.hsotg > UDC 16 mkdir g1 cd g1 echo 0x1d6b > idVendor echo 0x104 > idProduct mkdir strings/0x409 # US English, others rarely seen echo "Collabora" > strings/0x409/manufacturer echo "ECM" > strings/0x409/product mkdir configs/c.1 # dot and number mandatory mkdir functions/ecm.usb0 ln -s functions/ecm.usb0/ configs/c.1/ # bind! # ls /sys/class/udc to see available UDCs echo 12480000.hsotg > UDC 17 gt ● github.com/kopasiak/gt ● github.com/libusbgx/libusbgx.git ● gadget “schemes” 18 attrs : { idVendor = 0x1D6B; idProduct = 0x104; }; strings = ( { lang = 0x409; manufacturer = "Collabora"; product = "ECM"; configs = ( } { ); id = 1; functions : name = "c"; { functions = ( ecm_usb0 : { { name = "ecm.usb0"; instance = "usb0"; function = "ecm_usb0"; type = "ecm"; } ); }; } ); }; 19 attrs : { idVendor = 0x1D6B; idProduct = 0x104; }; strings = ( { lang = 0x409; manufacturer = "Collabora"; product = "ECM"; configs = ( } { ); id = 1; functions : name = "c"; { functions = ( ecm_usb0 : { { name = "ecm.usb0"; instance = "usb0"; function = "ecm_usb0"; type = "ecm"; } ); }; } ); }; 20 attrs : { idVendor = 0x1D6B; idProduct = 0x104; }; strings = ( { lang = 0x409; manufacturer = "Collabora"; product = "ECM"; configs = ( } { ); id = 1; functions : name = "c"; { functions = ( ecm_usb0 : { { name = "ecm.usb0"; instance = "usb0"; function = "ecm_usb0"; type = "ecm"; } ); }; } ); }; 21 attrs : { idVendor = 0x1D6B; idProduct = 0x104; }; strings = ( { lang = 0x409; manufacturer = "Collabora"; product = "ECM"; configs = ( } { ); id = 1; functions : name = "c"; { functions = ( ecm_usb0 : { { name = "ecm.usb0"; instance = "usb0"; function = "ecm_usb0"; type = "ecm"; } ); }; } ); }; 22 attrs : { idVendor = 0x1D6B; idProduct = 0x104; }; strings = ( { lang = 0x409; manufacturer = "Collabora"; product = "ECM"; configs = ( } { ); id = 1; functions : name = "c"; { functions = ( ecm_usb0 : { { name = "ecm.usb0"; instance = "usb0"; function = "ecm_usb0"; type = "ecm"; } ); }; } ); }; 23 attrs : { idVendor = 0x1D6B; idProduct = 0x104; }; strings = ( { lang = 0x409; manufacturer = "Collabora"; product = "ECM"; configs = ( } { ); id = 1; functions : name = "c"; { functions = ( ecm_usb0 : { { name = "ecm.usb0"; instance = "usb0"; function = "ecm_usb0"; type = "ecm"; } ); }; } ); }; 24 systemd integration 25 systemd ● Various units – service, mount, target, socket, ... ● Tracked dependencies ● High parallelization ● Lazy initialization (socket units) 26 The “glue layer” ● usb-gadget.target ● udev event 27 The “glue layer” ● usb-gadget.target [Unit] Description=Hardware activated USB gadget Documentation=man:systemd.special(7) ● udev event 28 The “glue layer” ● usb-gadget.target [Unit] Description=Hardware activated USB gadget Documentation=man:systemd.special(7) ● udev event SUBSYSTEM=="udc", ACTION=="add", TAG+="systemd", \ ENV{SYSTEMD_WANTS}+="usb-gadget.target" 29 Service unit [Unit] Description=Load USB gadget scheme for ecm Requires=sys-kernel-config.mount After=sys-kernel-config.mount DefaultDependencies=no [Service] ExecStart=/bin/gt load ecm.scheme ecm RemainAfterExit=yes ExecStop=/bin/gt rm -rf ecm Type=simple [Install] WantedBy=usb-gadget.target 30 Service unit [Unit] Description=Load USB gadget scheme for ecm Requires=sys-kernel-config.mount After=sys-kernel-config.mount DefaultDependencies=no [Service] ExecStart=/bin/gt load ecm.scheme ecm RemainAfterExit=yes ExecStop=/bin/gt rm -rf ecm Type=simple [Install] WantedBy=usb-gadget.target 31 Service unit [Unit] Description=Load USB gadget scheme for ecm Requires=sys-kernel-config.mount After=sys-kernel-config.mount DefaultDependencies=no [Service] ExecStart=/bin/gt load ecm.scheme ecm RemainAfterExit=yes ExecStop=/bin/gt rm -rf ecm Type=simple [Install] WantedBy=usb-gadget.target 32 Service unit [Unit] Description=Load USB gadget scheme for ecm Requires=sys-kernel-config.mount After=sys-kernel-config.mount DefaultDependencies=no [Service] ExecStart=/bin/gt load ecm.scheme ecm RemainAfterExit=yes ExecStop=/bin/gt rm -rf ecm Type=simple [Install] WantedBy=usb-gadget.target 33 Service unit [Unit] Description=Load USB gadget scheme for ecm Requires=sys-kernel-config.mount After=sys-kernel-config.mount DefaultDependencies=no [Service] ExecStart=/bin/gt load ecm.scheme ecm RemainAfterExit=yes ExecStop=/bin/gt rm -rf ecm Type=simple [Install] WantedBy=usb-gadget.target 34 Service unit [Unit] Description=Load USB gadget scheme for ecm Requires=sys-kernel-config.mount After=sys-kernel-config.mount DefaultDependencies=no [Service] ExecStart=/bin/gt load ecm.scheme ecm RemainAfterExit=yes ExecStop=/bin/gt rm -rf ecm Type=simple [Install] WantedBy=usb-gadget.target systemctl [en|dis]able usb-gadget.service 35 Service unit [Unit] Description=Load USB gadget scheme for ecm Requires=sys-kernel-config.mount After=sys-kernel-config.mount DefaultDependencies=no [Service] ExecStart=/bin/gt load ecm.scheme ecm RemainAfterExit=yes ExecStop=/bin/gt rm -rf ecm Type=simple [Install] WantedBy=usb-gadget.target systemctl [en|dis]able usb-gadget.service 36 Service unit templatized [Unit] Description=Load USB gadget scheme for %i Requires=sys-kernel-config.mount After=sys-kernel-config.mount DefaultDependencies=no [Service] ExecStart=/bin/gt load %i.scheme %i RemainAfterExit=yes ExecStop=/bin/gt rm -rf %i Type=simple [Install] WantedBy=usb-gadget.target 37 Service unit templatized [Unit] Description=Load USB gadget scheme for %i Requires=sys-kernel-config.mount After=sys-kernel-config.mount DefaultDependencies=no [Service] ExecStart=/bin/gt load %i.scheme %i RemainAfterExit=yes ExecStop=/bin/gt rm -rf %i Type=simple [Install] WantedBy=usb-gadget.target systemctl [en|dis]able [email protected] 38 systemd integration Your own USB function 39 FunctionFS vs systemd ● Gadget scheme ● Service unit (create gadget, gt load -o) ● Mount unit (FunctionFS instance) ● Socket unit (start its service unit, enable the gadget) ● Service unit (spawn userspace daemon) 40 attrs : { idVendor = 0x1D6B; idProduct = 0x104; }; strings = ( { lang = 0x409; manufacturer = "Collabora"; product = "MTP Gadget"; configs = ( } { ); id = 1; functions : name = "c"; { functions = ( ffs_mtp : { { name = "ffs.mtp"; instance = "mtp"; function = "ffs_mtp"; type = "ffs"; } ); }; } ); }; 41 attrs : { idVendor = 0x1D6B; idProduct = 0x104; }; strings = ( { lang = 0x409; manufacturer = "Collabora"; product = "MTP Gadget"; configs = ( } { ); id = 1; functions : name = "c"; { functions = ( ffs_mtp : { { name = "ffs.mtp"; instance = "mtp"; function = "ffs_mtp"; type = "ffs"; } ); }; } ); }; 42 attrs : { idVendor = 0x1D6B; idProduct = 0x104; }; strings = ( { lang = 0x409; manufacturer = "Collabora"; product = "MTP Gadget"; configs = ( } { ); id = 1; functions : name = "c"; { functions = ( ffs_mtp : { { name =

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    62 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us