+const struct rfid_asic_transport openpcd_rat = {
+ .name = "OpenPCD Dumb USB Protocol",
+ .priv.rc632 = {
+ .fn = {
+ .reg_write = &openpcd_reg_write,
+ .reg_read = &openpcd_reg_read,
+ .fifo_write = &openpcd_fifo_write,
+ .fifo_read = &openpcd_fifo_read,
+ },
+ },
+};
+
+static int openpcd_get_api_version(struct rfid_reader_handle *rh, u_int8_t *version)
+{
+ int ret;
+
+ // preset version result to zero
+ rcv_hdr->val=0;
+
+ ret = openpcd_xcv(OPENPCD_CMD_GET_API_VERSION, 0, 0, 0, NULL);
+ if (ret < 0) {
+ DEBUGPC("ERROR sending command [%i]\n", ret);
+ return ret;
+ }
+
+ if (ret < sizeof(struct openpcd_hdr)) {
+ DEBUGPC("ERROR: short packet [%i]\n", ret);
+ return -EINVAL;
+ }
+
+ *version = rcv_hdr->val;
+
+ return ret;
+}
+
+static int openpcd_get_environment(
+ struct rfid_reader_handle *rh,
+ unsigned char num_bytes,
+ unsigned char *buf)
+{
+ int ret;
+
+ DEBUGP(" ");
+
+ ret = openpcd_xcv(OPENPCD_CMD_GET_ENVIRONMENT, 0x00, num_bytes, 0, NULL);
+ if (ret < 0) {
+ DEBUGPC("ERROR sending command [%i]\n",ret);
+ return ret;
+ }
+ DEBUGPC("ret = %d\n", ret);
+
+ memcpy(buf, rcv_hdr->data, ret - sizeof(struct openpcd_hdr));
+ DEBUGPC("len=%d val=%s: OK\n", ret - sizeof(struct openpcd_hdr),
+ rfid_hexdump(rcv_hdr->data, ret - sizeof(struct openpcd_hdr)));
+
+ return ret;
+}
+
+static int openpcd_set_environment(
+ struct rfid_reader_handle *rh,
+ const unsigned char num_bytes,
+ unsigned char *buf)
+{
+ int ret;
+
+ ret = openpcd_xcv(OPENPCD_CMD_SET_ENVIRONMENT, 0, 0, num_bytes, buf);
+ if (ret < 0) {
+ DEBUGPC("ERROR sending command [%i]\n",ret);
+ return ret;
+ }
+
+ if (ret < sizeof(struct openpcd_hdr)) {
+ DEBUGPC("ERROR: short packet [%i]\n", ret);
+ return -EINVAL;
+ }
+
+ return rcv_hdr->val;
+}
+
+static int openpcd_reset(struct rfid_reader_handle *rh)
+{
+ int ret;
+
+ DEBUGP("reset ");
+ ret = openpcd_xcv(OPENPCD_CMD_RESET, 0, 0, 0, 0);
+
+ return ret;
+}
+
+#else
+/* RC632 access primitives for librfid inside reader firmware */
+
+static int openpcd_reg_write(struct rfid_asic_transport_handle *rath,
+ unsigned char reg, unsigned char value)
+{
+ return opcd_rc632_reg_write(rath, reg, value);
+}
+
+static int openpcd_reg_read(struct rfid_asic_transport_handle *rath,
+ unsigned char reg,
+ unsigned char *value)
+{
+ return opcd_rc632_reg_read(rath, reg, value);
+}
+
+
+static int openpcd_fifo_read(struct rfid_asic_transport_handle *rath,
+ unsigned char num_bytes,
+ unsigned char *buf)
+{
+ return opcd_rc632_fifo_read(rath, num_bytes, buf);
+}
+
+static int openpcd_fifo_write(struct rfid_asic_transport_handle *rath,
+ unsigned char len,
+ const unsigned char *bytes,
+ unsigned char flags)
+{
+ return opcd_rc632_fifo_write(rath, len, bytes, flags);
+}
+
+const struct rfid_asic_transport openpcd_rat = {
+ .name = "OpenPCD Firmware RC632 Access",
+ .priv.rc632 = {
+ .fn = {
+ .reg_write = &openpcd_reg_write,
+ .reg_read = &openpcd_reg_read,
+ .fifo_write = &openpcd_fifo_write,
+ .fifo_read = &openpcd_fifo_read,
+ },
+ },
+};
+
+#endif /* LIBRFID_FIRMWARE */
+