0001
0002
0003
0004
0005
0006
0007 #ifndef __DIGITAL_H
0008 #define __DIGITAL_H
0009
0010 #include <net/nfc/nfc.h>
0011 #include <net/nfc/digital.h>
0012
0013 #include <linux/crc-ccitt.h>
0014 #include <linux/crc-itu-t.h>
0015
0016 #define PROTOCOL_ERR(req) pr_err("%d: NFC Digital Protocol error: %s\n", \
0017 __LINE__, req)
0018
0019 #define DIGITAL_CMD_IN_SEND 0
0020 #define DIGITAL_CMD_TG_SEND 1
0021 #define DIGITAL_CMD_TG_LISTEN 2
0022 #define DIGITAL_CMD_TG_LISTEN_MDAA 3
0023 #define DIGITAL_CMD_TG_LISTEN_MD 4
0024
0025 #define DIGITAL_MAX_HEADER_LEN 7
0026 #define DIGITAL_CRC_LEN 2
0027
0028 #define DIGITAL_SENSF_NFCID2_NFC_DEP_B1 0x01
0029 #define DIGITAL_SENSF_NFCID2_NFC_DEP_B2 0xFE
0030
0031 #define DIGITAL_SENS_RES_NFC_DEP 0x0100
0032 #define DIGITAL_SEL_RES_NFC_DEP 0x40
0033 #define DIGITAL_SENSF_FELICA_SC 0xFFFF
0034
0035 #define DIGITAL_DRV_CAPS_IN_CRC(ddev) \
0036 ((ddev)->driver_capabilities & NFC_DIGITAL_DRV_CAPS_IN_CRC)
0037 #define DIGITAL_DRV_CAPS_TG_CRC(ddev) \
0038 ((ddev)->driver_capabilities & NFC_DIGITAL_DRV_CAPS_TG_CRC)
0039
0040 struct digital_data_exch {
0041 data_exchange_cb_t cb;
0042 void *cb_context;
0043 };
0044
0045 struct sk_buff *digital_skb_alloc(struct nfc_digital_dev *ddev,
0046 unsigned int len);
0047
0048 int digital_send_cmd(struct nfc_digital_dev *ddev, u8 cmd_type,
0049 struct sk_buff *skb, struct digital_tg_mdaa_params *params,
0050 u16 timeout, nfc_digital_cmd_complete_t cmd_cb,
0051 void *cb_context);
0052
0053 int digital_in_configure_hw(struct nfc_digital_dev *ddev, int type, int param);
0054 static inline int digital_in_send_cmd(struct nfc_digital_dev *ddev,
0055 struct sk_buff *skb, u16 timeout,
0056 nfc_digital_cmd_complete_t cmd_cb,
0057 void *cb_context)
0058 {
0059 return digital_send_cmd(ddev, DIGITAL_CMD_IN_SEND, skb, NULL, timeout,
0060 cmd_cb, cb_context);
0061 }
0062
0063 void digital_poll_next_tech(struct nfc_digital_dev *ddev);
0064
0065 int digital_in_send_sens_req(struct nfc_digital_dev *ddev, u8 rf_tech);
0066 int digital_in_send_sensb_req(struct nfc_digital_dev *ddev, u8 rf_tech);
0067 int digital_in_send_sensf_req(struct nfc_digital_dev *ddev, u8 rf_tech);
0068 int digital_in_send_iso15693_inv_req(struct nfc_digital_dev *ddev, u8 rf_tech);
0069
0070 int digital_in_iso_dep_pull_sod(struct nfc_digital_dev *ddev,
0071 struct sk_buff *skb);
0072 int digital_in_iso_dep_push_sod(struct nfc_digital_dev *ddev,
0073 struct sk_buff *skb);
0074
0075 int digital_target_found(struct nfc_digital_dev *ddev,
0076 struct nfc_target *target, u8 protocol);
0077
0078 int digital_in_recv_mifare_res(struct sk_buff *resp);
0079
0080 int digital_in_send_atr_req(struct nfc_digital_dev *ddev,
0081 struct nfc_target *target, __u8 comm_mode, __u8 *gb,
0082 size_t gb_len);
0083 int digital_in_send_dep_req(struct nfc_digital_dev *ddev,
0084 struct nfc_target *target, struct sk_buff *skb,
0085 struct digital_data_exch *data_exch);
0086
0087 int digital_tg_configure_hw(struct nfc_digital_dev *ddev, int type, int param);
0088 static inline int digital_tg_send_cmd(struct nfc_digital_dev *ddev,
0089 struct sk_buff *skb, u16 timeout,
0090 nfc_digital_cmd_complete_t cmd_cb, void *cb_context)
0091 {
0092 return digital_send_cmd(ddev, DIGITAL_CMD_TG_SEND, skb, NULL, timeout,
0093 cmd_cb, cb_context);
0094 }
0095
0096 void digital_tg_recv_sens_req(struct nfc_digital_dev *ddev, void *arg,
0097 struct sk_buff *resp);
0098
0099 void digital_tg_recv_sensf_req(struct nfc_digital_dev *ddev, void *arg,
0100 struct sk_buff *resp);
0101
0102 static inline int digital_tg_listen(struct nfc_digital_dev *ddev, u16 timeout,
0103 nfc_digital_cmd_complete_t cb, void *arg)
0104 {
0105 return digital_send_cmd(ddev, DIGITAL_CMD_TG_LISTEN, NULL, NULL,
0106 timeout, cb, arg);
0107 }
0108
0109 void digital_tg_recv_atr_req(struct nfc_digital_dev *ddev, void *arg,
0110 struct sk_buff *resp);
0111
0112 int digital_tg_send_dep_res(struct nfc_digital_dev *ddev, struct sk_buff *skb);
0113
0114 int digital_tg_listen_nfca(struct nfc_digital_dev *ddev, u8 rf_tech);
0115 int digital_tg_listen_nfcf(struct nfc_digital_dev *ddev, u8 rf_tech);
0116 void digital_tg_recv_md_req(struct nfc_digital_dev *ddev, void *arg,
0117 struct sk_buff *resp);
0118
0119 typedef u16 (*crc_func_t)(u16, const u8 *, size_t);
0120
0121 #define CRC_A_INIT 0x6363
0122 #define CRC_B_INIT 0xFFFF
0123 #define CRC_F_INIT 0x0000
0124
0125 void digital_skb_add_crc(struct sk_buff *skb, crc_func_t crc_func, u16 init,
0126 u8 bitwise_inv, u8 msb_first);
0127
0128 static inline void digital_skb_add_crc_a(struct sk_buff *skb)
0129 {
0130 digital_skb_add_crc(skb, crc_ccitt, CRC_A_INIT, 0, 0);
0131 }
0132
0133 static inline void digital_skb_add_crc_b(struct sk_buff *skb)
0134 {
0135 digital_skb_add_crc(skb, crc_ccitt, CRC_B_INIT, 1, 0);
0136 }
0137
0138 static inline void digital_skb_add_crc_f(struct sk_buff *skb)
0139 {
0140 digital_skb_add_crc(skb, crc_itu_t, CRC_F_INIT, 0, 1);
0141 }
0142
0143 static inline void digital_skb_add_crc_none(struct sk_buff *skb)
0144 {
0145 return;
0146 }
0147
0148 int digital_skb_check_crc(struct sk_buff *skb, crc_func_t crc_func,
0149 u16 crc_init, u8 bitwise_inv, u8 msb_first);
0150
0151 static inline int digital_skb_check_crc_a(struct sk_buff *skb)
0152 {
0153 return digital_skb_check_crc(skb, crc_ccitt, CRC_A_INIT, 0, 0);
0154 }
0155
0156 static inline int digital_skb_check_crc_b(struct sk_buff *skb)
0157 {
0158 return digital_skb_check_crc(skb, crc_ccitt, CRC_B_INIT, 1, 0);
0159 }
0160
0161 static inline int digital_skb_check_crc_f(struct sk_buff *skb)
0162 {
0163 return digital_skb_check_crc(skb, crc_itu_t, CRC_F_INIT, 0, 1);
0164 }
0165
0166 static inline int digital_skb_check_crc_none(struct sk_buff *skb)
0167 {
0168 return 0;
0169 }
0170
0171 #endif