MB_EN= 0x01,
HOST_PUT_MSG= 0x02,
RF_PUT_MSG= 0x04,
- RFU= 0x08,
HOST_MISS_MSG= 0x10,
RF_MISS_MSG= 0x20,
HOST_CURRENT_MSG=0x40,
{
if(count > 256) throw SizeError();
- bool savedFtm=false;
- if(addr >= FTM_MAILBOX && addr < FTM_MAILBOX+256) savedFtm=setFtm(true);
+ if(addr >= FTM_MAILBOX && addr < FTM_MAILBOX+256 && !getFtm()) throw FtmError(false);
addr=htons(addr);
if(::write(fd_,&addr,sizeof addr) < 0) throw WriteError(errno);
size_t c;
if((c=::read(fd_,buf,count)) < 0) throw ReadError(errno);
- if(addr >= FTM_MAILBOX && addr < FTM_MAILBOX+256) setFtm(savedFtm);
-
return c;
}
size_t St25I2c::write(uint16_t addr,const void *buf,size_t count)
{
if(count > 256) throw SizeError();
-
+
+ // Maixbox should be written from start
if(addr > FTM_MAILBOX && addr < FTM_MAILBOX+256) throw FtmAddressError();
/*
operation in user or system memory, otherwise command will be
NotACK, programming is not done and device goes in standby mode.
*/
- bool savedFtm=false;
- if(addr < DYNAMIC_CONFIG) savedFtm=setFtm(false);
- else if(addr == FTM_MAILBOX) savedFtm=setFtm(true);
+ if(addr < DYNAMIC_CONFIG && getFtm()) throw FtmError(true);
+ else if(addr == FTM_MAILBOX && !getFtm()) throw FtmError(false);
char *buffer=new char[count+sizeof addr];
- *buffer=htons(addr);
+ *((uint16_t *)buffer)=htons(addr);
for(size_t i=0;i < count;i++) buffer[i+sizeof addr]=((char *)buf)[i];
size_t c;
if((c=::write(fd_,buffer,count+sizeof addr)) < 0) throw WriteError(errno);
int writeTime=TW_US*(count+3+addr%4)/4;
usleep(writeTime);
- if((addr < DYNAMIC_CONFIG) || (addr == FTM_MAILBOX)) setFtm(savedFtm);
-
return c-sizeof addr;
}
uint8_t newMbCtrlDyn;
this->read(MB_CTRL_DYN,&mbCtrlDyn,sizeof mbCtrlDyn);
- newMbCtrlDyn=mbCtrlDyn | MB_EN;
+ newMbCtrlDyn=(ftm)? mbCtrlDyn | MB_EN : mbCtrlDyn & ~MB_EN;
this->write(MB_CTRL_DYN,&newMbCtrlDyn,sizeof newMbCtrlDyn);
- return (mbCtrlDyn & MB_EN);
+ return bool(mbCtrlDyn & MB_EN);
}
bool St25I2c::getFtm(void)
uint8_t mbCtrlDyn;
this->read(MB_CTRL_DYN,&mbCtrlDyn,sizeof mbCtrlDyn);
- return (mbCtrlDyn & MB_EN);
+ return bool(mbCtrlDyn & MB_EN);
+}
+
+unsigned char St25I2c::getMbCtrlDyn(void)
+{
+ unsigned char mbCtrlDyn;
+
+ this->read(MB_CTRL_DYN,&mbCtrlDyn,sizeof mbCtrlDyn);
+ return mbCtrlDyn;
}
+
+St25I2c::FtmError::FtmError(bool ftm_):Error(EFAULT),ftm(ftm_)
+{
+ strncpy(ftmTrue,Error::what(),sizeof ftmTrue);
+ strncat(ftmTrue," : Fast Transfer Mode active",sizeof ftmTrue);
+
+ strncpy(ftmFalse,Error::what(),sizeof ftmFalse);
+ strncat(ftmFalse," : Fast Transfer Mode not active",sizeof ftmFalse);
+};