diff options
author | laforge <laforge@e0336214-984f-0b4b-a45f-81c69e1f0ede> | 2008-01-29 16:29:21 +0000 |
---|---|---|
committer | laforge <laforge@e0336214-984f-0b4b-a45f-81c69e1f0ede> | 2008-01-29 16:29:21 +0000 |
commit | da4aa962e17978a70bf1cf4fc3d1b46b620bc3bf (patch) | |
tree | ce482cb98a3318224d0fd40f951688cfd6bf1140 /src/rfid_reader_rc632_common.c | |
parent | 2b0914e033eb2644fe576b7b4c03309830abd2ec (diff) |
* implement rfid_reader_{get,set}opt()
* move get/set environment and get firmware api version to reader_{get,set}opt()
* merge rc632 power_up and power_down functions in new power function
* merge rc632 layer 2 protocol init functions into one
* rename parameters of rfid_layer2_{get,set}opt()
* move rf_power() function of reader to new setopt() interface
* merge reader layer 2 protocol init functiosn into one
* move most of the iso15693 anticol implementation from asic into layer2 code
* make most iso15693 parameters configurable via layer2_{get,set}opt()
* implement AFI for iso15693 inventory request
* introduce new generic 'rc632 asic based reader' functions
* use those functions from openpcd, cm5121 and spidev readers
* use new register initialization script data structure for rc632 init functions
* TODO update
git-svn-id: https://svn.gnumonks.org/trunk/librfid@2064 e0336214-984f-0b4b-a45f-81c69e1f0ede
Diffstat (limited to 'src/rfid_reader_rc632_common.c')
-rw-r--r-- | src/rfid_reader_rc632_common.c | 152 |
1 files changed, 152 insertions, 0 deletions
diff --git a/src/rfid_reader_rc632_common.c b/src/rfid_reader_rc632_common.c new file mode 100644 index 0000000..4a41f15 --- /dev/null +++ b/src/rfid_reader_rc632_common.c @@ -0,0 +1,152 @@ +/* Shared/Common functions for all RC632 based readers + * + * (C) 2006-2008 by Harald Welte <laforge@gnumonks.org> + * + */ + +/* + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 2 + * as published by the Free Software Foundation + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + + +#include <errno.h> + +#include <librfid/rfid.h> +#include <librfid/rfid_reader.h> +#include <librfid/rfid_asic.h> +#include <librfid/rfid_asic_rc632.h> +#include <librfid/rfid_layer2.h> + +#include "rfid_reader_rc632_common.h" + +int _rdr_rc632_transceive(struct rfid_reader_handle *rh, + enum rfid_frametype frametype, + const unsigned char *tx_data, unsigned int tx_len, + unsigned char *rx_data, unsigned int *rx_len, + u_int64_t timeout, unsigned int flags) +{ + return rh->ah->asic->priv.rc632.fn.transceive(rh->ah, frametype, + tx_data, tx_len, + rx_data, rx_len, + timeout, flags); +} + +int _rdr_rc632_transceive_sf(struct rfid_reader_handle *rh, + unsigned char cmd, struct iso14443a_atqa *atqa) +{ + return rh->ah->asic->priv.rc632.fn.iso14443a.transceive_sf(rh->ah, + cmd, + atqa); +} + +int +_rdr_rc632_transceive_acf(struct rfid_reader_handle *rh, + struct iso14443a_anticol_cmd *cmd, + unsigned int *bit_of_col) +{ + return rh->ah->asic->priv.rc632.fn.iso14443a.transceive_acf(rh->ah, + cmd, bit_of_col); +} + +int +_rdr_rc632_iso15693_transceive_ac(struct rfid_reader_handle *rh, + const struct iso15693_anticol_cmd *acf, + unsigned int acf_len, + struct iso15693_anticol_resp *resp, + unsigned int *resp_len, char *bit_of_col) +{ + return rh->ah->asic->priv.rc632.fn.iso15693.transceive_ac( + rh->ah, acf, acf_len, resp, resp_len, + bit_of_col); +} + + +int +_rdr_rc632_14443a_set_speed(struct rfid_reader_handle *rh, + unsigned int tx, unsigned int speed) +{ + u_int8_t rate; + + DEBUGP("setting rate: "); + switch (speed) { + case RFID_14443A_SPEED_106K: + rate = 0x00; + DEBUGPC("106K\n"); + break; + case RFID_14443A_SPEED_212K: + rate = 0x01; + DEBUGPC("212K\n"); + break; + case RFID_14443A_SPEED_424K: + rate = 0x02; + DEBUGPC("424K\n"); + break; + case RFID_14443A_SPEED_848K: + rate = 0x03; + DEBUGPC("848K\n"); + break; + default: + return -EINVAL; + break; + } + return rh->ah->asic->priv.rc632.fn.iso14443a.set_speed(rh->ah, + tx, rate); +} + +int +_rdr_rc632_l2_init(struct rfid_reader_handle *rh, enum rfid_layer2_id l2) +{ + return rh->ah->asic->priv.rc632.fn.init(rh->ah, l2); +} + +int +_rdr_rc632_mifare_setkey(struct rfid_reader_handle *rh, const u_int8_t *key) +{ + return rh->ah->asic->priv.rc632.fn.mifare_classic.setkey(rh->ah, key); +} + +int +_rdr_rc632_mifare_auth(struct rfid_reader_handle *rh, u_int8_t cmd, + u_int32_t serno, u_int8_t block) +{ + return rh->ah->asic->priv.rc632.fn.mifare_classic.auth(rh->ah, + cmd, serno, block); +} + +int +_rdr_rc632_getopt(struct rfid_reader_handle *rh, int optname, + void *optval, unsigned int *optlen) +{ + return -EINVAL; +} + +int +_rdr_rc632_setopt(struct rfid_reader_handle *rh, int optname, + const void *optval, unsigned int optlen) +{ + unsigned int *val = (unsigned int *)optval; + + if (!optval || optlen < sizeof(*val)) + return -EINVAL; + + switch (optname) { + case RFID_OPT_RDR_RF_KILL: + if (*val) + return rh->ah->asic->priv.rc632.fn.rf_power(rh->ah, 0); + else + return rh->ah->asic->priv.rc632.fn.rf_power(rh->ah, 1); + default: + return -EINVAL; + } +} |