+ u_int8_t resp[ISO15693_RESP_SIZE_MAX];
+ struct iso15693_response *rx_pkt;
+ struct iso15693_err_resp *rx_err;
+
+ rx_pkt = (struct iso15693_response *)&resp[0];
+ rx_err = (struct iso15693_err_resp *)&resp[0];
+ rx_len = sizeof(resp);
+
+ if (len > ISO15693_BLOCK_SIZE_MAX)
+ return -1;
+
+ //return -1;
+
+ memset(&tx_req,0,sizeof(tx_req));
+ tx_req.sel.head.command = ISO15693_CMD_WRITE_BLOCK_SINGLE;
+
+ if (handle->priv.iso15693.vicc_fast) {
+ tx_req.sel.head.flags |= RFID_15693_F_RATE_HIGH;
+ timeout = iso15693_timing[ISO15693_T_FAST][ISO15693_T4_WRITE];
+ } else
+ timeout = iso15693_timing[ISO15693_T_SLOW][ISO15693_T4_WRITE];
+
+ if (handle->priv.iso15693.vicc_two_subc)
+ tx_req.sel.head.flags |= RFID_15693_F_SUBC_TWO;
+
+ if (handle->priv.iso15693.state == RFID_15693_STATE_SELECTED) {
+ tx_len=sizeof(struct iso15693_request_block_selected)+len;
+ tx_req.sel.head.flags |= RFID_15693_F4_SELECTED;
+ tx_req.sel.blocknum = blocknr;
+ memcpy(&tx_req.sel.data,data,len);
+ } else {
+ memcpy(&tx_req.addr.uid, handle->uid, ISO15693_UID_LEN);
+ tx_len=sizeof(struct iso15693_request_block_addressed)+len;
+ tx_req.addr.head.flags |= RFID_15693_F4_ADDRESS;
+ tx_req.addr.blocknum = blocknr;
+ memcpy(&tx_req.addr.data,data,len);
+ }
+
+ //DEBUGP("sizeof: addr: %d sel:%d\n",sizeof(struct iso15693_request_read_addressed),sizeof(struct iso15693_request_read_selected));
+ DEBUGP("tx_len=%u", tx_len); DEBUGPC(" rx_len=%u\n",rx_len);
+
+ ret = iso15693_transceive(handle, RFID_15693_FRAME, (u_int8_t*)&tx_req,
+ tx_len, resp, &rx_len, timeout, 0);
+
+ if (ret == -ETIMEDOUT)
+ errstr = "(TIMEOUT)";
+ else if (ret == -EIO)
+ errstr = "(EIO)";
+ else
+ errstr = "";
+ DEBUGP("length: %d rx_len: %d ret: %d%s\n",len,rx_len,ret,errstr);
+
+ if (ret < 0)
+ return ret;
+
+ if (rx_len > len+1)
+ return -1;
+ DEBUGP("error_flag: %d", rx_pkt->flags & RFID_15693_RF_ERROR);
+ if (rx_pkt->flags & RFID_15693_RF_ERROR) {
+ DEBUGPC(" -> error: %02x '%s'\n", rx_err->error,
+ iso15693_get_response_error_name(rx_err->error));
+ return -1;
+ } else {
+ //DEBUGPC(" block_sec_stat: 0x%02x\n",rx_pkt->data[0]);
+ //memcpy(data, rx_pkt->data, rx_len-1); /* FIXME rc-3 in case of CRC */
+ //return rx_len-1;
+ return 0;
+ }