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