To whom might concern,
I want to try the maintenance rd&wr transaction on our board using the loopback mode.
The problem is that the normal read write loopback transaction works ok, but the maintenance fails as " reg6 =
011b - Transaction complete, non-posted response packet (type 8 and 13) contained ERROR status, or response payload length was in error"
the configuration is as follows:
void srio_maintR(Uint32 src, Uint32 dst, Uint32 len){Uint8 lsu_no;CSL_SrioDirectIO_ConfigXfr lsu_conf = {0};
/* Create an LSU configuration */lsu_conf.srcNodeAddr = dst; /* Local address */lsu_conf.dstNodeAddr.addressHi = 0;lsu_conf.dstNodeAddr.addressLo = src ; /* Remote address */lsu_conf.byteCnt = len;lsu_conf.idSize = 1; /* 16 bit device id */lsu_conf.priority = 0; /* PKT priority is 2 */lsu_conf.xambs = 0; /* Not an extendedaddress */lsu_conf.dstId = LARGE_DEV_ID;//;lsu_conf.intrReq = 0; /* No interrupts */lsu_conf.pktType = SRIO_PKT_TYPE_MAINTR;/* write with noresponse */lsu_conf.hopCount = 0x1; /* Valid formaintainance pkt */lsu_conf.doorbellInfo = 0; /* doorbell pkt */lsu_conf.outPortId = 0; /* Tx on Port 0 */
lsu_no = SELECTED_LSU;CSL_srioLsuSetup (hSrio, &lsu_conf, lsu_no);/* Wait for the completion of transfer */response.index = lsu_no;do {CSL_srioGetHwStatus (hSrio, CSL_SRIO_QUERY_LSU_BSY_STAT, &response);} while(response.data == 1);
}
void main (void) {int i, k;volatile Uint8 *pdata;srio_init(DSP_MASTER); memset((void *)0x850000, 0, 0x100);memset((void *)0x851000, 0, 0x100);pdata = (Uint8*) 0x850000;for(i=0;i<0x10;i++)*pdata++ = i+1;
// srio_write(0x850000,0x851000,0x10);// srio_read(0x851000,0x852000,0x10);// srio_maintW(0x850000,0xd01068,0x4);srio_maintR(0xd0106c,0x851000,0x4); for (k = 1; k < 1000000; k++) ; printf("\n\t loopback finished! \n");
Can anyone help me to figure out the problem, please?
It seems that the mainteance transaction can only access regster offset between 0x1000 -- 0x2000, is that right??
can someone help me