Merge pull request #6478 from haukepetersen/fix_pm532_spiadapt

drivers/pn532: adapted to SPI interface changes
This commit is contained in:
Cenk Gündoğan 2017-01-27 10:52:52 +01:00 committed by GitHub
commit 9f1721ab65
4 changed files with 80 additions and 53 deletions

View File

@ -71,6 +71,10 @@
#define SPI_DATA_READ (0xC0) #define SPI_DATA_READ (0xC0)
#define SPI_WRITE_DELAY_US (2000) #define SPI_WRITE_DELAY_US (2000)
/* SPI bus parameters */
#define SPI_MODE (SPI_MODE_0)
#define SPI_CLK (SPI_CLK_1MHZ)
/* Length for passive listings */ /* Length for passive listings */
#define LIST_PASSIVE_LEN_14443(num) (num * 20) #define LIST_PASSIVE_LEN_14443(num) (num * 20)
@ -108,8 +112,6 @@ int pn532_init(pn532_t *dev, const pn532_params_t *params, pn532_mode_t mode)
{ {
assert(dev != NULL); assert(dev != NULL);
int ret = -1;
dev->conf = params; dev->conf = params;
gpio_init_int(dev->conf->irq, GPIO_IN_PU, GPIO_FALLING, gpio_init_int(dev->conf->irq, GPIO_IN_PU, GPIO_FALLING,
@ -120,28 +122,26 @@ int pn532_init(pn532_t *dev, const pn532_params_t *params, pn532_mode_t mode)
dev->mode = mode; dev->mode = mode;
if (mode == PN532_I2C) { if (mode == PN532_I2C) {
#ifdef PN532_SUPPORT_I2C #ifdef PN532_SUPPORT_I2C
ret = i2c_init_master(dev->conf->i2c, I2C_SPEED_FAST); if (i2c_init_master(dev->conf->i2c, I2C_SPEED_FAST) != 0) {
DEBUG("pn532: initialization of I2C bus failed\n");
return -1;
}
#endif #endif
} }
else { else {
#ifdef PN532_SUPPORT_SPI #ifdef PN532_SUPPORT_SPI
ret = spi_init_master(dev->conf->spi, SPI_CONF_FIRST_RISING, /* we handle the CS line manually... */
SPI_SPEED_1MHZ);
gpio_init(dev->conf->nss, GPIO_OUT); gpio_init(dev->conf->nss, GPIO_OUT);
gpio_set(dev->conf->nss); gpio_set(dev->conf->nss);
#endif #endif
} }
/* cppcheck-suppress knownConditionTrueFalse
* (reason: variable set when PN532_SUPPORT_{I2C,SPI} defined) */
if (ret == 0) {
pn532_reset(dev); pn532_reset(dev);
}
mutex_init(&dev->trap); mutex_init(&dev->trap);
mutex_lock(&dev->trap); mutex_lock(&dev->trap);
return ret; return 0;
} }
static unsigned char chksum(char *b, unsigned len) static unsigned char chksum(char *b, unsigned len)
@ -181,14 +181,15 @@ static int _write(pn532_t *dev, char *buff, unsigned len)
} }
else { else {
#ifdef PN532_SUPPORT_SPI #ifdef PN532_SUPPORT_SPI
spi_acquire(dev->conf->spi); spi_acquire(dev->conf->spi, SPI_CS_UNDEF, SPI_MODE, SPI_CLK);
gpio_clear(dev->conf->nss); gpio_clear(dev->conf->nss);
xtimer_usleep(SPI_WRITE_DELAY_US); xtimer_usleep(SPI_WRITE_DELAY_US);
reverse(buff, len); reverse(buff, len);
spi_transfer_byte(dev->conf->spi, SPI_DATA_WRITE, NULL); spi_transfer_byte(dev->conf->spi, SPI_CS_UNDEF, true, SPI_DATA_WRITE);
ret = spi_transfer_bytes(dev->conf->spi, buff, NULL, len); spi_transfer_bytes(dev->conf->spi, SPI_CS_UNDEF, true, buff, NULL, len);
gpio_set(dev->conf->nss); gpio_set(dev->conf->nss);
spi_release(dev->conf->spi); spi_release(dev->conf->spi);
ret = (int)len;
#endif #endif
} }
DEBUG("pn532: -> "); DEBUG("pn532: -> ");
@ -213,17 +214,16 @@ static int _read(pn532_t *dev, char *buff, unsigned len)
} }
else { else {
#ifdef PN532_SUPPORT_SPI #ifdef PN532_SUPPORT_SPI
spi_acquire(dev->conf->spi); spi_acquire(dev->conf->spi, SPI_CS_UNDEF, SPI_MODE, SPI_CLK);
gpio_clear(dev->conf->nss); gpio_clear(dev->conf->nss);
spi_transfer_byte(dev->conf->spi, SPI_DATA_READ, NULL); spi_transfer_byte(dev->conf->spi, SPI_CS_UNDEF, true, SPI_DATA_READ);
ret = spi_transfer_bytes(dev->conf->spi, 0x00, &buff[1], len); spi_transfer_bytes(dev->conf->spi, SPI_CS_UNDEF, true, NULL, &buff[1], len);
gpio_set(dev->conf->nss); gpio_set(dev->conf->nss);
spi_release(dev->conf->spi); spi_release(dev->conf->spi);
if (ret >= 0) {
buff[0] = 0x80; buff[0] = 0x80;
reverse(buff, ret); reverse(buff, len);
ret += 1; ret = (int)len + 1;
}
#endif #endif
} }
DEBUG("pn532: <- "); DEBUG("pn532: <- ");

View File

@ -11,11 +11,26 @@ TEST_PN532_I2C ?= I2C_DEV\(0\)
TEST_PN532_RESET ?= GPIO_PIN\(0,0\) TEST_PN532_RESET ?= GPIO_PIN\(0,0\)
TEST_PN532_IRQ ?= GPIO_PIN\(0,1\) TEST_PN532_IRQ ?= GPIO_PIN\(0,1\)
# alternative SPI configuration
TEST_PN532_SPI ?= SPI_DEV\(0\)
TEST_PN532_NSS ?= GPIO_PIN\(0,2\)
# export parameters # export parameters
CFLAGS += -DTEST_PN532_I2C=$(TEST_PN532_I2C) CFLAGS += -DTEST_PN532_I2C=$(TEST_PN532_I2C)
CFLAGS += -DTEST_PN532_RESET=$(TEST_PN532_RESET) CFLAGS += -DTEST_PN532_RESET=$(TEST_PN532_RESET)
CFLAGS += -DTEST_PN532_IRQ=$(TEST_PN532_IRQ) CFLAGS += -DTEST_PN532_IRQ=$(TEST_PN532_IRQ)
CFLAGS += -DTEST_PN532_SPI=$(TEST_PN532_SPI)
CFLAGS += -DTEST_PN532_NSS=$(TEST_PN532_NSS)
# select if you want to build the SPI or the I2C version of the driver:
# set PN532_MODE to `i2c` or to `spi`
PN532_MODE ?= i2c
ifeq ($(PN532_MODE),i2c)
CFLAGS += -DPN532_SUPPORT_I2C CFLAGS += -DPN532_SUPPORT_I2C
endif
ifeq ($(PN532_MODE),spi)
CFLAGS += -DPN532_SUPPORT_SPI
endif
CFLAGS += -I$(CURDIR) CFLAGS += -I$(CURDIR)

View File

@ -44,8 +44,13 @@ int main(void)
static nfc_iso14443a_t card; static nfc_iso14443a_t card;
static pn532_t pn532; static pn532_t pn532;
unsigned len; unsigned len;
int ret;
int ret = pn532_init_i2c(&pn532, &pn532_conf[0]); #if defined(PN532_SUPPORT_I2C)
ret = pn532_init_i2c(&pn532, &pn532_conf[0]);
#elif defined(PN532_SUPPORT_SPI)
ret = pn532_init_spi(&pn532, &pn532_conf[0]);
#endif
if (ret != 0) { if (ret != 0) {
LOG_INFO("init error %d\n", ret); LOG_INFO("init error %d\n", ret);

View File

@ -25,9 +25,16 @@ extern "C" {
static const pn532_params_t pn532_conf[] = { static const pn532_params_t pn532_conf[] = {
{ {
#if defined(PN532_SUPPORT_I2C)
.i2c = TEST_PN532_I2C, .i2c = TEST_PN532_I2C,
#elif defined(PN532_SUPPORT_SPI)
.spi = TEST_PN532_SPI,
#endif
.reset = TEST_PN532_RESET, .reset = TEST_PN532_RESET,
.irq = TEST_PN532_IRQ, .irq = TEST_PN532_IRQ,
#if defined(PN532_SUPPORT_SPI)
.nss = TEST_PN532_NSS
#endif
}, },
}; };