KeyMediaVolumeInc の値は 0xE4E9。上位の 0xE4 はTinyGoが付けた「Consumer Controlのキー」という目印で、下位の 0xE9 はHIDで決められた Volume Increment の値。
Down() は上位バイトを見てキーの種類を判定する。0xE4〜0xE7 なら Consumer Control なので downCon() に渡す。
c & 0x03FF で目印を外し、0xE9 だけを kb.con(押下中の Consumer Control キーを保持する配列)に入れる。
kb.con[0] の値を下位バイト・上位バイトに分け、Report ID 03 と合わせて3バイトのReportを作る。
Reportのデータ構造: Report Descriptorは付録に入れています
Consumer Page(Usage Page `0x0C`)から、今回扱うUsageを抜粋。
RTCとあるが、抜粋しただけなのと今回は見なくて良いので気にしないでください。RTC: Re-trigger Control, 「値が 1 の間、イベント完了後に再度イベントを発生させる」タイプの Control
HIDではReport内の複数バイトの値をlittle-endian(下位バイトが先)で並べる(HID 1.11 §5.8)。
TinyGoも b[1] に下位、b[2] に上位を入れているので、E9 00 は 0x00E9 と読む。
TinyGoのHID実装で、Media Keyの分岐からConsumer Control Reportの送信までのコードを読んだ。
USBホストがReportを受け取ったあと、HIDドライバがHIDの入力として解釈する。
その結果がOS側の入力処理に渡されて、最終的にVolume Incrementとして音量変更に反映される。
OS内部の具体的な実装はOSごとに異なるが、HID Usageを音量操作として扱う。