Nick Pelly | 5d9927b | 2010-09-23 12:47:58 -0700 | [diff] [blame] | 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 | * \file phFriNfc_OvrHal.h |
| 19 | * \brief Overlapped HAL |
| 20 | * |
| 21 | * Project: NFC-FRI |
| 22 | * Creator: Gerald Kersch |
| 23 | * |
| 24 | * $Date: Tue May 19 10:30:18 2009 $ |
| 25 | * Changed by: $Author: ing07336 $ |
| 26 | * $Revision: 1.13 $ |
| 27 | * $Aliases: NFC_FRI1.1_WK922_PREP1,NFC_FRI1.1_WK920_R25_1,NFC_FRI1.1_WK922_R26_1,NFC_FRI1.1_WK924_PREP1,NFC_FRI1.1_WK924_R27_1,NFC_FRI1.1_WK926_R28_1,NFC_FRI1.1_WK928_R29_1,NFC_FRI1.1_WK930_R30_1,NFC_FRI1.1_WK934_PREP_1,NFC_FRI1.1_WK934_R31_1,NFC_FRI1.1_WK941_PREP1,NFC_FRI1.1_WK941_PREP2,NFC_FRI1.1_WK941_1,NFC_FRI1.1_WK943_R32_1,NFC_FRI1.1_WK949_PREP1,NFC_FRI1.1_WK943_R32_10,NFC_FRI1.1_WK943_R32_13,NFC_FRI1.1_WK943_R32_14,NFC_FRI1.1_WK1007_R33_1,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 $ |
| 28 | * |
| 29 | */ |
| 30 | |
| 31 | #ifndef PHFRINFC_OVRHAL_H |
| 32 | #define PHFRINFC_OVRHAL_H |
| 33 | |
| 34 | #include <phFriNfc.h> |
| 35 | #ifdef PH_HAL4_ENABLE |
| 36 | #include <phHal4Nfc.h> |
| 37 | #else |
| 38 | #include <phHalNfc.h> |
| 39 | #endif |
| 40 | #include <phNfcCompId.h> |
| 41 | #include <phNfcStatus.h> |
| 42 | |
| 43 | |
| 44 | /** |
| 45 | * \name Overlapped HAL |
| 46 | * |
| 47 | * File: \ref phFriNfc_OvrHal.h |
| 48 | * |
| 49 | */ |
| 50 | /*@{*/ |
| 51 | #define PH_FRINFC_OVRHAL_FILEREVISION "$Revision: 1.13 $" /** \ingroup grp_file_attributes */ |
| 52 | #define PH_FRINFC_OVRHAL_FILEALIASES "$Aliases: NFC_FRI1.1_WK922_PREP1,NFC_FRI1.1_WK920_R25_1,NFC_FRI1.1_WK922_R26_1,NFC_FRI1.1_WK924_PREP1,NFC_FRI1.1_WK924_R27_1,NFC_FRI1.1_WK926_R28_1,NFC_FRI1.1_WK928_R29_1,NFC_FRI1.1_WK930_R30_1,NFC_FRI1.1_WK934_PREP_1,NFC_FRI1.1_WK934_R31_1,NFC_FRI1.1_WK941_PREP1,NFC_FRI1.1_WK941_PREP2,NFC_FRI1.1_WK941_1,NFC_FRI1.1_WK943_R32_1,NFC_FRI1.1_WK949_PREP1,NFC_FRI1.1_WK943_R32_10,NFC_FRI1.1_WK943_R32_13,NFC_FRI1.1_WK943_R32_14,NFC_FRI1.1_WK1007_R33_1,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 */ |
| 53 | /*@}*/ |
| 54 | |
| 55 | |
| 56 | /** \defgroup grp_fri_nfc_ovr_hal Overlapped HAL |
| 57 | * |
| 58 | * This component encapsulates the HAL functions, suited for the NFC-FRI overlapped way of operation. The HAL itself |
| 59 | * is used as it is, wrapped by this component. The purpose of the wrapper is to de-couple a blocking I/O, as used by |
| 60 | * the HAL, from the overlapped I/O operation mode the FRI is using. |
| 61 | * |
| 62 | * \par Device Based Functions |
| 63 | * NFC Device Based Functions are used to address the NFC device (local device) directly. |
| 64 | * These are all functions that use no Remote Device Information. |
| 65 | * |
| 66 | * \par Connection Based Functions |
| 67 | * Connection Based Functions use the Remote Device Information to describe a connection |
| 68 | * to a certain Remote Device. |
| 69 | * |
| 70 | * \par Component Instance Sharing |
| 71 | * FRI components accessing one NFC device share one instance of the Overlapped HAL. Therefore |
| 72 | * each calling FRI component must specify - together with the call - where to deliver the |
| 73 | * response of the overlapped operation. |
| 74 | * |
| 75 | * \par Lowest Layer |
| 76 | * The Overlapped HAL represents the NFC Device, the lowest layer of the FRI components. |
| 77 | * |
| 78 | * \par Completion Forced |
| 79 | * The \b HAL \b functions (and underlying functions) of this library must complete before a new call can |
| 80 | * be issued. No HAL operation must be pending. |
| 81 | * |
| 82 | */ |
| 83 | /*@{*/ |
| 84 | |
| 85 | /** |
| 86 | * \name OVR HAL Constants |
| 87 | */ |
| 88 | /*@{*/ |
| 89 | #define PH_FRINFC_OVRHAL_MAX_NUM_MOCKUP_PARAM 255 /**< Number of mockup indices that are are prepared. */ |
| 90 | /* Harsha: changed from 48 to 128, to work with the Mifare 4k TCs */ |
| 91 | #define PH_FRINFC_OVRHAL_MAX_NUM_MOCKUP_RDI 4 /**< Max. number of mockup RDIs. */ |
| 92 | #define PH_FRINFC_OVRHAL_MAX_TEST_DELAY 1000 /**< Max. test delay in OVR HAL. */ |
| 93 | #define PH_FRINFC_OVRHAL_POLL_PAYLOAD_LEN 5 /**< Length of the POLL payload. */ /* @GK/5.6.06 */ |
| 94 | /*@}*/ |
| 95 | /*@}*/ /* defgroup... */ |
| 96 | |
| 97 | /** \defgroup grp_ovr_hal_cmd Overlapped HAL Command List |
| 98 | * \ingroup grp_fri_nfc_ovr_hal |
| 99 | * These are the command definitions for the Overlapped HAL. They are used internally by the |
| 100 | * implementation of the component. |
| 101 | */ |
| 102 | /*@{*/ |
| 103 | #define PH_FRINFC_OVRHAL_NUL (0) /**< \brief We're in NO command */ |
| 104 | |
| 105 | #define PH_FRINFC_OVRHAL_ENU (1) /**< \brief Enumerate */ |
| 106 | #define PH_FRINFC_OVRHAL_OPE (2) /**< \brief Open */ |
| 107 | #define PH_FRINFC_OVRHAL_CLO (3) /**< \brief Close */ |
| 108 | #define PH_FRINFC_OVRHAL_GDC (4) /**< \brief Get Dev Caps */ |
| 109 | #define PH_FRINFC_OVRHAL_POL (5) /**< \brief Poll */ |
| 110 | #define PH_FRINFC_OVRHAL_CON (6) /**< \brief Connect */ |
| 111 | #define PH_FRINFC_OVRHAL_DIS (7) /**< \brief Disconnect */ |
| 112 | #define PH_FRINFC_OVRHAL_TRX (8) /**< \brief Transceive */ |
| 113 | #define PH_FRINFC_OVRHAL_STM (9) /**< \brief Start Target Mode */ |
| 114 | #define PH_FRINFC_OVRHAL_SND (10) /**< \brief Send */ |
| 115 | #define PH_FRINFC_OVRHAL_RCV (11) /**< \brief Receive */ |
| 116 | #define PH_FRINFC_OVRHAL_IOC (12) /**< \brief IOCTL */ |
| 117 | |
| 118 | #define PH_FRINFC_OVRHAL_TST (255) /**< \brief OVR HAL test-related command */ |
| 119 | |
| 120 | /** \ingroup grp_fri_nfc_ovr_hal |
| 121 | * \brief Post Message Function for Overlapped HAL |
| 122 | * |
| 123 | * \copydoc page_reg |
| 124 | * |
| 125 | * This is required by the Overlapped HAL in order to call the blocking (original HAL) in another |
| 126 | * thread. This function is required in addition to \ref pphFriNfc_OvrHalPresetParm to be |
| 127 | * implemented in the integrating software. |
| 128 | * |
| 129 | * \par First Parameter: Context of the Integration |
| 130 | * Set to the value, the Integration has provided when initialising this component. |
| 131 | */ |
| 132 | typedef void (*pphFriNfc_OvrHalPostMsg_t)(void*); |
| 133 | |
| 134 | /** \ingroup grp_fri_nfc_ovr_hal |
| 135 | * \brief Abort Function (to be defined/implemented by the Integration) |
| 136 | * |
| 137 | * \copydoc page_reg |
| 138 | * |
| 139 | * This is required by the Overlapped HAL in order abort a pending Overlapped HAL operation. This funtion will be |
| 140 | * internally called by the \ref phFriNfc_OvrHal_Abort function. |
| 141 | * |
| 142 | * \par First Parameter: Context of the Integration |
| 143 | * Set to the value, the Integration has provided when initialising this component. |
| 144 | * |
| 145 | * \par Return value: |
| 146 | * As defined by the integration |
| 147 | */ |
| 148 | typedef NFCSTATUS (*pphFriNfc_OvrHalAbort_t)(void*); |
| 149 | |
| 150 | |
| 151 | typedef void (*pphOvrHal_CB_t) (phHal_sRemoteDevInformation_t *RemoteDevHandle, |
| 152 | NFCSTATUS status, |
| 153 | phNfc_sData_t *pRecvdata, |
| 154 | void *context); |
| 155 | |
| 156 | /** \ingroup grp_fri_nfc_ovr_hal |
| 157 | * \brief Preset Function to prepare the parameters in the HAL |
| 158 | * |
| 159 | * \copydoc page_reg |
| 160 | * |
| 161 | * This function (pointer) is called by the Overlapped HAL to prepare the function call parameters |
| 162 | * in the HAL before posting the start message. As we have an asynchronously running FRI, but a |
| 163 | * synchronous HAL, the calls need to be "decoupled". This means, the HAL needs to run under |
| 164 | * a different time-base (or thread/task etc.). The consequence is that the data exchange between |
| 165 | * FRI and HAL must be done as required by the integration/system itself. The declaration |
| 166 | * of the function pointer allows for the integrating software to implement whatever functionality |
| 167 | * is required to convey the data. |
| 168 | * |
| 169 | * |
| 170 | * \par First Parameter |
| 171 | * Context of the Integration Set to the value, the Integration has provided when initialising |
| 172 | * this component. |
| 173 | * |
| 174 | * \par Second Parameter: |
| 175 | * \b HAL \b Command, as defined in the module \ref grp_ovr_hal_cmd. |
| 176 | * |
| 177 | * \par Third Parameter: |
| 178 | * \b Pointers to a specific structure containing the parameters of the HAL functions to be |
| 179 | * called. |
| 180 | * |
| 181 | * \par Forth parameter: |
| 182 | * Immediate Operation result (not the result of the HAL operation). Usually this is |
| 183 | * \ref NFCSTATUS_PENDING (for a successfully triggered HAL I/O or an error value that is |
| 184 | * returned by the HAL immediately, such as \ref NFCSTATUS_INVALID_PARAMETER. |
| 185 | * |
| 186 | * \par Return value: |
| 187 | * A boolean (\ref grp_special_conventions) value. The integration implementation must ensure |
| 188 | * that, if the function \b succeeds, the return value is \b TRUE, otherwise false. |
| 189 | */ |
| 190 | typedef uint8_t (*pphFriNfc_OvrHalPresetParm)(void*, uint16_t, void*, NFCSTATUS*); |
| 191 | |
| 192 | /** \ingroup grp_fri_nfc_ovr_hal |
| 193 | * \brief Overlapped HAL Context |
| 194 | * |
| 195 | * The Overlapped HAL structure. This structure contains the HAL "context" that |
| 196 | * is required by the FRI on a connection basis. Please note that the Overlapped HAL is |
| 197 | * a shared component, requiring a special completion notification mechanism. |
| 198 | * Read more in the description of this component. |
| 199 | * |
| 200 | */ |
| 201 | typedef struct phFriNfc_OvrHal |
| 202 | { |
| 203 | /** Currently active operation of the component. If no operation is pending, the content of this member is |
| 204 | * \ref PH_FRINFC_OVRHAL_NUL . The component refuses a new call if the contenet is different, namely one |
| 205 | * of the other values defined in \ref grp_ovr_hal_cmd . |
| 206 | */ |
| 207 | uint8_t Operation; |
| 208 | |
| 209 | /** The \b temporary pointer to the completion routine information. The HAL needs - for each call - to be told about the |
| 210 | * completion routine of the upper (calling) component. This major difference to other components is because |
| 211 | * some functions of the HAL are connection-based and some are not. Moreover it is because the HAL is shared |
| 212 | * among the FRI components. So, with a variety of potential callers it is required for each caller to instruct |
| 213 | * the HAL about the "delivery" address of the response for each individual call. |
| 214 | */ |
| 215 | phFriNfc_CplRt_t TemporaryCompletionInfo; |
| 216 | phFriNfc_CplRt_t TemporaryRcvCompletionInfo; |
| 217 | phFriNfc_CplRt_t TemporarySndCompletionInfo; |
| 218 | |
| 219 | /** Points to a function within the Integration that presets the parameters for the actual |
| 220 | * HAL call. |
| 221 | */ |
| 222 | pphFriNfc_OvrHalPresetParm Presetparameters; |
| 223 | |
| 224 | /** Posts a message to the actual HAL integration, starting a NFC HAL I/O with the pre-set |
| 225 | * parameters. |
| 226 | */ |
| 227 | pphFriNfc_OvrHalPostMsg_t PostMsg; |
| 228 | |
| 229 | /** The context of the Integration (the SW around this component). This is needed to let |
| 230 | * the Overlapped HAL access the Integration's functionality to post a message to another |
| 231 | * thread. |
| 232 | */ |
| 233 | void *IntegrationContext; |
| 234 | |
| 235 | /** Device reference returned during enumeration: This has to be filled in by the integrating software after |
| 236 | a call to the HAL Enumerate function (not contained in the overlapped HAl API). */ |
| 237 | phHal_sHwReference_t *psHwReference; |
| 238 | |
| 239 | /** This flag is set by the ABORT function. The OVR HAL then does no I/O to the real HAL |
| 240 | * or to the mockup any more but just completed with the ABORTED status. |
| 241 | */ |
| 242 | uint8_t OperationAborted; |
| 243 | |
| 244 | /** Abort function to be implemented by the integration. This parameter can be (optionally) initialized |
| 245 | * via the call of \ref phFriNfc_OvrHal_Reset_Abort function. |
| 246 | * If it is not NULL, the function pointed by \ref will be internally called by the \ref phFriNfc_OvrHal_Abort function. |
| 247 | */ |
| 248 | pphFriNfc_OvrHalAbort_t AbortIntegrationFunction; |
| 249 | |
| 250 | /** Integration-defined Context passed as a parameter of the \ref AbortIntegrationFunction. |
| 251 | */ |
| 252 | void* AbortIntegrationContext; |
| 253 | |
| 254 | void* OvrCompletion; |
| 255 | |
| 256 | phHal_sTransceiveInfo_t TranceiveInfo; |
| 257 | |
| 258 | /** TODO |
| 259 | */ |
| 260 | phNfc_sData_t sReceiveData; |
| 261 | |
| 262 | /** TODO |
| 263 | */ |
| 264 | phNfc_sData_t sSendData; |
| 265 | |
| 266 | /** TODO |
| 267 | */ |
| 268 | phHal4Nfc_TransactInfo_t TransactInfo; |
| 269 | |
| 270 | uint16_t *pndef_recv_length; |
| 271 | } phFriNfc_OvrHal_t; |
| 272 | |
| 273 | /** |
| 274 | * \ingroup grp_fri_nfc_ovr_hal |
| 275 | * |
| 276 | * \brief Transceive Data to/from a Remote Device |
| 277 | * |
| 278 | * \copydoc page_ovr |
| 279 | * |
| 280 | * \param[in] OvrHal Component Context. |
| 281 | * \param[in] CompletionInfo \copydoc phFriNfc_OvrHal_t::TemporaryCompletionInfo |
| 282 | * \param[in,out] RemoteDevInfo Remote Device Information. |
| 283 | * \param[in] Cmd Command to perform. |
| 284 | * \param[out] DepAdditionalInfo Protocol Information. |
| 285 | * \param[in] SendBuf Pointer to the data to send. |
| 286 | * \param[in] SendLength Length, in bytes, of the Send Buffer. |
| 287 | * \param[out] RecvBuf Pointer to the buffer that receives the data. |
| 288 | * \param[in,out] RecvLength Length, in bytes, of the received data. |
| 289 | * |
| 290 | * \retval NFCSTATUS_PENDING The operation is pending. |
| 291 | * \retval NFCSTATUS_INVALID_DEVICE_REQUEST \copydoc phFriNfc_OvrHal_t::Operation |
| 292 | * \retval NFCSTATUS_SUCCESS Success. |
| 293 | * \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters could not be |
| 294 | * properly interpreted. |
| 295 | * \retval NFCSTATUS_INVALID_DEVICE The device has not been opened or has been disconnected |
| 296 | * meanwhile. |
| 297 | * \retval NFCSTATUS_CMD_ABORTED The caller/driver has aborted the request. |
| 298 | * \retval NFCSTATUS_BUFFER_TOO_SMALL The buffer provided by the caller is too small. |
| 299 | * \retval NFCSTATUS_RF_TIMEOUT No data has been received within the TIMEOUT period. |
| 300 | * |
| 301 | * \note Please refer to HAL Transceive for a detailed description of the |
| 302 | * underlying function and the propagated parameters. |
| 303 | * |
| 304 | */ |
| 305 | |
| 306 | NFCSTATUS phFriNfc_OvrHal_Transceive(phFriNfc_OvrHal_t *OvrHal, |
| 307 | phFriNfc_CplRt_t *CompletionInfo, |
| 308 | phHal_sRemoteDevInformation_t *RemoteDevInfo, |
| 309 | phHal_uCmdList_t Cmd, |
| 310 | phHal_sDepAdditionalInfo_t *DepAdditionalInfo, |
| 311 | uint8_t *SendBuf, |
| 312 | uint16_t SendLength, |
| 313 | uint8_t *RecvBuf, |
| 314 | uint16_t *RecvLength); |
| 315 | |
| 316 | /** |
| 317 | * \ingroup grp_fri_nfc_ovr_hal |
| 318 | * |
| 319 | * \brief TODO |
| 320 | * |
| 321 | */ |
| 322 | NFCSTATUS phFriNfc_OvrHal_Receive(phFriNfc_OvrHal_t *OvrHal, |
| 323 | phFriNfc_CplRt_t *CompletionInfo, |
| 324 | phHal_sRemoteDevInformation_t *RemoteDevInfo, |
| 325 | uint8_t *RecvBuf, |
| 326 | uint16_t *RecvLength); |
| 327 | |
| 328 | /** |
| 329 | * \ingroup grp_fri_nfc_ovr_hal |
| 330 | * |
| 331 | * \brief TODO |
| 332 | * |
| 333 | */ |
| 334 | NFCSTATUS phFriNfc_OvrHal_Send(phFriNfc_OvrHal_t *OvrHal, |
| 335 | phFriNfc_CplRt_t *CompletionInfo, |
| 336 | phHal_sRemoteDevInformation_t *RemoteDevInfo, |
| 337 | uint8_t *SendBuf, |
| 338 | uint16_t SendLength); |
| 339 | |
| 340 | |
| 341 | NFCSTATUS phFriNfc_OvrHal_Reconnect(phFriNfc_OvrHal_t *OvrHal, |
| 342 | phFriNfc_CplRt_t *CompletionInfo, |
| 343 | phHal_sRemoteDevInformation_t *RemoteDevInfo); |
| 344 | |
| 345 | |
| 346 | NFCSTATUS phFriNfc_OvrHal_Connect(phFriNfc_OvrHal_t *OvrHal, |
| 347 | phFriNfc_CplRt_t *CompletionInfo, |
| 348 | phHal_sRemoteDevInformation_t *RemoteDevInfo, |
| 349 | phHal_sDevInputParam_t *DevInputParam); |
| 350 | |
| 351 | #endif |