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); }
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); }
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); }
/****************************************************************************** * * 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; }
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); }
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); }
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); }
/****************************************************************************** * * 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; }
/****************************************************************************** * * 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; }
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); }
static void nci_init_req(struct nci_dev *ndev, unsigned long opt) { nci_send_cmd(ndev, NCI_OP_CORE_INIT_CMD, 0, NULL); }
/****************************************************************************** * * 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; }