2 * Copyright 2012 Samsung Electronics Co., Ltd
\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
8 * http://www.tizenopensource.org/license
\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
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
28 #ifndef NET_NFC_EXPORT_API
\r
29 #define NET_NFC_EXPORT_API __attribute__((visibility("default")))
\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
43 NET_NFC_EXPORT_API net_nfc_error_e net_nfc_jewel_read_id (net_nfc_target_handle_h handle, void* trans_param)
\r
46 return NET_NFC_NULL_PARAMETER;
\r
48 if(!net_nfc_tag_is_connected()){
\r
49 return NET_NFC_OPERATION_FAIL;
\r
52 client_context_t* client_context_tmp = net_nfc_get_client_context();
\r
53 net_nfc_target_info_s* target_info = NULL;
\r
55 if((target_info = client_context_tmp->target_info) == NULL){
\r
56 return NET_NFC_NO_DATA_FOUND;
\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
64 uint8_t send_buffer[9] = {0x00, };
\r
65 send_buffer[0] = JEWEL_CMD_RID;
\r
67 net_nfc_util_compute_CRC(CRC_B, send_buffer, 9);
\r
69 DEBUG_MSG_PRINT_BUFFER(send_buffer, 9);
\r
73 rawdata.buffer = send_buffer;
\r
76 return net_nfc_transceive(handle, (data_h)&rawdata, trans_param);
\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
84 return NET_NFC_NULL_PARAMETER;
\r
86 if(block > 0xE || byte > 0x7 ){
\r
88 return NET_NFC_OUT_OF_BOUND;
\r
91 if(!net_nfc_tag_is_connected()){
\r
92 return NET_NFC_OPERATION_FAIL;
\r
95 client_context_t* client_context_tmp = net_nfc_get_client_context();
\r
96 net_nfc_target_info_s* target_info = NULL;
\r
98 if((target_info = client_context_tmp->target_info) == NULL){
\r
99 return NET_NFC_NO_DATA_FOUND;
\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
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
114 if(((data_s*)UID)->length != 4){
\r
116 return NET_NFC_OUT_OF_BOUND;
\r
119 uint8_t send_buffer[9] = {0x00, };
\r
122 send_buffer[0] = JEWEL_CMD_READ;
\r
125 send_buffer[1] = (((block << 3) & 0x78) | (byte & 0x7));
\r
128 send_buffer[2] = 0x00;
\r
131 memcpy(&(send_buffer[3]), ((data_s*)UID)->buffer, ((data_s*)UID)->length);
\r
133 net_nfc_util_compute_CRC(CRC_B, send_buffer, 9);
\r
135 DEBUG_MSG_PRINT_BUFFER(send_buffer, 9);
\r
139 rawdata.buffer = send_buffer;
\r
140 rawdata.length = 9;
\r
142 return net_nfc_transceive(handle, (data_h)&rawdata, trans_param);
\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
147 if(handle == NULL )
\r
148 return NET_NFC_NULL_PARAMETER;
\r
150 if(!net_nfc_tag_is_connected()){
\r
151 return NET_NFC_OPERATION_FAIL;
\r
154 client_context_t* client_context_tmp = net_nfc_get_client_context();
\r
155 net_nfc_target_info_s* target_info = NULL;
\r
157 if((target_info = client_context_tmp->target_info) == NULL){
\r
158 return NET_NFC_NO_DATA_FOUND;
\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
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
172 if(((data_s*)UID)->length != 4){
\r
174 return NET_NFC_OUT_OF_BOUND;
\r
177 uint8_t send_buffer[9] = {0x00, };
\r
180 send_buffer[0] = JEWEL_CMD_RALL;
\r
183 send_buffer[1] = 0x00;
\r
186 send_buffer[2] = 0x00;
\r
189 memcpy(&(send_buffer[3]), ((data_s*)UID)->buffer, ((data_s*)UID)->length);
\r
191 net_nfc_util_compute_CRC(CRC_B, send_buffer, 9);
\r
193 DEBUG_MSG_PRINT_BUFFER(send_buffer, 9);
\r
198 rawdata.buffer = send_buffer;
\r
199 rawdata.length = 9;
\r
201 return net_nfc_transceive(handle, (data_h)&rawdata, trans_param);
\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
209 return NET_NFC_NULL_PARAMETER;
\r
212 if(block > 0xE || byte > 0x7 ){
\r
214 return NET_NFC_OUT_OF_BOUND;
\r
217 if(!net_nfc_tag_is_connected()){
\r
218 return NET_NFC_OPERATION_FAIL;
\r
221 client_context_t* client_context_tmp = net_nfc_get_client_context();
\r
222 net_nfc_target_info_s* target_info = NULL;
\r
224 if((target_info = client_context_tmp->target_info) == NULL){
\r
225 return NET_NFC_NO_DATA_FOUND;
\r
228 if((target_info = client_context_tmp->target_info) == NULL){
\r
229 return NET_NFC_NO_DATA_FOUND;
\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
238 if(((data_s*)UID)->length != 4){
\r
240 return NET_NFC_OUT_OF_BOUND;
\r
244 uint8_t send_buffer[9] = {0x00, };
\r
247 send_buffer[0] = JEWEL_CMD_WRITE_E;
\r
250 send_buffer[1] = (((block << 3) & 0x78) | (byte & 0x7));
\r
253 send_buffer[2] = data;
\r
256 memcpy(&(send_buffer[3]), ((data_s*)UID)->buffer, ((data_s*)UID)->length);
\r
258 net_nfc_util_compute_CRC(CRC_B, send_buffer, 9);
\r
260 DEBUG_MSG_PRINT_BUFFER(send_buffer, 9);
\r
264 rawdata.buffer = send_buffer;
\r
265 rawdata.length = 9;
\r
267 return net_nfc_transceive(handle, (data_h)&rawdata, trans_param);
\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
274 return NET_NFC_NULL_PARAMETER;
\r
276 if(block > 0xE || byte > 0x7 ){
\r
278 return NET_NFC_OUT_OF_BOUND;
\r
281 if(!net_nfc_tag_is_connected()){
\r
282 return NET_NFC_OPERATION_FAIL;
\r
285 client_context_t* client_context_tmp = net_nfc_get_client_context();
\r
286 net_nfc_target_info_s* target_info = NULL;
\r
288 if((target_info = client_context_tmp->target_info) == NULL){
\r
289 return NET_NFC_NO_DATA_FOUND;
\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
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
303 if(((data_s*)UID)->length != 4){
\r
305 return NET_NFC_OUT_OF_BOUND;
\r
308 uint8_t send_buffer[9] = {0x00, };
\r
311 send_buffer[0] = JEWEL_CMD_WRITE_NE;
\r
314 send_buffer[1] = (((block << 3) & 0x78) | (byte & 0x7));
\r
317 send_buffer[2] = data;
\r
320 memcpy(&(send_buffer[3]), ((data_s*)UID)->buffer, ((data_s*)UID)->length);
\r
322 net_nfc_util_compute_CRC(CRC_B, send_buffer, 9);
\r
324 DEBUG_MSG_PRINT_BUFFER(send_buffer, 9);
\r
328 rawdata.buffer = send_buffer;
\r
329 rawdata.length = 9;
\r
331 return net_nfc_transceive(handle, (data_h)&rawdata, trans_param);
\r