apply FSL(Flora Software License)
[framework/connectivity/nfc-manager.git] / src / clientlib / net_nfc_client_tag_jewel.c
1 /*\r
2   * Copyright 2012  Samsung Electronics Co., Ltd\r
3   *\r
4   * Licensed under the Flora License, Version 1.0 (the "License");\r
5   * you may not use this file except in compliance with the License.\r
6   * You may obtain a copy of the License at\r
7 \r
8   *     http://www.tizenopensource.org/license\r
9   *\r
10   * Unless required by applicable law or agreed to in writing, software\r
11   * distributed under the License is distributed on an "AS IS" BASIS,\r
12   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\r
13   * See the License for the specific language governing permissions and\r
14   * limitations under the License.\r
15   */\r
16 \r
17 #include "net_nfc_tag.h"\r
18 #include "net_nfc_typedef_private.h"\r
19 #include "net_nfc_client_ipc_private.h"\r
20 #include "net_nfc_debug_private.h"\r
21 #include "net_nfc_util_private.h"\r
22 #include "net_nfc_client_nfc_private.h"\r
23 #include "net_nfc_tag_jewel.h"\r
24 #include "net_nfc_target_info.h"\r
25 \r
26 #include <string.h>\r
27 \r
28 #ifndef NET_NFC_EXPORT_API\r
29 #define NET_NFC_EXPORT_API __attribute__((visibility("default")))\r
30 #endif\r
31 \r
32 \r
33 \r
34 #define JEWEL_CMD_REQA 0x26\r
35 #define JEWEL_CMD_WUPA 0x52\r
36 #define JEWEL_CMD_RID 0x78\r
37 #define JEWEL_CMD_RALL 0x00\r
38 #define JEWEL_CMD_READ 0x01\r
39 #define JEWEL_CMD_WRITE_E 0x53\r
40 #define JEWEL_CMD_WRITE_NE 0x1A\r
41 #define JEWEL_TAG_KEY   "UID"\r
42 \r
43 NET_NFC_EXPORT_API net_nfc_error_e net_nfc_jewel_read_id (net_nfc_target_handle_h handle, void* trans_param)\r
44 {\r
45         if(handle == NULL)\r
46                 return NET_NFC_NULL_PARAMETER;\r
47 \r
48         if(!net_nfc_tag_is_connected()){\r
49                 return NET_NFC_OPERATION_FAIL;\r
50         }\r
51 \r
52         client_context_t* client_context_tmp = net_nfc_get_client_context();\r
53         net_nfc_target_info_s* target_info = NULL;\r
54 \r
55         if((target_info = client_context_tmp->target_info) == NULL){\r
56                 return NET_NFC_NO_DATA_FOUND;\r
57         }\r
58 \r
59         if(target_info->devType != NET_NFC_JEWEL_PICC){\r
60                 DEBUG_CLIENT_MSG("only Jewel tag is available");\r
61                 return NET_NFC_NOT_ALLOWED_OPERATION;\r
62         }\r
63 \r
64         uint8_t send_buffer[9] = {0x00, };\r
65         send_buffer[0] = JEWEL_CMD_RID;\r
66 \r
67         net_nfc_util_compute_CRC(CRC_B, send_buffer, 9);\r
68 \r
69         DEBUG_MSG_PRINT_BUFFER(send_buffer, 9);\r
70 \r
71         data_s rawdata;\r
72 \r
73         rawdata.buffer = send_buffer;\r
74         rawdata.length = 9;\r
75 \r
76         return net_nfc_transceive(handle, (data_h)&rawdata, trans_param);\r
77 \r
78 \r
79 }\r
80 \r
81 NET_NFC_EXPORT_API net_nfc_error_e net_nfc_jewel_read_byte (net_nfc_target_handle_h handle,  uint8_t block, uint8_t byte, void* trans_param)\r
82 {\r
83         if(handle == NULL)\r
84                 return NET_NFC_NULL_PARAMETER;\r
85 \r
86         if(block > 0xE || byte > 0x7 ){\r
87 \r
88                 return NET_NFC_OUT_OF_BOUND;\r
89         }\r
90 \r
91         if(!net_nfc_tag_is_connected()){\r
92                 return NET_NFC_OPERATION_FAIL;\r
93         }\r
94 \r
95         client_context_t* client_context_tmp = net_nfc_get_client_context();\r
96         net_nfc_target_info_s* target_info = NULL;\r
97 \r
98         if((target_info = client_context_tmp->target_info) == NULL){\r
99                 return NET_NFC_NO_DATA_FOUND;\r
100         }\r
101 \r
102         if(target_info->devType != NET_NFC_JEWEL_PICC){\r
103                 DEBUG_CLIENT_MSG("only Jewel tag is available");\r
104                 return NET_NFC_NOT_ALLOWED_OPERATION;\r
105         }\r
106 \r
107         data_h UID = NULL;\r
108 \r
109         if(net_nfc_get_tag_info_value((net_nfc_target_info_h)target_info, JEWEL_TAG_KEY, &UID) != NET_NFC_OK){\r
110                 return NET_NFC_NO_DATA_FOUND;\r
111         }\r
112 \r
113 \r
114         if(((data_s*)UID)->length != 4){\r
115 \r
116                 return NET_NFC_OUT_OF_BOUND;\r
117         }\r
118 \r
119         uint8_t send_buffer[9] = {0x00, };\r
120 \r
121         /* command */\r
122         send_buffer[0] = JEWEL_CMD_READ;\r
123 \r
124         /* addr */\r
125         send_buffer[1] = (((block << 3) & 0x78) | (byte & 0x7));\r
126 \r
127         /* data */\r
128         send_buffer[2] = 0x00;\r
129 \r
130         /* UID0 ~ 3 */\r
131         memcpy(&(send_buffer[3]), ((data_s*)UID)->buffer, ((data_s*)UID)->length);\r
132 \r
133         net_nfc_util_compute_CRC(CRC_B, send_buffer, 9);\r
134 \r
135         DEBUG_MSG_PRINT_BUFFER(send_buffer, 9);\r
136 \r
137         data_s rawdata;\r
138 \r
139         rawdata.buffer = send_buffer;\r
140         rawdata.length = 9;\r
141 \r
142         return net_nfc_transceive(handle, (data_h)&rawdata, trans_param);\r
143 }\r
144 \r
145 NET_NFC_EXPORT_API net_nfc_error_e net_nfc_jewel_read_all (net_nfc_target_handle_h handle, void* trans_param)\r
146 {\r
147         if(handle == NULL )\r
148                 return NET_NFC_NULL_PARAMETER;\r
149 \r
150         if(!net_nfc_tag_is_connected()){\r
151                 return NET_NFC_OPERATION_FAIL;\r
152         }\r
153 \r
154         client_context_t* client_context_tmp = net_nfc_get_client_context();\r
155         net_nfc_target_info_s* target_info = NULL;\r
156 \r
157         if((target_info = client_context_tmp->target_info) == NULL){\r
158                 return NET_NFC_NO_DATA_FOUND;\r
159         }\r
160 \r
161         if(target_info->devType != NET_NFC_JEWEL_PICC){\r
162                 DEBUG_CLIENT_MSG("only Jewel tag is available");\r
163                 return NET_NFC_NOT_ALLOWED_OPERATION;\r
164         }\r
165 \r
166         data_h UID = NULL;\r
167 \r
168         if(net_nfc_get_tag_info_value((net_nfc_target_info_h)target_info, JEWEL_TAG_KEY, &UID) != NET_NFC_OK){\r
169                 return NET_NFC_NO_DATA_FOUND;\r
170         }\r
171 \r
172         if(((data_s*)UID)->length != 4){\r
173 \r
174                 return NET_NFC_OUT_OF_BOUND;\r
175         }\r
176 \r
177         uint8_t send_buffer[9] = {0x00, };\r
178 \r
179         /* command */\r
180         send_buffer[0] = JEWEL_CMD_RALL;\r
181 \r
182         /* addr */\r
183         send_buffer[1] = 0x00;\r
184 \r
185         /* data */\r
186         send_buffer[2] = 0x00;\r
187 \r
188         /* UID0 ~ 3 */\r
189         memcpy(&(send_buffer[3]), ((data_s*)UID)->buffer, ((data_s*)UID)->length);\r
190 \r
191         net_nfc_util_compute_CRC(CRC_B, send_buffer, 9);\r
192 \r
193         DEBUG_MSG_PRINT_BUFFER(send_buffer, 9);\r
194 \r
195 \r
196         data_s rawdata;\r
197 \r
198         rawdata.buffer = send_buffer;\r
199         rawdata.length = 9;\r
200 \r
201         return net_nfc_transceive(handle, (data_h)&rawdata, trans_param);\r
202 \r
203 \r
204 }\r
205 \r
206 NET_NFC_EXPORT_API net_nfc_error_e net_nfc_jewel_write_with_erase (net_nfc_target_handle_h handle, uint8_t block, uint8_t byte, uint8_t data, void* trans_param)\r
207 {\r
208         if(handle == NULL)\r
209                 return NET_NFC_NULL_PARAMETER;\r
210 \r
211 \r
212         if(block > 0xE || byte > 0x7 ){\r
213 \r
214                 return NET_NFC_OUT_OF_BOUND;\r
215         }\r
216 \r
217         if(!net_nfc_tag_is_connected()){\r
218                 return NET_NFC_OPERATION_FAIL;\r
219         }\r
220 \r
221         client_context_t* client_context_tmp = net_nfc_get_client_context();\r
222         net_nfc_target_info_s* target_info = NULL;\r
223 \r
224         if((target_info = client_context_tmp->target_info) == NULL){\r
225                 return NET_NFC_NO_DATA_FOUND;\r
226         }\r
227 \r
228         if((target_info = client_context_tmp->target_info) == NULL){\r
229                 return NET_NFC_NO_DATA_FOUND;\r
230         }\r
231 \r
232         data_h UID = NULL;\r
233 \r
234         if(net_nfc_get_tag_info_value((net_nfc_target_info_h)target_info, JEWEL_TAG_KEY, &UID) != NET_NFC_OK){\r
235                 return NET_NFC_NO_DATA_FOUND;\r
236         }\r
237 \r
238         if(((data_s*)UID)->length != 4){\r
239 \r
240                 return NET_NFC_OUT_OF_BOUND;\r
241         }\r
242 \r
243 \r
244         uint8_t send_buffer[9] = {0x00, };\r
245 \r
246         /* command */\r
247         send_buffer[0] = JEWEL_CMD_WRITE_E;\r
248 \r
249         /* addr */\r
250         send_buffer[1] = (((block << 3) & 0x78) | (byte & 0x7));\r
251 \r
252         /* data */\r
253         send_buffer[2] = data;\r
254 \r
255         /* UID0 ~ 3 */\r
256         memcpy(&(send_buffer[3]), ((data_s*)UID)->buffer, ((data_s*)UID)->length);\r
257 \r
258         net_nfc_util_compute_CRC(CRC_B, send_buffer, 9);\r
259 \r
260         DEBUG_MSG_PRINT_BUFFER(send_buffer, 9);\r
261 \r
262         data_s rawdata;\r
263 \r
264         rawdata.buffer = send_buffer;\r
265         rawdata.length = 9;\r
266 \r
267         return net_nfc_transceive(handle, (data_h)&rawdata, trans_param);\r
268 \r
269 }\r
270 \r
271 NET_NFC_EXPORT_API net_nfc_error_e net_nfc_jewel_write_with_no_erase (net_nfc_target_handle_h handle, uint8_t block, uint8_t byte, uint8_t data, void* trans_param)\r
272 {\r
273         if(handle == NULL)\r
274                 return NET_NFC_NULL_PARAMETER;\r
275 \r
276         if(block > 0xE || byte > 0x7 ){\r
277 \r
278                 return NET_NFC_OUT_OF_BOUND;\r
279         }\r
280 \r
281         if(!net_nfc_tag_is_connected()){\r
282                 return NET_NFC_OPERATION_FAIL;\r
283         }\r
284 \r
285         client_context_t* client_context_tmp = net_nfc_get_client_context();\r
286         net_nfc_target_info_s* target_info = NULL;\r
287 \r
288         if((target_info = client_context_tmp->target_info) == NULL){\r
289                 return NET_NFC_NO_DATA_FOUND;\r
290         }\r
291 \r
292         if(target_info->devType != NET_NFC_JEWEL_PICC){\r
293                 DEBUG_CLIENT_MSG("only Jewel tag is available");\r
294                 return NET_NFC_NOT_ALLOWED_OPERATION;\r
295         }\r
296 \r
297         data_h UID = NULL;\r
298 \r
299         if(net_nfc_get_tag_info_value((net_nfc_target_info_h)target_info, JEWEL_TAG_KEY, &UID) != NET_NFC_OK){\r
300                 return NET_NFC_NO_DATA_FOUND;\r
301         }\r
302 \r
303         if(((data_s*)UID)->length != 4){\r
304 \r
305                 return NET_NFC_OUT_OF_BOUND;\r
306         }\r
307 \r
308         uint8_t send_buffer[9] = {0x00, };\r
309 \r
310         /* command */\r
311         send_buffer[0] = JEWEL_CMD_WRITE_NE;\r
312 \r
313         /* addr */\r
314         send_buffer[1] = (((block << 3) & 0x78) | (byte & 0x7));\r
315 \r
316         /* data */\r
317         send_buffer[2] = data;\r
318 \r
319         /* UID0 ~ 3 */\r
320         memcpy(&(send_buffer[3]), ((data_s*)UID)->buffer, ((data_s*)UID)->length);\r
321 \r
322         net_nfc_util_compute_CRC(CRC_B, send_buffer, 9);\r
323 \r
324         DEBUG_MSG_PRINT_BUFFER(send_buffer, 9);\r
325 \r
326         data_s rawdata;\r
327 \r
328         rawdata.buffer = send_buffer;\r
329         rawdata.length = 9;\r
330 \r
331         return net_nfc_transceive(handle, (data_h)&rawdata, trans_param);\r
332 }\r
333 \r