From b99be65c277b0cc65a00a33e784ed49461531737 Mon Sep 17 00:00:00 2001 From: Martijn Coenen Date: Wed, 2 Nov 2011 15:58:37 -0700 Subject: Use NFC HAL for some libnfc settings. The NFC HAL in libhardware allows us to store and retrieve product-specific settings. This patch moves two product-specific settings to the HAL: the device port, and the usage of the i2c workaround we had for crespo. This means configuring the port no longer needs to be done from JNI land. Change-Id: I2e19b6f188f808bc2f2a1f1abc28f2a6c47e6a4c --- Android.mk | 2 +- Linux_x86/phDal4Nfc.c | 64 +++++++++++++++++++++++++++++++++------------- Linux_x86/phDal4Nfc_i2c.c | 18 +++---------- Linux_x86/phDal4Nfc_uart.c | 38 ++------------------------- inc/phNfcTypes.h | 26 ++----------------- src/phDal4Nfc.h | 22 ++-------------- 6 files changed, 56 insertions(+), 114 deletions(-) diff --git a/Android.mk b/Android.mk index af260ce..b45f78b 100644 --- a/Android.mk +++ b/Android.mk @@ -129,7 +129,7 @@ LOCAL_CFLAGS += -I$(LOCAL_PATH)/src LOCAL_MODULE:= libnfc LOCAL_MODULE_TAGS := optional -LOCAL_SHARED_LIBRARIES := libcutils libnfc_ndef libdl +LOCAL_SHARED_LIBRARIES := libcutils libnfc_ndef libdl libhardware include $(BUILD_SHARED_LIBRARY) diff --git a/Linux_x86/phDal4Nfc.c b/Linux_x86/phDal4Nfc.c index 8b4f687..3e031f1 100644 --- a/Linux_x86/phDal4Nfc.c +++ b/Linux_x86/phDal4Nfc.c @@ -48,11 +48,9 @@ #include #include #include +#include +#include -/*----------------------------------------------------------------------------------- - MISC DEFINITIONS -------------------------------------------------------------------------------------*/ -#define DEFAULT_LINK_TYPE ENUM_DAL_LINK_TYPE_COM1 /*----------------------------------------------------------------------------------- TYPES @@ -269,7 +267,7 @@ NFCSTATUS phDal4Nfc_Init(void *pContext, void *pHwRef ) else { static phDal4Nfc_sConfig_t hw_config; - hw_config.nLinkType = DEFAULT_LINK_TYPE; + hw_config.deviceNode = NULL; result = phDal4Nfc_Config(&hw_config, pHwRef ); } } @@ -351,6 +349,9 @@ NFCSTATUS phDal4Nfc_ConfigRelease(void *pHwRef) /* Close the link */ gLinkFunc.close(); + if (gDalContext.pDev != NULL) { + nfc_pn544_close(gDalContext.pDev); + } /* Reset the Read Writer context to NULL */ memset((void *)&gReadWriteContext,0,sizeof(gReadWriteContext)); /* Reset the DAL context values to NULL */ @@ -533,22 +534,40 @@ PURPOSE: Configure the serial port. NFCSTATUS phDal4Nfc_Config(pphDal4Nfc_sConfig_t config,void **phwref) { NFCSTATUS retstatus = NFCSTATUS_SUCCESS; + const hw_module_t* hw_module; + nfc_pn544_device_t* pn544_dev; + uint8_t num_eeprom_settings; + uint8_t* eeprom_settings; + int ret; + + /* Retrieve the hw module from the Android NFC HAL */ + ret = hw_get_module(NFC_HARDWARE_MODULE_ID, &hw_module); + if (ret) { + LOGE("hw_get_module() failed"); + return NFCSTATUS_FAILED; + } + ret = nfc_pn544_open(hw_module, &pn544_dev); + if (ret) { + LOGE("Could not open pn544 hw_module"); + return NFCSTATUS_FAILED; + } + config->deviceNode = pn544_dev->device_node; + if (config->deviceNode == NULL) { + LOGE("deviceNode NULL"); + return NFCSTATUS_FAILED; + } DAL_PRINT("phDal4Nfc_Config"); - if ((config == NULL) || (phwref == NULL) || (config->nClientId == -1)) + if ((config == NULL) || (phwref == NULL)) return NFCSTATUS_INVALID_PARAMETER; /* Register the link callbacks */ memset(&gLinkFunc, 0, sizeof(phDal4Nfc_link_cbk_interface_t)); - switch(config->nLinkType) + switch(pn544_dev->linktype) { - case ENUM_DAL_LINK_TYPE_COM1: - case ENUM_DAL_LINK_TYPE_COM2: - case ENUM_DAL_LINK_TYPE_COM3: - case ENUM_DAL_LINK_TYPE_COM4: - case ENUM_DAL_LINK_TYPE_COM5: - case ENUM_DAL_LINK_TYPE_USB: + case PN544_LINK_TYPE_UART: + case PN544_LINK_TYPE_USB: { DAL_PRINT("UART link Config"); /* Uart link interface */ @@ -564,7 +583,7 @@ NFCSTATUS phDal4Nfc_Config(pphDal4Nfc_sConfig_t config,void **phwref) } break; - case ENUM_DAL_LINK_TYPE_I2C: + case PN544_LINK_TYPE_I2C: { DAL_PRINT("I2C link Config"); /* i2c link interface */ @@ -608,6 +627,9 @@ NFCSTATUS phDal4Nfc_Config(pphDal4Nfc_sConfig_t config,void **phwref) #else nDeferedCallMessageQueueId = config->nClientId; #endif + + gDalContext.pDev = pn544_dev; + /* Start Read and Write Threads */ if(NFCSTATUS_SUCCESS != phDal4Nfc_StartThreads()) { @@ -615,7 +637,6 @@ NFCSTATUS phDal4Nfc_Config(pphDal4Nfc_sConfig_t config,void **phwref) } gDalContext.hw_valid = TRUE; - phDal4Nfc_Reset(1); phDal4Nfc_Reset(0); phDal4Nfc_Reset(1); @@ -696,6 +717,13 @@ int phDal4Nfc_ReaderThread(void * pArg) phOsalNfc_Message_t OsalMsg ; int i; int i2c_error_count; + int i2c_workaround; + if (gDalContext.pDev != NULL) { + i2c_workaround = gDalContext.pDev->enable_i2c_workaround; + } else { + LOGE("gDalContext.pDev is not set"); + return NFCSTATUS_FAILED; + } pthread_setname_np(pthread_self(), "reader"); @@ -730,12 +758,12 @@ retry: /* Wait for IRQ !!! */ gReadWriteContext.nNbOfBytesRead = gLinkFunc.read(gReadWriteContext.pReadBuffer, gReadWriteContext.nNbOfBytesToRead); - /* TODO: Remove this hack - * Reading the value 0x57 indicates a HW I2C error at I2C address 0x57 + /* Reading the value 0x57 indicates a HW I2C error at I2C address 0x57 * (pn544). There should not be false positives because a read of length 1 * must be a HCI length read, and a length of 0x57 is impossible (max is 33). */ - if(gReadWriteContext.nNbOfBytesToRead == 1 && gReadWriteContext.pReadBuffer[0] == 0x57) + if(i2c_workaround && gReadWriteContext.nNbOfBytesToRead == 1 && + gReadWriteContext.pReadBuffer[0] == 0x57) { i2c_error_count++; DAL_DEBUG("RX Thread Read 0x57 %d times\n", i2c_error_count); diff --git a/Linux_x86/phDal4Nfc_i2c.c b/Linux_x86/phDal4Nfc_i2c.c index 72da8e7..8b742d9 100644 --- a/Linux_x86/phDal4Nfc_i2c.c +++ b/Linux_x86/phDal4Nfc_i2c.c @@ -24,7 +24,7 @@ #define LOG_TAG "NFC_i2c" #include - +#include #include #include #include @@ -144,24 +144,12 @@ PURPOSE: Closes the link NFCSTATUS phDal4Nfc_i2c_open_and_configure(pphDal4Nfc_sConfig_t pConfig, void ** pLinkHandle) { - char * pComPort; - DAL_ASSERT_STR(gI2cPortContext.nOpened==0, "Trying to open but already done!"); - switch(pConfig->nLinkType) - { - case ENUM_DAL_LINK_TYPE_I2C: - pComPort = "/dev/pn544"; - break; - default: - DAL_DEBUG("Open failed: unknown type %d\n", pConfig->nLinkType); - return NFCSTATUS_INVALID_PARAMETER; - } - - DAL_DEBUG("Opening port=%s\n", pComPort); + DAL_DEBUG("Opening port=%s\n", pConfig->deviceNode); /* open port */ - gI2cPortContext.nHandle = open(pComPort, O_RDWR | O_NOCTTY); + gI2cPortContext.nHandle = open(pConfig->deviceNode, O_RDWR | O_NOCTTY); if (gI2cPortContext.nHandle < 0) { DAL_DEBUG("Open failed: open() returned %d\n", gI2cPortContext.nHandle); diff --git a/Linux_x86/phDal4Nfc_uart.c b/Linux_x86/phDal4Nfc_uart.c index a2f6db3..b19c5c5 100644 --- a/Linux_x86/phDal4Nfc_uart.c +++ b/Linux_x86/phDal4Nfc_uart.c @@ -28,7 +28,7 @@ #define LOG_TAG "NFC_uart" #include - +#include #include #include #include @@ -159,7 +159,6 @@ PURPOSE: Closes the link NFCSTATUS phDal4Nfc_uart_open_and_configure(pphDal4Nfc_sConfig_t pConfig, void ** pLinkHandle) { - char * pComPort; int nComStatus; NFCSTATUS nfcret = NFCSTATUS_SUCCESS; int ret; @@ -168,41 +167,8 @@ NFCSTATUS phDal4Nfc_uart_open_and_configure(pphDal4Nfc_sConfig_t pConfig, void * srand(time(NULL)); - switch(pConfig->nLinkType) - { - case ENUM_DAL_LINK_TYPE_COM1: - pComPort = "/dev/ttyO0"; - break; - case ENUM_DAL_LINK_TYPE_COM2: - pComPort = "/dev/ttyO1"; - break; - case ENUM_DAL_LINK_TYPE_COM3: - pComPort = "/dev/ttyO2"; - break; - case ENUM_DAL_LINK_TYPE_COM4: - pComPort = "/dev/ttyO3"; - break; - case ENUM_DAL_LINK_TYPE_COM5: - pComPort = "/dev/ttyO4"; - break; - case ENUM_DAL_LINK_TYPE_COM6: - pComPort = "/dev/ttyO5"; - break; - case ENUM_DAL_LINK_TYPE_COM7: - pComPort = "/dev/ttyO6"; - break; - case ENUM_DAL_LINK_TYPE_COM8: - pComPort = "/dev/ttyO7"; - break; - case ENUM_DAL_LINK_TYPE_USB: - pComPort = "/dev/ttyUSB0"; - break; - default: - return NFCSTATUS_INVALID_PARAMETER; - } - /* open communication port handle */ - gComPortContext.nHandle = open(pComPort, O_RDWR | O_NOCTTY); + gComPortContext.nHandle = open(pConfig->deviceNode, O_RDWR | O_NOCTTY); if (gComPortContext.nHandle < 0) { *pLinkHandle = NULL; diff --git a/inc/phNfcTypes.h b/inc/phNfcTypes.h index 989cfe8..1f0fe1c 100644 --- a/inc/phNfcTypes.h +++ b/inc/phNfcTypes.h @@ -222,28 +222,6 @@ typedef struct phNfc_sData_t uint32_t length; } phNfc_sData_t; - -/** - *\brief Possible Hardware Configuration exposed to upper layer. - * Typically this should be port name (Ex:"COM1","COM2") to which PN544 is connected. - */ -typedef enum -{ - ENUM_LINK_TYPE_COM1, - ENUM_LINK_TYPE_COM2, - ENUM_LINK_TYPE_COM3, - ENUM_LINK_TYPE_COM4, - ENUM_LINK_TYPE_COM5, - ENUM_LINK_TYPE_COM6, - ENUM_LINK_TYPE_COM7, - ENUM_LINK_TYPE_COM8, - ENUM_LINK_TYPE_I2C, - ENUM_LINK_TYPE_USB, - ENUM_LINK_TYPE_TCP, - - ENUM_LINK_TYPE_NB, -} phLibNfc_eConfigLinkType; - /** * \brief Possible Hardware Configuration exposed to upper layer. * Typically this should be at least the communication link (Ex:"COM1","COM2") @@ -251,8 +229,8 @@ typedef enum */ typedef struct phLibNfc_sConfig_t { - /** Hardware communication link to the controller */ - phLibNfc_eConfigLinkType nLinkType; + /** Device node of the controller */ + const char* deviceNode; /** The client ID (thread ID or message queue ID) */ unsigned int nClientId; } phLibNfc_sConfig_t, *pphLibNfc_sConfig_t; diff --git a/src/phDal4Nfc.h b/src/phDal4Nfc.h index 0913c5e..3cbb585 100644 --- a/src/phDal4Nfc.h +++ b/src/phDal4Nfc.h @@ -49,6 +49,7 @@ * * */ +#include /**< Basic type definitions */ #include /**< Generic Interface Layer Function Definitions */ @@ -75,6 +76,7 @@ typedef struct phDal4Nfc_SContext phNfcIF_sCallBack_t cb_if; /**