This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

SIO_ready function never get true

I use:
Bios_5_42_01_09.
Ccsv6.
Edma3_lld_01_11_03_01.
Pspdrivers_01_30_00_05.
Xdctools_3_30_03_47_core.

Problem in string number 99.

I can get data from codec. I forever wait SIO_ready. It is not work when i use 2 or more buffers. When buffer is one it is all works.

I not use aic31 driver and audio driver, only mcasp.

Part of my code:

#define BUFLEN                  4096
#define BUFALIGN                128
#define NUM_BUFS                2

Uint8 buf[NUM_BUFS][BUFLEN];
extern Int edma3init();
extern EDMA3_DRV_Handle hEdma;
extern Mcasp_ChanParams mcasp_chanparam;

Mcasp_HwSetupData mcaspRcvSetup = {
        /* .rmask    = */ 0xFFFFFFFF, /* All the data bits are to be used     */
        /* .rfmt     = */ 0x000180F0,
        /* .afsrctl  = */ 0x00000110, /* burst mode,
                                       * Frame sync is one bit
                                       * Rising edge is start of frame
                                       * externally generated frame sync
                                       */
        /* .rtdm     = */ 0x00000003, /* slot 1 is active (DSP)               */
        /* .rintctl  = */ 0x00000000, /* sync error and overrun error         */
        /* .rstat    = */ 0x00000050, /* reset any existing status bits       */
        /* .revtctl  = */ 0x00000000, /* DMA request is enabled or disabled   */
        {
             /* .aclkrctl  = */ 0x00000020,
             /* .ahclkrctl = */ 0x00008000,
             /* .rclkchk   = */ 0x00FF0000
        }
} ;

Mcasp_ChanParams  mcasp_chanparam =
{
        0x0001,                    /* number of serialisers      */
        {Mcasp_SerializerNum_12, }, /* serialiser index           */
        &mcaspRcvSetup,
        TRUE,
        Mcasp_OpMode_TDM,          /* Mode (TDM/DIT)             */
        Mcasp_WordLength_32,
        NULL,
        0,
        NULL,
        NULL,
        2,                        /* number of TDM channels      */
        Mcasp_BufferFormat_1SER_MULTISLOT_INTERLEAVED,
        TRUE,
        TRUE
};

void audioUserMcaspInit(){
  /* power on the Mcasp 1 instance in the PSC  */
  Psc_ModuleClkCtrl(Psc_DevId_1, CSL_PSC_MCASP1, TRUE);

  Mcasp_init();
  mcasp0Params = Mcasp_PARAMS;
  mcasp0Params.hwiNumber = 8;
  mcasp0Params.enablecache = TRUE;
  mcasp0Params.mcaspHwSetup.glb.pfunc = 0x0200E7FF;  
  mcasp0Params.mcaspHwSetup.glb.pdir = 0x08000800; 
  mcasp0Params.mcaspHwSetup.glb.ctl = 0x00001F1E;  

  mcasp0Params.mcaspHwSetup.rx.fmt = 0x000180F0;
  mcasp0Params.mcaspHwSetup.rx.frSyncCtl = 0x00000110;
  mcasp0Params.mcaspHwSetup.rx.tdm = 0x00000000;
  mcasp0Params.mcaspHwSetup.rx.stat = 0x000001ff;
  mcasp0Params.mcaspHwSetup.rx.clk.clkSetupClk = 0x00000020;
  mcasp0Params.mcaspHwSetup.rx.clk.clkSetupHiClk = 0x00008000;
  mcasp0Params.mcaspHwSetup.rx.clk.clkChk = 0x00FF0000;

  mcasp0Params.mcaspHwSetup.tx.fmt = 0x000180F0;
  mcasp0Params.mcaspHwSetup.tx.frSyncCtl = 0x00000110;
  mcasp0Params.mcaspHwSetup.tx.tdm = 0x00000003;
  mcasp0Params.mcaspHwSetup.tx.stat = 0x00000050;
  mcasp0Params.mcaspHwSetup.tx.clk.clkSetupClk = 0x00000080;
  mcasp0Params.mcaspHwSetup.tx.clk.clkSetupHiClk = 0x00008000;
  mcasp0Params.mcaspHwSetup.tx.clk.clkChk = 0xEFFF0000;

}

static void createStreams(){
  SIO_Attrs sioAttrs;
  sioAttrs = SIO_ATTRS;
  sioAttrs.nbufs = NUM_BUFS;
  sioAttrs.align = BUFALIGN;
  sioAttrs.model = SIO_ISSUERECLAIM;
  mcasp_chanparam.edmaHandle = hEdma;
  inStream = SIO_create("/dioMcaspIN", SIO_INPUT, BUFLEN, &sioAttrs);
}

extern LOG_Obj trace;
void i2s_test(){
  edma3init();
  codec_init_aic32(PCM_16,SR_48000);
  EnablePinResetCodec();
  createStreams();
  Int count;
  for(count = 0; count < NUM_BUFS; count++)
    if(SYS_OK != SIO_issue(inStream, (Ptr) buf[count], BUFLEN, NULL))
      LOG_printf(&trace, "Error issue\n");
  Ptr rcv;
  while(1){
   if(SIO_ready(inStream))
    if(SYS_OK == SIO_reclaim(inStream, (Ptr *)&rcv, NULL))
      if(SYS_OK != SIO_issue(inStream, rcv, BUFLEN, NULL))
        LOG_printf(&trace, "Error issue\n");
  }
  return;
}

/*-------------------------------------------------------------------------------------------------------------------------

bios.UDEV.create("mcasp0");
bios.UDEV.instance("mcasp0").fxnTableType = "IOM_Fxns";
bios.UDEV.instance("mcasp0").initFxn = prog.extern("audioUserMcaspInit");
bios.UDEV.instance("mcasp0").params = prog.extern("mcasp0Params");
bios.UDEV.instance("mcasp0").fxnTable = prog.extern("Mcasp_IOMFXNS");
bios.UDEV.instance("mcasp0").deviceId = 0;


var dioCodec = bios.DIO.create("dioMcaspIN");
dioCodec.deviceName = prog.get("mcasp0");
dioCodec.useCallBackFxn = false;
dioCodec.chanParams = prog.extern("mcasp_chanparam");

Please help.

  • Can you try removing the "SIO_ready()" call to see if things start working?   The code looks correct as it is written, but the code should also work without the SIO_ready() call since the caller will wait for the I/O in SIO_reclaim(). 

    The SIO_ready() call isn't really necessary in the code above.

    I'm concerned that the I/O will not start until the first call to SIO_reclaim() which will call down into the driver.

    Thanks,
    -Karl-

  • Yes, it work. I deleted SIO_ready() and  SIO_ready() not return SYS_OK. SIO_ready() return number of MADUs or error if negative.