From: Walter Fetter Lages Date: Fri, 1 Jun 2018 04:30:56 +0000 (-0300) Subject: Avoid to change FTM mode in write; Add script to set FTM. X-Git-Url: http://git.ece.ufrgs.br/?a=commitdiff_plain;h=HEAD;p=st25_i2c.git Avoid to change FTM mode in write; Add script to set FTM. --- diff --git a/bin/st25_i2c_clear_mailbox b/bin/st25_i2c_clear_mailbox new file mode 100755 index 0000000..8d36f67 --- /dev/null +++ b/bin/st25_i2c_clear_mailbox @@ -0,0 +1,3 @@ +#!/bin/bash +st25_i2c_write 0x2006 0 +st25_i2c_write 0x2006 1 diff --git a/bin/st25_i2c_ftm b/bin/st25_i2c_ftm new file mode 100755 index 0000000..0a47ed2 --- /dev/null +++ b/bin/st25_i2c_ftm @@ -0,0 +1,9 @@ +#!/bin/bash +if [[ $1 == on ]] ; then + st25_i2c_write 0x2006 1 +elif [[ $1 == off ]] ; then + st25_i2c_write 0x2006 0 +else + echo "$0 Configures Fast Transfer Mode" + echo " Usage: $0 on|off" +fi diff --git a/bin/st25_i2c_mailbox_status b/bin/st25_i2c_mailbox_status new file mode 100755 index 0000000..7c817bc --- /dev/null +++ b/bin/st25_i2c_mailbox_status @@ -0,0 +1,9 @@ +#!/bin/bash +STATUS=`st25_i2c_read 0x2006 1` +if [[ $STATUS -eq 0x00 ]] ; then + echo Mailbox disabled. +elif [[ $STATUS -eq 0x01 ]] ; then + echo Mailbox enabled and clear. +else + echo Mailbox enabled and dirty. +fi diff --git a/include/st25_i2c.hpp b/include/st25_i2c.hpp index 4597664..0a65df9 100644 --- a/include/st25_i2c.hpp +++ b/include/st25_i2c.hpp @@ -51,6 +51,8 @@ class St25I2c bool setFtm(bool ftm); /** Get fast transfer mode */ bool getFtm(void); + /** Get MB_CTRL_Dyn register */ + unsigned char getMbCtrlDyn(void); enum MEMORY_MAP { @@ -103,6 +105,15 @@ class St25I2c public: FtmAddressError(void):Error(EFAULT) { }; }; + class FtmError: public Error + { + bool ftm; + char ftmTrue[256]; + char ftmFalse[256]; + public: + FtmError(bool ftm_); + virtual const char *what() const _GLIBCXX_USE_NOEXCEPT {return (ftm)? ftmTrue:ftmFalse;}; + }; }; #endif diff --git a/lib/st25_i2c.cpp b/lib/st25_i2c.cpp index 781f86a..50788ee 100644 --- a/lib/st25_i2c.cpp +++ b/lib/st25_i2c.cpp @@ -56,7 +56,6 @@ enum MB_CTRL_DYN_BITS 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, @@ -82,8 +81,7 @@ size_t St25I2c::read(uint16_t addr,void *buf,size_t count) { 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); @@ -91,8 +89,6 @@ size_t St25I2c::read(uint16_t addr,void *buf,size_t count) 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; } @@ -108,7 +104,8 @@ size_t St25I2c::read(void *buf,size_t count) 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(); /* @@ -118,12 +115,11 @@ size_t St25I2c::write(uint16_t addr,const void *buf,size_t count) 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); @@ -133,8 +129,6 @@ size_t St25I2c::write(uint16_t addr,const void *buf,size_t count) int writeTime=TW_US*(count+3+addr%4)/4; usleep(writeTime); - if((addr < DYNAMIC_CONFIG) || (addr == FTM_MAILBOX)) setFtm(savedFtm); - return c-sizeof addr; } @@ -144,9 +138,9 @@ bool St25I2c::setFtm(bool ftm) 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) @@ -154,5 +148,22 @@ 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); +};