最終更新:2017-06-15 (木) 16:25:26 (102d)  

Linux/USBガジェット はてなブックマークを見る
Top / Linux / USBガジェット

ドキュメント

kernel.org

その他

スライド

メモ

  • only one function at a time is accessible via USB.
  • The USB gadget framework supports only a single controller at a time.

USBホスト機能との比較

共通点

  • 使う構造体とか

違い

主な構造体

usb_gadget - デバイス自体

  • Linux/USBコントローラドライバ(r8a66597とかdwc3)のメンバ。
    struct usb_gadget {
            struct work_struct              work;
            /* readonly to gadget driver */
            const struct usb_gadget_ops     *ops;
            struct usb_ep                   *ep0;
            struct list_head                ep_list;        /* of usb_ep */
            enum usb_device_speed           speed;
            enum usb_device_speed           max_speed;
            enum usb_device_state           state;
            const char                      *name;
            struct device                   dev;
            unsigned                        out_epnum;
            unsigned                        in_epnum;
    
            unsigned                        sg_supported:1;
            unsigned                        is_otg:1;
            unsigned                        is_a_peripheral:1;
            unsigned                        b_hnp_enable:1;
            unsigned                        a_hnp_support:1;
            unsigned                        a_alt_hnp_support:1;
            unsigned                        quirk_ep_out_aligned_size:1;
    };
  • usb_gadget_ops
  • usb_ep

usb_gadget_driver - デバイスの機能の管理

  • driver for usb 'slave' devices
    struct usb_gadget_driver {
            char                    *function;
            enum usb_device_speed   max_speed;
            int                     (*bind)(struct usb_gadget *gadget,
                                            struct usb_gadget_driver *driver);
            void                    (*unbind)(struct usb_gadget *);
            int                     (*setup)(struct usb_gadget *,
                                            const struct usb_ctrlrequest *);
            void                    (*disconnect)(struct usb_gadget *);
            void                    (*suspend)(struct usb_gadget *);
            void                    (*resume)(struct usb_gadget *);
    
            /* FIXME support safe rmmod */
            struct device_driver    driver;
    };
  • usb_gadget_driver.bind
  • usb_gadget_driver.setup

usb_ep - ハードウェアの管理

  • device side representation of USB endpoint
    struct usb_ep {
            void                    *driver_data;
    
            const char              *name;
            const struct usb_ep_ops *ops;
            struct list_head        ep_list;
            unsigned                maxpacket:16;
            unsigned                maxpacket_limit:16;
            unsigned                max_streams:16;
            unsigned                mult:2;
            unsigned                maxburst:5;
            u8                      address;
            const struct usb_endpoint_descriptor    *desc;
            const struct usb_ss_ep_comp_descriptor  *comp_desc;
    };
  • usb_ep_ops
  • usb_endpoint_descriptor
  • usb_ss_ep_comp_descriptor?

usb_request - 転送の管理

  • holds essential information for transfers.
    struct usb_request {
            void                    *buf;
            unsigned                length;
            dma_addr_t              dma;
    
            struct scatterlist      *sg;
            unsigned                num_sgs;
            unsigned                num_mapped_sgs;
    
            unsigned                stream_id:16;
            unsigned                no_interrupt:1;
            unsigned                zero:1;
            unsigned                short_not_ok:1;
    
            void                    (*complete)(struct usb_ep *ep,
                                            struct usb_request *req);
            void                    *context;
            struct list_head        list;
    
            int                     status;
            unsigned                actual;
    };
  • usb_request.complete?

構成

  • 3つのレイヤからなる。

Linux/USBコントローラドライバ

  • The <linux/usb/gadget.h> API abstracts the peripheral controller endpoint hardware.
  • レジスタ、FIFO,DMA,割り込みの処理を行う。
  • 構造体
    • endpoint?
  • コールバックを通してガジェットドライバとやりとりをする。
  • USBコントローラ

コントローラのHAL

Linux/USBガジェットドライバ

アプリケーション層

関連するサブシステム

USB/エニュメレーション

ドライバ

ファイルシステム

configfs

  • Linux 3.11
  • Userspace-driven kernel object configuration.
  • interface that allows definition of arbitrary functions and configurations to define an application specific USB composite device from userspace.
  • The gadget framework is transitioning to use configfs for its configuration
    # Setup the device (configfs)
    modprobe libcomposite
    mkdir -p config
    mount none config -t configfs
    cd config/usb_gadget/
    
    # Setup functionfs
    mkdir functions/ffs.usb0
    ln -s functions/ffs.usb0 configs/c.1
    
    cd ../../../
    mkdir -p ffs
    mount usb0 ffs -t functionfs
    cd ffs
    ../ffs-test 64 & # from the Linux kernel, with mods!
    sleep 3
    cd ..
    # Enable the USB device
    echo musb-hdrc.0.auto >config/usb_gadget/g1/UDC

FunctionFS

  • Compositable version of gadgetfs
  • rewrite of GadgetFS to support userspace gadget functions that canbe combined into a USB composite gadget.
  • Linux 3.5
    mount -t functionfs mtp /dev/ffs-mtp
  • ディスクリプタを設定するのに、ep0に書き込む方法とconfigfsを使う方法がある。

gadgetfs

  • original monolithic kernel driver that provides an interface to implement userspace gadget drivers
  • CONFIG_USB_GADGETFS (Linux 2.6.0?〜、Late 2003〜)
  • Provides User-Mode API
  • Each endpoint presented as single I/O file descriptor
  • Normal read() and write() calls
  • Async I/O supported
  • Configuration and descriptors written into files

歴史

  • Early 2003
    • ガジェットフレームワーク登場、g_zero?,g_ether
  • Late 2003
    • getgetfs?登場
  • 2008
    • コンポジットフレームワーク追加
  • 2010

ソースコード

linux/usb/gadget.h - Core Objects and Methods

linux/usb/ch9.h

  • usb_speed_string?
  • usb_state_string?

linux/usb/composite.h - Composite Device Framework

  • 複合デバイス
    • usb_function - describes one function of a configuration
    • usb_configuration? - represents one gadget configuration
    • usb_composite_driver - groups configurations into a gadget
    • usb_composite_dev? - represents one composite usb gadget

drivers/usb/gadget

Composite Device Functions

  • drivers/usb/gadget/f_acm.c?
  • drivers/usb/gadget/f_ecm.c?
  • drivers/usb/gadget/f_subset.c?
  • drivers/usb/gadget/f_obex.c?
  • drivers/usb/gadget/f_serial.c?

ライフサイクル

  • デバイスコントローラにドライバを登録
  • ガジェットドライバをバインド
  • エニュメレーション
  • ディスクリプタを返す
  • 通信
  • アンバインド

Linux/USBガジェット/モジュール

Linux/USBガジェット/マスストレージ

Linux/HID

ODROID-X2

ODROID Magazine

  • 2月号

OMAP5432 EVM

Android

参考