FreeBSD で認識するかどうか条件によって変わる問題 †
- PC:DELL Inspiron910
- 先に挿すと認識しないケースでは LED2 が点かない(main が実行できない)場合と点く場合がある
- OS: FreeBSD-10.2, ファーム v.28
- 本体の USB 端子に挿すと認識しない(USB_ERR_TIMEOUT)
- ダイソーの USB1.0 2ポートハブでは認識するが、ハブにデバイスを先に挿しておくと認識しない
- ELECOM USB1.0 4ポートハブでは全く認識しない
- USB2.0 ハブ経由では認識するが、ハブにデバイスを先に挿しておくと認識しない(USB_ERR_STALLED)
- OS: FreeBSD-10.2, ファーム v.28(ブートローダなし+250ms版)
- 本体の USB 端子に挿すと認識する
- ダイソーの USB1.0 2ポートハブでは認識するが、ハブにデバイスを先に挿しておくと認識しない, LED2点く
- ELECOM USB1.0 4ポートハブでは全く認識しない(USB_ERROR_IOERROR)
- USB2.0 ハブ経由では認識するが、ハブにデバイスを先に挿しておくと認識しない
- OS: FreeBSD-10.2, ファーム v.28(ブートローダなし+1000ms+250ms版)
- 本体の USB 端子に挿すと認識する
- ダイソーの USB1.0 2ポートハブでハブにデバイスを先に挿しても認識する
- ELECOM USB1.0 4ポートハブでは全く認識しない
- OS: FreeBSD-10.2, ファーム v.28(1000ms+250ms版)
- 本体の USB 端子に挿すと認識しない(USB_ERR_TIMEOUT)
- ダイソーの USB1.0 2ポートハブでは認識するが、ハブにデバイスを先に挿しておくと認識しない(USB_ERR_STALLED) COLOR(BLUE){LED2付かない)
- USB2.0 ハブ経由では認識するが、ハブにデバイスを先に挿しておくと認識しない(USB_ERR_STALLED), LED2点かない
- OS Knoppix7.4, ファーム v.28(ブートローダなし+250ms版)
- 本体の USB 端子に挿すと認識する
- ダイソーの USB1.0 2ポートハブにデバイスを先に挿しても認識する
- ELECOM USB1.0 4ポートハブでは全く認識しない
- USB2.0 ハブ経由では先に挿しておいても認識する
- OS Windows10, ファーム v.28(ブートローダなし版)
- ELECOM USB1.0 4ポートハブで先に挿しても認識する
結果 †
- FreeBSD-10.2
- | ブートローダあり | ブートローダなし,250ms | ブートローダなし,1000+250ms | エラー |
USB2ハブ | ○ | ○ | (○) | - |
USB1ハブ(ダイソー) | ○ | ○ | ○ | - |
USBハブなし | × | ○ | ○ | USB_ERR_TIMEOUT |
USB1ハブ,USB2ハブ(※1) | × | × | (○) | USB_ERR_STALLED |
USB1ハブ(ELECOM) | × | × | × | USB_ERR_IOERROR |
(※1): ハブにデバイスを挿してから、PC にハブを挿した
[エラーメッセージ(USB_ERR_TIMEOUTT)]
Dec 12 03:03:26 milk kernel: usbus4: port reset timeout
Dec 12 03:03:26 milk kernel:
uhub_reattach_port: port 3 reset failed, error=USB_ERR_TIMEOUT
Dec 12 03:03:26 milk kernel: uhub_reattach_port:
device problem (USB_ERR_TIMEOUT), disabling port 3
[エラーメッセージ(USB_ERR_STALLE)]
Dec 12 03:43:28 milk kernel:
usb_alloc_device: set address 3 failed (USB_ERR_STALLED, ignored)
Dec 12 03:43:30 milk kernel:
usbd_setup_device_desc: getting device descriptor at addr 3 failed,
USB_ERR_STALLED
Dec 12 03:43:30 milk kernel:
usbd_req_re_enumerate: addr=3, set address failed! (USB_ERR_STALLED, ignored)
[エラーメッセージ(USB_ERR_IOERROR)]
Dec 12 20:52:49 milk kernel:
usb_alloc_device: set address 4 failed (USB_ERR_IOERROR, ignored)
Dec 12 20:52:51 milk kernel:
usbd_setup_device_desc:getting device descriptor at addr 4 failed,
USB_ERR_IOERROR
Dec 12 20:52:51 milk kernel:
usbd_req_re_enumerate: addr=4, set address failed! (USB_ERR_IOERROR, ignored)
- Knoppix7.4
- | ブートローダなし,250ms | エラー |
USB2ハブ | ○ | - |
USB1ハブ(ダイソー) | ○ | - |
USBハブなし | ○ | - |
USB1ハブ,USB2ハブ(※1) | ○ | - |
USB1ハブ(ELECOM) | × | IO |
(※1): ハブにデバイスを挿してから、PC にハブを挿した
- Windows10
- | ブートローダなし | エラー |
USB2ハブ | ○ | - |
USB1ハブ(ダイソー) | ○ | - |
USBハブなし | ○ | - |
USB1ハブ,USB2ハブ(※) | ○ | - |
USB1ハブ(ELECOM) | ○ | - |
改良 †
- ブートローダなし版を作成(Digispark としては使えなくなるが、FreeBSD に直接挿したときの認識率が改善する)
- 従来 micronucleus(DigiSpark 用 USB 経由のライタ) で書き込んでいたファームウェア(HEX ファイル)と全く同じコードを、Digispark の Flash の 0番地から AVR ライタで直接書き込む
- 起動時に 1000+250ms ウェイトを入れる(FreeBSD でハブにあらかじめ挿してあったデバイスの認識率が改善する)
- V-USB の初期化ルーチン(http://vusb.wikidot.com/examples)(http://vusb.wikidot.com/examples) に *1 の wait (約1000ms) を追加
usbInit(); // *1
uchar j=0; // *1
while(--j){
wdt_reset(); // if watchdog is active, reset it // *1
_delay_ms(4); } // *1
} // *1
usbDeviceDisconnect();
uchar i = 0;
while(--i){ // fake USB disconnect for > 250 ms
wdt_reset(); // if watchdog is active, reset it
_delay_ms(1); // library call -- has limited range
}
usbDeviceConnect();