Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/net/nfc/digital.h
26289 views
1
/* SPDX-License-Identifier: GPL-2.0-only */
2
/*
3
* NFC Digital Protocol stack
4
* Copyright (c) 2013, Intel Corporation.
5
*/
6
7
#ifndef __DIGITAL_H
8
#define __DIGITAL_H
9
10
#include <net/nfc/nfc.h>
11
#include <net/nfc/digital.h>
12
13
#include <linux/crc-ccitt.h>
14
#include <linux/crc-itu-t.h>
15
16
#define PROTOCOL_ERR(req) pr_err("%d: NFC Digital Protocol error: %s\n", \
17
__LINE__, req)
18
19
#define DIGITAL_CMD_IN_SEND 0
20
#define DIGITAL_CMD_TG_SEND 1
21
#define DIGITAL_CMD_TG_LISTEN 2
22
#define DIGITAL_CMD_TG_LISTEN_MDAA 3
23
#define DIGITAL_CMD_TG_LISTEN_MD 4
24
25
#define DIGITAL_MAX_HEADER_LEN 7
26
#define DIGITAL_CRC_LEN 2
27
28
#define DIGITAL_SENSF_NFCID2_NFC_DEP_B1 0x01
29
#define DIGITAL_SENSF_NFCID2_NFC_DEP_B2 0xFE
30
31
#define DIGITAL_SENS_RES_NFC_DEP 0x0100
32
#define DIGITAL_SEL_RES_NFC_DEP 0x40
33
#define DIGITAL_SENSF_FELICA_SC 0xFFFF
34
35
#define DIGITAL_DRV_CAPS_IN_CRC(ddev) \
36
((ddev)->driver_capabilities & NFC_DIGITAL_DRV_CAPS_IN_CRC)
37
#define DIGITAL_DRV_CAPS_TG_CRC(ddev) \
38
((ddev)->driver_capabilities & NFC_DIGITAL_DRV_CAPS_TG_CRC)
39
40
struct digital_data_exch {
41
data_exchange_cb_t cb;
42
void *cb_context;
43
};
44
45
struct sk_buff *digital_skb_alloc(struct nfc_digital_dev *ddev,
46
unsigned int len);
47
48
int digital_send_cmd(struct nfc_digital_dev *ddev, u8 cmd_type,
49
struct sk_buff *skb, struct digital_tg_mdaa_params *params,
50
u16 timeout, nfc_digital_cmd_complete_t cmd_cb,
51
void *cb_context);
52
53
int digital_in_configure_hw(struct nfc_digital_dev *ddev, int type, int param);
54
static inline int digital_in_send_cmd(struct nfc_digital_dev *ddev,
55
struct sk_buff *skb, u16 timeout,
56
nfc_digital_cmd_complete_t cmd_cb,
57
void *cb_context)
58
{
59
return digital_send_cmd(ddev, DIGITAL_CMD_IN_SEND, skb, NULL, timeout,
60
cmd_cb, cb_context);
61
}
62
63
void digital_poll_next_tech(struct nfc_digital_dev *ddev);
64
65
int digital_in_send_sens_req(struct nfc_digital_dev *ddev, u8 rf_tech);
66
int digital_in_send_sensb_req(struct nfc_digital_dev *ddev, u8 rf_tech);
67
int digital_in_send_sensf_req(struct nfc_digital_dev *ddev, u8 rf_tech);
68
int digital_in_send_iso15693_inv_req(struct nfc_digital_dev *ddev, u8 rf_tech);
69
70
int digital_in_iso_dep_pull_sod(struct nfc_digital_dev *ddev,
71
struct sk_buff *skb);
72
int digital_in_iso_dep_push_sod(struct nfc_digital_dev *ddev,
73
struct sk_buff *skb);
74
75
int digital_target_found(struct nfc_digital_dev *ddev,
76
struct nfc_target *target, u8 protocol);
77
78
int digital_in_recv_mifare_res(struct sk_buff *resp);
79
80
int digital_in_send_atr_req(struct nfc_digital_dev *ddev,
81
struct nfc_target *target, __u8 comm_mode, __u8 *gb,
82
size_t gb_len);
83
int digital_in_send_dep_req(struct nfc_digital_dev *ddev,
84
struct nfc_target *target, struct sk_buff *skb,
85
struct digital_data_exch *data_exch);
86
87
int digital_tg_configure_hw(struct nfc_digital_dev *ddev, int type, int param);
88
static inline int digital_tg_send_cmd(struct nfc_digital_dev *ddev,
89
struct sk_buff *skb, u16 timeout,
90
nfc_digital_cmd_complete_t cmd_cb, void *cb_context)
91
{
92
return digital_send_cmd(ddev, DIGITAL_CMD_TG_SEND, skb, NULL, timeout,
93
cmd_cb, cb_context);
94
}
95
96
void digital_tg_recv_sens_req(struct nfc_digital_dev *ddev, void *arg,
97
struct sk_buff *resp);
98
99
void digital_tg_recv_sensf_req(struct nfc_digital_dev *ddev, void *arg,
100
struct sk_buff *resp);
101
102
static inline int digital_tg_listen(struct nfc_digital_dev *ddev, u16 timeout,
103
nfc_digital_cmd_complete_t cb, void *arg)
104
{
105
return digital_send_cmd(ddev, DIGITAL_CMD_TG_LISTEN, NULL, NULL,
106
timeout, cb, arg);
107
}
108
109
void digital_tg_recv_atr_req(struct nfc_digital_dev *ddev, void *arg,
110
struct sk_buff *resp);
111
112
int digital_tg_send_dep_res(struct nfc_digital_dev *ddev, struct sk_buff *skb);
113
114
int digital_tg_listen_nfca(struct nfc_digital_dev *ddev, u8 rf_tech);
115
int digital_tg_listen_nfcf(struct nfc_digital_dev *ddev, u8 rf_tech);
116
void digital_tg_recv_md_req(struct nfc_digital_dev *ddev, void *arg,
117
struct sk_buff *resp);
118
119
typedef u16 (*crc_func_t)(u16, const u8 *, size_t);
120
121
#define CRC_A_INIT 0x6363
122
#define CRC_B_INIT 0xFFFF
123
#define CRC_F_INIT 0x0000
124
125
void digital_skb_add_crc(struct sk_buff *skb, crc_func_t crc_func, u16 init,
126
u8 bitwise_inv, u8 msb_first);
127
128
static inline void digital_skb_add_crc_a(struct sk_buff *skb)
129
{
130
digital_skb_add_crc(skb, crc_ccitt, CRC_A_INIT, 0, 0);
131
}
132
133
static inline void digital_skb_add_crc_b(struct sk_buff *skb)
134
{
135
digital_skb_add_crc(skb, crc_ccitt, CRC_B_INIT, 1, 0);
136
}
137
138
static inline void digital_skb_add_crc_f(struct sk_buff *skb)
139
{
140
digital_skb_add_crc(skb, crc_itu_t, CRC_F_INIT, 0, 1);
141
}
142
143
static inline void digital_skb_add_crc_none(struct sk_buff *skb)
144
{
145
return;
146
}
147
148
int digital_skb_check_crc(struct sk_buff *skb, crc_func_t crc_func,
149
u16 crc_init, u8 bitwise_inv, u8 msb_first);
150
151
static inline int digital_skb_check_crc_a(struct sk_buff *skb)
152
{
153
return digital_skb_check_crc(skb, crc_ccitt, CRC_A_INIT, 0, 0);
154
}
155
156
static inline int digital_skb_check_crc_b(struct sk_buff *skb)
157
{
158
return digital_skb_check_crc(skb, crc_ccitt, CRC_B_INIT, 1, 0);
159
}
160
161
static inline int digital_skb_check_crc_f(struct sk_buff *skb)
162
{
163
return digital_skb_check_crc(skb, crc_itu_t, CRC_F_INIT, 0, 1);
164
}
165
166
static inline int digital_skb_check_crc_none(struct sk_buff *skb)
167
{
168
return 0;
169
}
170
171
#endif /* __DIGITAL_H */
172
173