Post Go back to editing

Linux for ADSP‐SC5xx read audio from A2B bus

Category: Software
Product Number: ADZS-SC589-MINI
Software Version: Linux for ADSP‐SC5xx Processors 3.1.0

Hi Team,

I built the yocto image and uploaded successfully into the ADSP-SC589 following the guide: github.com/.../Getting-Started-with-ADSP‐SC589‐MINI-(Linux-for-ADSP‐SC5xx-Processors-3.1.0)
Then I also cross-compiled a simple server-client to send messages through the Ethernet to a PC.

Now I would like to read from the A2B bus the audio channels coming from the 4 microphones connected and send the raw data through the Ethernet.
Is there a guide to do this? Any suggestion about the library I should use to access the data on the A2B bus?

thanks

Thread Notes

Parents
  • Hi Barbisanl, you may check out this page, A2B® Software | Analog Devices, to see if A2B for Linux can address your question. We will chat with our Linux team to see if they have any examples. A side question, what is your goal of using SAM Linux? for passing audio from SAM to a PC?

  • Yes, I need to read the audio data from A2B bus and then send it to a PC

  • I need to take a step back to understand if what I'm trying to do is feasible with the hardware I have available.

    I have at my disposal:
    - SHARC Audio Module (ADZS-SC589-MINI)
    - JTAG emulator (ICE-1000)
    - an array of 4 microphones (EVAL-AD2428WC1BZ).

    I would like to know if I can somehow read the audio from the 4 channels of the respective microphones connected via the A2B bus and transmit this data to a PC connected via Ethernet cable in the same LAN.

    My initial approach was to use the Yocto Linux system, where I opened a socket to transmit data via Ethernet using a program I wrote in C++. At the moment, I am successfully transmitting sinusoidal waves and receiving them correctly for all the 4 channels.

    But in this way, I'm having trouble understanding if:
    1) does the A2B stack give me the possibility to read the audio channels by creating a C++ program to run on the SAM board?
    2) To use the A2B stack, the manual requires creating a scheme via SigmaStudio, but to do this, the SigmaStudio manual requires the use of a USBi which requires an additional board (EVAL-ADUSB2EBZ), is this correct? Can't it be created without it?
    3) Am I on the right track? Or are there more correct alternatives for using these boards? Considering that I would like to add three more arrays of microphones (EVAL-AD2428WC1BZ) to the A2B bus later, for a total of 16 audio channels to be transmitted to the PC.

  • Hi  ,

    1) Yes, what you are asking for is possible with our Audio Starter framework. Please give me a few to update and send you instructions. For number of channels, there may be some limitations. as some of the tools I have seen/used only allow stereo inputs so you might need to do some work to find a suitable tool to receive Ethernet Audio. (Note that the software is capable of up to 32 channels of audio out to VBAN).

    2) You will need the XML file generated from SigmaStudio for the Audio Starter framework. No, you don't need the USBi to generate this file. However, it can be very useful to have as it allows you to run and test your configuration in real-time prior to integrating and using it in your code. 

    3) Yes, I believe you are on the right track for what you are trying to accomplish. 

    As a side note, your request is also possible using USB instead of Ethernet as your PC connection. Please let me know if you would like information on A2B -> USB (PC) as well. 

  • Hi  ,

    You can use our Audio Starter framework (Networking branch is required for Ethernet): https://github.com/analogdevicesinc/sam-audio-starter/tree/Networking-2.0.0-Github .

    We have a Wiki here that tells you how to set up some basic examples: https://wiki.analog.com/resources/tools-software/sharc-audio-module/advanced-audio-projects . If you have used the Audio Starter framework, I recommend starting from the 'Set up pre-requisites required for this tutorial' and move forward, page by page. If you make it the Ethernet Audio Example CODEC->VBAN successfully, then there would only be a couple of additional steps to hook up your A2B PDM mic and route it to the Ethernet port.

    Also please note that 2.0.0 was just recently pushed and we are still updating some of the Wiki pages so if you get stuck somewhere before I get a chance to update, please let me know. 

  • Hi ,

    I completed the example from https://wiki.analog.com/resources/tools-software/sharc-audio-module/advanced-audio-projects to send data CODEC->VBAN.

    However, it provides instructions for transmitting audio from the LINE IN connector. it is not explained how to send the A2B channels. And it doesn't utilize SigmaStudio or the A2B Stack library.

    Using this advanced audio project and writing "help" in the serial communication, there is a "a2b" command. But it has only the possibility to set the board as main node or sub node.

    Where can I find more information on how to use A2B within this project?

  • Hi  ,

    Yes, unfortunately we do not have any example documentation for A2B in our Wiki at the moment. It is in our pipeline to add those. In the meanwhile, I have prepared an XML and a couple of SigmaStudio projects for your EVAL-AD2428WC1BZ so you can hook it up to your ADZS-SC589-MINI and retrieve the microphone data:

    ToShare.zip

    Please extract this file. In here you will see a Sigma Studio project for SAM v1.4 and SAM v2.1 since I do not know what version of hardware you are using.

    For A2B bus discovery, you will only need the adi_a2b_commandlist.xml file located in the xml folder of one of the two projects. Note that the Sigma Studio project is only needed if you need to make modifications to the XML file. For that we have various examples online on how to use Sigma Studio for A2B. 

    Please follow these steps below:

    1. Please ensure you have an SD Card placed in your SD Card slot on your hardware. If you do not have an SD Card and prefer to use the external flash instead, let me know.

    2. With your Audio Starter up and running with your shell window, type the command recv a2b_mic.xml

    3. Once you see the Waiting for file prompt, in TeraTerm navigate to File->Transfer->XMODEM->Send and choose the adi_a2b_commandlist.xml for your version of hardware:

    4. Once the transfer is complete, run the ls command ensure the contents of the xml file have made it to your file system on the SAM:

    5. Now plug in your EVAL-AD2428WC1BZ into the SAM board as shown below:

    6. Now back in your shell, type the command: discover a2b_mic.xml

    If the discovery was successful, you should see the red LED (D2 - connected to IO4 light up). 

    7. Before passing mic data to your PC, I highly suggest doing a sanity check and make sure that you can hear the MICs come of out of the codec (LINE OUT) first. To do this - you can type the following routes as an example:

    route 0 a2b 0 codec 0 1 0 - This will route microphone data from the MIC labeled M2 in the schematic to the left channel of the codec.

    or 

    route 0 a2b 1 codec 0 1 0 - This will route microphone data from the MIC labeled M3 in the schematic to the left channel of the codec. 

    or 

    route 0 a2b 2 codec 0 1 0 - This will route microphone data from the MIC labeled M1 in the schematic to the left channel of the codec. 

    or 

    route 0 a2b 3 codec 0 1 0 - This will route microphone data from the MIC labeled M4 in the schematic to the left channel of the codec.

    Note that these are individual routes to allow you to hear and isolate the MICs to just verify the hardware you have is set up properly (these are just intermediate steps to clarify for you). 

    Schematic:https://www.analog.com/media/en/evaluation-boards-kits/evaluation-software/EE420v01.zip 

    8. If this works out for you, you can simply change your routing sink from codec to vban (following the VBAN example that you already went through). So for this Wiki example: https://wiki.analog.com/resources/tools-software/sharc-audio-module/advanced-audio-projects/examples-ethernet-audio#audio_connection_setupcodec-_vban, when you get to step 7 for the routing, you can instead route to VBAN like below:

    Note that the above example is for 2 channels of MIC data (aligned with Wiki example). To get 4 channels you will need to configure your VBAN with 4 channels and route using 4 channels as shown below:

    Please let me know if you run into any issues with any of these steps. 

  • Thank you very much, using your xml file works! (I have SAM v2.1)

    However, when I tried to generate the xml file myself using the sigma studio project (without modifying it) I get the following error with the command "discover":

    # discover a2b_mic.xml
    Error loading 'a2b_mic.xml' A2B init XML file#

    I opened the xml file with a text editor and I saw that the structure is different from yours, maybe I extracted the wrong xml file. What I did was to right-click on "Target Processor" in the schematic and then "Export system config files...", selected the destination path, and clicked "Generate".

    This is the file I exported:

    <?xml version="1.0" standalone="no"?>
    <Bus_Configuration>
      <Version_Info>
        <BCF_Version Version="1.0.0" />
        <A2BDLL_Version Version="19.4.3.0" />
        <A2BStackDLL_Version Version="19.4.3.0" />
        <SigmaStudio_Version Version="4.07.000.1831" />
      </Version_Info>
      <Bus_Properties Num_of_Master_Nodes="1" Num_of_Slave_Nodes="1" />
      <Master_Slave_Chains Master_Slave_Chains="Chain_Num0" />
      <Master_Slave_Chain Chain_Num="0" Num_of_Slave_Nodes="1">
        <Node Version="" Type="Master" ID="0x0" Source_ID="0xFF" Part_number="ADI_A2B_AD2428" NodeName="A2B Main Node SAM">
          <Authentication_Settings>
            <Register_Field Vendor="0xAD" />
            <Register_Field Version="0x0" />
            <Register_Field Product="0x28" />
            <Register_Field Capability="0x1" />
            <Transceiver_Authentication_Field Transceiver_Authentication="A2B_ENABLED" />
          </Authentication_Settings>
          <Custom_Node_Id_Settings>
            <Custom_Node_Id_Field Custom_Node_Id_Authentication="A2B_DISABLED" />
          </Custom_Node_Id_Settings>
          <I2S_Settings>
            <Register_Field TDM_mode="TDM16" />
            <Register_Field TDM_channel_size="32-bit" />
            <Register_Field Sync_Mode="Pulse" />
            <Register_Field Sync_polarity="Rising Edge" />
            <Register_Field Early_frame_sync_status="Disabled" />
            <Register_Field Serial_Rx_on_DTx1="Disabled" />
            <Register_Field Transmit_Bit_clock_polarity="Falling Edge" />
            <Register_Field Receive_Bit_clock_polarity="Rising Edge" />
            <Register_Field TX_interleave_slots="Enabled" />
            <Register_Field RX_interleave_slots="Enabled" />
            <Register_Field Transmit_data_offset_in_TDM="0x0" />
            <Register_Field Receive_data_offset_in_TDM="0x0" />
            <Register_Field TxPin_TriState_before_driving_TDM_slots="Disabled" />
            <Register_Field TxPin_TriState_after_driving_TDM_slots="Disabled" />
            <Rate_Settings>
              <Reduced_Rate_Valid_Bits>
                <Register_Field LSB="DISABLED" />
                <Register_Field Extra_Bit="DISABLED" />
                <Register_Field Extra_Channel="DISABLED" />
              </Reduced_Rate_Valid_Bits>
              <Register_Field Strobe_in_IO1="DISABLED" />
              <Register_Field Strobe_Direction="DISABLED" />
            </Rate_Settings>
          </I2S_Settings>
          <Basic_Configuration_and_Control>
            <Register_Field Response_cycles="0x70" />
            <Register_Field Slot_Fmt="0x44" />
            <Register_Field Pass_Up_Slots="0x4" />
            <Register_Field Pass_Down_Slots="0x0" />
            <Register_Field Early_acknowledge_for_I2C="Disabled" />
            <Register_Field Data_control="0x3" />
          </Basic_Configuration_and_Control>
          <GPIO_Settings>
            <Register_Field GPIO_1_Pin_multiplexing="DISABLE" />
            <Register_Field GPIO_2_Pin_multiplexing="DISABLE" />
            <Register_Field GPIO_3_Pin_multiplexing="DTX0" />
            <Register_Field GPIO_4_Pin_multiplexing="DTX1" />
            <Register_Field GPIO_5_Pin_multiplexing="DRX0" />
            <Register_Field GPIO_6_Pin_multiplexing="DRX1" />
            <Register_Field GPIO_7_Pin_multiplexing="DISABLE" />
            <Register_Field Digital_Pin_Drive_Strength="Low" />
            <Register_Field IRQ_Edge="Rising Edge" />
            <Register_Field IRQ_Tristate="DISABLE" />
          </GPIO_Settings>
          <Interrupt_Configuration>
            <Register_Field Header_count_error="Report" />
            <Register_Field Data_decoding_error="Report" />
            <Register_Field Data_CRC_error="Report" />
            <Register_Field Data_parity_error="Do Not Report" />
            <Register_Field Data_bus_power_error="Report" />
            <Register_Field Bit_error_count_overflow_error="Report" />
            <Register_Field SRF_miss_error="Report" />
            <Register_Field GPIO_1_Interrupt="Do Not Report" />
            <Register_Field GPIO_2_Interrupt="Do Not Report" />
            <Register_Field GPIO_3_Interrupt="Report" />
            <Register_Field GPIO_4_Interrupt="Report" />
            <Register_Field GPIO_5_Interrupt="Report" />
            <Register_Field GPIO_6_Interrupt="Report" />
            <Register_Field GPIO_7_Interrupt="Do Not Report" />
            <Register_Field I2C_failure_error="Report" />
            <Register_Field Discovery_completion="Report" />
            <Register_Field Interrupt_frame_error="Report" />
            <Register_Field Slave_Interrupt_Request="Report" />
          </Interrupt_Configuration>
          <GPIO_Over_Distance_Settings>
            <GPIOD_1_Config>
              <Register_Field GPIOD_1="DISABLE" />
              <Register_Field GPIOD_1_Signal_Invert="DISABLE" />
              <GPIOD1_MASK>
                <Register_Field GPIO1_Flag0="Mask" GPIO1_Flag1="Mask" GPIO1_Flag2="Mask" GPIO1_Flag3="Mask" GPIO1_Flag4="Mask" GPIO1_Flag5="Mask" GPIO1_Flag6="Mask" GPIO1_Flag7="Mask" />
              </GPIOD1_MASK>
            </GPIOD_1_Config>
            <GPIOD_2_Config>
              <Register_Field GPIOD_2="DISABLE" />
              <Register_Field GPIOD_2_Signal_Invert="DISABLE" />
              <GPIOD2_MASK>
                <Register_Field GPIO2_Flag0="Mask" GPIO2_Flag1="Mask" GPIO2_Flag2="Mask" GPIO2_Flag3="Mask" GPIO2_Flag4="Mask" GPIO2_Flag5="Mask" GPIO2_Flag6="Mask" GPIO2_Flag7="Mask" />
              </GPIOD2_MASK>
            </GPIOD_2_Config>
            <GPIOD_3_Config>
              <Register_Field GPIOD_3="DISABLE" />
              <Register_Field GPIOD_3_Signal_Invert="DISABLE" />
              <GPIOD3_MASK>
                <Register_Field GPIO3_Flag0="Mask" GPIO3_Flag1="Mask" GPIO3_Flag2="Mask" GPIO3_Flag3="Mask" GPIO3_Flag4="Mask" GPIO3_Flag5="Mask" GPIO3_Flag6="Mask" GPIO3_Flag7="Mask" />
              </GPIOD3_MASK>
            </GPIOD_3_Config>
            <GPIOD_4_Config>
              <Register_Field GPIOD_4="DISABLE" />
              <Register_Field GPIOD_4_Signal_Invert="DISABLE" />
              <GPIOD4_MASK>
                <Register_Field GPIO4_Flag0="Mask" GPIO4_Flag1="Mask" GPIO4_Flag2="Mask" GPIO4_Flag3="Mask" GPIO4_Flag4="Mask" GPIO4_Flag5="Mask" GPIO4_Flag6="Mask" GPIO4_Flag7="Mask" />
              </GPIOD4_MASK>
            </GPIOD_4_Config>
            <GPIOD_5_Config>
              <Register_Field GPIOD_5="DISABLE" />
              <Register_Field GPIOD_5_Signal_Invert="DISABLE" />
              <GPIOD5_MASK>
                <Register_Field GPIO5_Flag0="Mask" GPIO5_Flag1="Mask" GPIO5_Flag2="Mask" GPIO5_Flag3="Mask" GPIO5_Flag4="Mask" GPIO5_Flag5="Mask" GPIO5_Flag6="Mask" GPIO5_Flag7="Mask" />
              </GPIOD5_MASK>
            </GPIOD_5_Config>
            <GPIOD_6_Config>
              <Register_Field GPIOD_6="DISABLE" />
              <Register_Field GPIOD_6_Signal_Invert="DISABLE" />
              <GPIOD6_MASK>
                <Register_Field GPIO6_Flag0="Mask" GPIO6_Flag1="Mask" GPIO6_Flag2="Mask" GPIO6_Flag3="Mask" GPIO6_Flag4="Mask" GPIO6_Flag5="Mask" GPIO6_Flag6="Mask" GPIO6_Flag7="Mask" />
              </GPIOD6_MASK>
            </GPIOD_6_Config>
            <GPIOD_7_Config>
              <Register_Field GPIOD_7="DISABLE" />
              <Register_Field GPIOD_7_Signal_Invert="DISABLE" />
              <GPIOD7_MASK>
                <Register_Field GPIO7_Flag0="Mask" GPIO7_Flag1="Mask" GPIO7_Flag2="Mask" GPIO7_Flag3="Mask" GPIO7_Flag4="Mask" GPIO7_Flag5="Mask" GPIO7_Flag6="Mask" GPIO7_Flag7="Mask" />
              </GPIOD7_MASK>
            </GPIOD_7_Config>
          </GPIO_Over_Distance_Settings>
          <Clock_Output_Settings>
            <Register_Field Pre_Div_Factor1="2" />
            <Register_Field Post_Div_Factor1="2" />
            <Register_Field Clk1_Invert="Disabled" />
            <Register_Field Pre_Div_Factor2="2" />
            <Register_Field Post_Div_Factor2="2" />
            <Register_Field Clk2_Invert="Disabled" />
          </Clock_Output_Settings>
          <Register_Settings>
            <Register_Field SWCTL_Register="0x1" />
            <Register_Field PDMCTL_Register="0x0" />
            <Register_Field TESTMODE_Register="0x0" />
            <Register_Field BECCTL_Register="0xEF" />
            <Register_Field ERRMGMT_Register="0x0" />
            <Register_Field I2STEST_Register="0x0" />
            <Register_Field GENERR_Register="0x0" />
            <Register_Field RAISE_Register="0x0" />
            <Register_Field BMMCFG_Register="0x0" />
            <Register_Field PDMCTL2_Register="0x0" />
            <Register_Field PLLCTL_Register="0x0" />
            <Register_Field TXACTL_Register="0x0" />
            <Register_Field TXBCTL_Register="0x0" />
            <Register_Field CONTROL_Register="0x0" />
          </Register_Settings>
          <Stream_Settings>
            <Source_Streams Number_of_Src_Streams="0" />
            <Sink_Streams Number_of_Snk_Streams="1">
              <Sink_Stream ID="0" Name="MICS" Sample_Rate="48" Data_Width="24" Num_Channels="4" Num_Slots="4" BusSlotIndex="0" Channels_To_Skip="0" Direction="UPSTREAM" />
            </Sink_Streams>
          </Stream_Settings>
        </Node>
        <Node Version="" Type="Slave" ID="0x0" Source_ID="0x0" Part_number="ADI_A2B_AD2428" Local_power="False" Enable_AutoConfig="False" NodeName="AD242x Sub Node0">
          <Authentication_Settings>
            <Register_Field Vendor="0xAD" />
            <Register_Field Version="0x0" />
            <Register_Field Product="0x28" />
            <Register_Field Capability="0x1" />
            <Transceiver_Authentication_Field Transceiver_Authentication="A2B_ENABLED" />
            <AnalyzerNode_Field AnalyzerNode="A2B_DISABLED" />
          </Authentication_Settings>
          <Custom_Node_Id_Settings>
            <Custom_Node_Id_Field Custom_Node_Id_Authentication="A2B_DISABLED" />
          </Custom_Node_Id_Settings>
          <I2S_Settings I2SReg_ProgrammedBy="Master">
            <Register_Field TDM_mode="TDM8" />
            <Register_Field TDM_channel_size="32-bit" />
            <Register_Field Sync_Mode="50 % Duty Cycle" />
            <Register_Field Sync_polarity="Falling Edge" />
            <Register_Field Early_frame_sync_status="Enabled" />
            <Register_Field Serial_Rx_on_DTx1="Disabled" />
            <Register_Field Sync_Offset_with_Super_frame="0x0" />
            <Register_Field Transmit_Bit_clock_polarity="Falling Edge" />
            <Register_Field Receive_Bit_clock_polarity="Rising Edge" />
            <Register_Field TX_interleave_slots="Disabled" />
            <Register_Field RX_interleave_slots="Disabled" />
            <Rate_Settings RateReg_ProgrammedBy="Master">
              <Register_Field I2S_sampling_rate="SFF x 1" />
              <Register_Field Reduce_Retransmit="Disabled" />
              <Register_Field Reduced_Rate_Share_Slot="DISABLED" />
              <Reduced_Rate_Valid_Bits>
                <Register_Field LSB="DISABLED" />
                <Register_Field Extra_Bit="DISABLED" />
              </Reduced_Rate_Valid_Bits>
              <Register_Field Strobe_in_IO1="DISABLED" />
              <Register_Field Strobe_Direction="DISABLED" />
              <Register_Field Reduced_Rate_Sync_Offset="0" />
            </Rate_Settings>
          </I2S_Settings>
          <Basic_Configuration_and_Control>
            <Register_Field Response_cycles="0x70" />
            <Register_Field I2C_Interface_Frequency="400 kHz" />
            <Register_Field Super_Frame_Rate="48.0 kHz" />
            <Register_Field Pass_Up_Slots="0x0" />
            <Register_Field Pass_Down_Slots="0x0" />
            <Register_Field Slots_for_Dwnstrm_Contribute="0x0" />
            <Register_Field Offset_for_Downstream_Contribute="0x0" />
            <Register_Field Additional_Down_Offset="0x0" />
            <Register_Field Local_UpSlots_Consume="0x0" />
            <UpStream_Masks>
              <Register_Field UpSlot0="Mask" UpSlot1="Mask" UpSlot2="Mask" UpSlot3="Mask" UpSlot4="Mask" UpSlot5="Mask" UpSlot6="Mask" UpSlot7="Mask" UpSlot8="Mask" UpSlot9="Mask" UpSlot10="Mask" UpSlot11="Mask" UpSlot12="Mask" UpSlot13="Mask" UpSlot14="Mask" UpSlot15="Mask" UpSlot16="Mask" UpSlot17="Mask" UpSlot18="Mask" UpSlot19="Mask" UpSlot20="Mask" UpSlot21="Mask" UpSlot22="Mask" UpSlot23="Mask" UpSlot24="Mask" UpSlot25="Mask" UpSlot26="Mask" UpSlot27="Mask" UpSlot28="Mask" UpSlot29="Mask" UpSlot30="Mask" UpSlot31="Mask" />
            </UpStream_Masks>
            <Register_Field Broadcast_Slots="0x0" />
            <Register_Field Local_Down_Slots_Consume="0x0" />
            <Register_Field Use_Consume_Masks_DwnStream="Enabled" />
            <Downstream_Masks>
              <Register_Field DownSlot0="Mask" DownSlot1="Mask" DownSlot2="Mask" DownSlot3="Mask" DownSlot4="Mask" DownSlot5="Mask" DownSlot6="Mask" DownSlot7="Mask" DownSlot8="Mask" DownSlot9="Mask" DownSlot10="Mask" DownSlot11="Mask" DownSlot12="Mask" DownSlot13="Mask" DownSlot14="Mask" DownSlot15="Mask" DownSlot16="Mask" DownSlot17="Mask" DownSlot18="Mask" DownSlot19="Mask" DownSlot20="Mask" DownSlot21="Mask" DownSlot22="Mask" DownSlot23="Mask" DownSlot24="Mask" DownSlot25="Mask" DownSlot26="Mask" DownSlot27="Mask" DownSlot28="Mask" DownSlot29="Mask" DownSlot30="Mask" DownSlot31="Mask" />
            </Downstream_Masks>
            <Register_Field Local_Up_Slots_Contribute="0x4" />
            <Register_Field Offset_for_Upstream_Contribute="0x0" />
            <Register_Field Additional_Up_Offset="0x0" />
            <Register_Field A_Side_CableLen="4.00" />
          </Basic_Configuration_and_Control>
          <GPIO_Settings PinConfigReg_ProgrammedBy="Master">
            <Register_Field GPIO_0_Pin_multiplexing="INPUT" Interrupt="Interrupt Enable" Polarity="Falling Edge" />
            <Register_Field GPIO_1_Pin_multiplexing="DISABLE" />
            <Register_Field GPIO_2_Pin_multiplexing="CLKOUT" />
            <Register_Field GPIO_3_Pin_multiplexing="DISABLE" />
            <Register_Field GPIO_4_Pin_multiplexing="OUTPUT" Value="High" />
            <Register_Field GPIO_5_Pin_multiplexing="PDM0" />
            <Register_Field GPIO_6_Pin_multiplexing="PDM1" />
            <Register_Field GPIO_7_Pin_multiplexing="DISABLE" />
            <Register_Field Digital_Pin_Drive_Strength="Low" />
            <Register_Field IRQ_EDGE="Rising Edge" />
            <Register_Field IRQ_TRI="DISABLE" />
          </GPIO_Settings>
          <PDM_Settings>
            <Register_Field Number_of_PDM0_slots="2-Slot" />
            <Register_Field Number_of_PDM1_slots="2-Slot" />
            <Register_Field Use_High_Pass_Filter="Enabled" />
            <Register_Field PDM_Rate="A2B_PDM_RATE_SFF" />
            <Register_Field PDM_AltClk_Inv_OnBCLK="Disabled" />
            <Register_Field PDM_Alt_Clk="Disabled" />
            <Register_Field PDM0_Falling_Edge_First="Disabled" />
            <Register_Field PDM1_Falling_Edge_First="Disabled" />
            <Register_Field PDM_Destination="A2B_BUS_ONLY" />
          </PDM_Settings>
          <Interrupt_Configuration>
            <Register_Field Header_count_error="Report" />
            <Register_Field Data_decoding_error="Report" />
            <Register_Field Data_CRC_error="Report" />
            <Register_Field Data_parity_error="Do Not Report" />
            <Register_Field Data_bus_power_error="Report" />
            <Register_Field Bit_error_count_overflow_error="Report" />
            <Register_Field SRF_miss_error="Report" />
            <Register_Field SRF_CRC_error="Do Not Report" />
            <Register_Field GPIO_0_Interrupt="Report" />
            <Register_Field GPIO_1_Interrupt="Report" />
            <Register_Field GPIO_2_Interrupt="Report" />
            <Register_Field GPIO_3_Interrupt="Report" />
            <Register_Field GPIO_4_Interrupt="Report" />
            <Register_Field GPIO_5_Interrupt="Report" />
            <Register_Field GPIO_6_Interrupt="Report" />
            <Register_Field GPIO_7_Interrupt="Do Not Report" />
          </Interrupt_Configuration>
          <GPIO_Over_Distance_Settings GpioDReg_ProgrammedBy="Master">
            <GPIOD_0_Config>
              <Register_Field GPIOD_0="DISABLE" />
              <Register_Field GPIOD_0_Signal_Invert="DISABLE" />
              <GPIOD0_MASK>
                <Register_Field GPIO0_Flag0="Mask" GPIO0_Flag1="Mask" GPIO0_Flag2="Mask" GPIO0_Flag3="Mask" GPIO0_Flag4="Mask" GPIO0_Flag5="Mask" GPIO0_Flag6="Mask" GPIO0_Flag7="Mask" />
              </GPIOD0_MASK>
            </GPIOD_0_Config>
            <GPIOD_1_Config>
              <Register_Field GPIOD_1="DISABLE" />
              <Register_Field GPIOD_1_Signal_Invert="DISABLE" />
              <GPIOD1_MASK>
                <Register_Field GPIO1_Flag0="Mask" GPIO1_Flag1="Mask" GPIO1_Flag2="Mask" GPIO1_Flag3="Mask" GPIO1_Flag4="Mask" GPIO1_Flag5="Mask" GPIO1_Flag6="Mask" GPIO1_Flag7="Mask" />
              </GPIOD1_MASK>
            </GPIOD_1_Config>
            <GPIOD_2_Config>
              <Register_Field GPIOD_2="DISABLE" />
              <Register_Field GPIOD_2_Signal_Invert="DISABLE" />
              <GPIOD2_MASK>
                <Register_Field GPIO2_Flag0="Mask" GPIO2_Flag1="Mask" GPIO2_Flag2="Mask" GPIO2_Flag3="Mask" GPIO2_Flag4="Mask" GPIO2_Flag5="Mask" GPIO2_Flag6="Mask" GPIO2_Flag7="Mask" />
              </GPIOD2_MASK>
            </GPIOD_2_Config>
            <GPIOD_3_Config>
              <Register_Field GPIOD_3="DISABLE" />
              <Register_Field GPIOD_3_Signal_Invert="DISABLE" />
              <GPIOD3_MASK>
                <Register_Field GPIO3_Flag0="Mask" GPIO3_Flag1="Mask" GPIO3_Flag2="Mask" GPIO3_Flag3="Mask" GPIO3_Flag4="Mask" GPIO3_Flag5="Mask" GPIO3_Flag6="Mask" GPIO3_Flag7="Mask" />
              </GPIOD3_MASK>
            </GPIOD_3_Config>
            <GPIOD_4_Config>
              <Register_Field GPIOD_4="DISABLE" />
              <Register_Field GPIOD_4_Signal_Invert="ENABLE" />
              <GPIOD4_MASK>
                <Register_Field GPIO4_Flag0="Mask" GPIO4_Flag1="Mask" GPIO4_Flag2="Mask" GPIO4_Flag3="Mask" GPIO4_Flag4="Mask" GPIO4_Flag5="Mask" GPIO4_Flag6="Mask" GPIO4_Flag7="Mask" />
              </GPIOD4_MASK>
            </GPIOD_4_Config>
            <GPIOD_5_Config>
              <Register_Field GPIOD_5="DISABLE" />
              <Register_Field GPIOD_5_Signal_Invert="DISABLE" />
              <GPIOD5_MASK>
                <Register_Field GPIO5_Flag0="Mask" GPIO5_Flag1="Mask" GPIO5_Flag2="Mask" GPIO5_Flag3="Mask" GPIO5_Flag4="Mask" GPIO5_Flag5="Mask" GPIO5_Flag6="Mask" GPIO5_Flag7="Mask" />
              </GPIOD5_MASK>
            </GPIOD_5_Config>
            <GPIOD_6_Config>
              <Register_Field GPIOD_6="DISABLE" />
              <Register_Field GPIOD_6_Signal_Invert="DISABLE" />
              <GPIOD6_MASK>
                <Register_Field GPIO6_Flag0="Mask" GPIO6_Flag1="Mask" GPIO6_Flag2="Mask" GPIO6_Flag3="Mask" GPIO6_Flag4="Mask" GPIO6_Flag5="Mask" GPIO6_Flag6="Mask" GPIO6_Flag7="Mask" />
              </GPIOD6_MASK>
            </GPIOD_6_Config>
            <GPIOD_7_Config>
              <Register_Field GPIOD_7="DISABLE" />
              <Register_Field GPIOD_7_Signal_Invert="DISABLE" />
              <GPIOD7_MASK>
                <Register_Field GPIO7_Flag0="Mask" GPIO7_Flag1="Mask" GPIO7_Flag2="Mask" GPIO7_Flag3="Mask" GPIO7_Flag4="Mask" GPIO7_Flag5="Mask" GPIO7_Flag6="Mask" GPIO7_Flag7="Mask" />
              </GPIOD7_MASK>
            </GPIOD_7_Config>
          </GPIO_Over_Distance_Settings>
          <Clock_Output_Settings>
            <Register_Field Pre_Div_Factor1="2" />
            <Register_Field Post_Div_Factor1="2" />
            <Register_Field Clk1_Invert="Disabled" />
            <Register_Field Pre_Div_Factor2="2" />
            <Register_Field Post_Div_Factor2="4" />
            <Register_Field Clk2_Invert="Enabled" />
          </Clock_Output_Settings>
          <Register_Settings>
            <Register_Field SWCTL_Register="0x0" />
            <Register_Field TESTMODE_Register="0x0" />
            <Register_Field BECCTL_Register="0xEF" />
            <Register_Field ERRMGMT_Register="0x0" />
            <Register_Field PLLCTL_Register="0x0" />
            <Register_Field I2STEST_Register="0x0" />
            <Register_Field GENERR_Register="0x0" />
            <Register_Field RAISE_Register="0x0" />
            <Register_Field BMMCFG_Register="0x0" />
            <Register_Field SUSCFG_Register="0x0" />
            <Register_Field MBOX0CTL_Register="0x0" />
            <Register_Field MBOX1CTL_Register="0x0" />
            <Register_Field TXACTL_Register="0x0" />
            <Register_Field TXBCTL_Register="0x0" />
            <Register_Field CONTROL_Register="0x0" />
          </Register_Settings>
          <Peripheral_Config Number_of_Peripherals="0x2">
            <Peripheral_0_Config>
              <Property I2C_interface_status="True" />
              <Property I2C_Address="0x50" />
              <Property Device_Type="GenericI2CDevice" />
              <Property Tx0_Pin_Use="False" />
              <Property Rx0_Pin_Use="False" />
              <Property Tx1_Pin_Use="False" />
              <Property Rx1_Pin_Use="False" />
              <Property No_of_Tx0_Channels="0x0" />
              <Property No_of_Rx0_Channels="0x0" />
              <Property No_of_Tx1_Channels="0x0" />
              <Property No_of_Rx1_Channels="0x0" />
              <Property Enable_Program_During_Discovery="False" />
            </Peripheral_0_Config>
            <Peripheral_1_Config>
              <Property I2C_interface_status="False" />
              <Property I2C_Address="0x50" />
              <Property Device_Type="Source" />
              <Property Tx0_Pin_Use="True" />
              <Property Rx0_Pin_Use="False" />
              <Property Tx1_Pin_Use="True" />
              <Property Rx1_Pin_Use="False" />
              <Property No_of_Tx0_Channels="0x2" />
              <Property No_of_Rx0_Channels="0x0" />
              <Property No_of_Tx1_Channels="0x2" />
              <Property No_of_Rx1_Channels="0x0" />
              <Property Enable_Program_During_Discovery="False" />
            </Peripheral_1_Config>
          </Peripheral_Config>
          <Stream_Settings>
            <Source_Streams Number_of_Src_Streams="1">
              <Source_Stream ID="0" Name="MICS" Sample_Rate="48" Data_Width="24" Num_Channels="4" Num_Slots="4" BusSlotIndex="0" Channels_To_Skip="0" Direction="UPSTREAM" />
            </Source_Streams>
            <Sink_Streams Number_of_Snk_Streams="0" />
            <PassThru_Streams Number_of_PassThru_Streams="0" />
          </Stream_Settings>
        </Node>
        <Common_Config>
          <Register_Field Downstream_slot_size="24-bit" />
          <Register_Field Upstream_slot_size="24-bit" />
          <Register_Field Upstream_compression="False" />
          <Register_Field Downstream_compression="False" />
          <Register_Field Reduce_Rate_on_Bus="Disabled" />
          <Register_Field System_Reduce_Rate_Factor="0" />
          <Register_Field Enable_upstream="True" />
          <Register_Field Enable_downstream="True" />
          <Register_Field Master_I2C_address="0x68" />
          <Register_Field Bus_I2C_address="0x69" />
        </Common_Config>
      </Master_Slave_Chain>
      <Network_Configuration>
        <Register_Field Discovery_Mode="Simple" />
        <Register_Field Discovery_StartDelay_ms="0x19" />
        <Register_Field Line_Diagnostics="Disable" />
        <Register_Field Auto_Rediscovery_upon_Critical_Fault="Disable" />
        <Register_Field Number_of_Discovery_Attempts_on_Critical_Fault="0x0" />
        <Register_Field Auto_Rediscovery_upon_Post_Discovery_Fault="Disable" />
        <Register_Field Rediscovery_Interval_ms="0x64" />
        <Register_Field Number_of_Peripheral_Devices="0x3" />
        <Network_Peripheral_Config>
          <Network_Peripheral_0_Config>
            <Register_Field I2C_Interface_in_Use="True" />
            <Register_Field I2C_Address="0x38" />
            <Register_Field SPI_SlaveSelect="0x38" />
            <Register_Field Device_Type="AudioHost" />
            <Register_Field Tx0_Pin_Use="False" />
            <Register_Field Rx0_Pin_Use="False" />
            <Register_Field Tx1_Pin_Use="False" />
            <Register_Field Rx1_Pin_Use="False" />
            <Register_Field No_of_Tx0_Channels="0x2" />
            <Register_Field No_of_Rx0_Channels="0x2" />
            <Register_Field No_of_Tx1_Channels="0x2" />
            <Register_Field No_of_Rx1_Channels="0x0" />
            <Register_Field Program_Discovery="False" />
            <Register_Field Config_Filename="xml\SAM-1761-TDM8-master.xml" />
          </Network_Peripheral_0_Config>
          <Network_Peripheral_1_Config>
            <Register_Field I2C_Interface_in_Use="True" />
            <Register_Field I2C_Address="0x50" />
            <Register_Field SPI_SlaveSelect="0x50" />
            <Register_Field Device_Type="GenericDevice" />
            <Register_Field Tx0_Pin_Use="False" />
            <Register_Field Rx0_Pin_Use="False" />
            <Register_Field Tx1_Pin_Use="False" />
            <Register_Field Rx1_Pin_Use="False" />
            <Register_Field No_of_Tx0_Channels="0x0" />
            <Register_Field No_of_Rx0_Channels="0x0" />
            <Register_Field No_of_Tx1_Channels="0x0" />
            <Register_Field No_of_Rx1_Channels="0x0" />
            <Register_Field Program_Discovery="False" />
            <Register_Field Config_Filename="xml\xml\adi_a2b_master_ADAU1361.xml" />
          </Network_Peripheral_1_Config>
          <Network_Peripheral_2_Config>
            <Register_Field I2C_Interface_in_Use="True" />
            <Register_Field I2C_Address="0x39" />
            <Register_Field SPI_SlaveSelect="0x39" />
            <Register_Field Device_Type="GenericDevice" />
            <Register_Field Tx0_Pin_Use="False" />
            <Register_Field Rx0_Pin_Use="False" />
            <Register_Field Tx1_Pin_Use="False" />
            <Register_Field Rx1_Pin_Use="False" />
            <Register_Field No_of_Tx0_Channels="0x0" />
            <Register_Field No_of_Rx0_Channels="0x0" />
            <Register_Field No_of_Tx1_Channels="0x0" />
            <Register_Field No_of_Rx1_Channels="0x0" />
            <Register_Field Program_Discovery="False" />
            <Register_Field Config_Filename="xml\adi_a2b_master_ADAU1361.xml" />
          </Network_Peripheral_2_Config>
        </Network_Peripheral_Config>
      </Network_Configuration>
      <Stream_Configuration>
        <Stream_Definition>
          <Stream_Definition_Info Stream_ID="0" Stream_Name="MICS" Sample_Rate="48" Data_Width="24" Num_Channels="4" Channels_To_Skip="0" />
        </Stream_Definition>
        <Stream_Assignment>
          <Stream_Assignment_Info Stream_ID="0" Stream_Name="MICS" Source_Name="AD242x Sub Node0" Source_ID="0" Dest_Count="1" Destination_Name_0="A2B Main Node SAM" Destination_ID_0="-1" Routing_style="Reserved" />
        </Stream_Assignment>
      </Stream_Configuration>
      <TimeStamp>
        <Time_Stamp Project_Name="SAM_V2_1_EVAL-AD2428WC1BZ.dspproj" Date-Time="3/1/2024 5:28:21 PM" />
      </TimeStamp>
      <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
        <SignedInfo>
          <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />
          <SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
          <Reference URI="">
            <Transforms>
              <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
            </Transforms>
            <DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
            <DigestValue>4b0qiit7oSiKt0aJJWa2dP4P2e8=</DigestValue>
          </Reference>
        </SignedInfo>
        <SignatureValue>QgSu/R9Lyak+2U08VJ8MGyyUljqGyltHmnsqBgwHQ5JM6v9Rh9KznAMwA+qvGb/V7tLPe/fpRrAgjAxYJcyFyR2RNNpGIN7XyYXNMLko+LIvld7tG7iY+BOQa4xkitJZc/Ki+d4XG5pg1QL+pLkx7jdNUfv+9gIb4mMQydcJXf4=</SignatureValue>
      </Signature>
    </Bus_Configuration>

    What is the correct procedure for exporting the xml file?

  • Hi  , I'm glad to hear that worked for you!

    Regarding re-generation, it looks like what you have attached may actually be the bus configuration, rather than the command list. The command list generation would be in the second tab:

    I actually had a bus configuration XML in the V1.4 version (adi_a2b_busconfig.xml) and if you compare that one with your version you will see they are very similar (minus differences in tool versions). 

    Are you able to double check this? 

  • Hi

    Yes, I was exporting the wrong configuration.

    Now, by exporting the "command list", I was able to create a configuration for 4 arrays of microphones and to transmit 16 audio channels.

    Is there a way to automatically initialize the transmission when the board is turned on? Specifically, the commands "discover", "route", and "vban"?

    I made a registration of about 1h and analyzing the VBAN header of the received packets there are some missing packets.

    I did the recording with 48kHz sample rate, 32bit, and 16 channels.

    Each UDP packet contains 22 audio samples.

    received packets: 8051824 (177140128 audio samples)
    total lost packets: 1811 (39842 audio samples)

    Is it possible to avoid the loss of packets? maybe changing the transmission protocol to TCP?

    I also tried to open the project https://github.com/analogdevicesinc/sam-audio-starter/tree/Networking-2.0.0-Github with CCES as explained in the README but the import tool does not recognize the three projects.

    I am using CCES 2.11.1

  • Hi  ,

    Good to hear the project is working for you! 

    Regarding your first question:

    The board can automatically run the commands you need, yes. At startup, it will try to run a file called shell.cmd from SF. You can load this file into your file system by running:

    recv sf:shell.cmd

    And then follow the XMODEM->Send just like before as you did with the A2B XML.

    I've attached an example here (it's just a text file essentially). 

    discover a2b_mic.xml
    delay
    vban tx on 192.168.2.1 6980 4 16
    route 0 a2b 0 vban 0 4 20
    

    If you load this as above and then do a reset of your system, it should automatically run these commands at startup. 

    You can also make changes to this file locally on your system by running if you want to modify or add new commands:

    edit sf:shell.cmd (commands are similar to nano). 

    Regarding your second question:

    We are not able to support TCP because our main goal in this starter project is to ensure continuous streaming that is audible whereas TCP includes retries which can introduce significant latency on the stream.

    I don't expect the UDP to drop samples (at least I haven't seen it in my own testing, even though technically the protocol allows it). This is true when your Ethernet connection is direct to your PC (but not true when using Wifi, etc.)

    To confirm, are you wired directly from the board to your PC? Or are you routing your cable to your wall/to a router, etc.? 

    If your connection is direct, are you able to observe the dropped samples by reducing your bits from 32 to 16-bits? I think there are also some PC settings in Voicemeeter (Net Quality) that also can affect the samples dropping or not. If you can try a few of these suggestions out and let me know if you see some improvement that would be great. Otherwise on my side I'll see if I can otherwise reproduce the issue. 

    Regarding your third question:

    Yes, there is not a CCES project (for compilation) unfortunately for the Networking branch. I should probably remove that note as it only applies to the regular 2.0.0 branch. To confirm, are you trying to use CCES to debug? If so, you can rebuild the software by following the compilation instructions here: 

    https://wiki.analog.com/resources/tools-software/sharc-audio-module/advanced-audio-projects/environment_setup#application_compilation 

    (Don't forget to ensure your environment is sourced: https://wiki.analog.com/resources/tools-software/sharc-audio-module/advanced-audio-projects/environment_setup#path_setup 

    And you can still debug the code in CCES with the software compiled by command line (from above steps), by following the instructions here: https://wiki.analog.com/resources/tools-software/sharc-audio-module/advanced-audio-projects/debug-session#debug_session_-_adzs-sc589-mini 

  • ,

    When I execute "recv sf:shell.cmd," I encounter the following error: "unable to open file sf:shell.cmd."

    I attempted to create the file using "edit sf:shell.cmd," but it returned: "Can't save! I/O error: Success," and the file is not visible when I use "ls sf:."

    Additionally, I have a question: What does SF stand for?

Reply Children
  • Hi  ,

    SF stands for SPIFFs file system. The Audio Starter has two file systems: One on the SD Card and one on the external flash chip connected to the DSP (SPIFFs). It's possible that your external flash needs to be formatted. Can you run fsck sf:  and paste the output here? 

    If you get a NOT OK or something similar, you may need to run the format command:

  • Great! I resolved the issue by formatting the SF flash memory.

    Additionally, I transferred the a2b_mic.xml file to the SF memory, allowing the board to work without requiring a MicroSD card. Is it a good solution?

    I couldn't find a command to change the IP address of the board. Is it possible to do it?

  • Hi  ,

    Excellent! And yes, transferring the A2B XML to SF memory is totally fine. Just keep in mind that the external flash is smaller than an SD Card so you may not be able to store as much data (depending on what you are doing - though A2B XMLs are quite small so this is no issue). And when you are doing the discover command you will need to append the sf: to the filename since SF is not the default in the system.

    There is not a command to change the IP address - you will have to modify the code directly. You can do this in the file context.h (ARM/include/context.h):

    You can change these definitions and then rebuild the code and reflash (as before). You can verify that the updates are present by running the syslog command:

    This will give you confirmation that your network is up and that the new settings for your IP have been applied.