blob: 153cd991dcd32a4aa5fe23d8162038305a58167f [file] [log] [blame]
/*
* Copyright (C) 2013 SAMSUNG S.LSI
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
#ifndef __NFC_SEC_HAL__
#define __NFC_SEC_HAL__
#include <hardware/nfc.h>
#include "hal_msg.h"
#include "osi.h"
#include "android/hardware/nfc/1.2/INfc.h"
#include "android/hardware/nfc/1.2/types.h"
using ::android::hardware::nfc::V1_1::NfcConfig;
#ifndef __bool_true_false_are_defined
#define __bool_true_false_are_defined
typedef enum { false, true } bool;
#endif
/***************************************
* DEVICE
***************************************/
typedef enum {
NFC_DEV_MODE_OFF = 0,
NFC_DEV_MODE_ON,
NFC_DEV_MODE_BOOTLOADER,
} eNFC_DEV_MODE;
/***************************************
* States
***************************************/
typedef enum {
HAL_STATE_INIT,
HAL_STATE_DEINIT,
HAL_STATE_OPEN,
HAL_STATE_VS,
HAL_STATE_POSTINIT,
HAL_STATE_SERVICE,
HAL_STATE_GRANTED,
HAL_STATE_CLOSE, /* VTS */
HAL_STATE_POWERCYCLE, /* VTS */
} eHAL_STATE;
/* FW sub-state */
#define FW_DATA_PAYLOAD_MAX (256)
/* VS sub-state */
typedef enum {
VS_INIT,
VS_W4_COMPLETE,
} eNFC_HAL_VS_STATE;
/***************************************
* Structures
***************************************/
/* VS related */
typedef struct {
eNFC_HAL_VS_STATE state;
} tNFC_HAL_VS_INFO;
enum {
CFG_SLEEP_TIMEOUT = 0,
CFG_WAKEUP_DELAY,
CFG_NCI_PROP,
CFG_POWER_DRIVER,
CFG_TRANS_DRIVER,
CFG_TRACE_LEVEL,
CFG_DATA_TRACE,
CFG_FW_CLK_SPEED,
};
static const char* cfg_name_table[] = {
"SLEEP_TIMEOUT", "WAKEUP_DELAY", "NCI_PROP", "POWER_DRIVER",
"TRANS_DRIVER", "TRACE_LEVEL", "DATA_TRACE", "FW_CFG_CLK_SPEED",
};
typedef struct {
uint32_t sleep_timeout;
uint32_t override_timeout;
} tNFC_HAL_CONFIG;
/* Granted related */
#define HAL_GRANT_SEND_NEXT 0x00
#define HAL_GRANT_WAIT_READ 0x01
#define HAL_GRANT_FINISH 0x02
typedef uint8_t(tNFC_HAL_GRANT_CALLBACK)(tNFC_NCI_PKT* pkt);
/* FLAGS */
#define HAL_FLAG_MASK_USING_TIMER 0x000F
#define HAL_FLAG_W4_CORE_RESET_RSP 0x0001
#define HAL_FLAG_W4_CORE_INIT_RSP 0x0002
#define HAL_FLAG_PROP_RESET 0x0010
#define HAL_FLAG_CLK_SET 0x0020
#define HAL_FLAG_PROP_ONE_TIMER 0x0040
#define HAL_FLAG_MASK_ALREADY 0x0F00
#define HAL_FLAG_ALREADY_RESET 0x0100
#define HAL_FLAG_ALREADY_INIT 0x0200
#define HAL_FLAG_MASK_SYSTEM 0xF000
#define HAL_FLAG_FORCE_FW_UPDATE 0x1000
#define HAL_FLAG_NTF_TRNS_ERROR 0x2000
#define HAL_FLAG_RETRY_TRNS 0x4000
/***************************************
* Main information(context block)
***************************************/
typedef struct {
tNFC_HAL_CONFIG cfg;
eHAL_STATE state; /* HAL state */
tNFC_HAL_VS_INFO vs_info;
tOSI_TASK_HANDLER msg_task; /* HAL main task */
tOSI_QUEUE_HANDLER msg_q;
nfc_stack_callback_t* stack_cback; /* Callback for HAL event */
nfc_stack_data_callback_t* data_cback; /* Callback for data event */
tNFC_NCI_PKT* nci_last_pkt; /* last sent package */
tNFC_NCI_PKT* nci_fragment_pkt; /* Control msg flagmentation */
tOSI_TIMER_HANDLER nci_timer; /* Timer for NCI message */
tOSI_TIMER_HANDLER sleep_timer; /* Timer for NCI message */
int trans_dev; /* transport device */
int power_dev; /* power device */
tOSI_QUEUE_HANDLER nci_q;
tNFC_HAL_GRANT_CALLBACK* grant_cback;
unsigned int flag;
/* START [H16031401] */
uint8_t msg_event; /* receiving message event */
/* END [H16031401] */
} tNFC_HAL_CB;
/*************************************
* Global
*************************************/
extern tNFC_HAL_CB nfc_hal_info;
/*************************************
* NFC HAL API prototype
*************************************/
int nfc_hal_init(void);
void nfc_hal_deinit(void);
int nfc_hal_open(nfc_stack_callback_t* p_cback,
nfc_stack_data_callback_t* p_data_cback);
int nfc_hal_write(uint16_t data_len, const uint8_t* p_data);
int nfc_hal_core_initialized(uint8_t* p_core_init_rsp_params);
int nfc_hal_pre_discover();
int nfc_hal_close();
int nfc_hal_control_granted();
int nfc_hal_power_cycle();
// HIDL INfc 1.1
int nfc_hal_factory_reset(void);
int nfc_hal_closeForPowerOffCase(void);
void nfc_hal_getVendorConfig(NfcConfig& config); // To-Do
/*************************************
* NFC HAL functions.
*************************************/
bool nfc_stack_cback(nfc_event_t event, nfc_status_t event_status);
bool nfc_data_callback(tNFC_NCI_PKT* pkt);
void nfc_hal_task(void);
/* START - VTS */
void nfc_hal_power_sm(tNFC_HAL_MSG* msg);
/* END - VTS */
void nfc_hal_grant_sm(tNFC_HAL_MSG* msg);
void nfc_hal_service_sm(tNFC_HAL_MSG* msg);
void nfc_hal_vs_sm(tNFC_HAL_MSG* msg);
void nfc_hal_postinit_sm(tNFC_HAL_MSG* msg);
void nfc_hal_open_sm(tNFC_HAL_MSG* msg);
void setSleepTimeout(int option, uint32_t timeout);
const char* event_to_string(uint8_t event);
const char* state_to_string(eHAL_STATE state);
// SM
void hal_update_sleep_timer(void);
int __send_to_device(uint8_t* data, size_t len);
// FW
void fw_force_update(void* param);
int nfc_fw_send_data(uint8_t* data, int len);
int fw_read_payload(tNFC_HAL_MSG* msg);
// NCI
int hal_nci_send(tNFC_NCI_PKT* pkt);
void hal_nci_send_reset(void);
void hal_nci_send_prop_fw_cfg(void);
void hal_nci_send_clearLmrt(void);
void nci_init_timeout(void* param);
bool nfc_hal_prehandler(tNFC_NCI_PKT* pkt);
int nci_read_payload(tNFC_HAL_MSG* msg);
// TRACE
void sec_nci_analyzer(tNFC_NCI_PKT* pkt);
#endif // __NFC_SEC_HAL__