Avoid to change FTM mode in write; Add script to set FTM. master
authorWalter Fetter Lages <w.fetter@ieee.org>
Fri, 1 Jun 2018 04:30:56 +0000 (01:30 -0300)
committerWalter Fetter Lages <w.fetter@ieee.org>
Fri, 1 Jun 2018 04:30:56 +0000 (01:30 -0300)
bin/st25_i2c_clear_mailbox [new file with mode: 0755]
bin/st25_i2c_ftm [new file with mode: 0755]
bin/st25_i2c_mailbox_status [new file with mode: 0755]
include/st25_i2c.hpp
lib/st25_i2c.cpp

diff --git a/bin/st25_i2c_clear_mailbox b/bin/st25_i2c_clear_mailbox
new file mode 100755 (executable)
index 0000000..8d36f67
--- /dev/null
@@ -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 (executable)
index 0000000..0a47ed2
--- /dev/null
@@ -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 (executable)
index 0000000..7c817bc
--- /dev/null
@@ -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
index 4597664..0a65df9 100644 (file)
@@ -51,6 +51,8 @@ class St25I2c
     bool setFtm(bool ftm);
     /** Get fast transfer mode */
     bool getFtm(void);
     bool setFtm(bool ftm);
     /** Get fast transfer mode */
     bool getFtm(void);
+    /** Get MB_CTRL_Dyn register */
+    unsigned char getMbCtrlDyn(void);
     
     enum MEMORY_MAP
     {
     
     enum MEMORY_MAP
     {
@@ -103,6 +105,15 @@ class St25I2c
         public:
         FtmAddressError(void):Error(EFAULT) { };
     };
         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
 };
 
 #endif
index 781f86a..50788ee 100644 (file)
@@ -56,7 +56,6 @@ enum MB_CTRL_DYN_BITS
         MB_EN=         0x01,
         HOST_PUT_MSG=  0x02,
         RF_PUT_MSG=    0x04,
         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,
         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();
 
 {
         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);
                 
         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);
         
         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;
 }
 
         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();
 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();
         
         /* 
         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.
         */
             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];
 
         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);
         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);
 
         int writeTime=TW_US*(count+3+addr%4)/4;
         usleep(writeTime);
 
-        if((addr < DYNAMIC_CONFIG) || (addr == FTM_MAILBOX)) setFtm(savedFtm);
-        
         return c-sizeof addr;
 }
 
         return c-sizeof addr;
 }
 
@@ -144,9 +138,9 @@ bool St25I2c::setFtm(bool ftm)
         uint8_t newMbCtrlDyn;
         
         this->read(MB_CTRL_DYN,&mbCtrlDyn,sizeof mbCtrlDyn);
         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);
         this->write(MB_CTRL_DYN,&newMbCtrlDyn,sizeof newMbCtrlDyn);
-        return (mbCtrlDyn & MB_EN);
+        return bool(mbCtrlDyn & MB_EN);
 }
 
 bool St25I2c::getFtm(void)
 }
 
 bool St25I2c::getFtm(void)
@@ -154,5 +148,22 @@ bool St25I2c::getFtm(void)
         uint8_t mbCtrlDyn;
         
         this->read(MB_CTRL_DYN,&mbCtrlDyn,sizeof mbCtrlDyn);
         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);
+};