summaryrefslogtreecommitdiff
path: root/halimpl/tml/phTmlNfc_i2c.c
diff options
context:
space:
mode:
Diffstat (limited to 'halimpl/tml/phTmlNfc_i2c.c')
-rw-r--r--halimpl/tml/phTmlNfc_i2c.c580
1 files changed, 0 insertions, 580 deletions
diff --git a/halimpl/tml/phTmlNfc_i2c.c b/halimpl/tml/phTmlNfc_i2c.c
deleted file mode 100644
index 55d0c0e..0000000
--- a/halimpl/tml/phTmlNfc_i2c.c
+++ /dev/null
@@ -1,580 +0,0 @@
-/*
- * Copyright (C) 2015 NXP Semiconductors
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-/*
- * DAL I2C port implementation for linux
- *
- * Project: Trusted NFC Linux
- *
- */
-#include <hardware/nfc.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <termios.h>
-#include <sys/ioctl.h>
-#include <sys/select.h>
-#include <errno.h>
-
-#include <phNxpLog.h>
-#include <phTmlNfc_i2c.h>
-#include <phNfcStatus.h>
-#include <string.h>
-#include <phNxpNciHal_utils.h>
-
-#define CRC_LEN 2
-#define NORMAL_MODE_HEADER_LEN 3
-#define FW_DNLD_HEADER_LEN 2
-#define FW_DNLD_LEN_OFFSET 1
-#define NORMAL_MODE_LEN_OFFSET 2
-#define FRAGMENTSIZE_MAX PHNFC_I2C_FRAGMENT_SIZE
-static bool_t bFwDnldFlag = false;
-
-/*******************************************************************************
-**
-** Function phTmlNfc_i2c_close
-**
-** Description Closes PN54X device
-**
-** Parameters pDevHandle - device handle
-**
-** Returns None
-**
-*******************************************************************************/
-void phTmlNfc_i2c_close(void* pDevHandle) {
- if (NULL != pDevHandle) {
- close((intptr_t)pDevHandle);
- }
-
- return;
-}
-
-/*******************************************************************************
-**
-** Function phTmlNfc_i2c_open_and_configure
-**
-** Description Open and configure PN54X device
-**
-** Parameters pConfig - hardware information
-** pLinkHandle - device handle
-**
-** Returns NFC status:
-** NFCSTATUS_SUCCESS - open_and_configure operation success
-** NFCSTATUS_INVALID_DEVICE - device open operation failure
-**
-*******************************************************************************/
-NFCSTATUS phTmlNfc_i2c_open_and_configure(pphTmlNfc_Config_t pConfig,
- void** pLinkHandle) {
- int nHandle;
-
- NXPLOG_TML_D("Opening port=%s\n", pConfig->pDevName);
- /* open port */
- nHandle = open((const char*)pConfig->pDevName, O_RDWR);
- if (nHandle < 0) {
- NXPLOG_TML_E("_i2c_open() Failed: retval %x", nHandle);
- *pLinkHandle = NULL;
- return NFCSTATUS_INVALID_DEVICE;
- }
-
- *pLinkHandle = (void*)((intptr_t)nHandle);
-
- /*Reset PN54X*/
- phTmlNfc_i2c_reset((void*)((intptr_t)nHandle), 0);
- usleep(10 * 1000);
- phTmlNfc_i2c_reset((void*)((intptr_t)nHandle), 1);
-
- return NFCSTATUS_SUCCESS;
-}
-
-/*******************************************************************************
-**
-** Function phTmlNfc_i2c_read
-**
-** Description Reads requested number of bytes from PN54X device into given
-** buffer
-**
-** Parameters pDevHandle - valid device handle
-** pBuffer - buffer for read data
-** nNbBytesToRead - number of bytes requested to be read
-**
-** Returns numRead - number of successfully read bytes
-** -1 - read operation failure
-**
-*******************************************************************************/
-int phTmlNfc_i2c_read(void* pDevHandle, uint8_t* pBuffer, int nNbBytesToRead) {
- int ret_Read;
- int ret_Select;
- int numRead = 0;
- struct timeval tv;
- fd_set rfds;
- uint16_t totalBtyesToRead = 0;
-
- int i;
- UNUSED(nNbBytesToRead);
- if (NULL == pDevHandle) {
- return -1;
- }
-
- if (false == bFwDnldFlag) {
- totalBtyesToRead = NORMAL_MODE_HEADER_LEN;
- } else {
- totalBtyesToRead = FW_DNLD_HEADER_LEN;
- }
-
- /* Read with 2 second timeout, so that the read thread can be aborted
- when the PN54X does not respond and we need to switch to FW download
- mode. This should be done via a control socket instead. */
- FD_ZERO(&rfds);
- FD_SET((intptr_t)pDevHandle, &rfds);
- tv.tv_sec = 2;
- tv.tv_usec = 1;
-
- ret_Select =
- select((int)((intptr_t)pDevHandle + (int)1), &rfds, NULL, NULL, &tv);
- if (ret_Select < 0) {
- NXPLOG_TML_E("i2c select() errno : %x", errno);
- return -1;
- } else if (ret_Select == 0) {
- NXPLOG_TML_E("i2c select() Timeout");
- return -1;
- } else {
- ret_Read = read((intptr_t)pDevHandle, pBuffer, totalBtyesToRead - numRead);
- if (ret_Read > 0) {
- numRead += ret_Read;
- } else if (ret_Read == 0) {
- NXPLOG_TML_E("_i2c_read() [hdr]EOF");
- return -1;
- } else {
- NXPLOG_TML_E("_i2c_read() [hdr] errno : %x", errno);
- return -1;
- }
-
- if (false == bFwDnldFlag) {
- totalBtyesToRead = NORMAL_MODE_HEADER_LEN;
- } else {
- totalBtyesToRead = FW_DNLD_HEADER_LEN;
- }
-
- if (numRead < totalBtyesToRead) {
- ret_Read =
- read((intptr_t)pDevHandle, pBuffer, totalBtyesToRead - numRead);
- if (ret_Read != totalBtyesToRead - numRead) {
- NXPLOG_TML_E("_i2c_read() [hdr] errno : %x", errno);
- return -1;
- } else {
- numRead += ret_Read;
- }
- }
- if (true == bFwDnldFlag) {
- totalBtyesToRead =
- pBuffer[FW_DNLD_LEN_OFFSET] + FW_DNLD_HEADER_LEN + CRC_LEN;
- } else {
- totalBtyesToRead =
- pBuffer[NORMAL_MODE_LEN_OFFSET] + NORMAL_MODE_HEADER_LEN;
- }
- if ((totalBtyesToRead - numRead) != 0) {
- ret_Read = read((intptr_t)pDevHandle, (pBuffer + numRead),
- totalBtyesToRead - numRead);
- if (ret_Read > 0) {
- numRead += ret_Read;
- } else if (ret_Read == 0) {
- NXPLOG_TML_E("_i2c_read() [pyld] EOF");
- return -1;
- } else {
- if (false == bFwDnldFlag) {
- NXPLOG_TML_E("_i2c_read() [hdr] received");
- phNxpNciHal_print_packet("RECV", pBuffer, NORMAL_MODE_HEADER_LEN);
- }
- NXPLOG_TML_E("_i2c_read() [pyld] errno : %x", errno);
- return -1;
- }
- } else {
- NXPLOG_TML_E("_>>>>> Empty packet recieved !!");
- }
- }
- return numRead;
-}
-
-/*******************************************************************************
-**
-** Function phTmlNfc_i2c_write
-**
-** Description Writes requested number of bytes from given buffer into
-** PN54X device
-**
-** Parameters pDevHandle - valid device handle
-** pBuffer - buffer for read data
-** nNbBytesToWrite - number of bytes requested to be written
-**
-** Returns numWrote - number of successfully written bytes
-** -1 - write operation failure
-**
-*******************************************************************************/
-int phTmlNfc_i2c_write(void* pDevHandle, uint8_t* pBuffer,
- int nNbBytesToWrite) {
- int ret;
- int numWrote = 0;
- int i;
- int numBytes = nNbBytesToWrite;
- if (NULL == pDevHandle) {
- return -1;
- }
- if (fragmentation_enabled == I2C_FRAGMENATATION_DISABLED &&
- nNbBytesToWrite > FRAGMENTSIZE_MAX) {
- NXPLOG_TML_E(
- "i2c_write() data larger than maximum I2C size,enable I2C "
- "fragmentation");
- return -1;
- }
- while (numWrote < nNbBytesToWrite) {
- if (fragmentation_enabled == I2C_FRAGMENTATION_ENABLED &&
- nNbBytesToWrite > FRAGMENTSIZE_MAX) {
- if (nNbBytesToWrite - numWrote > FRAGMENTSIZE_MAX) {
- numBytes = numWrote + FRAGMENTSIZE_MAX;
- } else {
- numBytes = nNbBytesToWrite;
- }
- }
- ret = write((intptr_t)pDevHandle, pBuffer + numWrote, numBytes - numWrote);
- if (ret > 0) {
- numWrote += ret;
- if (fragmentation_enabled == I2C_FRAGMENTATION_ENABLED &&
- numWrote < nNbBytesToWrite) {
- usleep(500);
- }
- } else if (ret == 0) {
- NXPLOG_TML_E("_i2c_write() EOF");
- return -1;
- } else {
- NXPLOG_TML_E("_i2c_write() errno : %x", errno);
- if (errno == EINTR || errno == EAGAIN) {
- continue;
- }
- return -1;
- }
- }
-
- return numWrote;
-}
-
-/*******************************************************************************
-**
-** Function phTmlNfc_i2c_reset
-**
-** Description Reset PN54X device, using VEN pin
-**
-** Parameters pDevHandle - valid device handle
-** level - reset level
-**
-** Returns 0 - reset operation success
-** -1 - reset operation failure
-**
-*******************************************************************************/
-int phTmlNfc_i2c_reset(void* pDevHandle, long level) {
- int ret = -1;
-
- NXPLOG_TML_D("phTmlNfc_i2c_reset(), VEN level %ld", level);
-
- if (NULL == pDevHandle) {
- return -1;
- }
- ret = ioctl((intptr_t)pDevHandle, PN544_SET_PWR, level);
- if (ret < 0) {
- NXPLOG_TML_E("%s :failed errno = 0x%x", __func__, errno);
- if (level == 2 && errno == EBUSY) {
- notifyFwrequest = true;
- } else {
- notifyFwrequest = false;
- }
- }
- if (level == 2 && ret == 0) {
- bFwDnldFlag = true;
- } else {
- bFwDnldFlag = false;
- }
- return ret;
-}
-
-/*******************************************************************************
-**
-** Function phTmlNfc_i2c_set_Jcop_dwnld_state
-**
-** Description This function set jcop download state.
-**
-** Parameters pDevHandle - valid device handle
-**
-** Returns NFCSTATUS
-**
-**
-*******************************************************************************/
-NFCSTATUS phTmlNfc_i2c_set_Jcop_dwnld_state(void* pDevHandle, long level) {
- NXPLOG_TML_D("phTmlNfc_i2c_set_Jcop_dwnld_state()");
- if(!nfcFL.nfcNxpEse) {
- NXPLOG_TML_D("NxpEse not available. Returning");
- return NFCSTATUS_FAILED;
- }
- int32_t ret = -1;
- NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
-
- NXPLOG_TML_D("phTmlNfc_i2c_set_Jcop_dwnld_state(), level %ld", level);
-
- if (NULL == pDevHandle) return NFCSTATUS_FAILED;
-
- ret =
- ioctl((intptr_t)pDevHandle, PN544_SET_DWNLD_STATUS, (unsigned long)level);
- if (ret < 0) {
- NXPLOG_TML_E("%s : failed errno = 0x%x", __func__, errno);
- if (errno == -EBUSY) {
- wStatus = NFCSTATUS_BUSY;
- } else if (errno == -EBADRQC) {
- wStatus = NFCSTATUS_INVALID_FORMAT;
- } else if (errno == -EINVAL) {
- wStatus = NFCSTATUS_INVALID_PARAMETER;
- } else {
- wStatus = NFCSTATUS_FAILED;
- }
- }
- return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function phTmlNfc_set_pid
-**
-** Description
-**
-** Parameters pDevHandle - valid device handle
-** pid - nfc service pid
-**
-** Returns p61_access_state_t - get_p61_power operation success
-** P61_STATE_INVALID - get_p61_power operation failure
-**
-*******************************************************************************/
-NFCSTATUS phTmlNfc_set_pid(void* pDevHandle, long pid) {
- NXPLOG_TML_D("phTmlNfc_set_pid()");
- if(!nfcFL.nfcNxpEse) {
- NXPLOG_TML_D("NxpEse not available. Returning");
- return NFCSTATUS_FAILED;
- }
- NFCSTATUS wStatus = NFCSTATUS_FAILED;
- uint32_t ret = -1;
- NXPLOG_TML_D("phTmlNfc_set_pid(), pid %ld", pid);
-
- if (NULL == pDevHandle) {
- return NFCSTATUS_FAILED;
- }
-
- ret = (uint32_t)ioctl((intptr_t)pDevHandle, P544_SET_NFC_SERVICE_PID, pid);
- if (!ret) wStatus = NFCSTATUS_SUCCESS;
-
- return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function phTmlNfc_set_power_scheme
-**
-** Description This function sets the eSE power scheme in pn544 driver
-**
-** Parameters pDevHandle - valid device handle
-** pid - nfc service pid
-**
-** Returns p61_access_state_t - get_p61_power operation success
-** P61_STATE_INVALID - get_p61_power operation failure
-**
-*******************************************************************************/
-NFCSTATUS phTmlNfc_set_power_scheme(void* pDevHandle, long id) {
- NXPLOG_TML_D("phTmlNfc_set_power_scheme()");
- if(!nfcFL.nfcNxpEse) {
- NXPLOG_TML_D("NxpEse not available. Returning");
- return NFCSTATUS_FAILED;
- }
- int ret;
- NXPLOG_TML_D("phTmlNfc_set_power_scheme(), id %ld", id);
-
- if (NULL == pDevHandle) {
- return NFCSTATUS_FAILED;
- }
-
- ret = ioctl((intptr_t)pDevHandle, P544_SET_POWER_SCHEME, id);
- return ret;
-}
-/*******************************************************************************
-**
-** Function phTmlNfc_i2c_set_p61_power_state
-**
-** Description
-**
-** Parameters pDevHandle - valid device handle
-**
-** Returns p61_access_state_t - get_p61_power operation success
-** P61_STATE_INVALID - get_p61_power operation failure
-**
-*******************************************************************************/
-NFCSTATUS phTmlNfc_i2c_set_p61_power_state(void* pDevHandle, long level) {
- NXPLOG_TML_D("phTmlNfc_i2c_set_p61_power_state()");
- if(!nfcFL.nfcNxpEse) {
- NXPLOG_TML_D("NxpEse not available. Returning");
- return NFCSTATUS_FAILED;
- }
- int ret = -1;
- NFCSTATUS wStatus = NFCSTATUS_FAILED;
-
- NXPLOG_TML_D("phTmlNfc_i2c_set_p61_power_state(), level %ld", level);
-
- if (NULL == pDevHandle) {
- return -1;
- }
- ret = ioctl((intptr_t)pDevHandle, P61_SET_WIRED_ACCESS, (unsigned long)level);
- if (ret < 0) {
- NXPLOG_TML_E("%s : failed errno = 0x%x", __func__, errno);
- if (errno == -EBUSY) {
- wStatus = NFCSTATUS_BUSY;
- } else if (errno == -EPERM) {
- wStatus = NFCSTATUS_NOT_ALLOWED;
- } else if (errno == -EBADRQC) {
- wStatus = NFCSTATUS_INVALID_PARAMETER;
- } else {
- wStatus = NFCSTATUS_FAILED;
- }
- } else {
- wStatus = NFCSTATUS_SUCCESS;
- }
-
- return wStatus;
-}
-
-/*******************************************************************************
-**
-** Function phTmlNfc_i2c_get_p61_power_state
-**
-** Description
-**
-** Parameters pDevHandle - valid device handle
-**
-** Returns get_p61_power operation success
-** NFCSTATUS_FAILED - get_p61_power operation failure
-**
-*******************************************************************************/
-NFCSTATUS phTmlNfc_i2c_get_p61_power_state(void* pDevHandle) {
- NXPLOG_TML_D("phTmlNfc_i2c_get_p61_power_state()");
- if(!nfcFL.nfcNxpEse) {
- NXPLOG_TML_D("NxpEse not available. Returning");
- return NFCSTATUS_FAILED;
- }
- int ret;
- NFCSTATUS wStatus = NFCSTATUS_FAILED;
- p61_access_state_t p61_current_state = P61_STATE_INVALID;
- NXPLOG_TML_D("phTmlNfc_i2c_get_p61_power_mode()");
-
- if (NULL == pDevHandle) {
- return -1;
- }
- ret = ioctl((intptr_t)pDevHandle, P61_GET_PWR_STATUS,
- (unsigned long)&p61_current_state);
- if (ret < 0) {
- NXPLOG_TML_E("%s : failed errno = 0x%x", __func__, errno);
- p61_current_state = P61_STATE_INVALID;
- }
- wStatus = p61_current_state;
- return wStatus;
-}
-/*******************************************************************************
-**
-** Function phTmlNfc_get_ese_access
-**
-** Description
-**
-** Parameters pDevHandle - valid device handle
-** timeout - timeout to wait for ese access
-**
-** Returns success or failure
-**
-*******************************************************************************/
-NFCSTATUS phTmlNfc_get_ese_access(void* pDevHandle, long timeout) {
- NXPLOG_TML_D("phTmlNfc_get_ese_access()");
- if(!nfcFL.nfcNxpEse) {
- NXPLOG_TML_D("NxpEse not available. Returning");
- return NFCSTATUS_FAILED;
- }
- int ret = -1;
- NFCSTATUS status = NFCSTATUS_SUCCESS;
- NXPLOG_TML_D("phTmlNfc_get_ese_access(), enter timeout %ld", timeout);
-
- if (NULL == pDevHandle) {
- return NFCSTATUS_FAILED;
- }
-
- ret = ioctl((intptr_t)pDevHandle, P544_GET_ESE_ACCESS, timeout);
- if (ret < 0) {
- if (ret == -EBUSY)
- status = NFCSTATUS_BUSY;
- else
- status = NFCSTATUS_FAILED;
- }
- NXPLOG_TML_D("phTmlNfc_get_ese_access(), exit ret %d, status %d", ret,
- status);
- return status;
-}
-
-/*******************************************************************************
-**
-** Function phTmlNfc_rel_svdd_wait
-**
-** Description
-**
-** Parameters pDevHandle - valid device handle
-**
-** Returns success or failure
-**
-*******************************************************************************/
-NFCSTATUS phTmlNfc_rel_svdd_wait(void* pDevHandle) {
- NXPLOG_TML_D("phTmlNfc_rel_svdd_wait()");
- if(!nfcFL.nfcNxpEse && !nfcFL.eseFL._ESE_SVDD_SYNC) {
- NXPLOG_TML_D("NxpEse and ESE_SVDD_SYNC not available. Returning");
- return NFCSTATUS_FAILED;
- }
- int ret = -1;
- NFCSTATUS status = NFCSTATUS_SUCCESS;
- NXPLOG_TML_D("phTmlNfc_rel_svdd_wait(), enter ");
-
- if (NULL == pDevHandle) {
- return NFCSTATUS_FAILED;
- }
-
- ret = ioctl((intptr_t)pDevHandle, P544_REL_SVDD_WAIT);
- if (ret < 0) {
- if (ret == -EBUSY)
- status = NFCSTATUS_BUSY;
- else
- status = NFCSTATUS_FAILED;
- }
- NXPLOG_TML_D("phTmlNfc_rel_svdd_wait(), exit ret %d, status %d", ret,
- status);
- return status;
-}
-
-/*******************************************************************************
-**
-** Function getDownloadFlag
-**
-** Description Returns the current mode
-**
-** Parameters none
-**
-** Returns Current mode download/NCI
-*******************************************************************************/
-bool_t getDownloadFlag(void) { return bFwDnldFlag; }