Exemple #1
0
static void nci_init_complete_req(struct nci_dev *ndev, unsigned long opt)
{
	struct nci_rf_disc_map_cmd cmd;
	struct disc_map_config *cfg = cmd.mapping_configs;
	__u8 *num = &cmd.num_mapping_configs;
	int i;

	/* set rf mapping configurations */
	*num = 0;

	/* by default mapping is set to NCI_RF_INTERFACE_FRAME */
	for (i = 0; i < ndev->num_supported_rf_interfaces; i++) {
		if (ndev->supported_rf_interfaces[i] ==
		    NCI_RF_INTERFACE_ISO_DEP) {
			cfg[*num].rf_protocol = NCI_RF_PROTOCOL_ISO_DEP;
			cfg[*num].mode = NCI_DISC_MAP_MODE_POLL |
				NCI_DISC_MAP_MODE_LISTEN;
			cfg[*num].rf_interface = NCI_RF_INTERFACE_ISO_DEP;
			(*num)++;
		} else if (ndev->supported_rf_interfaces[i] ==
			   NCI_RF_INTERFACE_NFC_DEP) {
			cfg[*num].rf_protocol = NCI_RF_PROTOCOL_NFC_DEP;
			cfg[*num].mode = NCI_DISC_MAP_MODE_POLL |
				NCI_DISC_MAP_MODE_LISTEN;
			cfg[*num].rf_interface = NCI_RF_INTERFACE_NFC_DEP;
			(*num)++;
		}

		if (*num == NCI_MAX_NUM_MAPPING_CONFIGS)
			break;
	}

	nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_MAP_CMD,
		     (1 + ((*num) * sizeof(struct disc_map_config))), &cmd);
}
Exemple #2
0
static void nci_rf_discover_select_req(struct nci_dev *ndev, unsigned long opt)
{
	struct nci_rf_discover_select_param *param =
		(struct nci_rf_discover_select_param *)opt;
	struct nci_rf_discover_select_cmd cmd;

	cmd.rf_discovery_id = param->rf_discovery_id;
	cmd.rf_protocol = param->rf_protocol;

	switch (cmd.rf_protocol) {
	case NCI_RF_PROTOCOL_ISO_DEP:
		cmd.rf_interface = NCI_RF_INTERFACE_ISO_DEP;
		break;

	case NCI_RF_PROTOCOL_NFC_DEP:
		cmd.rf_interface = NCI_RF_INTERFACE_NFC_DEP;
		break;

	default:
		cmd.rf_interface = NCI_RF_INTERFACE_FRAME;
		break;
	}

	nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_SELECT_CMD,
		     sizeof(struct nci_rf_discover_select_cmd), &cmd);
}
Exemple #3
0
static void nci_reset_req(struct nci_dev *ndev, unsigned long opt)
{
	struct nci_core_reset_cmd cmd;

	cmd.reset_type = NCI_RESET_TYPE_RESET_CONFIG;
	nci_send_cmd(ndev, NCI_OP_CORE_RESET_CMD, 1, &cmd);
}
Exemple #4
0
/******************************************************************************
*
* Name: action_evt_disable_c
*
* Description: Called by NCI core when event EVT_DISABLE_C occurs.
*
* Input: 	h_rf_mgmt - handle to RF Management object
*		curr_state - event to handle
*
* Output: None
*
* Return: Next state in SM according to current state and event
*
*******************************************************************************/
nfc_u32 action_evt_disable_c(nfc_handle_t h_rf_mgmt, nfc_u32 curr_state)
{
	struct ncix_rf_mgmt *p_rf_mgmt = (struct ncix_rf_mgmt *)h_rf_mgmt;
	nci_status_e status = NCI_STATUS_OK;
	nci_cmd_param_u	cmd;
	nfc_u32 next_state = curr_state;

	p_rf_mgmt->card_proto_mask = 0;
	p_rf_mgmt->reader_proto_mask = 0;

	switch(curr_state)
	{
		case E_STATE_IDLE:
			{
				ncix_op_complete(p_rf_mgmt->h_ncix, NCI_STATUS_OK);
				next_state = E_STATE_IDLE;
				break;
			}
		case E_STATE_ACTIVE:
		{
			cmd.deactivate.type = NCI_DEACTIVATE_TYPE_IDLE_MODE;
			status = nci_send_cmd(p_rf_mgmt->h_nci, NCI_OPCODE_RF_DEACTIVATE_CMD, &cmd, NULL, 0, NULL, NULL);
			next_state = E_STATE_DE_ACTIVATING;
			break;
		}

		default:
		{
			OSA_ASSERT(0);
		}
	}

	return 	next_state;
}
Exemple #5
0
static void nci_rf_deactivate_req(struct nci_dev *ndev, unsigned long opt)
{
	struct nci_rf_deactivate_cmd cmd;

	cmd.type = NCI_DEACTIVATE_TYPE_IDLE_MODE;

	nci_send_cmd(ndev, NCI_OP_RF_DEACTIVATE_CMD,
		     sizeof(struct nci_rf_deactivate_cmd), &cmd);
}
Exemple #6
0
static void nci_init_complete_req(struct nci_dev *ndev, unsigned long opt)
{
	struct nci_rf_disc_map_cmd cmd;
	struct nci_core_conn_create_cmd conn_cmd;
	int i;

	/* create static rf connection */
	conn_cmd.target_handle = 0;
	conn_cmd.num_target_specific_params = 0;
	nci_send_cmd(ndev, NCI_OP_CORE_CONN_CREATE_CMD, 2, &conn_cmd);

	/* set rf mapping configurations */
	cmd.num_mapping_configs = 0;

	/* by default mapping is set to NCI_RF_INTERFACE_FRAME */
	for (i = 0; i < ndev->num_supported_rf_interfaces; i++) {
		if (ndev->supported_rf_interfaces[i] ==
			NCI_RF_INTERFACE_ISO_DEP) {
			cmd.mapping_configs[cmd.num_mapping_configs]
			.rf_protocol = NCI_RF_PROTOCOL_ISO_DEP;
			cmd.mapping_configs[cmd.num_mapping_configs]
			.mode = NCI_DISC_MAP_MODE_BOTH;
			cmd.mapping_configs[cmd.num_mapping_configs]
			.rf_interface_type = NCI_RF_INTERFACE_ISO_DEP;
			cmd.num_mapping_configs++;
		} else if (ndev->supported_rf_interfaces[i] ==
			NCI_RF_INTERFACE_NFC_DEP) {
			cmd.mapping_configs[cmd.num_mapping_configs]
			.rf_protocol = NCI_RF_PROTOCOL_NFC_DEP;
			cmd.mapping_configs[cmd.num_mapping_configs]
			.mode = NCI_DISC_MAP_MODE_BOTH;
			cmd.mapping_configs[cmd.num_mapping_configs]
			.rf_interface_type = NCI_RF_INTERFACE_NFC_DEP;
			cmd.num_mapping_configs++;
		}

		if (cmd.num_mapping_configs == NCI_MAX_NUM_MAPPING_CONFIGS)
			break;
	}

	nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_MAP_CMD,
		(1 + (cmd.num_mapping_configs*sizeof(struct disc_map_config))),
		&cmd);
}
Exemple #7
0
static void nci_set_config_req(struct nci_dev *ndev, unsigned long opt)
{
	struct nci_set_config_param *param = (struct nci_set_config_param *)opt;
	struct nci_core_set_config_cmd cmd;

	BUG_ON(param->len > NCI_MAX_PARAM_LEN);

	cmd.num_params = 1;
	cmd.param.id = param->id;
	cmd.param.len = param->len;
	memcpy(cmd.param.val, param->val, param->len);

	nci_send_cmd(ndev, NCI_OP_CORE_SET_CONFIG_CMD, (3 + param->len), &cmd);
}
Exemple #8
0
/******************************************************************************
*
* Name: static_send_core_set_config
*
* Description: Send CORE_SET_CONFIG command - according to card protocol type
*			  configure TLV structure and send it.
*			  NOTE: this function assumes that p_rf_mgmt->card_proto_mask != 0. This
*			  verfication should be done by calling task.
*
* Input: 	p_rf_mgmt - handle to RF Management object
*
* Output: None
*
* Return: Success -NFC_RES_OK
*		  Failure -NFC_RES_ERROR
*
*******************************************************************************/
static nfc_status static_send_core_set_config(struct ncix_rf_mgmt *p_rf_mgmt)
{
	nci_status_e status = NCI_STATUS_OK;
	nfc_u8 la_proto = 0;
	nfc_u8 lb_proto = 0;
	nfc_u8 lf_proto = 0;
	struct nci_tlv tlv[NCI_MAX_TLV_IN_CMD];
	nfc_u8 index = 0;
	struct nci_cmd_core_set_config core_set_config;

	/* set la_protocol  - configure as card */
	if(p_rf_mgmt->card_proto_mask & NAL_PROTOCOL_CARD_P2P_TARGET)
	{
		if(bUseP2PFTech == 0)
			la_proto |= NCI_CFG_TYPE_LA_PROTOCOL_TYPE_NFC_DEP;
		else
			lf_proto |= NCI_CFG_TYPE_LF_PROTOCOL_TYPE_NFC_DEP;
	}

	if(p_rf_mgmt->card_proto_mask & NAL_PROTOCOL_CARD_ISO_14443_4_A)
	{
		la_proto |= NCI_CFG_TYPE_LA_PROTOCOL_TYPE_ISO_DEP;
	}

	if(p_rf_mgmt->card_proto_mask & NAL_PROTOCOL_CARD_ISO_14443_4_B)
	{
		lb_proto |= NCI_CFG_TYPE_LB_PROTOCOL_TYPE_ISO_DEP;
	}

	tlv[index].type = NCI_CFG_TYPE_LA_PROTOCOL_TYPE;
	tlv[index].length = NCI_CFG_PROTOCOL_TYPE_SIZE;
	tlv[index++].p_value = &la_proto;

	tlv[index].type = NCI_CFG_TYPE_LB_PROTOCOL_TYPE;
	tlv[index].length = NCI_CFG_PROTOCOL_TYPE_SIZE;
	tlv[index++].p_value = &lb_proto;

	tlv[index].type = NCI_CFG_TYPE_LF_PROTOCOL_TYPE1;
	tlv[index].length = NCI_CFG_PROTOCOL_TYPE_SIZE;
	tlv[index++].p_value = &lf_proto;

	core_set_config.num_of_tlvs = index;
	OSA_ASSERT(core_set_config.num_of_tlvs > 0);
	core_set_config.p_tlv = tlv;

	status = nci_send_cmd(p_rf_mgmt->h_nci, NCI_OPCODE_CORE_SET_CONFIG_CMD,
				(nci_cmd_param_u *)&core_set_config, NULL, 0, hndlr_core_set_config_rsp, p_rf_mgmt);

	return (status == NCI_STATUS_OK) ? NFC_RES_OK:NFC_RES_ERROR;
}
Exemple #9
0
/******************************************************************************
*
* Name: action_evt_enable_c
*
* Description: Called by NCI core when event EVT_ENABLE_C occurs.
*
* Input: 	h_rf_mgmt - handle to RF Management object
*		curr_state - event to handle
*
* Output: None
*
* Return: Next state in SM according to current state and event
*
*******************************************************************************/
nfc_u32 action_evt_enable_c(nfc_handle_t h_rf_mgmt, nfc_u32 curr_state)
{
	struct ncix_rf_mgmt *p_rf_mgmt = (struct ncix_rf_mgmt *)h_rf_mgmt;
	nci_status_e status = NCI_STATUS_OK;
	nci_cmd_param_u	cmd;
	nfc_u32 next_state = curr_state;

	switch(curr_state)
	{
		case E_STATE_IDLE:
		{
			//sanity check - we are not supposed to get here if c or r = 0
			if((p_rf_mgmt->card_proto_mask != 0) || (p_rf_mgmt->reader_proto_mask != 0))
			{
				if(p_rf_mgmt->card_proto_mask != 0)
				{
					status = static_send_core_set_config(p_rf_mgmt);
					next_state = E_STATE_WAIT_4_CORE_SET_CONFIG_RSP;
				}
				else
				{
					status = static_send_discover(p_rf_mgmt);
					next_state = E_STATE_ACTIVATING;
				}
			}
			else
			{
				OSA_ASSERT(0);
			}

			break;
		}
		case E_STATE_ACTIVE:
		{
			cmd.deactivate.type = NCI_DEACTIVATE_TYPE_IDLE_MODE;
			status = nci_send_cmd(p_rf_mgmt->h_nci, NCI_OPCODE_RF_DEACTIVATE_CMD, &cmd, NULL, 0, NULL, NULL);
			next_state = E_STATE_DE_ACTIVATING;
			break;
		}

		default:
		{
			OSA_ASSERT(0);
		}
	}

	return 	next_state;
}
Exemple #10
0
static void nci_rf_discover_req(struct nci_dev *ndev, unsigned long opt)
{
	struct nci_rf_disc_cmd cmd;
	__u32 protocols = opt;

	cmd.num_disc_configs = 0;

	if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS) &&
	    (protocols & NFC_PROTO_JEWEL_MASK
	     || protocols & NFC_PROTO_MIFARE_MASK
	     || protocols & NFC_PROTO_ISO14443_MASK
	     || protocols & NFC_PROTO_NFC_DEP_MASK)) {
		cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
			NCI_NFC_A_PASSIVE_POLL_MODE;
		cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
		cmd.num_disc_configs++;
	}

	if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS) &&
	    (protocols & NFC_PROTO_ISO14443_B_MASK)) {
		cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
			NCI_NFC_B_PASSIVE_POLL_MODE;
		cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
		cmd.num_disc_configs++;
	}

	if ((cmd.num_disc_configs < NCI_MAX_NUM_RF_CONFIGS) &&
	    (protocols & NFC_PROTO_FELICA_MASK
	     || protocols & NFC_PROTO_NFC_DEP_MASK)) {
		cmd.disc_configs[cmd.num_disc_configs].rf_tech_and_mode =
			NCI_NFC_F_PASSIVE_POLL_MODE;
		cmd.disc_configs[cmd.num_disc_configs].frequency = 1;
		cmd.num_disc_configs++;
	}

	nci_send_cmd(ndev, NCI_OP_RF_DISCOVER_CMD,
		     (1 + (cmd.num_disc_configs * sizeof(struct disc_config))),
		     &cmd);
}
Exemple #11
0
static void nci_init_req(struct nci_dev *ndev, unsigned long opt)
{
	nci_send_cmd(ndev, NCI_OP_CORE_INIT_CMD, 0, NULL);
}
Exemple #12
0
/******************************************************************************
*
* Name: static_send_discover
*
* Description: Send send_discover command -according to protocol type configure
*			  command structure and send it.
*
* Input: 	p_rf_mgmt - handle to RF Management object
*
* Output: None
*
* Return: Success -NFC_RES_OK
*		  Failure -NFC_RES_ERROR
*
*******************************************************************************/
static nfc_status static_send_discover(struct ncix_rf_mgmt *p_rf_mgmt)
{
	nci_status_e status;
	nci_cmd_param_u	cmd;

	/* set discovery */
	cmd.discover.num_of_conf = 0;

	if(p_rf_mgmt->reader_proto_mask & NAL_PROTOCOL_POLL_A)
	{
		if(bUseP2PFTech == 0)
		{
			cmd.discover.disc_conf[cmd.discover.num_of_conf].type = NCI_DISCOVERY_TYPE_POLL_A_PASSIVE;
			cmd.discover.disc_conf[cmd.discover.num_of_conf].frequency = E_NCI_DISCOVERY_FREQUENCY_EVERY_1_DISCOVERY_PERIOD;
			cmd.discover.num_of_conf++;
		}
	}
	if(p_rf_mgmt->reader_proto_mask & NAL_PROTOCOL_POLL_B)
	{
		cmd.discover.disc_conf[cmd.discover.num_of_conf].type = NCI_DISCOVERY_TYPE_POLL_B_PASSIVE;
		cmd.discover.disc_conf[cmd.discover.num_of_conf].frequency = E_NCI_DISCOVERY_FREQUENCY_EVERY_1_DISCOVERY_PERIOD;
		cmd.discover.num_of_conf++;
	}
	if(p_rf_mgmt->reader_proto_mask & NAL_PROTOCOL_POLL_F)
	{
		if(bUseP2PFTech != 0)
		{
			cmd.discover.disc_conf[cmd.discover.num_of_conf].type = NCI_DISCOVERY_TYPE_POLL_F_PASSIVE;
			cmd.discover.disc_conf[cmd.discover.num_of_conf].frequency = E_NCI_DISCOVERY_FREQUENCY_EVERY_1_DISCOVERY_PERIOD;
			cmd.discover.num_of_conf++;
		}
	}
	if(p_rf_mgmt->reader_proto_mask & NAL_PROTOCOL_POLL_15)
	{
		cmd.discover.disc_conf[cmd.discover.num_of_conf].type = NCI_DISCOVERY_TYPE_POLL_15693;
		cmd.discover.disc_conf[cmd.discover.num_of_conf].frequency = E_NCI_DISCOVERY_FREQUENCY_EVERY_1_DISCOVERY_PERIOD;
		cmd.discover.num_of_conf++;
	}
	if(p_rf_mgmt->card_proto_mask & NAL_PROTOCOL_LISTEN_A)
	{
		if(bUseP2PFTech == 0)
		{
			cmd.discover.disc_conf[cmd.discover.num_of_conf].type = NCI_DISCOVERY_TYPE_LISTEN_A_PASSIVE;
			cmd.discover.disc_conf[cmd.discover.num_of_conf].frequency = E_NCI_DISCOVERY_FREQUENCY_EVERY_1_DISCOVERY_PERIOD;
			cmd.discover.num_of_conf++;
		}
	}
	if(p_rf_mgmt->card_proto_mask & NAL_PROTOCOL_LISTEN_B)
	{
		//nfc_u8 bail_out = 1;

		/*tlv[2].type = NCI_CFG_TYPE_PB_H_INFO;
		tlv[2].length = 1;
		tlv[2].p_value = &la_proto;

		bail_out = 1;
		tlv[i].type = NCI_CFG_TYPE_PB_BAIL_OUT;
		tlv[i].length = 1;
		tlv[i++].p_value = &bail_out;

		nci_set_param(p_rf_mgmt->h_nci, tlv, 3, NULL, NULL);*/

		cmd.discover.disc_conf[cmd.discover.num_of_conf].type = NCI_DISCOVERY_TYPE_LISTEN_B_PASSIVE;
		cmd.discover.disc_conf[cmd.discover.num_of_conf].frequency = E_NCI_DISCOVERY_FREQUENCY_EVERY_1_DISCOVERY_PERIOD;
		cmd.discover.num_of_conf++;
	}
	if(p_rf_mgmt->card_proto_mask & NAL_PROTOCOL_LISTEN_F)
	{
		if(bUseP2PFTech != 0)
		{
			cmd.discover.disc_conf[cmd.discover.num_of_conf].type = NCI_DISCOVERY_TYPE_LISTEN_F_PASSIVE;
			cmd.discover.disc_conf[cmd.discover.num_of_conf].frequency = E_NCI_DISCOVERY_FREQUENCY_EVERY_1_DISCOVERY_PERIOD;
			cmd.discover.num_of_conf++;
		}
	}

	status = nci_send_cmd(p_rf_mgmt->h_nci, NCI_OPCODE_RF_DISCOVER_CMD, &cmd, NULL, 0, hndlr_discover_rsp, p_rf_mgmt);
	return (status == NCI_STATUS_OK) ? NFC_RES_OK:NFC_RES_ERROR;
}