Linuxでfriio

このエントリーをはてなブックマークに追加
881login:Penguin
>>880
ふと思い立って2.6.35にしたらこの問題にぶち当たって、ここに来ました。
35だとまたちょっと違ってるので色々調べて、次のdiffみたいに修正して、
一応録画できることを確認しました。
USBとか全然知らなくて、今日半日くらい調べただけなんで、
どなたか検証していただけないでしょうか。

参考にしたのは、
http://www2.renesas.com/usb/ja/about_usb/USB4.html
と、
http://www.usb.org/developers/devclass_docs
にあった
http://www.usb.org/developers/devclass_docs/USB_Video_Class_1_1.zip
のUSB_Video_Class_1.1.pdfの2.4.2, 2.4.3辺りです。
drivers/usb/gadget/f_uvc.c
もちょろっと見ました。

つづく。
882login:Penguin:2010/09/02(木) 23:38:57 ID:P3WQ/sn1
>>881のつづき。

修正の方針は、Alternate Settingsが複数ある場合はSet-Interfaceするという、
なんか、今見直してみると自分でもなんでこうしたんだか、みたいな?
OBEX(f_obex.c)の方に悪影響がないといいんですが。

--- drivers/usb/core/hub.c.org_2.6.35 2010-08-02 07:11:14.000000000 +0900
+++ drivers/usb/core/hub.c 2010-09-02 22:37:07.000000000 +0900
@@ -3689,7 +3689,8 @@
struct usb_interface_descriptor *desc;

desc = &intf->cur_altsetting->desc;
- if (desc->bAlternateSetting == 0) {
+ if (udev->actconfig->desc.bNumInterfaces <= 1 &&
+ desc->bAlternateSetting == 0) {
usb_disable_interface(udev, intf, true);
usb_enable_interface(udev, intf, true);
ret = 0;
883login:Penguin:2010/09/04(土) 19:49:16 ID:sJjYVArN
>>882の方針変更しました。

Interfaceが複数ある場合、0番だけSet-Interfaceする。他はdisable/enableだけ。
ここの部分のちょっと前にこんなコメントがあるんです。
/* Put interfaces back into the same altsettings as before.
* Don't bother to send the Set-Interface request for interfaces
* that were already in altsetting 0; besides being unnecessary,
* many devices can't handle it. Instead just reset the host-side
* endpoint state.
*/
これ見て、今のコードのif文、逆じゃないの?と思ったんですよね。
↓の変更でも、recfriioで録画できてます。

--- drivers/usb/core/hub.c.org_2.6.35 2010-08-02 07:11:14.000000000 +0900
+++ drivers/usb/core/hub.c 2010-09-04 17:23:04.000000000 +0900
@@ -3689,7 +3689,7 @@
struct usb_interface_descriptor *desc;

desc = &intf->cur_altsetting->desc;
- if (desc->bAlternateSetting == 0) {
+ if (desc->bAlternateSetting > 0) {
usb_disable_interface(udev, intf, true);
usb_enable_interface(udev, intf, true);
ret = 0;