xref: /aosp_15_r20/system/nfc/src/rust/nci/api.rs (revision 7eba2f3b06c51ae21384f6a4f14577b668a869b3)
1*7eba2f3bSAndroid Build Coastguard Worker // Copyright 2021, The Android Open Source Project
2*7eba2f3bSAndroid Build Coastguard Worker //
3*7eba2f3bSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
4*7eba2f3bSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
5*7eba2f3bSAndroid Build Coastguard Worker // You may obtain a copy of the License at
6*7eba2f3bSAndroid Build Coastguard Worker //
7*7eba2f3bSAndroid Build Coastguard Worker //     http://www.apache.org/licenses/LICENSE-2.0
8*7eba2f3bSAndroid Build Coastguard Worker //
9*7eba2f3bSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
10*7eba2f3bSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
11*7eba2f3bSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*7eba2f3bSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
13*7eba2f3bSAndroid Build Coastguard Worker // limitations under the License.
14*7eba2f3bSAndroid Build Coastguard Worker 
15*7eba2f3bSAndroid Build Coastguard Worker //! NCI API module
16*7eba2f3bSAndroid Build Coastguard Worker 
17*7eba2f3bSAndroid Build Coastguard Worker use crate::{CommandSender, LogicalConnectionsRegistry, Result};
18*7eba2f3bSAndroid Build Coastguard Worker use bytes::Bytes;
19*7eba2f3bSAndroid Build Coastguard Worker use log::{debug, error};
20*7eba2f3bSAndroid Build Coastguard Worker use nfc_hal::{HalEvent, HalEventRegistry, HalEventStatus};
21*7eba2f3bSAndroid Build Coastguard Worker use nfc_packets::nci::RfMappingConfiguration;
22*7eba2f3bSAndroid Build Coastguard Worker use nfc_packets::nci::{self, CommandBuilder, DataPacket, Opcode};
23*7eba2f3bSAndroid Build Coastguard Worker use nfc_packets::nci::{ConnCloseCommandBuilder, ConnCreateCommandBuilder};
24*7eba2f3bSAndroid Build Coastguard Worker use nfc_packets::nci::{DestParam, DestParamTypes, DestTypes};
25*7eba2f3bSAndroid Build Coastguard Worker use nfc_packets::nci::{FeatureEnable, PacketBoundaryFlag, ResetType};
26*7eba2f3bSAndroid Build Coastguard Worker use nfc_packets::nci::{InitCommandBuilder, ResetCommandBuilder};
27*7eba2f3bSAndroid Build Coastguard Worker use nfc_packets::nci::{InitResponse, ResponseChild};
28*7eba2f3bSAndroid Build Coastguard Worker use pdl_runtime::Packet;
29*7eba2f3bSAndroid Build Coastguard Worker use tokio::sync::oneshot;
30*7eba2f3bSAndroid Build Coastguard Worker 
31*7eba2f3bSAndroid Build Coastguard Worker type ConnCallback = fn(u8, u16, &[u8]);
32*7eba2f3bSAndroid Build Coastguard Worker 
33*7eba2f3bSAndroid Build Coastguard Worker struct NfcData {
34*7eba2f3bSAndroid Build Coastguard Worker     init_response: Option<InitResponse>,
35*7eba2f3bSAndroid Build Coastguard Worker     rf_callback: Option<ConnCallback>,
36*7eba2f3bSAndroid Build Coastguard Worker     hci_callback: Option<ConnCallback>,
37*7eba2f3bSAndroid Build Coastguard Worker }
38*7eba2f3bSAndroid Build Coastguard Worker 
39*7eba2f3bSAndroid Build Coastguard Worker type RespCallback = fn(u16, &[u8]);
40*7eba2f3bSAndroid Build Coastguard Worker 
41*7eba2f3bSAndroid Build Coastguard Worker /// NCI API object to manage static API data
42*7eba2f3bSAndroid Build Coastguard Worker pub struct NciApi {
43*7eba2f3bSAndroid Build Coastguard Worker     /// Command Sender external interface
44*7eba2f3bSAndroid Build Coastguard Worker     commands: Option<CommandSender>,
45*7eba2f3bSAndroid Build Coastguard Worker     /// Interface to Logical Connections Registry
46*7eba2f3bSAndroid Build Coastguard Worker     connections: Option<LogicalConnectionsRegistry>,
47*7eba2f3bSAndroid Build Coastguard Worker     /// The NFC response callback
48*7eba2f3bSAndroid Build Coastguard Worker     callback: Option<RespCallback>,
49*7eba2f3bSAndroid Build Coastguard Worker     /// HalEventRegistry is used to register for HAL events
50*7eba2f3bSAndroid Build Coastguard Worker     hal_events: Option<HalEventRegistry>,
51*7eba2f3bSAndroid Build Coastguard Worker     nfc_data: NfcData,
52*7eba2f3bSAndroid Build Coastguard Worker }
53*7eba2f3bSAndroid Build Coastguard Worker 
54*7eba2f3bSAndroid Build Coastguard Worker impl NciApi {
55*7eba2f3bSAndroid Build Coastguard Worker     /// NciApi constructor
new() -> NciApi56*7eba2f3bSAndroid Build Coastguard Worker     pub fn new() -> NciApi {
57*7eba2f3bSAndroid Build Coastguard Worker         let nfc_data = NfcData { init_response: None, rf_callback: None, hci_callback: None };
58*7eba2f3bSAndroid Build Coastguard Worker         NciApi { commands: None, connections: None, callback: None, hal_events: None, nfc_data }
59*7eba2f3bSAndroid Build Coastguard Worker     }
60*7eba2f3bSAndroid Build Coastguard Worker 
61*7eba2f3bSAndroid Build Coastguard Worker     /** ****************************************************************************
62*7eba2f3bSAndroid Build Coastguard Worker      **
63*7eba2f3bSAndroid Build Coastguard Worker      ** Function         nfc_enable
64*7eba2f3bSAndroid Build Coastguard Worker      **
65*7eba2f3bSAndroid Build Coastguard Worker      ** Description      This function enables NFC. Prior to calling NFC_Enable:
66*7eba2f3bSAndroid Build Coastguard Worker      **                  - the NFCC must be powered up, and ready to receive
67*7eba2f3bSAndroid Build Coastguard Worker      **                    commands.
68*7eba2f3bSAndroid Build Coastguard Worker      **
69*7eba2f3bSAndroid Build Coastguard Worker      **                  This function opens the NCI transport (if applicable),
70*7eba2f3bSAndroid Build Coastguard Worker      **                  resets the NFC controller, and initializes the NFC
71*7eba2f3bSAndroid Build Coastguard Worker      **                  subsystems.
72*7eba2f3bSAndroid Build Coastguard Worker      **
73*7eba2f3bSAndroid Build Coastguard Worker      **                  When the NFC startup procedure is completed, an
74*7eba2f3bSAndroid Build Coastguard Worker      **                  NFC_ENABLE_REVT is returned to the application using the
75*7eba2f3bSAndroid Build Coastguard Worker      **                  tNFC_RESPONSE_CBACK.
76*7eba2f3bSAndroid Build Coastguard Worker      **
77*7eba2f3bSAndroid Build Coastguard Worker      ** Returns          tNFC_STATUS
78*7eba2f3bSAndroid Build Coastguard Worker      **
79*7eba2f3bSAndroid Build Coastguard Worker      *******************************************************************************/
80*7eba2f3bSAndroid Build Coastguard Worker     /// extern tNFC_STATUS NFC_Enable(tNFC_RESPONSE_CBACK* p_cback);
nfc_enable(&mut self, callback: RespCallback)81*7eba2f3bSAndroid Build Coastguard Worker     pub async fn nfc_enable(&mut self, callback: RespCallback) {
82*7eba2f3bSAndroid Build Coastguard Worker         let nci = crate::init().await;
83*7eba2f3bSAndroid Build Coastguard Worker 
84*7eba2f3bSAndroid Build Coastguard Worker         self.commands = Some(nci.commands);
85*7eba2f3bSAndroid Build Coastguard Worker         self.connections = Some(nci.connections);
86*7eba2f3bSAndroid Build Coastguard Worker         self.callback = Some(callback);
87*7eba2f3bSAndroid Build Coastguard Worker         self.hal_events = Some(nci.hal_events);
88*7eba2f3bSAndroid Build Coastguard Worker     }
89*7eba2f3bSAndroid Build Coastguard Worker     /** ****************************************************************************
90*7eba2f3bSAndroid Build Coastguard Worker      **
91*7eba2f3bSAndroid Build Coastguard Worker      ** Function         NFC_Disable
92*7eba2f3bSAndroid Build Coastguard Worker      **
93*7eba2f3bSAndroid Build Coastguard Worker      ** Description      This function performs clean up routines for shutting down
94*7eba2f3bSAndroid Build Coastguard Worker      **                  NFC and closes the NCI transport (if using dedicated NCI
95*7eba2f3bSAndroid Build Coastguard Worker      **                  transport).
96*7eba2f3bSAndroid Build Coastguard Worker      **
97*7eba2f3bSAndroid Build Coastguard Worker      **                  When the NFC shutdown procedure is completed, an
98*7eba2f3bSAndroid Build Coastguard Worker      **                  NFC_DISABLED_REVT is returned to the application using the
99*7eba2f3bSAndroid Build Coastguard Worker      **                  tNFC_RESPONSE_CBACK.
100*7eba2f3bSAndroid Build Coastguard Worker      **
101*7eba2f3bSAndroid Build Coastguard Worker      ** Returns          nothing
102*7eba2f3bSAndroid Build Coastguard Worker      **
103*7eba2f3bSAndroid Build Coastguard Worker      *******************************************************************************/
104*7eba2f3bSAndroid Build Coastguard Worker     /// extern void NFC_Disable(void);
nfc_disable(&mut self)105*7eba2f3bSAndroid Build Coastguard Worker     pub async fn nfc_disable(&mut self) {
106*7eba2f3bSAndroid Build Coastguard Worker         let (tx, rx) = oneshot::channel::<HalEventStatus>();
107*7eba2f3bSAndroid Build Coastguard Worker         if let Some(mut event) = self.hal_events.take() {
108*7eba2f3bSAndroid Build Coastguard Worker             event.register(HalEvent::CloseComplete, tx).await;
109*7eba2f3bSAndroid Build Coastguard Worker 
110*7eba2f3bSAndroid Build Coastguard Worker             if let Some(cmd) = self.commands.take() {
111*7eba2f3bSAndroid Build Coastguard Worker                 drop(cmd);
112*7eba2f3bSAndroid Build Coastguard Worker             }
113*7eba2f3bSAndroid Build Coastguard Worker             if let Some(conn) = self.connections.take() {
114*7eba2f3bSAndroid Build Coastguard Worker                 drop(conn);
115*7eba2f3bSAndroid Build Coastguard Worker             }
116*7eba2f3bSAndroid Build Coastguard Worker             let status = rx.await.unwrap();
117*7eba2f3bSAndroid Build Coastguard Worker             debug!("Shutdown complete {:?}.", status);
118*7eba2f3bSAndroid Build Coastguard Worker 
119*7eba2f3bSAndroid Build Coastguard Worker             if let Some(cb) = self.callback.take() {
120*7eba2f3bSAndroid Build Coastguard Worker                 cb(1, &[]);
121*7eba2f3bSAndroid Build Coastguard Worker             }
122*7eba2f3bSAndroid Build Coastguard Worker         }
123*7eba2f3bSAndroid Build Coastguard Worker     }
124*7eba2f3bSAndroid Build Coastguard Worker 
125*7eba2f3bSAndroid Build Coastguard Worker     /** ****************************************************************************
126*7eba2f3bSAndroid Build Coastguard Worker      **
127*7eba2f3bSAndroid Build Coastguard Worker      ** Function         NFC_Init
128*7eba2f3bSAndroid Build Coastguard Worker      **
129*7eba2f3bSAndroid Build Coastguard Worker      ** Description      This function initializes control blocks for NFC
130*7eba2f3bSAndroid Build Coastguard Worker      **
131*7eba2f3bSAndroid Build Coastguard Worker      ** Returns          nothing
132*7eba2f3bSAndroid Build Coastguard Worker      **
133*7eba2f3bSAndroid Build Coastguard Worker      *******************************************************************************/
134*7eba2f3bSAndroid Build Coastguard Worker     /// extern void NFC_Init(tHAL_NFC_ENTRY* p_hal_entry_tbl);
nfc_init(&mut self) -> Result<()>135*7eba2f3bSAndroid Build Coastguard Worker     pub async fn nfc_init(&mut self) -> Result<()> {
136*7eba2f3bSAndroid Build Coastguard Worker         let pbf = PacketBoundaryFlag::CompleteOrFinal;
137*7eba2f3bSAndroid Build Coastguard Worker         if let Some(cmd) = self.commands.as_mut() {
138*7eba2f3bSAndroid Build Coastguard Worker             let reset = cmd
139*7eba2f3bSAndroid Build Coastguard Worker                 .send_and_notify(
140*7eba2f3bSAndroid Build Coastguard Worker                     ResetCommandBuilder { gid: 0, pbf, reset_type: ResetType::ResetConfig }
141*7eba2f3bSAndroid Build Coastguard Worker                         .build()
142*7eba2f3bSAndroid Build Coastguard Worker                         .into(),
143*7eba2f3bSAndroid Build Coastguard Worker                 )
144*7eba2f3bSAndroid Build Coastguard Worker                 .await?;
145*7eba2f3bSAndroid Build Coastguard Worker             let _notification_packet = reset.notification.await?;
146*7eba2f3bSAndroid Build Coastguard Worker             let init = cmd
147*7eba2f3bSAndroid Build Coastguard Worker                 .send(
148*7eba2f3bSAndroid Build Coastguard Worker                     InitCommandBuilder { gid: 0, pbf, feature_enable: FeatureEnable::Rfu }
149*7eba2f3bSAndroid Build Coastguard Worker                         .build()
150*7eba2f3bSAndroid Build Coastguard Worker                         .into(),
151*7eba2f3bSAndroid Build Coastguard Worker                 )
152*7eba2f3bSAndroid Build Coastguard Worker                 .await?;
153*7eba2f3bSAndroid Build Coastguard Worker             if let ResponseChild::InitResponse(irp) = init.specialize() {
154*7eba2f3bSAndroid Build Coastguard Worker                 if let Some(conn) = self.connections.as_mut() {
155*7eba2f3bSAndroid Build Coastguard Worker                     // Open static RF connection
156*7eba2f3bSAndroid Build Coastguard Worker                     // TODO: use channels instead of callcacks here
157*7eba2f3bSAndroid Build Coastguard Worker                     // the data can be tranlated to c-callback at the shim level
158*7eba2f3bSAndroid Build Coastguard Worker                     conn.open(0, self.nfc_data.rf_callback, 0, 0).await;
159*7eba2f3bSAndroid Build Coastguard Worker                     // Open static HCI connection
160*7eba2f3bSAndroid Build Coastguard Worker                     conn.open(
161*7eba2f3bSAndroid Build Coastguard Worker                         1, /* TODO: link constants to the c header */
162*7eba2f3bSAndroid Build Coastguard Worker                         self.nfc_data.hci_callback,
163*7eba2f3bSAndroid Build Coastguard Worker                         irp.get_max_data_payload(),
164*7eba2f3bSAndroid Build Coastguard Worker                         irp.get_num_of_credits(),
165*7eba2f3bSAndroid Build Coastguard Worker                     )
166*7eba2f3bSAndroid Build Coastguard Worker                     .await;
167*7eba2f3bSAndroid Build Coastguard Worker                 }
168*7eba2f3bSAndroid Build Coastguard Worker                 self.nfc_data.init_response = Some(irp);
169*7eba2f3bSAndroid Build Coastguard Worker             }
170*7eba2f3bSAndroid Build Coastguard Worker         }
171*7eba2f3bSAndroid Build Coastguard Worker         Ok(())
172*7eba2f3bSAndroid Build Coastguard Worker     }
173*7eba2f3bSAndroid Build Coastguard Worker 
174*7eba2f3bSAndroid Build Coastguard Worker     /** *****************************************************************************
175*7eba2f3bSAndroid Build Coastguard Worker      **
176*7eba2f3bSAndroid Build Coastguard Worker      ** Function         NFC_GetLmrtSize
177*7eba2f3bSAndroid Build Coastguard Worker      **
178*7eba2f3bSAndroid Build Coastguard Worker      ** Description      Called by application wto query the Listen Mode Routing
179*7eba2f3bSAndroid Build Coastguard Worker      **                  Table size supported by NFCC
180*7eba2f3bSAndroid Build Coastguard Worker      **
181*7eba2f3bSAndroid Build Coastguard Worker      ** Returns          Listen Mode Routing Table size
182*7eba2f3bSAndroid Build Coastguard Worker      **
183*7eba2f3bSAndroid Build Coastguard Worker      *******************************************************************************/
184*7eba2f3bSAndroid Build Coastguard Worker     /// extern uint16_t NFC_GetLmrtSize(void);
nfc_get_lmrt_size(&mut self) -> u16185*7eba2f3bSAndroid Build Coastguard Worker     pub async fn nfc_get_lmrt_size(&mut self) -> u16 {
186*7eba2f3bSAndroid Build Coastguard Worker         if let Some(ir) = &self.nfc_data.init_response {
187*7eba2f3bSAndroid Build Coastguard Worker             ir.get_max_rout_tbls_size()
188*7eba2f3bSAndroid Build Coastguard Worker         } else {
189*7eba2f3bSAndroid Build Coastguard Worker             0
190*7eba2f3bSAndroid Build Coastguard Worker         }
191*7eba2f3bSAndroid Build Coastguard Worker     }
192*7eba2f3bSAndroid Build Coastguard Worker 
193*7eba2f3bSAndroid Build Coastguard Worker     /** *****************************************************************************
194*7eba2f3bSAndroid Build Coastguard Worker      **
195*7eba2f3bSAndroid Build Coastguard Worker      ** Function         NFC_SetConfig
196*7eba2f3bSAndroid Build Coastguard Worker      **
197*7eba2f3bSAndroid Build Coastguard Worker      ** Description      This function is called to send the configuration parameter
198*7eba2f3bSAndroid Build Coastguard Worker      **                  TLV to NFCC. The response from NFCC is reported by
199*7eba2f3bSAndroid Build Coastguard Worker      **                  tNFC_RESPONSE_CBACK as NFC_SET_CONFIG_REVT.
200*7eba2f3bSAndroid Build Coastguard Worker      **
201*7eba2f3bSAndroid Build Coastguard Worker      ** Parameters       tlv_size - the length of p_param_tlvs.
202*7eba2f3bSAndroid Build Coastguard Worker      **                  p_param_tlvs - the parameter ID/Len/Value list
203*7eba2f3bSAndroid Build Coastguard Worker      **
204*7eba2f3bSAndroid Build Coastguard Worker      ** Returns          tNFC_STATUS
205*7eba2f3bSAndroid Build Coastguard Worker      **
206*7eba2f3bSAndroid Build Coastguard Worker      *******************************************************************************/
207*7eba2f3bSAndroid Build Coastguard Worker     /// extern tNFC_STATUS NFC_SetConfig(uint8_t tlv_size, uint8_t* p_param_tlvs);
nfc_set_config(&mut self, param_tlvs: &[u8]) -> Result<u8>208*7eba2f3bSAndroid Build Coastguard Worker     pub async fn nfc_set_config(&mut self, param_tlvs: &[u8]) -> Result<u8> {
209*7eba2f3bSAndroid Build Coastguard Worker         let pbf = PacketBoundaryFlag::CompleteOrFinal;
210*7eba2f3bSAndroid Build Coastguard Worker         if let Some(cmd) = self.commands.as_mut() {
211*7eba2f3bSAndroid Build Coastguard Worker             let raw = cmd
212*7eba2f3bSAndroid Build Coastguard Worker                 .send(
213*7eba2f3bSAndroid Build Coastguard Worker                     CommandBuilder {
214*7eba2f3bSAndroid Build Coastguard Worker                         gid: 0,
215*7eba2f3bSAndroid Build Coastguard Worker                         pbf,
216*7eba2f3bSAndroid Build Coastguard Worker                         op: Opcode::CoreSetConfig,
217*7eba2f3bSAndroid Build Coastguard Worker                         payload: Some(Bytes::copy_from_slice(param_tlvs)),
218*7eba2f3bSAndroid Build Coastguard Worker                     }
219*7eba2f3bSAndroid Build Coastguard Worker                     .build(),
220*7eba2f3bSAndroid Build Coastguard Worker                 )
221*7eba2f3bSAndroid Build Coastguard Worker                 .await?
222*7eba2f3bSAndroid Build Coastguard Worker                 .encode_to_bytes()?;
223*7eba2f3bSAndroid Build Coastguard Worker             if let Some(cb) = self.callback {
224*7eba2f3bSAndroid Build Coastguard Worker                 cb(2, &raw[3..]);
225*7eba2f3bSAndroid Build Coastguard Worker             }
226*7eba2f3bSAndroid Build Coastguard Worker             Ok(raw[3])
227*7eba2f3bSAndroid Build Coastguard Worker         } else {
228*7eba2f3bSAndroid Build Coastguard Worker             Ok(nci::Status::NotInitialized as u8)
229*7eba2f3bSAndroid Build Coastguard Worker         }
230*7eba2f3bSAndroid Build Coastguard Worker     }
231*7eba2f3bSAndroid Build Coastguard Worker 
232*7eba2f3bSAndroid Build Coastguard Worker     /** *****************************************************************************
233*7eba2f3bSAndroid Build Coastguard Worker      **
234*7eba2f3bSAndroid Build Coastguard Worker      ** Function         NFC_GetConfig
235*7eba2f3bSAndroid Build Coastguard Worker      **
236*7eba2f3bSAndroid Build Coastguard Worker      ** Description      This function is called to retrieve the parameter TLV from
237*7eba2f3bSAndroid Build Coastguard Worker      **                  NFCC. The response from NFCC is reported by
238*7eba2f3bSAndroid Build Coastguard Worker      **                  tNFC_RESPONSE_CBACK as NFC_GET_CONFIG_REVT.
239*7eba2f3bSAndroid Build Coastguard Worker      **
240*7eba2f3bSAndroid Build Coastguard Worker      ** Parameters       num_ids - the number of parameter IDs
241*7eba2f3bSAndroid Build Coastguard Worker      **                  p_param_ids - the parameter ID list.
242*7eba2f3bSAndroid Build Coastguard Worker      **
243*7eba2f3bSAndroid Build Coastguard Worker      ** Returns          tNFC_STATUS
244*7eba2f3bSAndroid Build Coastguard Worker      **
245*7eba2f3bSAndroid Build Coastguard Worker      *******************************************************************************/
246*7eba2f3bSAndroid Build Coastguard Worker     /// extern tNFC_STATUS NFC_GetConfig(uint8_t num_ids, uint8_t* p_param_ids);
nfc_get_config(&mut self, param_tlvs: &[u8]) -> Result<u8>247*7eba2f3bSAndroid Build Coastguard Worker     pub async fn nfc_get_config(&mut self, param_tlvs: &[u8]) -> Result<u8> {
248*7eba2f3bSAndroid Build Coastguard Worker         let pbf = PacketBoundaryFlag::CompleteOrFinal;
249*7eba2f3bSAndroid Build Coastguard Worker         if let Some(cmd) = self.commands.as_mut() {
250*7eba2f3bSAndroid Build Coastguard Worker             let raw = cmd
251*7eba2f3bSAndroid Build Coastguard Worker                 .send(
252*7eba2f3bSAndroid Build Coastguard Worker                     CommandBuilder {
253*7eba2f3bSAndroid Build Coastguard Worker                         gid: 0,
254*7eba2f3bSAndroid Build Coastguard Worker                         pbf,
255*7eba2f3bSAndroid Build Coastguard Worker                         op: Opcode::CoreGetConfig,
256*7eba2f3bSAndroid Build Coastguard Worker                         payload: Some(Bytes::copy_from_slice(param_tlvs)),
257*7eba2f3bSAndroid Build Coastguard Worker                     }
258*7eba2f3bSAndroid Build Coastguard Worker                     .build(),
259*7eba2f3bSAndroid Build Coastguard Worker                 )
260*7eba2f3bSAndroid Build Coastguard Worker                 .await?
261*7eba2f3bSAndroid Build Coastguard Worker                 .encode_to_bytes()?;
262*7eba2f3bSAndroid Build Coastguard Worker             if let Some(cb) = self.callback {
263*7eba2f3bSAndroid Build Coastguard Worker                 cb(3, &raw[3..]);
264*7eba2f3bSAndroid Build Coastguard Worker             }
265*7eba2f3bSAndroid Build Coastguard Worker             Ok(raw[3])
266*7eba2f3bSAndroid Build Coastguard Worker         } else {
267*7eba2f3bSAndroid Build Coastguard Worker             Ok(nci::Status::NotInitialized as u8)
268*7eba2f3bSAndroid Build Coastguard Worker         }
269*7eba2f3bSAndroid Build Coastguard Worker     }
270*7eba2f3bSAndroid Build Coastguard Worker     /** ****************************************************************************
271*7eba2f3bSAndroid Build Coastguard Worker      **
272*7eba2f3bSAndroid Build Coastguard Worker      ** Function         NFC_ConnCreate
273*7eba2f3bSAndroid Build Coastguard Worker      **
274*7eba2f3bSAndroid Build Coastguard Worker      ** Description      This function is called to create a logical connection with
275*7eba2f3bSAndroid Build Coastguard Worker      **                  NFCC for data exchange.
276*7eba2f3bSAndroid Build Coastguard Worker      **                  The response from NFCC is reported in tNFC_CONN_CBACK
277*7eba2f3bSAndroid Build Coastguard Worker      **                  as NFC_CONN_CREATE_CEVT.
278*7eba2f3bSAndroid Build Coastguard Worker      **
279*7eba2f3bSAndroid Build Coastguard Worker      ** Parameters       dest_type - the destination type
280*7eba2f3bSAndroid Build Coastguard Worker      **                  id   - the NFCEE ID or RF Discovery ID .
281*7eba2f3bSAndroid Build Coastguard Worker      **                  protocol - the protocol
282*7eba2f3bSAndroid Build Coastguard Worker      **                  p_cback - the data callback function to receive data from
283*7eba2f3bSAndroid Build Coastguard Worker      **                  NFCC
284*7eba2f3bSAndroid Build Coastguard Worker      **
285*7eba2f3bSAndroid Build Coastguard Worker      ** Returns          tNFC_STATUS
286*7eba2f3bSAndroid Build Coastguard Worker      **
287*7eba2f3bSAndroid Build Coastguard Worker      *******************************************************************************/
288*7eba2f3bSAndroid Build Coastguard Worker     //extern tNFC_STATUS NFC_ConnCreate(uint8_t dest_type, uint8_t id,
289*7eba2f3bSAndroid Build Coastguard Worker     //                                  uint8_t protocol, tNFC_CONN_CBACK* p_cback);
nfc_conn_create( &mut self, dest_type: u8, id: u8, protocol: u8, callback: ConnCallback, ) -> Result<u8>290*7eba2f3bSAndroid Build Coastguard Worker     pub async fn nfc_conn_create(
291*7eba2f3bSAndroid Build Coastguard Worker         &mut self,
292*7eba2f3bSAndroid Build Coastguard Worker         dest_type: u8,
293*7eba2f3bSAndroid Build Coastguard Worker         id: u8,
294*7eba2f3bSAndroid Build Coastguard Worker         protocol: u8,
295*7eba2f3bSAndroid Build Coastguard Worker         callback: ConnCallback,
296*7eba2f3bSAndroid Build Coastguard Worker     ) -> Result<u8> {
297*7eba2f3bSAndroid Build Coastguard Worker         let pbf = PacketBoundaryFlag::CompleteOrFinal;
298*7eba2f3bSAndroid Build Coastguard Worker         let mut destparams: Vec<DestParam> = vec![];
299*7eba2f3bSAndroid Build Coastguard Worker         let dt = DestTypes::try_from(dest_type).unwrap();
300*7eba2f3bSAndroid Build Coastguard Worker         match dt {
301*7eba2f3bSAndroid Build Coastguard Worker             DestTypes::NfccLpbk => (),
302*7eba2f3bSAndroid Build Coastguard Worker             DestTypes::Remote => {
303*7eba2f3bSAndroid Build Coastguard Worker                 let parameter = vec![id, protocol];
304*7eba2f3bSAndroid Build Coastguard Worker                 destparams.push(DestParam { ptype: DestParamTypes::RfDisc, parameter });
305*7eba2f3bSAndroid Build Coastguard Worker             }
306*7eba2f3bSAndroid Build Coastguard Worker             DestTypes::Nfcee => {
307*7eba2f3bSAndroid Build Coastguard Worker                 let parameter: Vec<u8> = vec![id, protocol];
308*7eba2f3bSAndroid Build Coastguard Worker                 destparams.push(DestParam { ptype: DestParamTypes::Nfcee, parameter });
309*7eba2f3bSAndroid Build Coastguard Worker             }
310*7eba2f3bSAndroid Build Coastguard Worker             _ => return Ok(nci::Status::InvalidParam as u8),
311*7eba2f3bSAndroid Build Coastguard Worker         }
312*7eba2f3bSAndroid Build Coastguard Worker         if let Some(cmd) = self.commands.as_mut() {
313*7eba2f3bSAndroid Build Coastguard Worker             let rp = cmd
314*7eba2f3bSAndroid Build Coastguard Worker                 .send(ConnCreateCommandBuilder { gid: 0, pbf, dt, destparams }.build().into())
315*7eba2f3bSAndroid Build Coastguard Worker                 .await?;
316*7eba2f3bSAndroid Build Coastguard Worker             if let ResponseChild::ConnCreateResponse(ccrp) = rp.specialize() {
317*7eba2f3bSAndroid Build Coastguard Worker                 let status = ccrp.get_status();
318*7eba2f3bSAndroid Build Coastguard Worker                 if status == nci::Status::Ok {
319*7eba2f3bSAndroid Build Coastguard Worker                     if let Some(conn) = self.connections.as_mut() {
320*7eba2f3bSAndroid Build Coastguard Worker                         conn.open(
321*7eba2f3bSAndroid Build Coastguard Worker                             ccrp.get_conn_id(),
322*7eba2f3bSAndroid Build Coastguard Worker                             Some(callback),
323*7eba2f3bSAndroid Build Coastguard Worker                             ccrp.get_mpps(),
324*7eba2f3bSAndroid Build Coastguard Worker                             ccrp.get_ncreds(),
325*7eba2f3bSAndroid Build Coastguard Worker                         )
326*7eba2f3bSAndroid Build Coastguard Worker                         .await;
327*7eba2f3bSAndroid Build Coastguard Worker                         let conn_create_evt =
328*7eba2f3bSAndroid Build Coastguard Worker                             [status as u8, dest_type, id, ccrp.get_mpps(), ccrp.get_ncreds()];
329*7eba2f3bSAndroid Build Coastguard Worker                         callback(ccrp.get_conn_id(), 0, &conn_create_evt[..]);
330*7eba2f3bSAndroid Build Coastguard Worker                     } else {
331*7eba2f3bSAndroid Build Coastguard Worker                         return Ok(nci::Status::NotInitialized as u8);
332*7eba2f3bSAndroid Build Coastguard Worker                     }
333*7eba2f3bSAndroid Build Coastguard Worker                 }
334*7eba2f3bSAndroid Build Coastguard Worker                 Ok(status as u8)
335*7eba2f3bSAndroid Build Coastguard Worker             } else {
336*7eba2f3bSAndroid Build Coastguard Worker                 Ok(nci::Status::Failed as u8)
337*7eba2f3bSAndroid Build Coastguard Worker             }
338*7eba2f3bSAndroid Build Coastguard Worker         } else {
339*7eba2f3bSAndroid Build Coastguard Worker             Ok(nci::Status::NotInitialized as u8)
340*7eba2f3bSAndroid Build Coastguard Worker         }
341*7eba2f3bSAndroid Build Coastguard Worker     }
342*7eba2f3bSAndroid Build Coastguard Worker 
343*7eba2f3bSAndroid Build Coastguard Worker     /** ****************************************************************************
344*7eba2f3bSAndroid Build Coastguard Worker      **
345*7eba2f3bSAndroid Build Coastguard Worker      ** Function         NFC_ConnClose
346*7eba2f3bSAndroid Build Coastguard Worker      **
347*7eba2f3bSAndroid Build Coastguard Worker      ** Description      This function is called to close a logical connection with
348*7eba2f3bSAndroid Build Coastguard Worker      **                  NFCC.
349*7eba2f3bSAndroid Build Coastguard Worker      **                  The response from NFCC is reported in tNFC_CONN_CBACK
350*7eba2f3bSAndroid Build Coastguard Worker      **                  as NFC_CONN_CLOSE_CEVT.
351*7eba2f3bSAndroid Build Coastguard Worker      **
352*7eba2f3bSAndroid Build Coastguard Worker      ** Parameters       conn_id - the connection id.
353*7eba2f3bSAndroid Build Coastguard Worker      **
354*7eba2f3bSAndroid Build Coastguard Worker      ** Returns          tNFC_STATUS
355*7eba2f3bSAndroid Build Coastguard Worker      **
356*7eba2f3bSAndroid Build Coastguard Worker      *******************************************************************************/
357*7eba2f3bSAndroid Build Coastguard Worker     //extern tNFC_STATUS NFC_ConnClose(uint8_t conn_id);
nfc_conn_close(&mut self, conn_id: u8) -> Result<u8>358*7eba2f3bSAndroid Build Coastguard Worker     pub async fn nfc_conn_close(&mut self, conn_id: u8) -> Result<u8> {
359*7eba2f3bSAndroid Build Coastguard Worker         let pbf = PacketBoundaryFlag::CompleteOrFinal;
360*7eba2f3bSAndroid Build Coastguard Worker         if let Some(conn) = self.connections.as_mut() {
361*7eba2f3bSAndroid Build Coastguard Worker             if let Some(cb) = conn.close(conn_id).await {
362*7eba2f3bSAndroid Build Coastguard Worker                 if let Some(cmd) = self.commands.as_mut() {
363*7eba2f3bSAndroid Build Coastguard Worker                     let rp = cmd
364*7eba2f3bSAndroid Build Coastguard Worker                         .send(ConnCloseCommandBuilder { gid: 0, pbf, conn_id }.build().into())
365*7eba2f3bSAndroid Build Coastguard Worker                         .await?;
366*7eba2f3bSAndroid Build Coastguard Worker                     if let ResponseChild::ConnCloseResponse(ccrp) = rp.specialize() {
367*7eba2f3bSAndroid Build Coastguard Worker                         let status = ccrp.get_status() as u8;
368*7eba2f3bSAndroid Build Coastguard Worker                         let conn_close_evt = [status];
369*7eba2f3bSAndroid Build Coastguard Worker                         cb(conn_id, 1, &conn_close_evt[..]);
370*7eba2f3bSAndroid Build Coastguard Worker                         return Ok(status);
371*7eba2f3bSAndroid Build Coastguard Worker                     } else {
372*7eba2f3bSAndroid Build Coastguard Worker                         return Ok(nci::Status::Failed as u8);
373*7eba2f3bSAndroid Build Coastguard Worker                     }
374*7eba2f3bSAndroid Build Coastguard Worker                 }
375*7eba2f3bSAndroid Build Coastguard Worker             } else {
376*7eba2f3bSAndroid Build Coastguard Worker                 return Ok(nci::Status::InvalidParam as u8);
377*7eba2f3bSAndroid Build Coastguard Worker             }
378*7eba2f3bSAndroid Build Coastguard Worker         }
379*7eba2f3bSAndroid Build Coastguard Worker         Ok(nci::Status::NotInitialized as u8)
380*7eba2f3bSAndroid Build Coastguard Worker     }
381*7eba2f3bSAndroid Build Coastguard Worker 
382*7eba2f3bSAndroid Build Coastguard Worker     /** *****************************************************************************
383*7eba2f3bSAndroid Build Coastguard Worker      **
384*7eba2f3bSAndroid Build Coastguard Worker      ** Function         NFC_SetStaticRfCback
385*7eba2f3bSAndroid Build Coastguard Worker      **
386*7eba2f3bSAndroid Build Coastguard Worker      ** Description      This function is called to update the data callback function
387*7eba2f3bSAndroid Build Coastguard Worker      **                  to receive the data for the given connection id.
388*7eba2f3bSAndroid Build Coastguard Worker      **
389*7eba2f3bSAndroid Build Coastguard Worker      ** Parameters       p_cback - the connection callback function
390*7eba2f3bSAndroid Build Coastguard Worker      **
391*7eba2f3bSAndroid Build Coastguard Worker      ** Returns          Nothing
392*7eba2f3bSAndroid Build Coastguard Worker      **
393*7eba2f3bSAndroid Build Coastguard Worker      *******************************************************************************/
394*7eba2f3bSAndroid Build Coastguard Worker     //extern void NFC_SetStaticRfCback(tNFC_CONN_CBACK* p_cback);
nfc_set_static_rf_callback(&mut self, callback: ConnCallback)395*7eba2f3bSAndroid Build Coastguard Worker     pub async fn nfc_set_static_rf_callback(&mut self, callback: ConnCallback) {
396*7eba2f3bSAndroid Build Coastguard Worker         self.nfc_data.rf_callback = Some(callback);
397*7eba2f3bSAndroid Build Coastguard Worker         if let Some(conn) = self.connections.as_mut() {
398*7eba2f3bSAndroid Build Coastguard Worker             conn.set_static_callback(0, Some(callback)).await;
399*7eba2f3bSAndroid Build Coastguard Worker         }
400*7eba2f3bSAndroid Build Coastguard Worker     }
401*7eba2f3bSAndroid Build Coastguard Worker 
402*7eba2f3bSAndroid Build Coastguard Worker     /** *****************************************************************************
403*7eba2f3bSAndroid Build Coastguard Worker      **
404*7eba2f3bSAndroid Build Coastguard Worker      ** Function         NFC_SetStaticHciCback
405*7eba2f3bSAndroid Build Coastguard Worker      **
406*7eba2f3bSAndroid Build Coastguard Worker      ** Description      This function to update the data callback function
407*7eba2f3bSAndroid Build Coastguard Worker      **                  to receive the data for the static Hci connection id.
408*7eba2f3bSAndroid Build Coastguard Worker      **
409*7eba2f3bSAndroid Build Coastguard Worker      ** Parameters       p_cback - the connection callback function
410*7eba2f3bSAndroid Build Coastguard Worker      **
411*7eba2f3bSAndroid Build Coastguard Worker      ** Returns          Nothing
412*7eba2f3bSAndroid Build Coastguard Worker      **
413*7eba2f3bSAndroid Build Coastguard Worker      *******************************************************************************/
414*7eba2f3bSAndroid Build Coastguard Worker     //extern void NFC_SetStaticHciCback(tNFC_CONN_CBACK* p_cback);
nfc_set_static_hci_callback(&mut self, callback: ConnCallback)415*7eba2f3bSAndroid Build Coastguard Worker     pub async fn nfc_set_static_hci_callback(&mut self, callback: ConnCallback) {
416*7eba2f3bSAndroid Build Coastguard Worker         self.nfc_data.hci_callback = Some(callback);
417*7eba2f3bSAndroid Build Coastguard Worker         if let Some(conn) = self.connections.as_mut() {
418*7eba2f3bSAndroid Build Coastguard Worker             conn.set_static_callback(1, Some(callback)).await;
419*7eba2f3bSAndroid Build Coastguard Worker         }
420*7eba2f3bSAndroid Build Coastguard Worker     }
421*7eba2f3bSAndroid Build Coastguard Worker 
422*7eba2f3bSAndroid Build Coastguard Worker     /*******************************************************************************
423*7eba2f3bSAndroid Build Coastguard Worker      **
424*7eba2f3bSAndroid Build Coastguard Worker      ** Function         NFC_SetReassemblyFlag
425*7eba2f3bSAndroid Build Coastguard Worker      **
426*7eba2f3bSAndroid Build Coastguard Worker      ** Description      This function is called to set if nfc will reassemble
427*7eba2f3bSAndroid Build Coastguard Worker      **                  nci packet as much as its buffer can hold or it should not
428*7eba2f3bSAndroid Build Coastguard Worker      **                  reassemble but forward the fragmented nci packet to layer
429*7eba2f3bSAndroid Build Coastguard Worker      **                  above. If nci data pkt is fragmented, nfc may send multiple
430*7eba2f3bSAndroid Build Coastguard Worker      **                  NFC_DATA_CEVT with status NFC_STATUS_CONTINUE before sending
431*7eba2f3bSAndroid Build Coastguard Worker      **                  NFC_DATA_CEVT with status NFC_STATUS_OK based on reassembly
432*7eba2f3bSAndroid Build Coastguard Worker      **                  configuration and reassembly buffer size
433*7eba2f3bSAndroid Build Coastguard Worker      **
434*7eba2f3bSAndroid Build Coastguard Worker      ** Parameters       reassembly - flag to indicate if nfc may reassemble or not
435*7eba2f3bSAndroid Build Coastguard Worker      **
436*7eba2f3bSAndroid Build Coastguard Worker      ** Returns          Nothing
437*7eba2f3bSAndroid Build Coastguard Worker      **
438*7eba2f3bSAndroid Build Coastguard Worker      *******************************************************************************/
439*7eba2f3bSAndroid Build Coastguard Worker     //extern void NFC_SetReassemblyFlag(bool reassembly);
440*7eba2f3bSAndroid Build Coastguard Worker 
441*7eba2f3bSAndroid Build Coastguard Worker     /** ****************************************************************************
442*7eba2f3bSAndroid Build Coastguard Worker      **
443*7eba2f3bSAndroid Build Coastguard Worker      ** Function         NFC_SendData
444*7eba2f3bSAndroid Build Coastguard Worker      **
445*7eba2f3bSAndroid Build Coastguard Worker      ** Description      This function is called to send the given data packet
446*7eba2f3bSAndroid Build Coastguard Worker      **                  to the connection identified by the given connection id.
447*7eba2f3bSAndroid Build Coastguard Worker      **
448*7eba2f3bSAndroid Build Coastguard Worker      ** Parameters       conn_id - the connection id.
449*7eba2f3bSAndroid Build Coastguard Worker      **                  p_data - the data packet
450*7eba2f3bSAndroid Build Coastguard Worker      **
451*7eba2f3bSAndroid Build Coastguard Worker      ** Returns          tNFC_STATUS
452*7eba2f3bSAndroid Build Coastguard Worker      **
453*7eba2f3bSAndroid Build Coastguard Worker      *******************************************************************************/
454*7eba2f3bSAndroid Build Coastguard Worker     //extern tNFC_STATUS NFC_SendData(uint8_t conn_id, NFC_HDR* p_data);
nfc_send_data(&mut self, conn_id: u8, data: &[u8]) -> Result<u8>455*7eba2f3bSAndroid Build Coastguard Worker     pub async fn nfc_send_data(&mut self, conn_id: u8, data: &[u8]) -> Result<u8> {
456*7eba2f3bSAndroid Build Coastguard Worker         if let Some(conn) = self.connections.as_mut() {
457*7eba2f3bSAndroid Build Coastguard Worker             match DataPacket::parse(data) {
458*7eba2f3bSAndroid Build Coastguard Worker                 Ok(pkt) => {
459*7eba2f3bSAndroid Build Coastguard Worker                     conn.send_packet(conn_id, pkt).await;
460*7eba2f3bSAndroid Build Coastguard Worker                     return Ok(nci::Status::Ok as u8);
461*7eba2f3bSAndroid Build Coastguard Worker                 }
462*7eba2f3bSAndroid Build Coastguard Worker                 Err(e) => {
463*7eba2f3bSAndroid Build Coastguard Worker                     error!("Data packet is invalid:{:?}", e);
464*7eba2f3bSAndroid Build Coastguard Worker                     return Ok(nci::Status::InvalidParam as u8);
465*7eba2f3bSAndroid Build Coastguard Worker                 }
466*7eba2f3bSAndroid Build Coastguard Worker             }
467*7eba2f3bSAndroid Build Coastguard Worker         }
468*7eba2f3bSAndroid Build Coastguard Worker         Ok(nci::Status::NotInitialized as u8)
469*7eba2f3bSAndroid Build Coastguard Worker     }
470*7eba2f3bSAndroid Build Coastguard Worker 
471*7eba2f3bSAndroid Build Coastguard Worker     /** ****************************************************************************
472*7eba2f3bSAndroid Build Coastguard Worker      **
473*7eba2f3bSAndroid Build Coastguard Worker      ** Function         NFC_FlushData
474*7eba2f3bSAndroid Build Coastguard Worker      **
475*7eba2f3bSAndroid Build Coastguard Worker      ** Description      This function is called to discard the tx data queue of
476*7eba2f3bSAndroid Build Coastguard Worker      **                  the given connection id.
477*7eba2f3bSAndroid Build Coastguard Worker      **
478*7eba2f3bSAndroid Build Coastguard Worker      ** Parameters       conn_id - the connection id.
479*7eba2f3bSAndroid Build Coastguard Worker      **
480*7eba2f3bSAndroid Build Coastguard Worker      ** Returns          tNFC_STATUS
481*7eba2f3bSAndroid Build Coastguard Worker      **
482*7eba2f3bSAndroid Build Coastguard Worker      *******************************************************************************/
483*7eba2f3bSAndroid Build Coastguard Worker     //extern tNFC_STATUS NFC_FlushData(uint8_t conn_id);
nfc_flush_data(&mut self, conn_id: u8) -> Result<u8>484*7eba2f3bSAndroid Build Coastguard Worker     pub async fn nfc_flush_data(&mut self, conn_id: u8) -> Result<u8> {
485*7eba2f3bSAndroid Build Coastguard Worker         if let Some(conn) = self.connections.as_mut() {
486*7eba2f3bSAndroid Build Coastguard Worker             if conn.flush_data(conn_id).await {
487*7eba2f3bSAndroid Build Coastguard Worker                 Ok(nci::Status::Ok as u8)
488*7eba2f3bSAndroid Build Coastguard Worker             } else {
489*7eba2f3bSAndroid Build Coastguard Worker                 Ok(nci::Status::Failed as u8)
490*7eba2f3bSAndroid Build Coastguard Worker             }
491*7eba2f3bSAndroid Build Coastguard Worker         } else {
492*7eba2f3bSAndroid Build Coastguard Worker             Ok(nci::Status::NotInitialized as u8)
493*7eba2f3bSAndroid Build Coastguard Worker         }
494*7eba2f3bSAndroid Build Coastguard Worker     }
495*7eba2f3bSAndroid Build Coastguard Worker 
496*7eba2f3bSAndroid Build Coastguard Worker     /** ****************************************************************************
497*7eba2f3bSAndroid Build Coastguard Worker      **
498*7eba2f3bSAndroid Build Coastguard Worker      ** Function         NFC_DiscoveryMap
499*7eba2f3bSAndroid Build Coastguard Worker      **
500*7eba2f3bSAndroid Build Coastguard Worker      ** Description      This function is called to set the discovery interface
501*7eba2f3bSAndroid Build Coastguard Worker      **                  mapping. The response from NFCC is reported by
502*7eba2f3bSAndroid Build Coastguard Worker      **                  tNFC_DISCOVER_CBACK as. NFC_MAP_DEVT.
503*7eba2f3bSAndroid Build Coastguard Worker      **
504*7eba2f3bSAndroid Build Coastguard Worker      ** Parameters       num - the number of items in p_params.
505*7eba2f3bSAndroid Build Coastguard Worker      **                  p_maps - the discovery interface mappings
506*7eba2f3bSAndroid Build Coastguard Worker      **                  p_cback - the discovery callback function
507*7eba2f3bSAndroid Build Coastguard Worker      **
508*7eba2f3bSAndroid Build Coastguard Worker      ** Returns          tNFC_STATUS
509*7eba2f3bSAndroid Build Coastguard Worker      **
510*7eba2f3bSAndroid Build Coastguard Worker      *******************************************************************************/
511*7eba2f3bSAndroid Build Coastguard Worker     // extern tNFC_STATUS NFC_DiscoveryMap(uint8_t num, tNFC_DISCOVER_MAPS* p_maps,
512*7eba2f3bSAndroid Build Coastguard Worker     //                                    tNFC_DISCOVER_CBACK* p_cback);
nfc_discovery_map(&mut self, _maps: Vec<RfMappingConfiguration>) -> Result<u8>513*7eba2f3bSAndroid Build Coastguard Worker     pub async fn nfc_discovery_map(&mut self, _maps: Vec<RfMappingConfiguration>) -> Result<u8> {
514*7eba2f3bSAndroid Build Coastguard Worker         Ok(0)
515*7eba2f3bSAndroid Build Coastguard Worker     }
516*7eba2f3bSAndroid Build Coastguard Worker 
517*7eba2f3bSAndroid Build Coastguard Worker     /*******************************************************************************
518*7eba2f3bSAndroid Build Coastguard Worker      **
519*7eba2f3bSAndroid Build Coastguard Worker      ** Function         NFC_DiscoveryStart
520*7eba2f3bSAndroid Build Coastguard Worker      **
521*7eba2f3bSAndroid Build Coastguard Worker      ** Description      This function is called to start Polling and/or Listening.
522*7eba2f3bSAndroid Build Coastguard Worker      **                  The response from NFCC is reported by tNFC_DISCOVER_CBACK
523*7eba2f3bSAndroid Build Coastguard Worker      **                  as NFC_START_DEVT. The notification from NFCC is reported by
524*7eba2f3bSAndroid Build Coastguard Worker      **                  tNFC_DISCOVER_CBACK as NFC_RESULT_DEVT.
525*7eba2f3bSAndroid Build Coastguard Worker      **
526*7eba2f3bSAndroid Build Coastguard Worker      ** Parameters       num_params - the number of items in p_params.
527*7eba2f3bSAndroid Build Coastguard Worker      **                  p_params - the discovery parameters
528*7eba2f3bSAndroid Build Coastguard Worker      **                  p_cback - the discovery callback function
529*7eba2f3bSAndroid Build Coastguard Worker      **
530*7eba2f3bSAndroid Build Coastguard Worker      ** Returns          tNFC_STATUS
531*7eba2f3bSAndroid Build Coastguard Worker      **
532*7eba2f3bSAndroid Build Coastguard Worker      *******************************************************************************/
533*7eba2f3bSAndroid Build Coastguard Worker     // extern tNFC_STATUS NFC_DiscoveryStart(uint8_t num_params,
534*7eba2f3bSAndroid Build Coastguard Worker     //                                       tNFC_DISCOVER_PARAMS* p_params,
535*7eba2f3bSAndroid Build Coastguard Worker     //                                       tNFC_DISCOVER_CBACK* p_cback);
536*7eba2f3bSAndroid Build Coastguard Worker 
537*7eba2f3bSAndroid Build Coastguard Worker     /*******************************************************************************
538*7eba2f3bSAndroid Build Coastguard Worker      **
539*7eba2f3bSAndroid Build Coastguard Worker      ** Function         NFC_DiscoverySelect
540*7eba2f3bSAndroid Build Coastguard Worker      **
541*7eba2f3bSAndroid Build Coastguard Worker      ** Description      If tNFC_DISCOVER_CBACK reports status=NFC_MULTIPLE_PROT,
542*7eba2f3bSAndroid Build Coastguard Worker      **                  the application needs to use this function to select the
543*7eba2f3bSAndroid Build Coastguard Worker      **                  the logical endpoint to continue. The response from NFCC is
544*7eba2f3bSAndroid Build Coastguard Worker      **                  reported by tNFC_DISCOVER_CBACK as NFC_SELECT_DEVT.
545*7eba2f3bSAndroid Build Coastguard Worker      **
546*7eba2f3bSAndroid Build Coastguard Worker      ** Parameters       rf_disc_id - The ID identifies the remote device.
547*7eba2f3bSAndroid Build Coastguard Worker      **                  protocol - the logical endpoint on the remote device
548*7eba2f3bSAndroid Build Coastguard Worker      **                  rf_interface - the RF interface to communicate with NFCC
549*7eba2f3bSAndroid Build Coastguard Worker      **
550*7eba2f3bSAndroid Build Coastguard Worker      ** Returns          tNFC_STATUS
551*7eba2f3bSAndroid Build Coastguard Worker      **
552*7eba2f3bSAndroid Build Coastguard Worker      *******************************************************************************/
553*7eba2f3bSAndroid Build Coastguard Worker     // extern tNFC_STATUS NFC_DiscoverySelect(uint8_t rf_disc_id, uint8_t protocol,
554*7eba2f3bSAndroid Build Coastguard Worker     //                                        uint8_t rf_interface);
555*7eba2f3bSAndroid Build Coastguard Worker }
556*7eba2f3bSAndroid Build Coastguard Worker 
557*7eba2f3bSAndroid Build Coastguard Worker impl Default for NciApi {
default() -> Self558*7eba2f3bSAndroid Build Coastguard Worker     fn default() -> Self {
559*7eba2f3bSAndroid Build Coastguard Worker         Self::new()
560*7eba2f3bSAndroid Build Coastguard Worker     }
561*7eba2f3bSAndroid Build Coastguard Worker }
562