トップ «前の日記(2024-06-03) 最新 次の日記(2024-06-06)» 編集

Orz日記 by Akio Morita

ToDo:

  • 15 SAD Fit[]回りの障害事例の解析
  • 10 smart pointer版PEGクラスの再実装(Left Recursionまわり)
2006|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|06|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|07|08|09|10|11|12|
2013|01|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|06|07|08|10|12|
2016|01|02|03|05|06|08|10|11|
2017|01|02|03|04|05|06|07|09|10|11|12|
2018|01|02|03|04|06|07|08|09|10|11|12|
2019|01|03|04|05|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|04|05|06|07|08|09|

2024-06-04 [長年日記]

_ [FreeBSD]Intel AX211 Bluetooth on FreeBSD

コメントにある通り、小手先のidProduct追加程度ではどうにもなりそうに無いくらい前世代から仕様が異なる模様

一応、実験的なコードはある模様なので、実験してみる

試してみた

  • iwmbtfw(8)単体は走る
    • ugen経由で待機中のUSB bluetoothドングルにファームウェアをダウンロードし、成功したらUSBドライバスタックをリスタートする(結果として、ng_ubtがprobe/attachされる)
    • CF-FV5Uだと usr.sbin/bluetooth/iwmbtfw/main.cswitch (ver.hw_variant)ブロックにver.hw_variant = 0x1bが渡ってくる
      • 番号の間隔を考えるとCPU同梱のI/Oコントローラ世代毎に違うのでは?
    • firmwareとしてibt-0180-0041.sfiibt-0180-0041.ddcが要求されるが、iwmbt-firmware-20230515パッケージに入っていない
  • 2024/06/06時点のコードだと、iwmbtfwが成功しても、ubt0が生えない
    • sys/netgraph/bluetooth/drivers/ubt/ng_ubt_intel.cusr.sbin/bluetooth/iwmbtfw/main.cを読み比べて、USBドングルからのメッセージ解析器を比べたところ、ng_ubt_intel.cubt_intel_tlv_is_firmware_running()でデータ列の初期位置をpos = offsetof(struct ubt_hci_event_command_compl, data);で初期化しているが、データ構造的には pos = 0;の間違いだと思われる
      • 修正するとubt0が生えて、Bluetooth mouseとの通信確立・Xorgでの動作を確認出来た
        • 動作確認時の ibt-0180-0041.sfiは、Revision 23.20.0.3
      • Reviewでは動いたとの報告があるので、最初のデータエントリ長とposの初期値がたまたま整合して動いてたのでは?
        • 手元の環境では、パッチしないと個別エントリの切り出した境界とデータパケットの末尾の位置が合わない模様
  • 後ほど、必要な修正点をまとめる
    • ibt-0180-0041.sfiのRevision確認
    • ng_ubt_intelドライバの修正項目
Command: iwmbtfw -D -I -d ugen1.4 -f /usr/local/share/iwmbt-firmware
main: opening dev 1.4
iwmbt_is_tlv: found TLV
iwmbt_dump_one_tlv: TLV: 0x10 = 0x00000800
iwmbt_dump_one_tlv: TLV: 0x11 = 0x00000410
iwmbt_dump_one_tlv: TLV: 0x12 = 0x00003700
iwmbt_dump_one_tlv: TLV: 0x15 = 0x0613
iwmbt_dump_one_tlv: TLV: 0x16 = 0x0000
iwmbt_dump_one_tlv: TLV: 0x17 = 0x8087
iwmbt_dump_one_tlv: TLV: 0x18 = 0x0033
iwmbt_dump_one_tlv: TLV: 0x1c = 0x01
iwmbt_dump_one_tlv: TLV: 0x1d = 0x1612
iwmbt_dump_one_tlv: TLV: 0x1e = 0x01
iwmbt_dump_one_tlv: TLV: 0x1f = 0x0000c072
iwmbt_dump_one_tlv: TLV: 0x27 = 0x00
iwmbt_dump_one_tlv: TLV: 0x28 = 0x01
iwmbt_dump_one_tlv: TLV: 0x29 = 0x00
iwmbt_dump_one_tlv: TLV: 0x2a = 0x01
iwmbt_dump_one_tlv: TLV: 0x2b = 0x01
iwmbt_dump_one_tlv: TLV: 0x2c = 0x00
iwmbt_dump_one_tlv: TLV: 0x2d has unhandled length of 3
iwmbt_dump_one_tlv: TLV: 0x2e = 0x00
iwmbt_dump_one_tlv: TLV: 0x2f = 0x01
iwmbt_dump_one_tlv: TLV: 0x30 has unhandled length of 6
iwmbt_dump_one_tlv: TLV: 0x31 = 0x00
iwmbt_dump_version: status       0x00
iwmbt_dump_version: hw_platform  0x37
iwmbt_dump_version: hw_variant   0x1b
iwmbt_dump_version: hw_revision  0x00
iwmbt_dump_version: fw_variant   0x00
iwmbt_dump_version: fw_revision  0x00
iwmbt_dump_version: fw_build_num 0x00
iwmbt_dump_version: fw_build_ww  0x00
iwmbt_dump_version: fw_build_yy  0x00
iwmbt_dump_version: fw_patch_num 0x00
main: fw_variant=0x00
main: firmware_path = /usr/local/share/iwmbt-firmware/ibt-0180-0041.sfi
iwmbt_init_firmware: loading /usr/local/share/iwmbt-firmware/ibt-0180-0041.sfi
iwmbt_load_fwfile: file=/usr/local/share/iwmbt-firmware/ibt-0180-0041.sfi, size=824316
iwmbt_load_fwfile: transferring 128 bytes, offset 644
...
iwmbt_load_fwfile: transferring 208 bytes, offset 824076
iwmbt_load_fwfile: transferring 4 bytes, offset 824284
iwmbt_load_fwfile: boot_param=0x00100800
iwmbt_load_fwfile: transferring 28 bytes, offset 824288
main: Firmware download complete
main: Firmware operational
iwmbt_dump_version: status       0x00
iwmbt_dump_version: hw_platform  0x37
iwmbt_dump_version: hw_variant   0x1b
iwmbt_dump_version: hw_revision  0xa0
iwmbt_dump_version: fw_variant   0x63
iwmbt_dump_version: fw_revision  0x0c
iwmbt_dump_version: fw_build_num 0x00
iwmbt_dump_version: fw_build_ww  0x00
iwmbt_dump_version: fw_build_yy  0x0e
iwmbt_dump_version: fw_patch_num 0x18
main: ddc_path = /usr/local/share/iwmbt-firmware/ibt-0180-0041.ddc
iwmbt_init_ddc: loading /usr/local/share/iwmbt-firmware/ibt-0180-0041.ddc
iwmbt_load_ddc: file=/usr/local/share/iwmbt-firmware/ibt-0180-0041.ddc, size=9
iwmbt_load_ddc: transferring 4 bytes, offset 0
iwmbt_load_ddc: transferring 5 bytes, offset 4
main: DDC download complete
main: Intel Event Mask is set
main: Firmware download is successful!

Command exit status: 0

カテゴリー: Admin | Emacs | EPICS | Fortran | FreeBSD | GCC | hgsubversion | IPv6 | KEKB | LHC | Lisp | LLVM | MADX | Ryzen | SAD | samba | tDiary | unix | WWW | YaSAI | お仕事 | イベント | 出張 | 宴会 | 数学 | 艦これ | 買いもの | 追記 | 雑記