--- /dev/null
+# Text editor
+# Backup files
+*.*~
+*.bak
+
+# C++
+# Prerequisites
+*.d
+
+# Compiled Object files
+*.slo
+*.lo
+*.o
+*.obj
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Compiled Dynamic libraries
+*.so
+*.dylib
+*.dll
+
+# Fortran module files
+*.mod
+*.smod
+
+# Compiled Static libraries
+*.lai
+*.la
+*.a
+*.lib
+
+# Executables
+*.exe
+*.out
+*.app
+
+# Java
+# Compiled class file
+*.class
+
+# Log file
+*.log
+
+# BlueJ files
+*.ctxt
+
+# Mobile Tools for Java (J2ME)
+.mtj.tmp/
+
+# Package Files #
+*.jar
+*.war
+*.nar
+*.ear
+*.zip
+*.tar.gz
+*.rar
+
+# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
+hs_err_pid*
+
+#TeX
+## Core latex/pdflatex auxiliary files:
+*.aux
+*.lof
+*.log
+*.lot
+*.fls
+*.out
+*.toc
+*.fmt
+*.fot
+*.cb
+*.cb2
+.*.lb
+
+## Intermediate documents:
+*.dvi
+*.xdv
+*-converted-to.*
+
+## Generated if empty string is given at "Please type another file name for output:"
+.pdf
+
+## Bibliography auxiliary files (bibtex/biblatex/biber):
+*.bbl
+*.bcf
+*.blg
+*-blx.aux
+*-blx.bib
+*.run.xml
+
+## Build tool auxiliary files:
+*.fdb_latexmk
+*.synctex
+*.synctex(busy)
+*.synctex.gz
+*.synctex.gz(busy)
+*.pdfsync
+
+## Build tool directories for auxiliary files
+# latexrun
+latex.out/
+
+## Auxiliary and intermediate files from other packages:
+# algorithms
+*.alg
+*.loa
+
+# achemso
+acs-*.bib
+
+# amsthm
+*.thm
+
+# beamer
+*.nav
+*.pre
+*.snm
+*.vrb
+
+# changes
+*.soc
+
+# cprotect
+*.cpt
+
+# elsarticle (documentclass of Elsevier journals)
+*.spl
+
+# endnotes
+*.ent
+
+# fixme
+*.lox
+
+# feynmf/feynmp
+*.mf
+*.mp
+*.t[1-9]
+*.t[1-9][0-9]
+*.tfm
+
+#(r)(e)ledmac/(r)(e)ledpar
+*.end
+*.?end
+*.[1-9]
+*.[1-9][0-9]
+*.[1-9][0-9][0-9]
+*.[1-9]R
+*.[1-9][0-9]R
+*.[1-9][0-9][0-9]R
+*.eledsec[1-9]
+*.eledsec[1-9]R
+*.eledsec[1-9][0-9]
+*.eledsec[1-9][0-9]R
+*.eledsec[1-9][0-9][0-9]
+*.eledsec[1-9][0-9][0-9]R
+
+# glossaries
+*.acn
+*.acr
+*.glg
+*.glo
+*.gls
+*.glsdefs
+
+# gnuplottex
+*-gnuplottex-*
+
+# gregoriotex
+*.gaux
+*.gtex
+
+# htlatex
+*.4ct
+*.4tc
+*.idv
+*.lg
+*.trc
+*.xref
+
+# hyperref
+*.brf
+
+# knitr
+*-concordance.tex
+# TODO Comment the next line if you want to keep your tikz graphics files
+*.tikz
+*-tikzDictionary
+
+# listings
+*.lol
+
+# makeidx
+*.idx
+*.ilg
+*.ind
+*.ist
+
+# minitoc
+*.maf
+*.mlf
+*.mlt
+*.mtc[0-9]*
+*.slf[0-9]*
+*.slt[0-9]*
+*.stc[0-9]*
+
+# minted
+_minted*
+*.pyg
+
+# morewrites
+*.mw
+
+# nomencl
+*.nlg
+*.nlo
+*.nls
+
+# pax
+*.pax
+
+# pdfpcnotes
+*.pdfpc
+
+# sagetex
+*.sagetex.sage
+*.sagetex.py
+*.sagetex.scmd
+
+# scrwfile
+*.wrt
+
+# sympy
+*.sout
+*.sympy
+sympy-plots-for-*.tex/
+
+# pdfcomment
+*.upa
+*.upb
+
+# pythontex
+*.pytxcode
+pythontex-files-*/
+
+# thmtools
+*.loe
+
+# TikZ & PGF
+*.dpth
+*.md5
+*.auxlock
+
+# todonotes
+*.tdo
+
+# easy-todo
+*.lod
+
+# xmpincl
+*.xmpi
+
+# xindy
+*.xdy
+
+# xypic precompiled matrices
+*.xyc
+
+# endfloat
+*.ttt
+*.fff
+
+# Latexian
+TSWLatexianTemp*
+
+## Editors:
+# WinEdt
+*.bak
+*.sav
+
+# Texpad
+.texpadtmp
+
+# Kile
+*.backup
+
+# KBibTeX
+*~[0-9]*
+
+# auto folder when using emacs and auctex
+./auto/*
+*.el
+
+# expex forward references with \gathertags
+*-tags.tex
+
+# standalone packages
+*.sta
+
+# generated if using elsarticle.cls
+*.spl
--- /dev/null
+export PACKAGEROOT=$(PWD)
+
+export CC=$(CROSS_COMPILE)gcc
+export CCAR=$(CROSS_COMPILE)ar
+export CCBIN2HEX=$(CROSS_COMPILE)bin2hex
+export CCFLAGS=-Wall -O2 -g -MMD
+export CPU=
+export CCINCDIR=-I$(PACKAGEROOT)/include
+export CCLIBDIR=
+
+export LIBDIR=-L$(PACKAGEROOT)/lib
+
+PACKAGES= lib \
+ st25_i2c_read
+
+all:
+ for i in $(PACKAGES); do $(MAKE) -C $$i; done
+
+check:
+ for i in $(PACKAGES); do $(MAKE) -C $$i check; done
+
+clean:
+ for i in $(PACKAGES); do $(MAKE) -C $$i clean; done
+ rm -rf *~ *.bak
+
+configure:
+ for i in $(PACKAGES); do $(MAKE) -C $$i configure; done
+
+distclean:
+ for i in $(PACKAGES); do $(MAKE) -C $$i distclean; done
+ rm -rf *~ *.bak
+
+install:
+ for i in $(PACKAGES); do $(MAKE) -C $$i install; done
+
+uninstall:
+ for i in $(PACKAGES); do $(MAKE) -C $$i uninstall; done
+
+unpack:
+ for i in $(PACKAGES); do $(MAKE) -C $$i unpack; done
+
+upload:
+ for i in $(AICPACKAGES); do $(MAKE) -C $$i upload; done
+
\ No newline at end of file
--- /dev/null
+/*
+ EFC-Project
+
+ St25I2c Class
+
+ Copyright (c) 2017 Walter Fetter Lages <w.fetter@ieee.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ You can also obtain a copy of the GNU General Public License
+ at <http://www.gnu.org/licenses>.
+
+*/
+
+#ifndef ST25_I2C_HPP
+#define ST25_I2C_HPP
+
+#include <errno.h>
+#include <stdint.h>
+
+class St25I2c
+{
+ int fd_;
+ uint8_t i2cAdd_;
+
+ public:
+ St25I2c(const char i2cDev[]="/dev/i2c-0",uint8_t i2cAdd=0xa6);
+ ~St25I2c(void);
+ /** Random address read */
+ size_t read(uint16_t addr,void *buf,size_t count);
+ /** Current address read */
+ size_t read(void *buf,size_t count);
+ /** Random address write */
+ size_t write(uint16_t addr,const void *buf,size_t count);
+ /** Set fast transfer mode */
+ bool setFtm(bool ftm);
+ /** Get fast transfer mode */
+ bool getFtm(void);
+
+ enum MEMORY_MAP
+ {
+ USER_MEMORY= 0x0000,
+ DYNAMIC_CONFIG= 0x2000,
+ FTM_MAILBOX= 0x2008
+ };
+
+ class Error
+ {
+ int e_;
+
+ public:
+ Error(const int e):e_(e) { };
+ };
+ class OpenError: public Error
+ {
+ public:
+ OpenError(const int e):Error(e) { };
+ };
+ class CloseError: public Error
+ {
+ public:
+ CloseError(const int e):Error(e) { };
+ };
+ class I2cAddressError: public Error
+ {
+ public:
+ I2cAddressError(const int e):Error(e) { };
+ };
+ class WriteError: public Error
+ {
+ public:
+ WriteError(const int e):Error(e) { };
+ };
+ class ReadError: public Error
+ {
+ public:
+ ReadError(const int e):Error(e) { };
+ };
+ class SizeError: public Error
+ {
+ public:
+ SizeError(void):Error(EMSGSIZE) { };
+ };
+ class FtmAddressError: public Error
+ {
+ public:
+ FtmAddressError(void):Error(EFAULT) { };
+ };
+};
+
+#endif
--- /dev/null
+TARGET=libst25_i2c.a
+SRCS=st25_i2c.cpp
+
+FLAGS=-O2 -Wall -g -MMD
+INCLUDE=-I../include
+LIBDIR=-L../lib
+LIBS=
+
+CC=$(CROSS_COMPILE)g++
+CCAR=$(CROSS_COMPILE)ar
+CFLAGS=$(FLAGS) $(INCLUDE)
+LDFLAGS=$(LIBDIR) $(LIBS)
+CCARFLAGS=-crvs
+
+all: $(TARGET)
+
+$(TARGET): $(SRCS:.cpp=.o)
+ $(CCAR) $(CCARFLAGS) $@ $^
+
+%.o: %.cpp
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+-include $(SRCS:.cpp=.d)
+
+clean:
+ rm -f *~ *.bak *.o *.d
+
+distclean: clean
+ rm -f $(TARGET)
--- /dev/null
+/*
+ EFC-Project
+
+ St25I2c Class implementation
+
+ Copyright (c) 2017 Walter Fetter Lages <w.fetter@ieee.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ You can also obtain a copy of the GNU General Public License
+ at <http://www.gnu.org/licenses>.
+
+*/
+
+
+#include <errno.h>
+#include <fcntl.h>
+#include <unistd.h>
+
+#include <arpa/inet.h>
+#include <sys/ioctl.h>
+
+#include <linux/i2c.h>
+#include <linux/i2c-dev.h>
+
+#include <st25_i2c.hpp>
+
+enum DYNAMIC_REGISTERS
+{
+ GPO_CTRL_DYN= 0x2000,
+ EH_CTRL_DYN= 0x2002,
+ RF_MNGT_DYN= 0x2003,
+ I2C_SSO_DYN= 0x2004,
+ IT_STS_DYN= 0x2005,
+ MB_CTRL_DYN= 0x2006,
+ MB_LEN_DYN= 0x2007
+};
+
+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,
+ RF_CURRENT_MSG= 0x80
+};
+
+St25I2c::St25I2c(const char i2cDev[],uint8_t i2cAdd): i2cAdd_(i2cAdd)
+{
+ if((fd_=open(i2cDev,O_RDWR)) < 0) throw OpenError(errno);
+ /* I2C Address 0xae (system memory) => 0x57 is used by Galileo EEPROM */
+ /* I2C Address 0xa6 => 0x53 => user memory => register 0x0000-0x1ffc
+ => dynamic configuration => register 0x2000-0x2007
+ => FTM mailbox => register 0x2008-0x2107 */
+ if(ioctl(fd_,I2C_SLAVE,i2cAdd_ >> 1) < 0) throw I2cAddressError(errno);
+
+}
+
+St25I2c::~St25I2c(void)
+{
+ if(close(fd_) < 0) throw CloseError(errno);
+}
+
+size_t St25I2c::read(uint16_t addr,void *buf,size_t count)
+{
+ bool savedFtm=false;
+ if(addr >= FTM_MAILBOX && addr < FTM_MAILBOX+256) savedFtm=setFtm(true);
+
+ 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::read(void *buf,size_t count)
+{
+
+ size_t c;
+ if((c=::read(fd_,buf,count)) < 0) throw ReadError(errno);
+ return c;
+}
+
+size_t St25I2c::write(uint16_t addr,const void *buf,size_t count)
+{
+ if(count > 256) throw SizeError();
+
+ if(addr > FTM_MAILBOX && addr < FTM_MAILBOX+256) throw FtmAddressError();
+
+ /*
+ I2C Writing data in user or system memory (EEPROM), transit
+ via the 256-Bytes Fast Transfer Mode's buffer. Consequently
+ Fast Transfer Mode must be deactivated before starting any write
+ 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);
+
+ char *buffer=new char[count+sizeof addr];
+ *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);
+ delete[] buffer;
+
+ if((addr < DYNAMIC_CONFIG) || (addr == FTM_MAILBOX)) setFtm(savedFtm);
+
+ return c-sizeof addr;
+}
+
+bool St25I2c::setFtm(bool ftm)
+{
+ uint8_t mbCtrlDyn;
+ uint8_t newMbCtrlDyn;
+
+ this->read(MB_CTRL_DYN,&mbCtrlDyn,sizeof mbCtrlDyn);
+ newMbCtrlDyn=mbCtrlDyn | MB_EN;
+ this->write(MB_CTRL_DYN,&newMbCtrlDyn,sizeof newMbCtrlDyn);
+ return (mbCtrlDyn & MB_EN);
+}
+
+bool St25I2c::getFtm(void)
+{
+ uint8_t mbCtrlDyn;
+
+ this->read(MB_CTRL_DYN,&mbCtrlDyn,sizeof mbCtrlDyn);
+ return (mbCtrlDyn & MB_EN);
+}
--- /dev/null
+TARGET=st25_i2c_read
+SRCS=$(TARGET).cpp
+
+FLAGS=-O2 -Wall -g -MMD
+INCLUDE=-I../include
+LIBDIR=-L../lib
+LIBS=-lst25_i2c
+
+CC=$(CROSS_COMPILE)g++
+CFLAGS=$(FLAGS) $(INCLUDE)
+LDFLAGS=$(LIBDIR) $(LIBS) -MMD
+
+all: $(TARGET)
+
+$(TARGET): $(SRCS:.cpp=.o)
+ $(CC) -o $@ $^ $(LDFLAGS)
+
+%.o: %.cpp
+ $(CC) $(CFLAGS) -c -o $@ $<
+
+-include $(SRCS:.cpp=.d)
+
+clean:
+ rm -f *~ *.bak *.o *.d
+
+distclean: clean
+ rm -f $(TARGET)
--- /dev/null
+/*
+
+ Copyright (c) 2018 Walter Fetter Lages <w.fetter@ieee.org>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+ You can also obtain a copy of the GNU General Public License
+ at <http://www.gnu.org/licenses>.
+
+*/
+
+#include <stdlib.h>
+
+#include <iomanip>
+#include <iostream>
+
+#include <st25_i2c.hpp>
+
+int main(int argc,char *argv[])
+{
+ if(argc != 2)
+ {
+ std::cout << argv[0]
+ << "Read from ST25 user memory, dynamic configuration registers or FTM mailbox."
+ << std::endl;
+ std::cout << "\tUsage: " << argv[0] << " address" << std::endl;
+ return -1;
+ }
+
+ St25I2c st25I2c;
+
+ unsigned char data;
+
+ uint16_t addr=strtol(argv[1],NULL,0);
+
+ st25I2c.read(addr,&data,sizeof data);
+
+ std::cout << "0x" << std::hex << std::setw(2) << std::setfill('0')
+ << static_cast<unsigned>(data) << std::endl;
+
+ return 0;
+}