1/* 2 * Copyright (C) 2010 NXP Semiconductors 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17/*! 18* =========================================================================== * 19* * 20* * 21* \file phHciNfc.h * 22* \brief HCI Header for the Generic HCI Management. * 23* * 24* * 25* Project: NFC-FRI-1.1 * 26* * 27* $Date: Mon Apr 5 14:37:06 2010 $ * 28* $Author: ing04880 $ * 29* $Revision: 1.39 $ * 30* $Aliases: NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $ 31* * 32* =========================================================================== * 33*/ 34 35 36/*@{*/ 37 38#ifndef PHHCINFC_H 39#define PHHCINFC_H 40 41/*@}*/ 42/** 43 * \name HCI 44 * 45 * File: \ref phHciNfc.h 46 * 47 */ 48/*@{*/ 49#define PH_HCINFC_FILEREVISION "$Revision: 1.39 $" /**< \ingroup grp_file_attributes */ 50#define PH_HCINFC_FILEALIASES "$Aliases: NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $" /**< \ingroup grp_file_attributes */ 51/*@}*/ 52 53/* 54################################################################################ 55***************************** Header File Inclusion **************************** 56################################################################################ 57*/ 58 59#include <phNfcStatus.h> 60#include <phNfcInterface.h> 61#ifdef ANDROID 62#include <string.h> 63#endif 64 65/* 66################################################################################ 67****************************** Macro Definitions ******************************* 68################################################################################ 69*/ 70 71 72/* 73################################################################################ 74******************** Enumeration and Structure Definition ********************** 75################################################################################ 76*/ 77 78typedef enum phHciNfc_Init 79{ 80 HCI_SESSION = 0x00, 81 HCI_NFC_DEVICE_TEST, 82 HCI_CUSTOM_INIT, 83 HCI_SELF_TEST 84}phHciNfc_Init_t; 85 86/** \ingroup grp_hal_hci 87 * 88 * \if hal 89 * \brief HCI Tag Exchange Information 90 * \else 91 * \brief HCI-Specific 92 * \endif 93 * 94 * The <em> Tag Exchange Info Structure </em> holds the exchange information to 95 * the connected tag . 96 * 97 * \note All members of this structure are in parameters [in]. 98 * 99 */ 100 101typedef struct phHciNfc_Tag_XchgInfo 102{ 103 /** \internal RF Reader Command Type */ 104 uint8_t cmd_type; 105 /** \internal Address Field required for only Mifare 106 * Family Proprietary Cards. 107 * The Address Size is Valid only upto 255 Blocks limit 108 * i:e for Mifare 4K 109 */ 110 uint8_t addr; 111}phHciNfc_Tag_XchgInfo_t; 112 113/** \ingroup grp_hal_hci 114 * 115 * \if hal 116 * \brief HCI NFC-IP Exchange Information 117 * \else 118 * \brief HCI-Specific 119 * \endif 120 * 121 * The <em> NFC-IP Exchange Info Structure </em> holds the exchange information to 122 * the connected NFC-IP target . 123 * 124 * \note All members of this structure are in parameters [in]. 125 * 126 */ 127 128typedef struct phHciNfc_NfcIP_XchgInfo 129{ 130 /** \internal NFC-IP DEP Meta Chining Information */ 131 uint8_t more_info; 132 133}phHciNfc_NfcIP_XchgInfo_t; 134 135/** \ingroup grp_hal_hci 136 * 137 * \if hal 138 * \brief HCI Target Exchange Information 139 * \else 140 * \brief HCI-Specific 141 * \endif 142 * 143 * The <em> Target Exchange Info Structure </em> holds all the exchange information to 144 * the connected target . 145 * 146 * \note All members of this structure are in parameters [in]. 147 * 148 */ 149 150 151typedef struct phHciNfc_XchgInfo 152{ 153 /** \internal Exchange Data/NFC-IP DEP 154 * Exchange Buffer */ 155 uint8_t *tx_buffer; 156 /** \internal Exchange Data/NFC-IP DEP 157 * Exchange Buffer Length*/ 158 uint16_t tx_length; 159 160 union 161 { 162 phHciNfc_Tag_XchgInfo_t tag_info; 163 phHciNfc_NfcIP_XchgInfo_t nfc_info; 164 }params; 165 166}phHciNfc_XchgInfo_t; 167 168 169 170/* 171################################################################################ 172*********************** Function Prototype Declaration ************************* 173################################################################################ 174*/ 175 176/** 177 * \ingroup grp_hci_nfc 178 * 179 * The phHciNfc_Initialise function initialises the HCI context and all other 180 * resources used in the HCI Layer for the corresponding interface link. 181 * 182 * \param[in,out] psHciHandle psHciHandle is the handle or the context 183 * of the HCI Layer. 184 * \param[in] pHwRef pHwRef is the Information of 185 * the Device Interface Link . 186 * \param[in] init_mode init_mode specifies the kind of the 187 * Initialisation for the HCI layer . 188 * \param[in] pHwConfig pHwConfig is the Information required 189 * to configure the parameters of the 190 * NFC Device . 191 * \param[in] pHalNotify Upper layer Notification function 192 * pointer. 193 * \param[in] psContext psContext is the context of 194 * the Upper Layer. 195 * \param[in] psHciLayerCfg Pointer to the HCI Layer configuration 196 * Structure. 197 * 198 * \retval NFCSTATUS_PENDING Initialisation of HCI Layer is in Progress. 199 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 200 * could not be interpreted properly. 201 * \retval Other errors Errors related to the other layers 202 * 203 */ 204 205 extern 206 NFCSTATUS 207 phHciNfc_Initialise ( 208 void *psHciHandle, 209 void *pHwRef, 210 phHciNfc_Init_t init_mode, 211 phHal_sHwConfig_t *pHwConfig, 212 pphNfcIF_Notification_CB_t pHalNotify, 213 void *psContext, 214 phNfcLayer_sCfg_t *psHciLayerCfg 215 ); 216 217/** 218 * \ingroup grp_hci_nfc 219 * 220 * The phHciNfc_Release function releases all the resources used in the HCI 221 * Layer for the corresponding interface link, described by the HCI handle. 222 * 223 * \param[in] psHciHandle psHciHandle is the handle or the context 224 * of the HCI Layer. 225 * \param[in] pHwRef pHwRef is the Information of 226 * the Device Interface Link . 227 * \param[in] pHalReleaseCB Upper layer release callback function 228 * pointer . 229 * \param[in] psContext psContext is the context of 230 * the Upper Layer. 231 * 232 * \retval NFCSTATUS_PENDING Releasing of HCI Resources are in Progress. 233 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 234 * could not be interpreted properly. 235 * \retval Other errors Errors related to the other layers 236 * 237 */ 238 239 extern 240 NFCSTATUS 241 phHciNfc_Release ( 242 void *psHciHandle, 243 void *pHwRef, 244 pphNfcIF_Notification_CB_t pHalReleaseCB, 245 void *psContext 246 ); 247 248 249extern 250NFCSTATUS 251phHciNfc_Config_Discovery ( 252 void *psHciHandle, 253 void *pHwRef, 254 phHal_sADD_Cfg_t *pPollConfig 255 ); 256 257 258/** 259 * \ingroup grp_hci_nfc 260 * 261 * The phHciNfc_Restart_Discovery function restarts the Polling Wheel. 262 * 263 * \param[in] psHciHandle psHciHandle is the handle or the context 264 * of the HCI Layer. 265 * \param[in] pHwRef pHwRef is the Information of 266 * the Device Interface Link . 267 * \param[in] discovery_type If True: Start re-polling of the target 268 * after the Target Device is de-activated 269 * or else - continue discovery with next 270 * technology. 271 * \retval NFCSTATUS_PENDING The Discovery Wheel retarted. 272 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 273 * could not be interpreted properly. 274 * \retval Other errors Errors related to the other layers 275 * 276 */ 277 278 extern 279 NFCSTATUS 280 phHciNfc_Restart_Discovery ( 281 void *psHciHandle, 282 void *pHwRef, 283 uint8_t discovery_type 284 ); 285 286 287 /** 288 * \ingroup grp_hci_nfc 289 * 290 * The phHciNfc_Start_Discovery function Starts the Polling Wheel. 291 * 292 * \param[in] psHciHandle psHciHandle is the handle or the context 293 * of the HCI Layer. 294 * \param[in] pHwRef pHwRef is the Information of 295 * the Device Interface Link . 296 * \retval NFCSTATUS_PENDING The Discovery Wheel Started. 297 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 298 * could not be interpreted properly. 299 * \retval Other errors Errors related to the other layers 300 * 301 */ 302 303 extern 304 NFCSTATUS 305 phHciNfc_Start_Discovery ( 306 void *psHciHandle, 307 void *pHwRef 308 ); 309 310 311 /** 312 * \ingroup grp_hci_nfc 313 * 314 * The phHciNfc_Stop_Discovery function Stops the Polling Wheel. 315 * 316 * \param[in] psHciHandle psHciHandle is the handle or the context 317 * of the HCI Layer. 318 * \param[in] pHwRef pHwRef is the Information of 319 * the Device Interface Link . 320 * \retval NFCSTATUS_PENDING The Discovery Wheel Stopped. 321 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 322 * could not be interpreted properly. 323 * \retval Other errors Errors related to the other layers 324 * 325 */ 326 327 extern 328 NFCSTATUS 329 phHciNfc_Stop_Discovery ( 330 void *psHciHandle, 331 void *pHwRef 332 ); 333 334 335 /** 336 * \ingroup grp_hci_nfc 337 * 338 * The phHciNfc_Configure function Configures Configures the Polling Wheel to 339 * select the kind of Tags to be polled. This also allows to enable/disable 340 * the Tag Emulation. This also configures the Secure elements the UICC, WI and 341 * Target to Emulate the Tag or Target. 342 * 343 * 344 * \param[in] psHciHandle psHciHandle is the handle or the context 345 * of the HCI Layer. 346 * \param[in] pHwRef pHwRef is the Information of 347 * the Device Interface Link . 348 * \param[in] config_type config_type specifies the type of the 349 * Parameter configuration. 350 * \param[in] pConfig pConfig is the Information for 351 * Configuring the Device. 352 * \retval NFCSTATUS_PENDING The Emulation configuration pending. 353 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 354 * could not be interpreted properly. 355 * \retval Other errors Errors related to the other layers 356 * 357 */ 358 359 extern 360 NFCSTATUS 361 phHciNfc_Configure ( 362 void *psHciHandle, 363 void *pHwRef, 364 phHal_eConfigType_t config_type, 365 phHal_uConfig_t *pConfig 366 ); 367 368 /** 369 * \ingroup grp_hci_nfc 370 * 371 * The phHciNfc_Switch_SmxMode function Switches the WI(S2C) interface 372 * from Wired/Virtual to vice versa. 373 * 374 * 375 * \param[in] psHciHandle psHciHandle is the handle or the context 376 * of the HCI Layer. 377 * \param[in] pHwRef pHwRef is the Information of 378 * the Device Interface Link . 379 * \param[in] smx_mode smx_mode specifies the type of the switch 380 * configuration. 381 * \param[in] pPollConfig pPollConfig is the Information for 382 * polling the SmartMX Device. 383 * \retval NFCSTATUS_PENDING The SmartMX Mode Switch pending. 384 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 385 * could not be interpreted properly. 386 * \retval Other errors Errors related to the other layers 387 * 388 */ 389 390 NFCSTATUS 391 phHciNfc_Switch_SmxMode ( 392 void *psHciHandle, 393 void *pHwRef, 394 phHal_eSmartMX_Mode_t smx_mode, 395 phHal_sADD_Cfg_t *pPollConfig 396 ); 397 398 399 /** 400 * \ingroup grp_hci_nfc 401 * 402 * The phHciNfc_Switch_SwpMode function Switches the SWP Link 403 * from On/Off to vice versa. 404 * 405 * 406 * \param[in] psHciHandle psHciHandle is the handle or the context 407 * of the HCI Layer. 408 * \param[in] pHwRef pHwRef is the Information of 409 * the Device Interface Link . 410 * \param[in] swp_mode swp_mode specifies to switch on/off the 411 * SWP Link. 412 * \retval NFCSTATUS_PENDING The SWP Mode Switch pending. 413 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 414 * could not be interpreted properly. 415 * \retval Other errors Errors related to the other layers 416 * 417 */ 418 419 NFCSTATUS 420 phHciNfc_Switch_SwpMode ( 421 void *psHciHandle, 422 void *pHwRef, 423 phHal_eSWP_Mode_t swp_mode /* , 424 void *pSwpCfg */ 425 ); 426 427 428 429/** 430 * \ingroup grp_hci_nfc 431 * 432 * The phHciNfc_Connect function selects the discovered target to 433 * perform the transactions on it. 434 * 435 * 436 * \param[in] psHciHandle psHciHandle is the handle or the context 437 * of the HCI Layer. 438 * \param[in] pHwRef pHwRef is the Information of 439 * the Device Interface Link . 440 * \param[in] p_remote_dev_info p_remote_dev_info is the information 441 * of the Target Device to be connected . 442 * \retval NFCSTATUS_PENDING To select the remote target pending. 443 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 444 * could not be interpreted properly. 445 * \retval Other errors Errors related to the other layers 446 * 447 */ 448 449 extern 450 NFCSTATUS 451 phHciNfc_Connect ( 452 void *psHciHandle, 453 void *pHwRef, 454 phHal_sRemoteDevInformation_t *p_remote_dev_info 455 ); 456 457 458/** 459 * \ingroup grp_hci_nfc 460 * 461 * The phHciNfc_Reactiavte function reactivates the discovered target to 462 * and selects that target perform the transactions on it. 463 * 464 * 465 * \param[in] psHciHandle psHciHandle is the handle or the context 466 * of the HCI Layer. 467 * \param[in] pHwRef pHwRef is the Information of 468 * the Device Interface Link . 469 * \param[in] p_remote_dev_info p_remote_dev_info is the information 470 * of the Target Device to be reactivated . 471 * \retval NFCSTATUS_PENDING To reactivate the remote target pending. 472 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 473 * could not be interpreted properly. 474 * \retval Other errors Errors related to the other layers 475 * 476 */ 477 478 479 extern 480 NFCSTATUS 481 phHciNfc_Reactivate ( 482 void *psHciHandle, 483 void *pHwRef, 484 phHal_sRemoteDevInformation_t *p_target_info 485 ); 486 487 488/** 489 * \ingroup grp_hci_nfc 490 * 491 * The phHciNfc_Disconnect function de-selects the selected target and 492 * any ongoing transactions . 493 * 494 * 495 * \param[in] psHciHandle psHciHandle is the handle or the context 496 * of the HCI Layer. 497 * \param[in] pHwRef pHwRef is the Information of 498 * the Device Interface Link . 499 * \param[in] discovery_type If NFC_RF_DISCOVERY_REPOLL: Start re-polling of 500 * the target after the Target Device is 501 * de-activatedor if NFC_RF_DISCOVERY_CONTINUE - 502 * continue discovery with next technology or 503 * stop the discovery wheel. 504 * 505 * \retval NFCSTATUS_PENDING To De-select the remote target pending. 506 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 507 * could not be interpreted properly. 508 * \retval Other errors Errors related to the other layers 509 * 510 */ 511 512 extern 513 NFCSTATUS 514 phHciNfc_Disconnect ( 515 void *psHciHandle, 516 void *pHwRef, 517 uint8_t discovery_type 518 ); 519 520 521/** 522 * \ingroup grp_hci_nfc 523 * 524 * The phHciNfc_Presence_Check function checks for the presence of the target 525 * selected in the vicinity of the Reader's RF Field . 526 * 527 * 528 * \param[in] psHciHandle psHciHandle is the handle or the context 529 * of the HCI Layer. 530 * \param[in] pHwRef pHwRef is the Information of 531 * the Device Interface Link . 532 * \retval NFCSTATUS_PENDING Presence Check of the remote target 533 * pending. 534 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 535 * could not be interpreted properly. 536 * \retval Other errors Errors related to the other layers 537 * 538 */ 539 540extern 541NFCSTATUS 542phHciNfc_Presence_Check ( 543 void *psHciHandle, 544 void *pHwRef 545 ); 546 547 548/** 549 * \ingroup grp_hci_nfc 550 * 551 * The phHciNfc_Select_Next_Target function selects and activates the 552 * next target present in the the Reader's RF Field . 553 * 554 * 555 * \param[in] psHciHandle psHciHandle is the handle or the 556 * context of the HCI Layer. 557 * \param[in] pHwRef pHwRef is the Information of 558 * the Device Interface Link . 559 * \retval NFCSTATUS_PENDING selection and activation of the next 560 * remote target pending. 561 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 562 * could not be interpreted properly. 563 * \retval Other errors Errors related to the other layers 564 * 565 */ 566 567extern 568NFCSTATUS 569phHciNfc_Select_Next_Target ( 570 void *psHciHandle, 571 void *pHwRef 572 ); 573 574 575 /** 576 * \ingroup grp_hci_nfc 577 * 578 * The phHciNfc_Exchange_Data function exchanges the data 579 * to/from the selected remote target device. 580 * 581 * 582 * \param[in] psHciHandle psHciHandle is the handle or the context 583 * of the HCI Layer. 584 * \param[in] pHwRef pHwRef is the Information of 585 * the Device Interface Link . 586 * \param[in] p_remote_dev_info p_remote_dev_info is the information of the 587 * selected target to which data 588 * should be sent. 589 * \param[in] p_xchg_info The exchange info contains the command type, 590 * addr and data to be sent to the connected 591 * remote target device. 592 * \retval NFCSTATUS_PENDING Data to remote target pending. 593 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 594 * could not be interpreted properly. 595 * \retval Other errors Errors related to the other layers 596 * 597 */ 598 599 extern 600 NFCSTATUS 601 phHciNfc_Exchange_Data ( 602 void *psHciHandle, 603 void *pHwRef, 604 phHal_sRemoteDevInformation_t *p_remote_dev_info, 605 phHciNfc_XchgInfo_t *p_xchg_info 606 ); 607 608 /** 609 * \ingroup grp_hci_nfc 610 * 611 * The phHciNfc_Send_Data function Sends the data provided 612 * to the appropriate remote target device. 613 * 614 * 615 * \param[in] psHciHandle psHciHandle is the handle or the context 616 * of the HCI Layer. 617 * \param[in] pHwRef pHwRef is the Information of 618 * the Device Interface Link . 619 * \param[in] p_remote_dev_info p_remote_dev_info is the information 620 * of the selected target to which data 621 * should be sent. 622 * \param[in] p_send_param The send param contains the 623 * data to be sent to the 624 * remote device. 625 * \retval NFCSTATUS_PENDING Data to remote device pending. 626 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 627 * could not be interpreted properly. 628 * \retval Other errors Errors related to the other layers 629 * 630 */ 631 632 extern 633 NFCSTATUS 634 phHciNfc_Send_Data ( 635 void *psHciHandle, 636 void *pHwRef, 637 phHal_sRemoteDevInformation_t *p_remote_dev_info, 638 phHciNfc_XchgInfo_t *p_send_param 639 ); 640 641 /** 642 * \ingroup grp_hci_nfc 643 * 644 * The phHciNfc_System_Test function performs the System Management Tests 645 * provided by the NFC Peripheral device. 646 * 647 * \param[in] psContext psContext is the pointer to HCI Layer 648 * context Structure. 649 * \param[in] pHwRef pHwRef is the Information of 650 * the Device Interface Link . 651 * \param[in] test_type test_type is the type of the Self Test 652 * that needs to be performed on the device. 653 * \param[in] test_param test_param is the parameter for the Self Test 654 * that needs to be performed on the device. 655 * 656 * 657 * \retval NFCSTATUS_PENDING System Test on the System Management 658 * is pending. 659 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 660 * could not be interpreted properly. 661 * \retval Other errors Errors related to the other layers 662 * 663 */ 664 665extern 666NFCSTATUS 667phHciNfc_System_Test( 668 void *psContext, 669 void *pHwRef, 670 uint32_t test_type, 671 phNfc_sData_t *test_param 672 ); 673 674 /** 675 * \ingroup grp_hci_nfc 676 * 677 * The phHciNfc_System_Configure function performs the System Management 678 * Configuration with the value provided. 679 * 680 * \param[in] psContext psContext is the pointer to HCI Layer 681 * context Structure. 682 * \param[in] pHwRef pHwRef is the Information of 683 * the Device Interface Link . 684 * \param[in] config_type config_type is the type of the configuration 685 * that needs to be performed on the device. 686 * \param[in] config_value config_value is the value for the configuring 687 * that needs to be performed on the device. 688 * 689 * 690 * \retval NFCSTATUS_PENDING Configuration of the provided information to 691 * the is pending. 692 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 693 * could not be interpreted properly. 694 * \retval Other errors Errors related to the other layers 695 * 696 */ 697extern 698NFCSTATUS 699phHciNfc_System_Configure ( 700 void *psHciHandle, 701 void *pHwRef, 702 uint32_t config_type, 703 uint8_t config_value 704 ); 705 706 /** 707 * \ingroup grp_hci_nfc 708 * 709 * The phHciNfc_System_Get_Info function obtains the System Management 710 * information from the address provided. 711 * 712 * \param[in] psContext psContext is the pointer to HCI Layer 713 * context Structure. 714 * \param[in] pHwRef pHwRef is the Information of 715 * the Device Interface Link . 716 * \param[in] info_type info_type is the type of the Information 717 * that needs to be obtained from the device. 718 * \param[in,out] p_val p_val is the pointer to which the 719 * information need to be updated. 720 * 721 * 722 * \retval NFCSTATUS_PENDING Get information from the NFC Device 723 * is pending. 724 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 725 * could not be interpreted properly. 726 * \retval Other errors Errors related to the other layers 727 * 728 */ 729extern 730NFCSTATUS 731phHciNfc_System_Get_Info( 732 void *psHciHandle, 733 void *pHwRef, 734 uint32_t info_type, 735 uint8_t *p_val 736 ); 737 738extern 739NFCSTATUS 740phHciNfc_PRBS_Test ( 741 void *psHciHandle, 742 void *pHwRef, 743 uint32_t test_type, 744 phNfc_sData_t *test_param 745 ); 746 747#if 0 748 extern 749 NFCSTATUS 750 phHciNfc_Receive_Data ( 751 void *psHciHandle, 752 void *pHwRef, 753 uint8_t *p_data, 754 uint8_t length 755 ); 756 757#endif 758 759 760#endif 761 762