Gadget 測試

本文件總結了 Gadget 提供的 USB 功能的基本測試資訊。

1. ACM 功能

此功能由 usb_f_acm.ko 模組提供。

功能專用 configfs 介面

建立功能目錄時使用的功能名稱是“acm”。ACM 功能在其功能目錄中只提供一個屬性

port_num

此屬性為只讀。

系統中最多可以有 4 個 ACM/通用序列/OBEX 埠。

測試 ACM 功能

在主機上

cat > /dev/ttyACM<X>

在裝置上

cat /dev/ttyGS<Y>

然後反過來

在裝置上

cat > /dev/ttyGS<Y>

在主機上

cat /dev/ttyACM<X>

2. ECM 功能

此功能由 usb_f_ecm.ko 模組提供。

功能專用 configfs 介面

建立功能目錄時使用的功能名稱是“ecm”。ECM 功能在其功能目錄中提供以下屬性

ifname

與此功能例項關聯的網路裝置介面名稱

qmult

用於高速和超高速的佇列長度乘數

host_addr

此 USB 乙太網鏈路主機端的 MAC 地址

dev_addr

此 USB 乙太網鏈路裝置端的 MAC 地址

建立 functions/ecm.<例項名稱> 後,它們包含預設值:qmult 為 5,dev_addr 和 host_addr 隨機選擇。如果功能未繫結,則可以寫入 ifname。寫入必須是介面模式,例如“usb%d”,這將導致網路核心選擇下一個空閒的 usbX 介面。預設情況下,它設定為“usb%d”。

測試 ECM 功能

配置裝置和主機的 IP 地址。然後

在裝置上

ping <host's IP>

在主機上

ping <device's IP>

3. ECM 子集功能

此功能由 usb_f_ecm_subset.ko 模組提供。

功能專用 configfs 介面

建立功能目錄時使用的功能名稱是“geth”。ECM 子集功能在其功能目錄中提供以下屬性

ifname

與此功能例項關聯的網路裝置介面名稱

qmult

用於高速和超高速的佇列長度乘數

host_addr

此 USB 乙太網鏈路主機端的 MAC 地址

dev_addr

此 USB 乙太網鏈路裝置端的 MAC 地址

建立 functions/ecm.<例項名稱> 後,它們包含預設值:qmult 為 5,dev_addr 和 host_addr 隨機選擇。如果功能未繫結,則可以寫入 ifname。寫入必須是介面模式,例如“usb%d”,這將導致網路核心選擇下一個空閒的 usbX 介面。預設情況下,它設定為“usb%d”。

測試 ECM 子集功能

配置裝置和主機的 IP 地址。然後

在裝置上

ping <host's IP>

在主機上

ping <device's IP>

4. EEM 功能

此功能由 usb_f_eem.ko 模組提供。

功能專用 configfs 介面

建立功能目錄時使用的功能名稱是“eem”。EEM 功能在其功能目錄中提供以下屬性

ifname

與此功能例項關聯的網路裝置介面名稱

qmult

用於高速和超高速的佇列長度乘數

host_addr

此 USB 乙太網鏈路主機端的 MAC 地址

dev_addr

此 USB 乙太網鏈路裝置端的 MAC 地址

建立 functions/eem.<例項名稱> 後,它們包含預設值:qmult 為 5,dev_addr 和 host_addr 隨機選擇。如果功能未繫結,則可以寫入 ifname。寫入必須是介面模式,例如“usb%d”,這將導致網路核心選擇下一個空閒的 usbX 介面。預設情況下,它設定為“usb%d”。

測試 EEM 功能

配置裝置和主機的 IP 地址。然後

在裝置上

ping <host's IP>

在主機上

ping <device's IP>

5. FFS 功能

此功能由 usb_f_fs.ko 模組提供。

功能專用 configfs 介面

建立功能目錄時使用的功能名稱是“ffs”。該功能目錄有意為空且不可修改。

建立目錄後,系統中將有一個新的 FunctionFS 例項(一個“裝置”)可用。一旦“裝置”可用,使用者應遵循使用 FunctionFS 的標準程式(掛載它,執行實現該功能的完整使用者空間程序)。應透過向 usb_gadget//UDC 寫入合適的字串來啟用 gadget。

FFS 功能在其功能目錄中只提供一個屬性

ready

此屬性為只讀,表示功能是否準備好(1)使用,例如,如果使用者空間已將描述符和字串寫入 ep0,則可以啟用 gadget。

測試 FFS 功能

在裝置上:啟動功能的 Sigil 使用者空間守護程式,啟用 gadget

在主機上:使用裝置提供的 USB 功能

6. HID 功能

此功能由 usb_f_hid.ko 模組提供。

功能專用 configfs 介面

建立功能目錄時使用的功能名稱是“hid”。HID 功能在其功能目錄中提供以下屬性

protocol

要使用的 HID 協議

report_desc

HID 報告中要使用的資料,但透過 /dev/hidg 傳遞的資料除外

report_length

HID 報告長度

subclass

要使用的 HID 子類

對於鍵盤,協議和子類都是 1,report_length 是 8,而 report_desc 是

$ hd my_report_desc
00000000  05 01 09 06 a1 01 05 07  19 e0 29 e7 15 00 25 01  |..........)...%.|
00000010  75 01 95 08 81 02 95 01  75 08 81 03 95 05 75 01  |u.......u.....u.|
00000020  05 08 19 01 29 05 91 02  95 01 75 03 91 03 95 06  |....).....u.....|
00000030  75 08 15 00 25 65 05 07  19 00 29 65 81 00 c0     |u...%e....)e...|
0000003f

這樣的位元組序列可以使用 echo 儲存到屬性中

$ echo -ne \\x05\\x01\\x09\\x06\\xa1.....

測試 HID 功能

裝置

  • 建立 gadget

  • 將 gadget 連線到主機,最好不是用於控制該 gadget 的主機

  • 執行一個寫入 /dev/hidg 的程式,例如在Linux USB HID gadget 驅動程式中找到的使用者空間程式

    $ ./hid_gadget_test /dev/hidg0 keyboard
    

主機

  • 觀察來自 gadget 的按鍵

7. LOOPBACK 功能

此功能由 usb_f_ss_lb.ko 模組提供。

功能專用 configfs 介面

建立功能目錄時使用的功能名稱是“Loopback”。LOOPBACK 功能在其功能目錄中提供以下屬性

qlen

迴環佇列深度

bulk_buflen

緩衝區長度

測試 LOOPBACK 功能

裝置:執行 gadget

主機:test-usb (tools/usb/testusb.c)

8. 大容量儲存功能

此功能由 usb_f_mass_storage.ko 模組提供。

功能專用 configfs 介面

建立功能目錄時使用的功能名稱是“mass_storage”。大容量儲存功能在其目錄中提供以下屬性:檔案

stall

設定為允許功能停止批次端點。在一些已知無法正常工作的 USB 裝置上停用。您應該將其設定為 true。

num_buffers

管道緩衝區數量。有效數字為 2..4。僅在設定 CONFIG_USB_GADGET_DEBUG_FILES 時可用。

以及一個對應於 SCSI LUN #0 的預設 lun.0 目錄。

可以使用 mkdir 新增新的 LUN

$ mkdir functions/mass_storage.0/partition.5

LUN 編號不必連續,但預設建立的 LUN #0 除外。最多可以指定 8 個 LUN,並且它們都必須遵循 <名稱>.<數字> 方案命名。數字可以是 0..8。一個好的約定可能是將 LUN 命名為“lun.<數字>”,儘管這不是強制性的。

在每個 LUN 目錄中都有以下屬性檔案

file

LUN 後備檔案的路徑。如果 LUN 未標記為可移動,則必需。

ro

指定 LUN 訪問許可權為只讀的標誌。如果啟用了 CD-ROM 模擬以及無法以讀/寫模式開啟“filename”時,則隱含此設定。

removable

指定 LUN 應指示為可移動的標誌。

cdrom

指定 LUN 應報告為 CD-ROM 的標誌。

nofua

指定 SCSI WRITE(10,12) 中的 FUA 標誌的標誌

forced_eject

此只寫檔案僅在功能啟用時有用。它導致後備檔案從 LUN 中強制分離,無論主機是否允許。寫入任何非零位元組數都將導致彈出。

測試大容量儲存功能

裝置:連線 gadget,啟用它 主機:dmesg,檢視 USB 驅動器出現(如果系統配置為自動掛載)

9. MIDI 功能

此功能由 usb_f_midi.ko 模組提供。

功能專用 configfs 介面

建立功能目錄時使用的功能名稱是“midi”。MIDI 功能在其功能目錄中提供以下屬性

buflen

MIDI 緩衝區長度

id

USB MIDI 介面卡的 ID 字串

in_ports

MIDI 輸入埠數量

index

USB MIDI 介面卡的索引值

out_ports

MIDI 輸出埠數量

qlen

USB 讀取請求佇列長度

測試 MIDI 功能

有兩種情況:從 gadget 播放 MIDI 到主機,以及從主機播放 MIDI 到 gadget。

  1. 從 gadget 播放 MIDI 到主機

主機

$ arecordmidi -l
 Port    Client name                      Port name
 14:0    Midi Through                     Midi Through Port-0
 24:0    MIDI Gadget                      MIDI Gadget MIDI 1
$ arecordmidi -p 24:0 from_gadget.mid

gadget

$ aplaymidi -l
 Port    Client name                      Port name
 20:0    f_midi                           f_midi

$ aplaymidi -p 20:0 to_host.mid
  1. 從主機播放 MIDI 到 gadget

gadget

$ arecordmidi -l
 Port    Client name                      Port name
 20:0    f_midi                           f_midi

$ arecordmidi -p 20:0 from_host.mid

主機

$ aplaymidi -l
 Port    Client name                      Port name
 14:0    Midi Through                     Midi Through Port-0
 24:0    MIDI Gadget                      MIDI Gadget MIDI 1

$ aplaymidi -p24:0 to_gadget.mid

from_gadget.mid 的聲音應與 to_host.mid 相同。

from_host.mid 的聲音應與 to_gadget.mid 相同。

MIDI 檔案可以使用例如已安裝的 timidity 播放到揚聲器/耳機

$ aplaymidi -l
 Port    Client name                      Port name
 14:0    Midi Through                     Midi Through Port-0
 24:0    MIDI Gadget                      MIDI Gadget MIDI 1
128:0    TiMidity                         TiMidity port 0
128:1    TiMidity                         TiMidity port 1
128:2    TiMidity                         TiMidity port 2
128:3    TiMidity                         TiMidity port 3

$ aplaymidi -p 128:0 file.mid

MIDI 埠可以使用 aconnect 工具進行邏輯連線,例如

$ aconnect 24:0 128:0 # try it on the host

將 gadget 的 MIDI 埠連線到 timidity 的 MIDI 埠後,在 gadget 側使用 aplaymidi -l 播放的任何內容都可以在主機的揚聲器/耳機中聽到。

10. NCM 功能

此功能由 usb_f_ncm.ko 模組提供。

功能專用 configfs 介面

建立功能目錄時使用的功能名稱是“ncm”。NCM 功能在其功能目錄中提供以下屬性

ifname

與此功能例項關聯的網路裝置介面名稱

qmult

用於高速和超高速的佇列長度乘數

host_addr

此 USB 乙太網鏈路主機端的 MAC 地址

dev_addr

此 USB 乙太網鏈路裝置端的 MAC 地址

max_segment_size

P2P 連線所需的段大小。這將把 MTU 設定為 14 位元組

建立 functions/ncm.<例項名稱> 後,它們包含預設值:qmult 為 5,dev_addr 和 host_addr 隨機選擇。如果功能未繫結,則可以寫入 ifname。寫入必須是介面模式,例如“usb%d”,這將導致網路核心選擇下一個空閒的 usbX 介面。預設情況下,它設定為“usb%d”。

測試 NCM 功能

配置裝置和主機的 IP 地址。然後

在裝置上

ping <host's IP>

在主機上

ping <device's IP>

11. OBEX 功能

此功能由 usb_f_obex.ko 模組提供。

功能專用 configfs 介面

建立功能目錄時使用的功能名稱是“obex”。OBEX 功能在其功能目錄中只提供一個屬性

port_num

此屬性為只讀。

系統中最多可以有 4 個 ACM/通用序列/OBEX 埠。

測試 OBEX 功能

在裝置上

seriald -f /dev/ttyGS<Y> -s 1024

在主機上

serialc -v <vendorID> -p <productID> -i<interface#> -a1 -s1024 \
        -t<out endpoint addr> -r<in endpoint addr>

其中 seriald 和 serialc 是 Felipe 的實用程式,可在此處找到

12. PHONET 功能

此功能由 usb_f_phonet.ko 模組提供。

功能專用 configfs 介面

建立功能目錄時使用的功能名稱是“phonet”。PHONET 功能在其功能目錄中只提供一個屬性

ifname

與此功能例項關聯的網路裝置介面名稱

測試 PHONET 功能

在沒有特定硬體的情況下無法測試 SOCK_STREAM 協議,因此只測試了 SOCK_DGRAM。為了使後者工作,過去我必須應用此處提到的補丁

http://www.spinics.net/lists/linux-usb/msg85689.html

需要以下工具

git://git.gitorious.org/meego-cellular/phonet-utils.git

在主機上

$ ./phonet -a 0x10 -i usbpn0
$ ./pnroute add 0x6c usbpn0
$./pnroute add 0x10 usbpn0
$ ifconfig usbpn0 up

在裝置上

$ ./phonet -a 0x6c -i upnlink0
$ ./pnroute add 0x10 upnlink0
$ ifconfig upnlink0 up

然後可以使用測試程式

http://www.spinics.net/lists/linux-usb/msg85690.html

在裝置上

$ ./pnxmit -a 0x6c -r

在主機上

$ ./pnxmit -a 0x10 -s 0x6c

結果是應該從主機向裝置傳送一些資料。然後反過來

在主機上

$ ./pnxmit -a 0x10 -r

在裝置上

$ ./pnxmit -a 0x6c -s 0x10

13. RNDIS 功能

此功能由 usb_f_rndis.ko 模組提供。

功能專用 configfs 介面

建立功能目錄時使用的功能名稱是“rndis”。RNDIS 功能在其功能目錄中提供以下屬性

ifname

與此功能例項關聯的網路裝置介面名稱

qmult

用於高速和超高速的佇列長度乘數

host_addr

此 USB 乙太網鏈路主機端的 MAC 地址

dev_addr

此 USB 乙太網鏈路裝置端的 MAC 地址

建立 functions/rndis.<例項名稱> 後,它們包含預設值:qmult 為 5,dev_addr 和 host_addr 隨機選擇。如果功能未繫結,則可以寫入 ifname。寫入必須是介面模式,例如“usb%d”,這將導致網路核心選擇下一個空閒的 usbX 介面。預設情況下,它設定為“usb%d”。

測試 RNDIS 功能

配置裝置和主機的 IP 地址。然後

在裝置上

ping <host's IP>

在主機上

ping <device's IP>

14. 序列功能

此功能由 usb_f_gser.ko 模組提供。

功能專用 configfs 介面

建立功能目錄時使用的功能名稱是“gser”。序列功能在其功能目錄中只提供一個屬性

port_num

此屬性為只讀。

系統中最多可以有 4 個 ACM/通用序列/OBEX 埠。

測試序列功能

在主機上

insmod usbserial
echo VID PID >/sys/bus/usb-serial/drivers/generic/new_id

在主機上

cat > /dev/ttyUSB<X>

在目標裝置上

cat /dev/ttyGS<Y>

然後反過來

在目標裝置上

cat > /dev/ttyGS<Y>

在主機上

cat /dev/ttyUSB<X>

15. SOURCESINK 功能

此功能由 usb_f_ss_lb.ko 模組提供。

功能專用 configfs 介面

建立功能目錄時使用的功能名稱是“SourceSink”。SOURCESINK 功能在其功能目錄中提供以下屬性

pattern

0(全零)、1(mod63)、2(無)

isoc_interval

1..16

isoc_maxpacket

0 - 1023 (全速), 0 - 1024 (高速/超高速)

isoc_mult

0..2 (僅限高速/超高速)

isoc_maxburst

0..15 (僅限超高速)

bulk_buflen

緩衝區長度

bulk_qlen

批次佇列深度

iso_qlen

同步佇列深度

測試 SOURCESINK 功能

裝置:執行 gadget

主機:test-usb (tools/usb/testusb.c)

16. UAC1 功能(舊版實現)

此功能由 usb_f_uac1_legacy.ko 模組提供。

功能專用 configfs 介面

建立功能目錄時使用的功能名稱是“uac1_legacy”。UAC1 功能在其功能目錄中提供以下屬性

audio_buf_size

音訊緩衝區大小

fn_cap

捕獲 PCM 裝置檔名

fn_cntl

控制裝置檔名

fn_play

播放 PCM 裝置檔名

req_buf_size

ISO OUT 端點請求緩衝區大小

req_count

ISO OUT 端點請求計數

這些屬性具有合理的預設值。

測試 UAC1 功能

裝置:執行 gadget

主機

aplay -l # should list our USB Audio Gadget

17. UAC2 功能

此功能由 usb_f_uac2.ko 模組提供。

功能專用 configfs 介面

建立功能目錄時使用的功能名稱是“uac2”。UAC2 功能在其功能目錄中提供以下屬性

c_chmask

捕獲通道掩碼

c_srate

捕獲取樣率列表(逗號分隔)

c_ssize

捕獲樣本大小(位元組)

c_sync

捕獲同步型別(非同步/自適應)

c_mute_present

捕獲靜音控制啟用

c_volume_present

捕獲音量控制啟用

c_volume_min

捕獲音量控制最小值(1/256 dB)

c_volume_max

捕獲音量控制最大值(1/256 dB)

c_volume_res

捕獲音量控制解析度(1/256 dB)

c_hs_bint

HS/SS 的捕獲 bInterval(1-4:固定,0:自動)

fb_max

非同步模式下的最大額外頻寬

p_chmask

播放通道掩碼

p_srate

播放取樣率列表(逗號分隔)

p_ssize

播放樣本大小(位元組)

p_mute_present

播放靜音控制啟用

p_volume_present

播放音量控制啟用

p_volume_min

播放音量控制最小值(1/256 dB)

p_volume_max

播放音量控制最大值(1/256 dB)

p_volume_res

播放音量控制解析度(1/256 dB)

p_hs_bint

HS/SS 的播放 bInterval(1-4:固定,0:自動)

req_number

為捕獲和播放預分配的請求數量

function_name

介面名稱

if_ctrl_name

拓撲控制名稱

clksrc_in_name

輸入時鐘名稱

clksrc_out_name

輸出時鐘名稱

p_it_name

播放輸入終端名稱

p_it_ch_name

播放輸入首個通道名稱

p_ot_name

播放輸出終端名稱

p_fu_vol_name

播放功能單元名稱

c_it_name

捕獲輸入終端名稱

c_it_ch_name

捕獲輸入首個通道名稱

c_ot_name

捕獲輸出終端名稱

c_fu_vol_name

捕獲功能單元名稱

c_terminal_type

捕獲終端型別程式碼

p_terminal_type

播放終端型別程式碼

這些屬性具有合理的預設值。

測試 UAC2 功能

裝置:執行 gadget 主機:aplay -l # 應列出我們的 USB 音訊 Gadget

此功能不需要實際硬體支援,它只是向/從主機發送音訊資料流。為了在裝置端實際聽到聲音,必須在裝置端使用類似以下命令

$ arecord -f dat -t wav -D hw:2,0 | aplay -D hw:0,0 &

例如

$ arecord -f dat -t wav -D hw:CARD=UAC2Gadget,DEV=0 | \
  aplay -D default:CARD=OdroidU3

18. UVC 功能

此功能由 usb_f_uvc.ko 模組提供。

功能專用 configfs 介面

建立功能目錄時使用的功能名稱是“uvc”。UVC 功能在其功能目錄中提供以下屬性

streaming_interval

資料傳輸輪詢端點的時間間隔

streaming_maxburst

超高速伴隨描述符的 bMaxBurst

streaming_maxpacket

選擇此配置時,此端點能夠傳送或接收的最大包大小

function_name

介面名稱

還有“control”和“streaming”子目錄,每個子目錄都包含許多其子目錄。提供了一些合理的預設值,但使用者必須提供以下內容

控制頭

在 control/header 中建立,從 control/class/fs 和/或 control/class/ss 連結

流式傳輸頭

在 streaming/header 中建立,從 streaming/class/fs 和/或 streaming/class/hs 和/或 streaming/class/ss 連結

格式描述

在 streaming/mjpeg 和/或 streaming/uncompressed 中建立

幀描述

在 streaming/mjpeg/<格式> 和/或 streaming/uncompressed/<格式> 中建立

每個幀描述都包含幀間隔規範,每個這樣的規範由多行組成,每行中都有一個間隔值。上述規則最好透過示例進行說明

# mkdir functions/uvc.usb0/control/header/h
# cd functions/uvc.usb0/control/
# ln -s header/h class/fs
# ln -s header/h class/ss
# mkdir -p functions/uvc.usb0/streaming/uncompressed/u/360p
# cat <<EOF > functions/uvc.usb0/streaming/uncompressed/u/360p/dwFrameInterval
666666
1000000
5000000
EOF
# cd $GADGET_CONFIGFS_ROOT
# mkdir functions/uvc.usb0/streaming/header/h
# cd functions/uvc.usb0/streaming/header/h
# ln -s ../../uncompressed/u
# cd ../../class/fs
# ln -s ../../header/h
# cd ../../class/hs
# ln -s ../../header/h
# cd ../../class/ss
# ln -s ../../header/h

測試 UVC 功能

裝置:執行 gadget,modprobe vivid

# uvc-gadget -u /dev/video<uvc video node #> -v /dev/video<vivid video node #>
其中 uvc-gadget 是此程式

http://git.ideasonboard.org/uvc-gadget.git

帶有這些補丁

主機

luvcview -f yuv

19. 印表機功能

此功能由 usb_f_printer.ko 模組提供。

功能專用 configfs 介面

建立功能目錄時使用的功能名稱是“printer”。印表機功能在其功能目錄中提供以下屬性

pnp_string

要以 pnp 字串形式傳遞給主機的資料

q_len

每個端點的請求數量

測試印表機功能

最基本的測試

裝置:執行 gadget

# ls -l /devices/virtual/usb_printer_gadget/

應顯示 g_printer<數字>。

如果 udev 處於活動狀態,則 /dev/g_printer<數字> 應自動出現。

主機

如果 udev 處於活動狀態,則例如 /dev/usb/lp0 應出現。

主機->裝置傳輸

裝置

# cat /dev/g_printer<number>

主機

# cat > /dev/usb/lp0

裝置->主機傳輸

# cat > /dev/g_printer<number>

主機

# cat /dev/usb/lp0

可以使用Linux USB 印表機 Gadget 驅動程式中描述的 prn_example 進行更高階的測試。

20. UAC1 功能(虛擬 ALSA 音效卡,使用 u_audio API)

此功能由 usb_f_uac1.ko 模組提供。它將建立一個虛擬 ALSA 音效卡,音訊流將簡單地從該音效卡輸入和輸出。

功能專用 configfs 介面

建立功能目錄時使用的功能名稱是“uac1”。UAC1 功能在其功能目錄中提供以下屬性

c_chmask

捕獲通道掩碼

c_srate

捕獲取樣率列表(逗號分隔)

c_ssize

捕獲樣本大小(位元組)

c_mute_present

捕獲靜音控制啟用

c_volume_present

捕獲音量控制啟用

c_volume_min

捕獲音量控制最小值(1/256 dB)

c_volume_max

捕獲音量控制最大值(1/256 dB)

c_volume_res

捕獲音量控制解析度(1/256 dB)

p_chmask

播放通道掩碼

p_srate

播放取樣率列表(逗號分隔)

p_ssize

播放樣本大小(位元組)

p_mute_present

播放靜音控制啟用

p_volume_present

播放音量控制啟用

p_volume_min

播放音量控制最小值(1/256 dB)

p_volume_max

播放音量控制最大值(1/256 dB)

p_volume_res

播放音量控制解析度(1/256 dB)

req_number

捕獲和播放預分配請求的數量

function_name

介面名稱

p_it_name

播放輸入終端名稱

p_it_ch_name

播放通道名稱

p_ot_name

播放輸出終端名稱

p_fu_vol_name

播放靜音/音量功能單元名稱

c_it_name

捕獲輸入終端名稱

c_it_ch_name

捕獲通道名稱

c_ot_name

捕獲輸出終端名稱

c_fu_vol_name

捕獲靜音/音量功能單元名稱

這些屬性具有合理的預設值。

測試 UAC1 功能

裝置:執行 gadget 主機:aplay -l # 應列出我們的 USB 音訊 Gadget

此功能不需要實際硬體支援,它只是向/從主機發送音訊資料流。為了在裝置端實際聽到聲音,必須在裝置端使用類似以下命令

$ arecord -f dat -t wav -D hw:2,0 | aplay -D hw:0,0 &

例如

$ arecord -f dat -t wav -D hw:CARD=UAC1Gadget,DEV=0 | \
  aplay -D default:CARD=OdroidU3

21. MIDI2 功能

此功能由 usb_f_midi2.ko 模組提供。它將建立一個包含 UMP rawmidi 裝置的虛擬 ALSA 音效卡,其中 UMP 資料包被迴環。此外,還會建立一箇舊版 rawmidi 裝置。UMP rawmidi 也與 ALSA 序列器客戶端繫結。

功能專用 configfs 介面

建立功能目錄時使用的功能名稱是“midi2”。midi2 功能在其功能目錄中提供以下屬性作為音效卡頂層資訊

process_ump

處理 UMP 流訊息的布林標誌(0 或 1)

static_block

靜態塊的布林標誌(0 或 1)

iface_name

可選介面名稱字串

該目錄包含一個名為“ep.0”的子目錄,該子目錄提供了 UMP 端點的屬性(即一對 USB MIDI 端點)

protocol_caps

MIDI 協議功能;1: MIDI 1.0, 2: MIDI 2.0, 或 3: 兩種協議都支援

protocol

預設 MIDI 協議(1 或 2)

ep_name

UMP 端點名稱字串

product_id

產品 ID 字串

manufacturer

製造商 ID 號(24 位)

family

裝置家族 ID 號(16 位)

model

裝置型號 ID 號(16 位)

sw_revision

軟體修訂版(32 位)

每個端點子目錄都包含一個名為“block.0”的子目錄,該子目錄表示 Block 0 資訊的函式塊。其屬性為

name

功能塊名稱字串

direction

此功能塊的方向 1:輸入,2:輸出,或 3:雙向

first_group

第一個 UMP 組號(0-15)

num_groups

此功能塊中的組數(1-16)

midi1_first_group

MIDI 1.0 的第一個 UMP 組號(0-15)

midi1_num_groups

MIDI 1.0 的組數(0-16)

ui_hint

此功能塊的 UI 提示 0:未知,1:接收方,2:傳送方,3:兩者

midi_ci_version

支援的 MIDI-CI 版本號(8 位)

is_midi1

舊版 MIDI 1.0 裝置 (0-2) 0:MIDI 2.0 裝置,1:無限制 MIDI 1.0,或 2:低速 MIDI 1.0

sysex8_streams

SysEx8 流的最大數量(8 位)

active

功能塊活動的布林標誌(0 或 1)

如果需要多個功能塊,可以透過建立帶有相應功能塊編號(1、2、...)的子目錄“block.”來新增更多功能塊。功能塊子目錄也可以動態刪除。請注意,功能塊編號必須是連續的。

同樣,如果需要多個 UMP 端點,可以透過建立子目錄“ep.”來新增更多端點。編號必須是連續的。

為了模擬不支援 UMP v1.1 的舊版 MIDI 2.0 裝置,請將 process_ump 標誌設定為 0。然後將忽略所有 UMP v1.1 請求。

測試 MIDI2 功能

在裝置上:執行 gadget,然後執行

$ cat /proc/asound/cards

將顯示一個包含 MIDI2 裝置的新音效卡。

另一方面,在主機上

$ cat /proc/asound/cards

將顯示一個包含 MIDI1 或 MIDI2 裝置的新音效卡,具體取決於 USB 音訊驅動程式配置。

在這兩者上,當主機上啟用 ALSA 序列器時,您可以找到 UMP MIDI 客戶端,例如“MIDI 2.0 Gadget”。

由於驅動程式只是簡單地迴環資料,因此僅為了測試目的不需要真實裝置。

為了測試從 gadget 到主機的 MIDI 輸入(例如模擬 MIDI 鍵盤),您可以傳送如下 MIDI 流。

在 gadget 上

$ aconnect -o
....
client 20: 'MIDI 2.0 Gadget' [type=kernel,card=1]
    0 'MIDI 2.0        '
    1 'Group 1 (MIDI 2.0 Gadget I/O)'
$ aplaymidi -p 20:1 to_host.mid

在主機上

$ aconnect -i
....
client 24: 'MIDI 2.0 Gadget' [type=kernel,card=2]
    0 'MIDI 2.0        '
    1 'Group 1 (MIDI 2.0 Gadget I/O)'
$ arecordmidi -p 24:1 from_gadget.mid

如果您有支援 UMP 的應用程式,您也可以使用 UMP 埠傳送/接收原始 UMP 資料包。例如,支援 UMP 的 aseqdump 程式可以從 UMP 埠接收。在主機上

$ aseqdump -u 2 -p 24:1
Waiting for data. Press Ctrl+C to end.
Source  Group    Event                  Ch  Data
 24:1   Group  0, Program change          0, program 0, Bank select 0:0
 24:1   Group  0, Channel pressure        0, value 0x80000000

為了測試從主機到 gadget 的 MIDI 輸出(例如模擬 MIDI 合成器),它將只是反過來。

在 gadget 上

$ arecordmidi -p 20:1 from_host.mid

在主機上

$ aplaymidi -p 24:1 to_gadget.mid

主機上 altset 0 的 MIDI 1.0 訪問受支援,並且在 gadget 上從/向 UMP 資料包進行轉換。它僅繫結到功能塊 0。

當前操作模式可以在 SND_CTL_IFACE_RAWMIDI 的 ALSA 控制元素“Operation Mode”中觀察到。例如

$ amixer -c1 contents
numid=1,iface=RAWMIDI,name='Operation Mode'
  ; type=INTEGER,access=r--v----,values=1,min=0,max=2,step=0
  : values=2

其中 0 = 未使用,1 = MIDI 1.0 (altset 0),2 = MIDI 2.0 (altset 1)。上面的示例顯示它正在模式 2 下執行,即 MIDI 2.0。