2014-05-26 00:35:38 +04:00
/*
* NCI based Driver for STMicroelectronics NFC Chip
*
* Copyright ( C ) 2014 STMicroelectronics SAS . All rights reserved .
*
* This program is free software ; you can redistribute it and / or modify it
* under the terms and conditions of the GNU General Public License ,
* version 2 , as published by the Free Software Foundation .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , see < http : //www.gnu.org/licenses/>.
*/
2015-06-09 23:26:05 +03:00
# ifndef __LOCAL_ST_NCI_H_
# define __LOCAL_ST_NCI_H_
2014-05-26 00:35:38 +04:00
# include "ndlc.h"
/* Define private flags: */
2015-06-09 23:26:05 +03:00
# define ST_NCI_RUNNING 1
2014-05-26 00:35:38 +04:00
2015-06-09 23:26:05 +03:00
# define ST_NCI_CORE_PROP 0x01
# define ST_NCI_SET_NFC_MODE 0x02
2015-06-06 14:16:52 +03:00
2015-10-26 07:55:22 +03:00
/*
* ref ISO7816 - 3 chap 8.1 . the initial character TS is followed by a
* sequence of at most 32 characters .
*/
# define ST_NCI_ESE_MAX_LENGTH 33
2015-10-26 00:54:36 +03:00
# define ST_NCI_DEVICE_MGNT_GATE 0x01
# define ST_NCI_VENDOR_OUI 0x0080E1 /* STMicroelectronics */
# define ST_NCI_FACTORY_MODE 2
2015-06-06 14:16:52 +03:00
struct nci_mode_set_cmd {
u8 cmd_type ;
u8 mode ;
} __packed ;
2015-06-06 14:16:47 +03:00
struct nci_mode_set_rsp {
u8 status ;
} __packed ;
2015-10-26 00:54:39 +03:00
struct st_nci_se_status {
bool is_ese_present ;
bool is_uicc_present ;
} ;
2015-10-26 07:55:22 +03:00
struct st_nci_se_info {
2015-10-26 00:54:39 +03:00
struct st_nci_se_status * se_status ;
2015-10-26 07:55:22 +03:00
u8 atr [ ST_NCI_ESE_MAX_LENGTH ] ;
struct completion req_completion ;
struct timer_list bwi_timer ;
int wt_timeout ; /* in msecs */
bool bwi_active ;
struct timer_list se_active_timer ;
bool se_active ;
bool xch_error ;
se_io_cb_t cb ;
void * cb_context ;
} ;
2015-10-26 00:54:36 +03:00
/**
* enum nfc_vendor_cmds - supported nfc vendor commands
*
* @ FACTORY_MODE : Allow to set the driver into a mode where no secure element
* are activated . It does not consider any NFC_ATTR_VENDOR_DATA .
* @ HCI_CLEAR_ALL_PIPES : Allow to execute a HCI clear all pipes command .
* It does not consider any NFC_ATTR_VENDOR_DATA .
* @ HCI_DM_PUT_DATA : Allow to configure specific CLF registry as for example
* RF trimmings or low level drivers configurations ( I2C , SPI , SWP ) .
* @ HCI_DM_UPDATE_AID : Allow to configure an AID routing into the CLF routing
* table following RF technology , CLF mode or protocol .
* @ HCI_DM_GET_INFO : Allow to retrieve CLF information .
* @ HCI_DM_GET_DATA : Allow to retrieve CLF configurable data such as low
* level drivers configurations or RF trimmings .
* @ HCI_DM_DIRECT_LOAD : Allow to load a firmware into the CLF . A complete
* packet can be more than 8 KB .
* @ HCI_DM_RESET : Allow to run a CLF reset in order to " commit " CLF
* configuration changes without CLF power off .
* @ HCI_GET_PARAM : Allow to retrieve an HCI CLF parameter ( for example the
* white list ) .
* @ HCI_DM_FIELD_GENERATOR : Allow to generate different kind of RF
* technology . When using this command to anti - collision is done .
2016-04-30 10:12:53 +03:00
* @ LOOPBACK : Allow to echo a command and test the Dh to CLF connectivity .
2015-10-26 00:54:36 +03:00
* @ HCI_DM_VDC_MEASUREMENT_VALUE : Allow to measure the field applied on the
* CLF antenna . A value between 0 and 0x0f is returned . 0 is maximum .
* @ HCI_DM_FWUPD_START : Allow to put CLF into firmware update mode . It is a
* specific CLF command as there is no GPIO for this .
* @ HCI_DM_FWUPD_END : Allow to complete firmware update .
* @ HCI_DM_VDC_VALUE_COMPARISON : Allow to compare the field applied on the
* CLF antenna to a reference value .
* @ MANUFACTURER_SPECIFIC : Allow to retrieve manufacturer specific data
* received during a NCI_CORE_INIT_CMD .
*/
enum nfc_vendor_cmds {
FACTORY_MODE ,
HCI_CLEAR_ALL_PIPES ,
HCI_DM_PUT_DATA ,
HCI_DM_UPDATE_AID ,
HCI_DM_GET_INFO ,
HCI_DM_GET_DATA ,
HCI_DM_DIRECT_LOAD ,
HCI_DM_RESET ,
HCI_GET_PARAM ,
HCI_DM_FIELD_GENERATOR ,
2016-04-30 10:12:53 +03:00
LOOPBACK ,
2015-10-26 00:54:36 +03:00
HCI_DM_FWUPD_START ,
HCI_DM_FWUPD_END ,
HCI_DM_VDC_MEASUREMENT_VALUE ,
HCI_DM_VDC_VALUE_COMPARISON ,
MANUFACTURER_SPECIFIC ,
} ;
2015-06-09 23:26:05 +03:00
struct st_nci_info {
2014-05-26 00:35:38 +04:00
struct llt_ndlc * ndlc ;
unsigned long flags ;
2015-10-26 00:54:39 +03:00
2015-06-09 23:26:05 +03:00
struct st_nci_se_info se_info ;
2014-05-26 00:35:38 +04:00
} ;
2015-06-09 23:26:05 +03:00
void st_nci_remove ( struct nci_dev * ndev ) ;
int st_nci_probe ( struct llt_ndlc * ndlc , int phy_headroom ,
2015-10-26 00:54:39 +03:00
int phy_tailroom , struct st_nci_se_status * se_status ) ;
2014-05-26 00:35:38 +04:00
2015-10-26 00:54:39 +03:00
int st_nci_se_init ( struct nci_dev * ndev , struct st_nci_se_status * se_status ) ;
2015-10-26 07:55:22 +03:00
void st_nci_se_deinit ( struct nci_dev * ndev ) ;
int st_nci_discover_se ( struct nci_dev * ndev ) ;
int st_nci_enable_se ( struct nci_dev * ndev , u32 se_idx ) ;
int st_nci_disable_se ( struct nci_dev * ndev , u32 se_idx ) ;
int st_nci_se_io ( struct nci_dev * ndev , u32 se_idx ,
u8 * apdu , size_t apdu_length ,
se_io_cb_t cb , void * cb_context ) ;
int st_nci_hci_load_session ( struct nci_dev * ndev ) ;
void st_nci_hci_event_received ( struct nci_dev * ndev , u8 pipe ,
u8 event , struct sk_buff * skb ) ;
void st_nci_hci_cmd_received ( struct nci_dev * ndev , u8 pipe , u8 cmd ,
struct sk_buff * skb ) ;
2015-10-26 00:54:36 +03:00
int st_nci_vendor_cmds_init ( struct nci_dev * ndev ) ;
2015-06-09 23:26:05 +03:00
# endif /* __LOCAL_ST_NCI_H_ */