diff options
-rw-r--r-- | openpcd/firmware/src/pcd/rc632_highlevel.c | 28 |
1 files changed, 18 insertions, 10 deletions
diff --git a/openpcd/firmware/src/pcd/rc632_highlevel.c b/openpcd/firmware/src/pcd/rc632_highlevel.c index 8cb1b86..b1186ab 100644 --- a/openpcd/firmware/src/pcd/rc632_highlevel.c +++ b/openpcd/firmware/src/pcd/rc632_highlevel.c @@ -371,16 +371,17 @@ rc632_transceive(struct rfid_asic_handle *handle, return rc632_fifo_read(handle, *rx_len, rx_buf); } -static int -rc632_read_eeprom(struct rfid_asic_handle *handle) +int +rc632_read_eeprom(struct rfid_asic_handle *handle, u_int16_t addr, u_int8_t len, + u_int8_t *recvbuf) { - u_int8_t recvbuf[60]; u_int8_t sndbuf[3]; + u_int8_t err; int ret; - sndbuf[0] = 0x00; - sndbuf[1] = 0x00; - sndbuf[2] = 0x3c; + sndbuf[0] = (addr & 0xff); + sndbuf[1] = addr >> 8; + sndbuf[2] = len; ret = rc632_fifo_write(handle, 3, sndbuf, 0x03); if (ret < 0) @@ -390,14 +391,21 @@ rc632_read_eeprom(struct rfid_asic_handle *handle) if (ret < 0) return ret; - usleep(20000); + /* usleep(20000); */ - ret = rc632_fifo_read(handle, sizeof(recvbuf), recvbuf); + ret = rc632_reg_read(handle, RC632_REG_ERROR_FLAG, &err); + if (err & RC632_ERR_FLAG_ACCESS_ERR) + return -EPERM; + + ret = rc632_reg_read(handle, RC632_REG_FIFO_DATA, &err); + if (err < len) + len = err; + + ret = rc632_fifo_read(handle, len, recvbuf); if (ret < 0) return ret; - // FIXME: do something with eeprom contents - return ret; + return len; } static int |