背景
バラシの可能性は大いにありますが🤣、USBデバイスの製品を開発する案件が発生しました🎉
USBのホストはMacです。
ちゃんとした製品なので、USBのデスクリプタに消費電力(Mac上では割り当て電力)を正しく表示させる必要があります。
STM32CubeIDEではどうやって値を指定するんだろう...と、かなりいろんな情報に惑わされたため、備忘録、そして今後このような設定をする方のために、記事として残しておこうと思いました。
USBデバイスの消費電流を定義する
さて、STM32CubeIDEで何もしないと、Mac上には「割り当て電力」が表示されません。
以前はCubeMXで記述できたり、ソースコード上で記述したりする方式だったようですが、現在はこれらの方法ではできませんでした。
これらの情報をもとにソースコードを追いかけていくと、消費電流はマクロ定義で指定することが判明しました!
#ifndef USBD_MAX_POWER
#define USBD_MAX_POWER 0x32U /* 100 mA */
#endif /* USBD_MAX_POWER */
USBD_MAX_POWERが定義されてなければ、0x32という値が採用されるということですね。
実際の電流値は、指定の値(0x32 = 50)の2倍の値です。
なので、上記のコードでは50 x 2 = 100(mA)ということになります。
500mAに指定するには、USBD_MAX_POWERを250(0xfa)にすればいいですね。
プロジェクトのCコンパイラプリプロセッサにこのマクロを定義するのが楽そう。
これでコンパイルして実行すると、こんな感じで「割り当て電力」が指定通りになりますね。
このように、現在はマクロ定義する仕様に変わっています。
USB-MIDIインターフェースの場合
この案件とは別にUSB-MIDIインターフェースも開発していますが、これはどうなってるんだろう...
500mAになってます。
実際はこんなに消費しないんですが、まぁいいでしょう。
ところで、これはどこで定義しているんだろう?
探したところ、こちらで定義されていました。
/* USB MIDI device Configuration Descriptor */
__ALIGN_BEGIN static uint8_t USBD_MIDI_CfgDesc[USB_MIDI_CONFIG_DESC_SIZE] __ALIGN_END =
{
0x09, /* bLength: Configuration Descriptor size */
USB_DESC_TYPE_CONFIGURATION,/* bDescriptorType: Configuration */
USB_MIDI_CONFIG_DESC_SIZE,
0x00, /*Length of the total configuration block, including this descriptor, in bytes.*/
0x01, /*bNumInterfaces: 1 interface*/
0x01, /*bConfigurationValue: ID of this configuration. */
0x00, /*iConfiguration: Index of string descriptor describing the configuration (Unused.)*/
0x80, /*bmAttributes: Bus Powered device, not Self Powered, no Remote wakeup capability. */
0xFA, /*MaxPower 500 mA: this current is used for detecting Vbus*/
.
.
.
.
消費電流が500mAだったので、0xfaで検索したら見つかりました。
USB-MIDIインターフェースについては、ここを書き換えて実態に応じた値へ変更するか、最大の500mAと宣言しておくか...ちょっと悩ましいところです。
最後に
USBデバイスの消費電流設定に困っている人の助けになれば幸いです。



