1cbe590cb9f7c3d3cfe4b5147e8fe92fec60bbe06Martijn Coenen/*
2cbe590cb9f7c3d3cfe4b5147e8fe92fec60bbe06Martijn Coenen * Copyright (C) 2016 The Android Open Source Project
3cbe590cb9f7c3d3cfe4b5147e8fe92fec60bbe06Martijn Coenen *
4cbe590cb9f7c3d3cfe4b5147e8fe92fec60bbe06Martijn Coenen * Licensed under the Apache License, Version 2.0 (the "License");
5cbe590cb9f7c3d3cfe4b5147e8fe92fec60bbe06Martijn Coenen * you may not use this file except in compliance with the License.
6cbe590cb9f7c3d3cfe4b5147e8fe92fec60bbe06Martijn Coenen * You may obtain a copy of the License at
7cbe590cb9f7c3d3cfe4b5147e8fe92fec60bbe06Martijn Coenen *
8cbe590cb9f7c3d3cfe4b5147e8fe92fec60bbe06Martijn Coenen *      http://www.apache.org/licenses/LICENSE-2.0
9cbe590cb9f7c3d3cfe4b5147e8fe92fec60bbe06Martijn Coenen *
10cbe590cb9f7c3d3cfe4b5147e8fe92fec60bbe06Martijn Coenen * Unless required by applicable law or agreed to in writing, software
11cbe590cb9f7c3d3cfe4b5147e8fe92fec60bbe06Martijn Coenen * distributed under the License is distributed on an "AS IS" BASIS,
12cbe590cb9f7c3d3cfe4b5147e8fe92fec60bbe06Martijn Coenen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13cbe590cb9f7c3d3cfe4b5147e8fe92fec60bbe06Martijn Coenen * See the License for the specific language governing permissions and
14cbe590cb9f7c3d3cfe4b5147e8fe92fec60bbe06Martijn Coenen * limitations under the License.
15cbe590cb9f7c3d3cfe4b5147e8fe92fec60bbe06Martijn Coenen */
16cbe590cb9f7c3d3cfe4b5147e8fe92fec60bbe06Martijn Coenen
17a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huberpackage android.hardware.nfc@1.0;
18a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber
19a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huberimport INfcClientCallback;
20a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber
21a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huberinterface INfc {
22675ae49ab1bb061503044aa8add426f49e1723a2Andreas Huber    /**
23a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     * Opens the NFC controller device and performs initialization.
24a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     * This may include patch download and other vendor-specific initialization.
25a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     *
26a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     * If open completes successfully, the controller should be ready to perform
27a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     * NCI initialization - ie accept CORE_RESET and subsequent commands through
28a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     * the write() call.
29a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     *
3051068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi     * If open() returns NfcStatus::OK, the NCI stack will wait for a
3151068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi     * NfcEvent.OPEN_CPLT before continuing.
32a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     *
3351068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi     * If open() returns NfcStatus::FAILED, the NCI stack will stop.
34a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     *
35a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     */
36846d9ab9faadf6131a22c9e6c0ba81cfbffe448cRuchi Kandoi    @entry
37846d9ab9faadf6131a22c9e6c0ba81cfbffe448cRuchi Kandoi    @callflow(next={"write", "coreInitialized", "prediscover", "powerCycle", "controlGranted"})
3851068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi    open(INfcClientCallback clientCallback) generates (NfcStatus status);
39a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber
40675ae49ab1bb061503044aa8add426f49e1723a2Andreas Huber    /**
41a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     * Performs an NCI write.
42a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     *
43a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     * This method may queue writes and return immediately. The only
44a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     * requirement is that the writes are executed in order.
4551068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi     *
4651068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi     * @return number of bytes written to the NFCC
47a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     */
48846d9ab9faadf6131a22c9e6c0ba81cfbffe448cRuchi Kandoi    @callflow(next={"write", "prediscover", "coreInitialized", "close", "powerCycle",
49846d9ab9faadf6131a22c9e6c0ba81cfbffe448cRuchi Kandoi                    "controlGranted"})
5051068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi    write(NfcData data) generates (uint32_t retval);
51a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber
52675ae49ab1bb061503044aa8add426f49e1723a2Andreas Huber    /**
5351068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi     * coreInitialized() is called after the CORE_INIT_RSP is received from the
5451068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi     * NFCC. At this time, the HAL can do any chip-specific configuration.
55a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     *
5651068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi     * If coreInitialized() returns NfcStatus::OK, the NCI stack will wait for a
5751068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi     * NfcEvent.POST_INIT_CPLT before continuing.
58a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     *
5951068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi     * If coreInitialized() returns NfcStatus::FAILED, the NCI stack will
6051068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi     * continue immediately.
61a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     */
62846d9ab9faadf6131a22c9e6c0ba81cfbffe448cRuchi Kandoi    @callflow(next={"write", "prediscover", "close"})
6351068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi    coreInitialized(NfcData data) generates (NfcStatus status);
64a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber
65675ae49ab1bb061503044aa8add426f49e1723a2Andreas Huber    /**
66cffe8d5df49133a91711235c3b133e3bf48cdf98Steven Moreland     * prediscover is called every time before starting RF discovery.
67a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     * It is a good place to do vendor-specific configuration that must be
68a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     * performed every time RF discovery is about to be started.
69a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     *
7051068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi     * If prediscover() returns NfcStatus::OK, the NCI stack will wait for a
7151068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi     * NfcEvent.PREDISCOVER_CPLT before continuing.
72a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     *
7351068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi     * If prediscover() returns NfcStatus::FAILED, the NCI stack will start
74a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     * RF discovery immediately.
75a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     */
76846d9ab9faadf6131a22c9e6c0ba81cfbffe448cRuchi Kandoi    @callflow(next={"write", "close", "coreInitialized", "powerCycle", "controlGranted"})
7751068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi    prediscover() generates (NfcStatus status);
78a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber
79675ae49ab1bb061503044aa8add426f49e1723a2Andreas Huber    /**
80a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     * Close the NFC controller. Should free all resources.
8151068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi     *
8251068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi     * @return NfcStatus::OK on success and NfcStatus::FAILED on error.
83a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     */
84846d9ab9faadf6131a22c9e6c0ba81cfbffe448cRuchi Kandoi    @exit
8551068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi    close() generates (NfcStatus status);
86a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber
87675ae49ab1bb061503044aa8add426f49e1723a2Andreas Huber    /**
88a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     * Grant HAL the exclusive control to send NCI commands.
89cffe8d5df49133a91711235c3b133e3bf48cdf98Steven Moreland     * Called in response to NfcEvent.REQUEST_CONTROL.
90a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     * Must only be called when there are no NCI commands pending.
91cffe8d5df49133a91711235c3b133e3bf48cdf98Steven Moreland     * NfcEvent.RELEASE_CONTROL will notify when HAL no longer needs exclusive control.
9251068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi     *
9351068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi     * @return NfcStatus::OK on success and NfcStatus::FAILED on error.
94a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     */
95846d9ab9faadf6131a22c9e6c0ba81cfbffe448cRuchi Kandoi    @callflow(next={"write", "close", "prediscover", "coreInitialized", "powerCycle"})
9651068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi    controlGranted() generates (NfcStatus status);
97a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber
98675ae49ab1bb061503044aa8add426f49e1723a2Andreas Huber     /**
99a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     * Restart controller by power cyle;
100cffe8d5df49133a91711235c3b133e3bf48cdf98Steven Moreland     * NfcEvent.OPEN_CPLT will notify when operation is complete.
10151068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi     *
10251068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi     * @return NfcStatus::OK on success and NfcStatus::FAILED on error.
103a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber     */
104846d9ab9faadf6131a22c9e6c0ba81cfbffe448cRuchi Kandoi    @callflow(next={"write", "coreInitialized", "prediscover", "controlGranted", "close"})
10551068e0bd3477a27b447e211a13c3eec7b472899Ruchi Kandoi    powerCycle() generates (NfcStatus status);
106a48313947e6e6eeaa87b01d795f0c7bc76373a09Andreas Huber};
107