service: nfc: fix tagprotocol and implement GetApplicationAreaId

This commit is contained in:
german77 2022-11-13 10:52:48 -06:00
parent 08091ff3e3
commit 6c045c9beb
4 changed files with 43 additions and 8 deletions

View File

@ -77,6 +77,9 @@ void NfpDevice::NpadUpdate(Core::HID::ControllerTriggerType type) {
LoadAmiibo(nfc_status.data); LoadAmiibo(nfc_status.data);
break; break;
case Common::Input::NfcState::AmiiboRemoved: case Common::Input::NfcState::AmiiboRemoved:
if (device_state == DeviceState::Initialized || device_state == DeviceState::TagRemoved) {
break;
}
if (device_state != DeviceState::SearchingForTag) { if (device_state != DeviceState::SearchingForTag) {
CloseAmiibo(); CloseAmiibo();
} }
@ -97,6 +100,8 @@ bool NfpDevice::LoadAmiibo(std::span<const u8> data) {
return false; return false;
} }
// TODO: Filter by allowed_protocols here
memcpy(&encrypted_tag_data, data.data(), sizeof(EncryptedNTAG215File)); memcpy(&encrypted_tag_data, data.data(), sizeof(EncryptedNTAG215File));
device_state = DeviceState::TagFound; device_state = DeviceState::TagFound;
@ -143,7 +148,7 @@ void NfpDevice::Finalize() {
device_state = DeviceState::Unavailable; device_state = DeviceState::Unavailable;
} }
Result NfpDevice::StartDetection(s32 protocol_) { Result NfpDevice::StartDetection([[maybe_unused]] TagProtocol allowed_protocol) {
if (device_state != DeviceState::Initialized && device_state != DeviceState::TagRemoved) { if (device_state != DeviceState::Initialized && device_state != DeviceState::TagRemoved) {
LOG_ERROR(Service_NFP, "Wrong device state {}", device_state); LOG_ERROR(Service_NFP, "Wrong device state {}", device_state);
return WrongDeviceState; return WrongDeviceState;
@ -155,7 +160,7 @@ Result NfpDevice::StartDetection(s32 protocol_) {
} }
device_state = DeviceState::SearchingForTag; device_state = DeviceState::SearchingForTag;
protocol = protocol_; allowed_protocols = allowed_protocol;
return ResultSuccess; return ResultSuccess;
} }
@ -469,6 +474,30 @@ Result NfpDevice::OpenApplicationArea(u32 access_id) {
return ResultSuccess; return ResultSuccess;
} }
Result NfpDevice::GetApplicationAreaId(u32& application_area_id) const {
if (device_state != DeviceState::TagMounted) {
LOG_ERROR(Service_NFP, "Wrong device state {}", device_state);
if (device_state == DeviceState::TagRemoved) {
return TagRemoved;
}
return WrongDeviceState;
}
if (mount_target == MountTarget::None || mount_target == MountTarget::Rom) {
LOG_ERROR(Service_NFP, "Amiibo is read only", device_state);
return WrongDeviceState;
}
if (tag_data.settings.settings.appdata_initialized.Value() == 0) {
LOG_WARNING(Service_NFP, "Application area is not initialized");
return ApplicationAreaIsNotInitialized;
}
application_area_id = tag_data.application_area_id;
return ResultSuccess;
}
Result NfpDevice::GetApplicationArea(std::vector<u8>& data) const { Result NfpDevice::GetApplicationArea(std::vector<u8>& data) const {
if (device_state != DeviceState::TagMounted) { if (device_state != DeviceState::TagMounted) {
LOG_ERROR(Service_NFP, "Wrong device state {}", device_state); LOG_ERROR(Service_NFP, "Wrong device state {}", device_state);

View File

@ -4,6 +4,7 @@
#pragma once #pragma once
#include <array> #include <array>
#include <span>
#include <vector> #include <vector>
#include "common/common_funcs.h" #include "common/common_funcs.h"
@ -37,7 +38,7 @@ public:
void Initialize(); void Initialize();
void Finalize(); void Finalize();
Result StartDetection(s32 protocol_); Result StartDetection(TagProtocol allowed_protocol);
Result StopDetection(); Result StopDetection();
Result Mount(MountTarget mount_target); Result Mount(MountTarget mount_target);
Result Unmount(); Result Unmount();
@ -53,6 +54,7 @@ public:
Result DeleteAllData(); Result DeleteAllData();
Result OpenApplicationArea(u32 access_id); Result OpenApplicationArea(u32 access_id);
Result GetApplicationAreaId(u32& application_area_id) const;
Result GetApplicationArea(std::vector<u8>& data) const; Result GetApplicationArea(std::vector<u8>& data) const;
Result SetApplicationArea(std::span<const u8> data); Result SetApplicationArea(std::span<const u8> data);
Result CreateApplicationArea(u32 access_id, std::span<const u8> data); Result CreateApplicationArea(u32 access_id, std::span<const u8> data);
@ -88,7 +90,7 @@ private:
bool is_data_moddified{}; bool is_data_moddified{};
bool is_app_area_open{}; bool is_app_area_open{};
s32 protocol{}; TagProtocol allowed_protocols{};
s64 current_posix_time{}; s64 current_posix_time{};
MountTarget mount_target{MountTarget::None}; MountTarget mount_target{MountTarget::None};
DeviceState device_state{DeviceState::Unavailable}; DeviceState device_state{DeviceState::Unavailable};

View File

@ -88,11 +88,15 @@ enum class PackedTagType : u8 {
Type5, // ISO15693 RW/RO 540 bytes 106kbit/s Type5, // ISO15693 RW/RO 540 bytes 106kbit/s
}; };
// Verify this enum. It might be completely wrong default protocol is 0x48
enum class TagProtocol : u32 { enum class TagProtocol : u32 {
None, None,
TypeA, // ISO14443A TypeA = 1U << 0, // ISO14443A
TypeB, // ISO14443B TypeB = 1U << 1, // ISO14443B
TypeF, // Sony Felica TypeF = 1U << 2, // Sony Felica
Unknown1 = 1U << 3,
Unknown2 = 1U << 5,
All = 0xFFFFFFFFU,
}; };
using UniqueSerialNumber = std::array<u8, 7>; using UniqueSerialNumber = std::array<u8, 7>;

View File

@ -130,7 +130,7 @@ void IUser::ListDevices(Kernel::HLERequestContext& ctx) {
void IUser::StartDetection(Kernel::HLERequestContext& ctx) { void IUser::StartDetection(Kernel::HLERequestContext& ctx) {
IPC::RequestParser rp{ctx}; IPC::RequestParser rp{ctx};
const auto device_handle{rp.Pop<u64>()}; const auto device_handle{rp.Pop<u64>()};
const auto nfp_protocol{rp.Pop<s32>()}; const auto nfp_protocol{rp.PopEnum<TagProtocol>()};
LOG_INFO(Service_NFP, "called, device_handle={}, nfp_protocol={}", device_handle, nfp_protocol); LOG_INFO(Service_NFP, "called, device_handle={}, nfp_protocol={}", device_handle, nfp_protocol);
if (state == State::NonInitialized) { if (state == State::NonInitialized) {