USB HIDクラスとUVCクラスの併用について

大島と申します。
お世話になっております。

Armadillo-810をUSBデバイスとして使用する際
下記のドライバを併用したいと考えております。
・Linux Foundation g_uvc_acm_ether
・Netchip HID Gadget

下記URLを元に、HID(キーボードのみ)を使用することは確認できましたが
UVCとHIDを併用することができておりません。

kernelコンフィギュレーション及び一部ガジェットの追加実装にて
・UVCまたはHIDをそれぞれ単体で有効にしkernelをビルドする方法
・UVCとHIDをモジュール化してkernelをビルドし切り替える方法
で使用できるかと思いますが
・UVCとHIDを単一でkernelをビルドし併用させたい
と考えております。
その手法をご教示いただけないでしょうか?

Armadillo-810をHIDを利用してマウス/キーボード/ジョイスティックとして使用したいこと
また、デバッグ時にUVCを利用して画像を確認したいこともあり
上記の様な要求で、kernelをビルドし機能させたいと考えております。

以上、宜しくお願い致します。

製品: 
Armadillo-810

既にmenuconfigでどのドライバをビルドするのか切り替える操作は
できているようですので、
USB Gadget Driversの項で、もう一度スペースキーを押すと * が M
に変ってモジュールとしてビルドされるようになります。

下記のような状態です。

<*>   USB Gadget Support  ---> 
    <M>   USB Gadget Drivers
        <M>     HID Gadget
        <M>     UVC Composite Device (ACM and Ethernet)

このコンフィグでビルドすると、カーネルイメージ以外に
linux-3.4-atX/ 以下に次のファイルが生成されます。

drivers/usb/gadget/g_hid.ko
drivers/usb/gadget/g_uvc_acm_ether.ko

これはカーネルモジュールなので、このときビルドされた
カーネルでArmadilloを起動して、
Armadillo上でinsmod/rmmodすればモジュールの有効/無効
を切り替えることができます。

ただ、アットマークテクノではこのドライバをモジュールにして
テストしていないので正常に動作するかはわかりません。

大島です。
お世話になっております。
ご対応いただき、有難う御座います。

UVCとHIDの切り替え及び併用ができませんでした。

また、それぞれのモジュール単体を有効にてして動作確認をしたところ
UVCモジュールの場合、画像が取得できませんでした。
デバイスファイルが見つからなかった(対称のデバイスファイルが変わった?)ことが原因のようです。
HIDモジュールの場合、期待する動作を確認しました。

下記、それぞれのオペレーションを記載します。
アドバイスいただきたく、宜しくお願いいたします。

・UVCモジュールを有効→UVCモジュールを無効
⇒無効にできないので、切り替えられない。
[root@armadillo810-0 (ttySC2) ~]# insmod /lib/modules/3.4-at14/kernel/drivers/usb/gadget/g_uvc_acm_ether.ko
 gadget: using random self ethernet address
 gadget: using random host ethernet address
usb0: MAC 3e:97:ac:64:b9:dd
usb0: HOST MAC de:e4:0f:45:54:ff
 gadget: UVC Composite Gadget, version: 0.9.0
 gadget: userspace failed to provide iSerialNumber
 gadget: g_uvc_acm_ether ready
[root@armadillo810-0 (ttySC2) ~]# g_uvc_acm_ether gadget: high-speed config #1: UVC Composite with ACM and RNDIS
[root@armadillo810-0 (ttySC2) ~]# lsmod
g_uvc_acm_ether 52569 0 - Live 0xbf000000
[root@armadillo810-0 (ttySC2) ~]# rmmod /lib/modules/3.4-at14/kernel/drivers/usb/gadget/g_uvc_acm_ether.ko
[root@armadillo810-0 (ttySC2) ~]# lsmod
g_uvc_acm_ether 52569 0 - Live 0xbf000000

・UVCモジュールを有効→HIDモジュールを有効
⇒併用できない。
[root@armadillo810-0 (ttySC2) ~]# insmod /lib/modules/3.4-at14/kernel/drivers/usb/gadget/g_uvc_acm_ether.ko
[root@armadillo810-0 (ttySC2) ~]# lsmod
g_uvc_acm_ether 52569 0 - Live 0xbf000000
[root@armadillo810-0 (ttySC2) ~]# insmod /lib/modules/3.4-at14/kernel/drivers/usb/gadget/g_hid.ko
insmod: can't insert '/lib/modules/3.4-at14/kernel/drivers/usb/gadget/g_hid.ko': No such device

・HIDモジュールを有効→HIDモジュールを無効
⇒無効にできないので、切り替えられない。
[root@armadillo810-0 (ttySC2) ~]# insmod /lib/modules/3.4-at14/kernel/drivers/usb/gadget/g_hid.ko
 gadget: HID Gadget, version: 2010/03/16
 gadget: g_hid ready
[root@armadillo810-0 (ttySC2) ~]# g_hid gadget: high-speed config #1: HID Gadget
[root@armadillo810-0 (ttySC2) ~]# lsmod
g_hid 15899 0 - Live 0xbf000000
[root@armadillo810-0 (ttySC2) ~]# rmmod /lib/modules/3.4-at14/kernel/drivers/usb/gadget/g_hid.ko
[root@armadillo810-0 (ttySC2) ~]# lsmod
g_hid 15899 0 - Live 0xbf000000

・HIDモジュールを有効→UVCモジュールを有効
⇒併用できない。
[root@armadillo810-0 (ttySC2) ~]# insmod /lib/modules/3.4-at14/kernel/drivers/usb/gadget/g_hid.ko
 gadget: HID Gadget, version: 2010/03/16
 gadget: g_hid ready
[root@armadillo810-0 (ttySC2) ~]# lsmod
g_hid 15899 0 - Live 0xbf000000
[root@armadillo810-0 (ttySC2) ~]# insmod /lib/modules/3.4-at14/kernel/drivers/usb/gadget/g_uvc_acm_ether.ko
insmod: can't insert '/lib/modules/3.4-at14/kernel/drivers/usb/gadget/g_uvc_acm_ether.ko': No such device

以上、宜しくお願い致します。

> UVCとHIDの切り替え及び併用ができませんでした。

併用はできません。できるのであれば、最初からconfigで同時に
有効にすることができるように実装されているはずなので…

rmmod は rmmod g_uvc_acm_ether.ko のようにモジュール名のみを
オプションに渡しても同じ状況でしょうか。

大島です。
お世話になっております。
ご対応いただき、有難う御座います。

ご教示いただいた下記コマンドで実行できました。
[root@armadillo810-0 (ttySC2) ~]# rmmod <モジュール名>

但し、UVCモジュールは、有効/無効で切り替えが正常にできたのですが
HIDモジュールは、有効/無効で切り替えが正常にできませんでした。
また、UVCモジュールを有効にしても、画像は取得できていない状況です。

下記、オペレーションを記載します。
アドバイスいただきたく、宜しくお願いいたします。

・UVCモジュールの場合
有効/無効で切り替えが正常にできました。
繰り返し可。

[root@armadillo810-0 (ttySC2) ~]# insmod /lib/modules/3.4-at14/kernel/drivers/usb/gadget/g_uvc_acm_ether.ko
 gadget: using random self ethernet address
 gadget: using random host ethernet address
usb0: MAC aa:7e:13:17:3e:71
usb0: HOST MAC 26:4b:89:e8:76:3b
 gadget: UVC Composite Gadget, version: 0.9.0
 gadget: userspace failed to provide iSerialNumber
 gadget: g_uvc_acm_ether ready
[root@armadillo810-0 (ttySC2) ~]# g_uvc_acm_ether gadget: high-speed config #1: UVC Composite with ACM and RNDIS
[root@armadillo810-0 (ttySC2) ~]# lsmod
g_uvc_acm_ether 52569 0 - Live 0xbf000000
[root@armadillo810-0 (ttySC2) ~]# rmmod g_uvc_acm_ether
[root@armadillo810-0 (ttySC2) ~]# lsmod
[root@armadillo810-0 (ttySC2) ~]#

・HIDモジュールの場合
有効/無効で切り替えが正常にできませんでした。
有効にした後、無効にできず、再度有効にもできませんでした。

[root@armadillo810-0 (ttySC2) ~]# insmod /lib/modules/3.4-at14/kernel/drivers/usb/gadget/g_hid.ko
 gadget: HID Gadget, version: 2010/03/16
 gadget: g_hid ready
[root@armadillo810-0 (ttySC2) ~]# g_hid gadget: high-speed config #1: HID Gadget
[root@armadillo810-0 (ttySC2) ~]# lsmod
g_hid 15899 0 - Live 0xbf015000
[root@armadillo810-0 (ttySC2) ~]# rmmod g_hid
Unable to handle kernel NULL pointer dereference at virtual address 00000000
pgd = c88d0000
[00000000] *pgd=4e356831, *pte=00000000, *ppte=00000000
Internal error: Oops: 80000007 [#1] PREEMPT ARM
Modules linked in: g_hid(-) [last unloaded: g_uvc_acm_ether]
CPU: 0 Not tainted (3.4-at14 #7)
PC is at 0x0
LR is at usbhsg_ep_dequeue+0x3c/0x4c
pc : [<00000000>] lr : [] psr: 60000013
sp : cd0c9e88 ip : cd0c9e08 fp : cd0c9e9c
r10: bf018068 r9 : cc4cf200 r8 : 00100100
r7 : 00200200 r6 : cc4cf220 r5 : cc4b7834 r4 : c88fe6c0
r3 : 00000000 r2 : cd0c9e68 r1 : c88fe6c0 r0 : cc4b7834
Flags: nZCv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
Control: 10c53c7d Table: 488d0059 DAC: 00000015
Process rmmod (pid: 3283, stack limit = 0xcd0c82e8)
Stack: (0xcd0c9e88 to 0xcd0ca000)
9e80: cc4e2a38 cc4e29c0 cd0c9eb4 cd0c9ea0 bf0159dc c0293b6c
9ea0: bf018084 cd3c8580 cd0c9eec cd0c9eb8 bf015cb8 bf015990 c02907d0 cd3c85a4
9ec0: cd0c9edc cc4cc980 bf017f94 00000013 00000081 c000dd84 cd0c8000 00000000
9ee0: cd0c9f04 cd0c9ef0 c02946e0 bf015c50 bf017f94 c0532518 cd0c9f1c cd0c9f08
9f00: c0294760 c0294684 bf017f70 00000000 cd0c9f2c cd0c9f20 bf0165b8 c0294728
9f20: cd0c9f44 cd0c9f30 bf017a60 bf0165a0 bf017a40 bf01816c cd0c9fa4 cd0c9f48
9f40: c005498c bf017a4c cd0c8000 69685f67 cd0c0064 cd0c9f60 c003c088 c0200c5c
9f60: cd0c9f8c cd0c9f70 c009dfa0 c003c084 b6f8b000 00001000 00000000 0000005b
9f80: cd0c9fa4 000c9f90 c009e120 00000000 bed3dea3 00000001 00000000 cd0c9fa8
9fa0: c000dc00 c00547fc 00000000 bed3dea3 bed3dea3 00000880 000c533a 000b91f8
9fc0: 00000000 bed3dea3 00000001 00000081 00000001 00000000 b6f92000 00000000
9fe0: 000b9228 bed3da20 00026785 b6ebeefc 80000010 bed3dea3 00000000 00000000
Backtrace:
[] (usbhsg_ep_dequeue+0x0/0x4c) from [] (hidg_unbind+0x58/0xa8 [g_hid])
 r5:cc4e29c0 r4:cc4e2a38
[] (hidg_unbind+0x0/0xa8 [g_hid]) from [] (composite_unbind+0x74/0x160 [g_hid])
 r5:cd3c8580 r4:bf018084
[] (composite_unbind+0x0/0x160 [g_hid]) from [] (usb_gadget_remove_driver+0x68/0xa4)
[] (usb_gadget_remove_driver+0x0/0xa4) from [] (usb_gadget_unregister_driver+0x44/0x80)
 r4:c0532518 r3:bf017f94
[] (usb_gadget_unregister_driver+0x0/0x80) from [] (usb_composite_unregister+0x24/0x30 [g_hid])
 r5:00000000 r4:bf017f70
[] (usb_composite_unregister+0x0/0x30 [g_hid]) from [] (hidg_cleanup+0x20/0x28 [g_hid])
[] (hidg_cleanup+0x0/0x28 [g_hid]) from [] (sys_delete_module+0x19c/0x238)
 r4:bf01816c r3:bf017a40
[] (sys_delete_module+0x0/0x238) from [] (ret_fast_syscall+0x0/0x30)
 r6:00000001 r5:bed3dea3 r4:00000000
Code: bad PC value
---[ end trace d75034534367e0d7 ]---
Segmentation fault
[root@armadillo810-0 (ttySC2) ~]# lsmod
g_hid 15899 0 - Unloading 0xbf015000
[root@armadillo810-0 (ttySC2) ~]#

以上、宜しくお願い致します。

> Unable to handle kernel NULL pointer dereference at virtual address 00000000

NULL pointer参照しているので多分unloadする時の処理に問題があるのだと思います。

表示されているスタックトレースから具体的には linux-3.4-at/drivers/usb/gadget/f_hid.c 内の
hidg_unbind() から9行目の kfree(hidg->req->buf); が問題になっているようです。

これ以前にが既にreqあたりがfreeされていたり、NULLが代入されている等の理由だと思ったのですが、
見付からないですね。

メモリリークはしますが、とりあえず、この行を削ればエラーしなくはなると思います。
運用ではなくデバッグ用途であれば、この方法で試してみてください。

参考までにスタックトレースからの確認方法ですが、

> [<c0293b60>] (usbhsg_ep_dequeue+0x0/0x4c) from [<bf0159dc>] (hidg_unbind+0x58/0xa8 [g_hid])

トレースの先頭がここなので、hidg_unbindの関数から0x58先に何の処理があるのか
CONFIG_DEBUG_INFOを有効にしてg_hid.koをビルドして、objdumpでディスアッセンブルして確認してみました。

arm-linux-gnueabihf-objdump -l -d g_hid.ko

大島です。
お世話になっております。
ご対応いただき、有難う御座います。

試してみたのですが改善されず、変化なしでした。
アドバイスいただきたく、宜しくお願いいたします。

HIDモジュールを有効にした際、下記コマンドを実行したのですが
エラーとなったのも気になります。
UVCモジュールを有効にした際、下記コマンドを実行すると
正常に機能しているようです。
[root@armadillo810-0 (ttySC2) ~]# ifup usb0
ifconfig: SIOCGIFFLAGS: No such device

こちらでお伺いするべきことではないのかもしれませんが。。
上記とは別に、UVCとHIDの併用につきまして
configに実装されていないですが
アットマークテクノ社で、今回のようなkernelの実装を
お願いすることはできるものでしょうか?

以上、宜しくお願い致します。

> 大島です。
> お世話になっております。
> ご対応いただき、有難う御座います。
>
>
> 試してみたのですが改善されず、変化なしでした。
> アドバイスいただきたく、宜しくお願いいたします。
>
> HIDモジュールを有効にした際、下記コマンドを実行したのですが
> エラーとなったのも気になります。
> UVCモジュールを有効にした際、下記コマンドを実行すると
> 正常に機能しているようです。
> [root@armadillo810-0 (ttySC2) ~]# ifup usb0
> ifconfig: SIOCGIFFLAGS: No such device

ちょっと直ぐに解決するのは難しそうなのですが、
HIDデバイスとして動作させつつ、デバッグ用にカメラの映像を
同時に確認したい。という用途なのであれば、次の方法で
利用頂くことはできないでしょうか。

- USB gadget(MiniUSB)は HIDデバイスとして利用する
- A810拡張基板のUSBホスト(TypeA)にUSB-Ethernet変換アダプタを接続して、画像をPCへストリーミング

これであれば、kernelの改造も必要なく、動作検証済みの
機能だけで、HIDデバイスとして挙動と画像の確認が同時に
できます。

> こちらでお伺いするべきことではないのかもしれませんが。。
> 上記とは別に、UVCとHIDの併用につきまして
> configに実装されていないですが
> アットマークテクノ社で、今回のようなkernelの実装を
> お願いすることはできるものでしょうか?

すみません、フォーラムでは業務委託等の回答をすることが
できません。お手数ですが、弊社営業部へご確認お願いいたします。

大島と申します。
お世話になっております。
ご対応いただき、有難う御座います。

> ちょっと直ぐに解決するのは難しそうなのですが、
> HIDデバイスとして動作させつつ、デバッグ用にカメラの映像を
> 同時に確認したい。という用途なのであれば、次の方法で
> 利用頂くことはできないでしょうか。
>
> - USB gadget(MiniUSB)は HIDデバイスとして利用する
> -A810拡張基板のUSBホスト(TypeA)にUSB-Ethernet変換アダプタを接続して、画像をPCへストリーミング
>
> これであれば、kernelの改造も必要なく、動作検証済みの
> 機能だけで、HIDデバイスとして挙動と画像の確認が同時に
> できます。
開発デバッグ時につきましては、上記方法でも可能かと思いますのでやってみます。
但し、製品として筐体にA810を納めると、A810拡張基板を使用することができず
臨床評価の際、画像確認できないのが不便で、エンドユーザーさまの要求機能に沿えない状況です。
現状、HIDモジュールの無効処理が正常終了しないですが、こちらを解決した上で
せめてUVCとHIDのモジュール切替をしながら、使用できるようにしたいです。
アドバイスいただきたく、宜しくお願いいたします。

> すみません、フォーラムでは業務委託等の回答をすることが
> できません。お手数ですが、弊社営業部へご確認お願いいたします。
kernelとしてのUVCとHIDの統合(併用)につきまして、kernelの実装に掛かる部分は
別途、御社営業部に相談いたします。

以上、宜しくお願い致します。

大島と申します。
お世話になっております。

その後、状況は如何でしょうか?

先日、御社営業部の方とお打ち合わせさせていただきまして
本件につきまして、正常にモジュール切替ができるよう
御社と弊社の双方で取り組むこととなりました。
お手数をお掛けいたしますが、解決に向けて
一緒に取り組んでいただければ幸いです。

当方の現状ですが、解決できていない状況で
トライアンドエラーを繰り返しております。
また進展がありましたら、こちらに投稿します。

以上、宜しくお願い致します。