int exec_cmd(EcInitCmdDesc *CmdDesc, uint16 slave) {int wkc,cnt = 0; char i; uint32 data=0; uint16 retry,estat; retry=CmdDesc->retries; if (CmdDesc->ecHead.ADO==0x502||CmdDesc->ecHead.ADO==0x508) { ec_eeprom2master(slave); if (ec_eeprom_waitnotbusyAP(CmdDesc->ecHead.ADP, &estat, EC_TIMEOUTEEP)) { if (estat & EC_ESTAT_EMASK) /* error bits are set */ { estat = htoes(EC_ECMD_NOP); /* clear error bits */ wkc=ec_APWR(CmdDesc->ecHead.ADP, ECT_REG_EEPCTL, sizeof(estat), &estat, EC_TIMEOUTRET); } do wkc=EcatCmdReq(CmdDesc, &data, slave); while ((wkc <= 0) && (cnt++ < retry)); } } EC_PRINT("Command: %s\n",CmdDesc->cmt); else { do {
int EcatCmdReq(EcInitCmdDesc *CmdDesc, uint32 *pData, uint16 Slave) { int wkc; uint32 data; memcpy(&data,CmdDesc->data,sizeof(data)); data=htoel(data); uint16 len; len=CmdDesc->DataLength; switch (CmdDesc->ecHead.command){ case EC_CMD_APRD: wkc=ec_APRD(CmdDesc->ecHead.ADP,CmdDesc->ecHead.ADO,len,CmdDesc->data,EC_TIMEOUTSAFE); break; case EC_CMD_APWR: wkc=ec_APWR(CmdDesc->ecHead.ADP,CmdDesc->ecHead.ADO,len,CmdDesc->data,EC_TIMEOUTSAFE); if(((CmdDesc->ecHead.ADO-ECT_REG_FMMU0)>=0)&&((CmdDesc->ecHead.ADO-ECT_REG_FMMU0)<=0x30)) {set_fmmu(CmdDesc,Slave); } if(((CmdDesc->ecHead.ADO-ECT_REG_SM0)>=0)&&((CmdDesc->ecHead.ADO-ECT_REG_SM0)<=0x18)) { set_sm(CmdDesc,Slave); EC_PRINT("SMs of Slave %d updated\n\r", Slave); } break; case EC_CMD_APRW: wkc=ec_ARMW(CmdDesc->ecHead.ADP,CmdDesc->ecHead.ADO,len,CmdDesc->data,EC_TIMEOUTSAFE); break; case EC_CMD_FPRD: wkc=ec_FPRD(CmdDesc->ecHead.ADP,CmdDesc->ecHead.ADO,len,CmdDesc->data,EC_TIMEOUTSAFE); break; case EC_CMD_FPWR: wkc=ec_FPWR(CmdDesc->ecHead.ADP,CmdDesc->ecHead.ADO,len,CmdDesc->data,EC_TIMEOUTSAFE); if(((CmdDesc->ecHead.ADO-ECT_REG_FMMU0)>=0)&&((CmdDesc->ecHead.ADO-ECT_REG_FMMU0)<=0x30)) {set_fmmu(CmdDesc,Slave); EC_PRINT("FMMUs of Slave %d updated\n\r", Slave); } if(((CmdDesc->ecHead.ADO-ECT_REG_SM0)>=0)&&((CmdDesc->ecHead.ADO-ECT_REG_SM0)<=0x18)) {set_sm(CmdDesc,Slave); } break; //case EC_CMD_FPRW: //not implemented in SOEM //break; case EC_CMD_BRD: wkc=ec_BRD(CmdDesc->ecHead.ADP,CmdDesc->ecHead.ADO,len,CmdDesc->data,EC_TIMEOUTSAFE); break; case EC_CMD_BWR: wkc=ec_BWR(CmdDesc->ecHead.ADP,CmdDesc->ecHead.ADO,len,CmdDesc->data,EC_TIMEOUTSAFE); if(CmdDesc->ecHead.ADO==ECT_REG_FMMU0) {set_fmmu(CmdDesc,0); EC_PRINT("FMMUs of ALL Slave updated\n\r"); } if(CmdDesc->ecHead.ADO==ECT_REG_SM0) {set_sm(CmdDesc,0); EC_PRINT("SMs of ALL Slave updated\n\r"); } break; //case EC_CMD_BRW: //not implemented in SOEM // break; case EC_CMD_LRD: wkc=ec_LRD(CmdDesc->ecHead.laddr,len,CmdDesc->data,EC_TIMEOUTSAFE); break; case EC_CMD_LWR: wkc=ec_LWR(CmdDesc->ecHead.laddr,len,CmdDesc->data,EC_TIMEOUTSAFE); break; case EC_CMD_LRW: wkc=ec_LRW(CmdDesc->ecHead.laddr,len,CmdDesc->data,EC_TIMEOUTSAFE); break; case EC_CMD_ARMW: wkc=ec_ARMW(CmdDesc->ecHead.ADP,CmdDesc->ecHead.ADO,len,CmdDesc->data,EC_TIMEOUTSAFE); break; case EC_CMD_FRMW: wkc=ec_FRMW(CmdDesc->ecHead.ADP,CmdDesc->ecHead.ADO,len,CmdDesc->data,EC_TIMEOUTSAFE); break; default: wkc=-1; break; } return wkc; }
/** APWRw "auto increment address write" word primitive. Blocking. * * @param[in] ADP = Address Position, each slave ++, slave that has 0 writes. * @param[in] ADO = Address Offset, slave memory address * @param[in] data = word data to write to slave. * @param[in] timeout = timeout in us, standard is EC_TIMEOUTRET * @return Workcounter or EC_NOFRAME */ int ec_APWRw(uint16 ADP, uint16 ADO, uint16 data, int timeout) { return ec_APWR(ADP,ADO, sizeof(data), &data, timeout); }