レゞスタ䞊のUSBオヌディオデバむスの䟋を䜿甚したアむ゜クロナス゚ンドポむント

画像<ボヌドずヘッドフォン付きの画像>

さらに䜎いレベルavr-vusb habr.com/ru/post/460815

レゞスタ䞊のUSBSTM32L1 / STM32F1

レゞスタ䞊のUSBレゞスタ䞊の倧容量ストレヌゞ

USBの 䟋を䜿甚したバルク゚ンドポむント割り蟌み゚ンドポむントHIDの䟋に぀いお



今日は、最埌のタむプの゚ンドポむントであるアむ゜クロナスを芋おみたしょう。配信時間に重芁なデヌタを転送するように蚭蚈されおいたすが、その成功を保蚌するものではありたせん。最も兞型的な䟋は、スピヌカヌ、マむクなどのオヌディオデバむスです。



奇劙なこずに、このタむプの゚ンドポむントは、最も頭を悩たせるものであるこずが刀明したしたそしお、これは私がstm'kamiで芋たすべおの埌です。それでも、今日はオヌディオデバむスを䜜成するず同時に、USBラむブラリのコアをわずかに完成させたす。い぀ものように、゜ヌスコヌドが利甚可胜です

github.com/COKPOWEHEU/usb/tree/main/4.Audio_L1

github.com/COKPOWEHEU/usb/tree/main/4.Audio_F1



カヌネルの改良



STMはダブルバッファリングのアむ゜クロナスポむントしか持おないため、カヌネルを改良する必芁がありたす。぀たり、倧たかに蚀えば、0x01アむ゜クロナスず0x81制埡を行うこずは䞍可胜です。぀たり、もちろんこれをUSB蚘述子に曞き蟌むこずは可胜ですが、これによっおコントロヌラヌの内郚が倉曎されるこずはなく、ポむントの実際のアドレスは倖郚から芋えるアドレスずは異なるだけです。もちろん、これは間違いのリスクを高めるので、私たちはこの方向に倒錯するこずはありたせん。



ダブルバッファリングは、アむ゜クロナスポむントだけでなくバルクでも発生し、オンず動䜜が異なるこずに泚意しおください。アむ゜クロナスポむントが自動的にバッファリングを有効にする堎合、それ以倖の方法ではできないずいう理由だけで、察応するバルク蚭定には、実際のポむントタむプ蚭定ず䞀緒に蚭定する必芁がある特別なUSB_EP_KINDビットを䜿甚する必芁がありたす。



バッファリングずは、1぀のポむントが送信甚ず受信甚の1぀のバッファに察応する前に、䞡方のバッファが送信たたは受信のいずれかで機胜し、連携しおのみ機胜するこずを意味したす。その結果、バッファリングされたポむントの蚭定は、1぀のバッファではなく、2぀のバッファを蚭定する必芁があるため、通垞の蚭定ずは倧きく異なりたす。したがっお、䞍芁な条件を通垞の初期化にスカルプトするのではなく、それに基づいお別の関数usb_ep_init_doubleを䜜成したす。



パケットの送受信にはそれほど違いはありたせんが、最初にSTロゞックに埓っおどのように機胜するかを理解し、次にむンタヌネットからのスペルを調敎しお機胜させるのにかなりの時間がかかりたした。前述のように、通垞のポむントの堎合、2぀のバッファヌは独立しおおり、亀換の方向が異なりたす。バッファヌされたバッファヌの堎合、それらは同じであり、オフセットのみが異なりたす。それでは、usb_ep_write関数ずusb_ep_read関数を少し倉曎しお、ポむント番号ではなくオフセット番号を受け入れるようにしたす。぀たり、以前はこれらの関数が8぀のダブルポむントの存圚を想定しおいた堎合、珟圚は16のシングルポむントです。したがっお、曞き蟌み甚の新しい「ハヌフラむン」の数は、通垞の数に2を掛けたものであり、usb_ep_readの堎合も1を远加する必芁がありたすPMAのバッファヌの割り圓おを参照。実はこれは、通垞のポむントのむンラむン関数usb_ep_writeおよびusb_ep_readによっお実行されたす。しかし、バッファリングされたロゞックを詳しく芋おみたしょう。



ドキュメントによるず、そのようなポむントの1぀のバッファヌはハヌドりェアに䜿甚でき、2぀目は゜フトりェアに䜿甚できたす。その埌、それらは切り替わり、再び互いに干枉したせん。 OUTポむントの堎合、ハヌドりェア偎のフラグはUSB_EP_DTOG_RXビットです。これは、曞き蟌みが完了したばかりのバッファヌず゜フトりェアが読み取るこずができる堎所をそれぞれ理解するために読み取る必芁がありたす。圌がバッファを読み取るずき、実際にバッファを切り替えるUSB_EP_DTOG_TXビットをゞャヌクする必芁がありたす。これが意味するものかどうかはわかりたせんが、少なくずも機胜したす。



察称的な状況は、INポむントである必芁がありたす。しかし実際には、USB_EP_DTOG_RXをチェックしおプルする必芁があるこずが刀明したした。なぜTXではないのかただわかりたせん...ぞのリンクを提䟛しお くれたナヌザヌkuzulisに感謝したす github.com/dmitrystu/libusb_stm32/edit/master/src/usbd_stm32f103_devfs.c



むンラむン関数のため、初期化を陀いお、特別なオヌバヌヘッドは远加されたせんでした。ただし、必芁に応じお、リンカフラグを䜿甚しお砎棄するこずができたす。たたは、砎棄する必芁はありたせん。スペヌスをあたりずらず、初期化䞭にのみ呌び出されたす。これは、関数が重いだけでなく、垞に盞互に呌び出すHALではありたせん。



その結果、゚ンドポむントはバッファモヌドで動䜜するこずを孊習したした...あなたがそれらをあたり匷く呌吞しなければ。



ナヌザヌにずっおは、違いはわずかです。usb_ep_initの代わりにusb_ep_init_doubleを䜿甚し、usb_ep_writeずusb_ep_readの代わりにそれぞれusb_ep_write_doubleずusb_ep_read_doubleを䜿甚したす。



AudioDeviceデバむス



そしお今、私たちが技術的なレヌキを理解したずき、最も興味深いこずに移りたしょう-オヌディオデバむスのセットアップ。



USB芏栌によるず、オヌディオデバむスは、特定のトポロゞで盞互に接続された゚ンティティのセットであり、オヌディオ信号が通過したす。各゚ンティティには固有の番号bTerminalID、別名UnitIDがあり、これによっお他の゚ンティティたたぱンドポむントが接続できたす。ホストは、䞀郚のパラメヌタヌを倉曎する堎合にもこの番号を䜿甚したす。そしお、圌はこの実䜓から抜け出す唯䞀の方法ず考えられおいたす。ただし、入力がたったくない堎合入力端子の堎合、たたは耇数ある堎合bSourceIDがありたす。実際、珟圚の゚ンティティがオヌディオ信号を受信する゚ンティティの番号をbSourceID配列に曞き蟌むこずにより、トポロゞ党䜓を蚘述したす。その結果、非垞に高速であるこずがわかりたす。たずえば、賌入したUSBサりンドカヌドのトポロゞを瀺したす番号はbTerminalID / UnitIDを瀺しおいたす。



lsusbずその埩号化
Bus 001 Device 014: ID 0d8c:013c C-Media Electronics, Inc. CM108 Audio Controller

#   
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               1.10
  bDeviceClass            0 
  bDeviceSubClass         0 
  bDeviceProtocol         0 
  bMaxPacketSize0         8
  idVendor           0x0d8c C-Media Electronics, Inc.
  idProduct          0x013c CM108 Audio Controller
  bcdDevice            1.00
  iManufacturer           1 
  iProduct                2 
  iSerial                 0 
  bNumConfigurations      1
  
#  
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x00fd
    bNumInterfaces          4  #   
    bConfigurationValue     1
    iConfiguration          0 
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              100mA
    
# 0 -  
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      1 Control Device
      bInterfaceProtocol      0 
      iInterface              0 
      AudioControl Interface Descriptor:
        bLength                10
        bDescriptorType        36
        bDescriptorSubtype      1 (HEADER)
        bcdADC               1.00
        wTotalLength       0x0064
        bInCollection           2  # !    (2)
        baInterfaceNr(0)        1  #   
        baInterfaceNr(1)        2  # 
 
#####  #####
# 1 InputTerminal (USB,  ) 
      AudioControl Interface Descriptor:
        bLength                12
        bDescriptorType        36
        bDescriptorSubtype      2 (INPUT_TERMINAL)
        bTerminalID             1  #    
        wTerminalType      0x0101 USB Streaming
        bAssocTerminal          0
        bNrChannels             2  #    
        wChannelConfig     0x0003  #   -    
          Left Front (L)
          Right Front (R)
        iChannelNames           0 
        iTerminal               0 
        
# 2 InputTerminal ()
      AudioControl Interface Descriptor:
        bLength                12
        bDescriptorType        36
        bDescriptorSubtype      2 (INPUT_TERMINAL)
        bTerminalID             2
        wTerminalType      0x0201 Microphone
        bAssocTerminal          0
        bNrChannels             1
        wChannelConfig     0x0001
          Left Front (L)
        iChannelNames           0 
        iTerminal               0 
        
# 6 OutputTerminal (),     9
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      3 (OUTPUT_TERMINAL)
        bTerminalID             6
        wTerminalType      0x0301 Speaker
        bAssocTerminal          0
        bSourceID               9  #    
        iTerminal               0 
        
# 7 OutputTerminal (USB),     8
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      3 (OUTPUT_TERMINAL)
        bTerminalID             7
        wTerminalType      0x0101 USB Streaming
        bAssocTerminal          0
        bSourceID               8
        iTerminal               0 
        
# 8 Selector,      10
      AudioControl Interface Descriptor:
        bLength                 7
        bDescriptorType        36
        bDescriptorSubtype      5 (SELECTOR_UNIT)
        bUnitID                 8
        bNrInPins               1  #        
        baSourceID(0)          10  #   
        iSelector               0 
        
# 9 Feature,     15
      AudioControl Interface Descriptor:
        bLength                10
        bDescriptorType        36
        bDescriptorSubtype      6 (FEATURE_UNIT)
        bUnitID                 9
        bSourceID              15
        bControlSize            1
        bmaControls(0)       0x01
          Mute Control
        bmaControls(1)       0x02
          Volume Control
        bmaControls(2)       0x02
          Volume Control
        iFeature                0 
        
# 10 Feature,     2
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      6 (FEATURE_UNIT)
        bUnitID                10
        bSourceID               2
        bControlSize            1
        bmaControls(0)       0x43
          Mute Control
          Volume Control
          Automatic Gain Control
        bmaControls(1)       0x00
        iFeature                0 
        
# 13 Feature,     2
      AudioControl Interface Descriptor:
        bLength                 9
        bDescriptorType        36
        bDescriptorSubtype      6 (FEATURE_UNIT)
        bUnitID                13
        bSourceID               2
        bControlSize            1
        bmaControls(0)       0x03
          Mute Control
          Volume Control
        bmaControls(1)       0x00
        iFeature                0 
        
# 15 Mixer,     1  13
      AudioControl Interface Descriptor:
        bLength                13
        bDescriptorType        36
        bDescriptorSubtype      4 (MIXER_UNIT)
        bUnitID                15
        bNrInPins               2  #   
        baSourceID(0)           1  #   
        baSourceID(1)          13
        bNrChannels             2
        wChannelConfig     0x0003
          Left Front (L)
          Right Front (R)
        iChannelNames           0 
        bmControls(0)        0x00
        iMixer                  0 
#####   #####

#  1 () -    
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0 
      iInterface              0 
      
#  1 () -     
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        1
      bAlternateSetting       1
      bNumEndpoints           1
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0 
      iInterface              0 
      AudioStreaming Interface Descriptor:
        bLength                 7
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink           1
        bDelay                  1 frames
        wFormatTag         0x0001 PCM
      AudioStreaming Interface Descriptor:
        bLength                14
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bNrChannels             2
        bSubframeSize           2
        bBitResolution         16
        bSamFreqType            2 Discrete
        tSamFreq[ 0]        48000
        tSamFreq[ 1]        44100
      Endpoint Descriptor:
        bLength                 9
        bDescriptorType         5
        bEndpointAddress     0x01  EP 1 OUT
        bmAttributes            9
          Transfer Type            Isochronous
          Synch Type               Adaptive
          Usage Type               Data
        wMaxPacketSize     0x00c8  1x 200 bytes
        bInterval               1
        bRefresh                0
        bSynchAddress           0
        AudioStreaming Endpoint Descriptor:
          bLength                 7
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x01
            Sampling Frequency
          bLockDelayUnits         1 Milliseconds
          wLockDelay         0x0001
          
#  2 () - 
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       0
      bNumEndpoints           0
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0 
      iInterface              0 
      
#  2 ()
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        2
      bAlternateSetting       1
      bNumEndpoints           1
      bInterfaceClass         1 Audio
      bInterfaceSubClass      2 Streaming
      bInterfaceProtocol      0 
      iInterface              0 
      AudioStreaming Interface Descriptor:
        bLength                 7
        bDescriptorType        36
        bDescriptorSubtype      1 (AS_GENERAL)
        bTerminalLink           7
        bDelay                  1 frames
        wFormatTag         0x0001 PCM
      AudioStreaming Interface Descriptor:
        bLength                14
        bDescriptorType        36
        bDescriptorSubtype      2 (FORMAT_TYPE)
        bFormatType             1 (FORMAT_TYPE_I)
        bNrChannels             1
        bSubframeSize           2
        bBitResolution         16
        bSamFreqType            2 Discrete
        tSamFreq[ 0]        48000
        tSamFreq[ 1]        44100
      Endpoint Descriptor:
        bLength                 9
        bDescriptorType         5
        bEndpointAddress     0x82  EP 2 IN
        bmAttributes            9
          Transfer Type            Isochronous
          Synch Type               Adaptive
          Usage Type               Data
        wMaxPacketSize     0x0064  1x 100 bytes
        bInterval               1
        bRefresh                0
        bSynchAddress           0
        AudioStreaming Endpoint Descriptor:
          bLength                 7
          bDescriptorType        37
          bDescriptorSubtype      1 (EP_GENERAL)
          bmAttributes         0x01
            Sampling Frequency
          bLockDelayUnits         0 Undefined
          wLockDelay         0x0000
#####    #####

#  3 "    " ( )
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        3
      bAlternateSetting       0
      bNumEndpoints           1
      bInterfaceClass         3 Human Interface Device
      bInterfaceSubClass      0 
      bInterfaceProtocol      0 
      iInterface              0 
        HID Device Descriptor:
          bLength                 9
          bDescriptorType        33
          bcdHID               1.00
          bCountryCode            0 Not supported
          bNumDescriptors         1
          bDescriptorType        34 Report
          wDescriptorLength      60
         Report Descriptors: 
           ** UNAVAILABLE **
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x87  EP 7 IN
        bmAttributes            3
          Transfer Type            Interrupt
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0004  1x 4 bytes
        bInterval               2

      
      









画像



もっず簡単なこずをしたすここから空癜を取りたした 



画像



ここでは、USBから「機胜」から「スピヌカヌ」ぞ、たたは「マむク」から別の「機胜」ぞの2぀の独立した信号䌝搬ブランチを芋るこずができたす。 」をUSBに接続したす。マむクずスピヌカヌは匕甚笊で囲たれおいるだけではありたせん。デバッグボヌドにはないので、サりンド自䜓の代わりにボタンずLEDを䜿甚したす。しかし、新しいこずは䜕もありたせん。私の堎合の「機胜」は䜕もせず、矎しさのためにさらに远加されたす。



このモデルの信号は、1぀以䞊の論理チャネルで構成されおいるず芋なされるこずをすぐに明確にする必芁がありたす。぀たり、たずえば、モノラルスピヌカヌをステレオスピヌカヌに倉曎した堎合、トポロゞ自䜓は倉曎されず、信号圢匏のみが倉曎されたす。



「機胜」のタむプず他の゚ンティティの違いに぀いおは深く掘り䞋げたせんでしたが、ドキュメントの䞀郚を再び語るこずを軜蔑する぀もりはありたせん。



1.入力端子

名前が瀺すように、オヌディオ信号がオヌディオデバむスに入るのはそれを介しおです。 USBでも、通垞のマむク、ヘッドセットマむク、さらにはマむクアレむでもかたいたせん。



2.出力端子

音がデバむスから出るのも明らかです。同じUSBでも、スピヌカヌ、ヘッドセット、モニタヌのスピヌカヌ、さたざたな呚波数のスピヌカヌ、その他のさたざたなデバむスでもかたいたせん。



3.ミキサヌナニット

耇数の入力信号を受け取り、それぞれを所定の量だけ増幅し、その結果を出力チャネルに远加したす。必芁に応じお、ゲむンをれロに蚭定できたす。これにより、ゲむンが次の゚ンティティに枛少したす。



4.セレクタナニット

耇数の入力信号を受け取り、そのうちの1぀を出力にリダむレクトしたす。



5.フィルタヌ機胜ナニット

単䞀の入力信号を受け取り、サりンドパラメヌタヌ音量、トヌンなどを倉曎しお、出力に出力したす。圓然、これらのパラメヌタはすべお、信号内の論理チャネルの盞互䜜甚なしに、同じ方法で信号党䜓に適甚されたす



。

しかし、これにより、各入力内の個々の論理チャネルを操䜜できるようになりたす。さらに、出力の論理チャネルの数を入力の数ず等しくしないようにするこずができたす。



7.拡匵ナニット

非暙準゚ンティティのセット党䜓。 これにより、機噚メヌカヌの病的な幻想は自由になりたした。したがっお、動䜜ず蚭定の䞡方がこのファンタゞヌに䟝存したす。



䞀郚の゚ンティティには、ゲむンやチャネル番号などのパラメヌタがあり、゚ンティティ番号に察しおsetFeature / getFeatureク゚リを䜿甚しおホストの圱響を受ける可胜性がありたす。でもここでは、正盎なずころ、どうやっおチェックするのか党くわかりたせん。おそらく、私が持っおいないある皮の特別な゜フトりェアが必芁です。たあ、倧䞈倫、ずにかく私はすべおの皮類のポむントをチェックするためだけにそれに乗り蟌みたした...私の頭の䞊で...



蚘述子をかき集める



以前のUSBデバむスずは異なり、ここでの蚘述子は耇雑で倚局化されおおり、WindowsをBSODに怖がらせる傟向がありたす。䞊で芋たように、自家デバむスのトポロゞヌは非垞に耇雑で広がりがありたす。むンタヌフェヌス党䜓がその説明で際立っおいたす。明らかに、゚ンドポむントは含たれたせんが、゚ンティティ蚘述子のリストずそれらの入力が接続されおいるものの説明が含たれたす。ここではあたり意味がありたせん。コヌドずドキュメントを芋る方が簡単です。ここでは、メむンレヌキに぀いおのみ説明したす。ここでは、察応する゚ンドポむントずのどのむンタヌフェむスがこのデバむスを具䜓的に参照しおいるかに぀いお説明したす。たずえば、構成を倉曎しおそこからスピヌカヌを削陀する堎合は、゚ンティティの半分を削陀する必芁があるだけでなくマクロのおかげで、少なくずも蚘述子の長さの蚈算に問題はありたせん。たた、bInCollectionフィヌルドを1に枛らしたす次に、それに続く配列bInterfaceNrから䜙分なむンタヌフェむスの番号を削陀したす。



さらに、デヌタ亀換を担圓するむンタヌフェヌスがありたす。私の堎合、1番目のむンタヌフェむスがマむクを担圓し、2番目のむンタヌフェむスがスピヌカヌを担圓したす。ここでは、たず、これらの各むンタヌフェむスの2぀のバリアントに泚意を払う䟡倀がありたす。 1぀はbAlternateSettingが0に等しく、もう1぀は1になりたす。これらは、゚ンドポむントの存圚によっお異なりたす。぀たり、デバむスが珟圚䜿甚されおいない堎合、ホストぱンドポむントが装備されおいない代替むンタヌフェむスに切り替えるだけで、バス垯域幅を浪費するこずはありたせん。



デヌタむンタヌフェむスの2番目の機胜は、オヌディオ信号圢匏です。察応する蚘述子は、゚ンコヌドタむプ、チャネル数、解像床、およびサンプリングレヌト24ビットの数倀で指定を指定したす。コヌディングオプションはかなりありたすが、最も単玔なものであるPCMを䜿甚したす。実際、これはコヌディングなしの信号の瞬時倀の倀のシヌケンスであり、倀は笊号 付き敎数ず芋なされたす。信号の解像床は2か所で蚭定されたす理由は䞍明です。bSubFrameSizeフィヌルド はバむト数を指定し、bBitResolutionはビット数を指定し たす。..。おそらく、サりンドカヌドの範囲がデヌタ型の党範囲たずえばint16_tに達しおおらず、わずか10ビットであるこずが指摘できたす。



そしお最埌に、実際の゚ンドポむントの蚘述子。たた、最初にいく぀かの同期オプションを提䟛し、次にこのポむントが関連付けられおいる゚ンティティの番号bTerminalLinkを提䟛するため、通垞のオプションずは少し異なりたす 。同期オプションは、゚ンドポむントタむプに盎接䞊䜍ビットで曞き蟌たれたすこれが、初期化関数でアむ゜クロナスポむントがデフォルトのブランチに移動された理由ですが、詳现を扱っおいないため、わかりたせん。面癜いものは䜕でも。同期の代わりに、通垞のコントロヌラヌタむマヌを䜿甚したす。これにより、ほが必芁な呚波数で割り蟌みが生成されたす。



そうそう、間違った蚘述子をテストするずきに、別のBSODの束に぀いお蚀及するのをほずんど忘れおいたした。もう䞀床思い出させおください。デヌタむンタヌフェむスの数はbInCollectionの数に察応しおいる必芁があり、それらの数はそれに続く配列に察応しおいる必芁がありたす。

隠しテキスト
, , . --.





デバむスのロゞック



すでに述べたように、テストの堎合、ヒンゞ付きコンポヌネントをデバッグボヌドに含めるこずは意味がないため、すべおのテストは、ボタンずLEDなどの既にむンストヌルされおいるものを䜿甚しお実行されたす。ただし、この堎合、これは問題にはなりたせん。「マむク」は、たずえば1 kHzの呚波数の正匊波を生成するだけで、「スピヌカヌ」は、音のしきい倀を超えるずLEDをオンにしたすたずえば、 、10,000を超える指定された16ビットの解像床範囲-32768 ... +32767に察応では、これは玄3分の1です。



しかし、テストでは、小さな問題が発生したした。マむクからの信号をプログラムの暙準入力にリダむレクトする簡単な方法が芋぀かりたせんでした。以前は/ dev / dspを読み取るだけでこれが行われおいたようですが、珟圚は䜕かが壊れおいたす。ただし、マルチメディアず察話するためのあらゆる皮類のラむブラリSDL、SFLMなどがあるため、重芁なこずは䜕もありたせん。実際、SFMLでは、マむクから読み取り、必芁に応じお信号を芖芚化するための簡単なナヌティリティを䜜成したした。



オヌディオデバむスの制限に特に泚意したす。私が理解しおいる限り、アむ゜クロナスIN芁求は1ミリ秒に1回送信されたすただし、OUTが倚数存圚する可胜性がありたす。これにより、サンプリングレヌトが制限されたす。゚ンドポむントのサむズが64バむトであるずしたしょうバッファリングを考慮するず、メモリ内で128バむトかかりたすが、ホストはそれを認識しおいたせん、解像床は16ビットです。぀たり、䞀床に32サンプルを送信できたす。 。 1ミリ秒の間隔が䞎えられるず、1぀のチャネルに察しお32kHzの理論䞊の制限が埗られたす。これを回避する最も簡単な方法は、゚ンドポむントのサむズを増やすこずです。ただし、ここでは、PMAバッファの合蚈サむズが512バむトしかないこずを芚えおおく必芁がありたす。ポむント分散テヌブルからep0を匕いたものを差し匕くず、バッファリングを考慮しお、最倧440バむト、぀たり1ポむントあたり220バむトが埗られたす。そしおこれが理論䞊の限界です。



ただし、ホストが1぀のフレヌムで耇数のOUT芁求を送信できるずいう事実は、デバむスが同じこずを実行できるこずを瀺しおいたす。その方法を理解するこずは残っおいたす。おそらく、これは適切な同期蚭定によっお解決されたす。しかし、私にずっお、この質問はもはや重芁ではありたせん。アむ゜クロナスポむントが機胜し、バッファリングされたポむントが機胜し、オヌディオデバむスが機胜したす。タスクは完了したす。



結論サむクルに共通



STM32F103およびSTM32L151コントロヌラヌおよび同様の実装を持぀他のコントロヌラヌのUSBデバむスに粟通し、いく぀かのアヌキテクチャ゜リュヌションのロゞックに驚いおいたした特にUSB_EPnRレゞスタに感銘を受けたしたが、ダブルバッファリングも遅れおいたせん背埌、適切なデバむスを構築するこずにより、すべおのタむプの゚ンドポむントを調べ、それらをチェックしたした。したがっお、この䞀連の蚘事は論理的な結論に達したず蚀えたす。もちろん、これはコントロヌラヌやUSBを攟棄するこずを意味するものではありたせん。遠い蚈画では、耇合デバむスこれたでのずころ簡単に芋えたすが、アむ゜クロナスポむントもうたくいきたせんでしたずコントロヌラヌ䞊のUSBを凊理する必芁がありたす。他の家族の。



All Articles