device.h 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. // SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
  2. // SPDX-License-Identifier: GPL-2.0-or-later
  3. #pragma once
  4. #include <span>
  5. #include "common/common_types.h"
  6. #include "core/hle/service/kernel_helpers.h"
  7. #include "core/hle/service/nfc/mifare_types.h"
  8. #include "core/hle/service/nfc/nfc_types.h"
  9. #include "core/hle/service/nfp/nfp_types.h"
  10. #include "core/hle/service/service.h"
  11. namespace Kernel {
  12. class KEvent;
  13. class KReadableEvent;
  14. } // namespace Kernel
  15. namespace Core {
  16. class System;
  17. } // namespace Core
  18. namespace Core::HID {
  19. class EmulatedController;
  20. enum class ControllerTriggerType;
  21. enum class NpadIdType : u32;
  22. } // namespace Core::HID
  23. namespace Service::NFC {
  24. class NfcDevice {
  25. public:
  26. NfcDevice(Core::HID::NpadIdType npad_id_, Core::System& system_,
  27. KernelHelpers::ServiceContext& service_context_,
  28. Kernel::KEvent* availability_change_event_);
  29. ~NfcDevice();
  30. void Initialize();
  31. void Finalize();
  32. Result StartDetection(NfcProtocol allowed_protocol);
  33. Result StopDetection();
  34. Result GetTagInfo(TagInfo& tag_info) const;
  35. Result ReadMifare(std::span<const MifareReadBlockParameter> parameters,
  36. std::span<MifareReadBlockData> read_block_data) const;
  37. Result WriteMifare(std::span<const MifareWriteBlockParameter> parameters);
  38. Result SendCommandByPassThrough(const s64& timeout, std::span<const u8> command_data,
  39. std::span<u8> out_data);
  40. Result Mount(NFP::ModelType model_type, NFP::MountTarget mount_target);
  41. Result Unmount();
  42. Result Flush();
  43. Result FlushDebug();
  44. Result FlushWithBreak(NFP::BreakType break_type);
  45. Result Restore();
  46. Result GetCommonInfo(NFP::CommonInfo& common_info) const;
  47. Result GetModelInfo(NFP::ModelInfo& model_info) const;
  48. Result GetRegisterInfo(NFP::RegisterInfo& register_info) const;
  49. Result GetRegisterInfoPrivate(NFP::RegisterInfoPrivate& register_info) const;
  50. Result GetAdminInfo(NFP::AdminInfo& admin_info) const;
  51. Result DeleteRegisterInfo();
  52. Result SetRegisterInfoPrivate(const NFP::RegisterInfoPrivate& register_info);
  53. Result Format();
  54. Result OpenApplicationArea(u32 access_id);
  55. Result GetApplicationAreaId(u32& application_area_id) const;
  56. Result GetApplicationArea(std::span<u8> data) const;
  57. Result SetApplicationArea(std::span<const u8> data);
  58. Result CreateApplicationArea(u32 access_id, std::span<const u8> data);
  59. Result RecreateApplicationArea(u32 access_id, std::span<const u8> data);
  60. Result DeleteApplicationArea();
  61. Result ExistsApplicationArea(bool& has_application_area) const;
  62. Result GetAll(NFP::NfpData& data) const;
  63. Result SetAll(const NFP::NfpData& data);
  64. Result BreakTag(NFP::BreakType break_type);
  65. Result HasBackup(const UniqueSerialNumber& uid, std::size_t uuid_size) const;
  66. Result HasBackup(const NFP::TagUuid& tag_uid) const;
  67. Result ReadBackupData(const UniqueSerialNumber& uid, std::size_t uuid_size,
  68. std::span<u8> data) const;
  69. Result ReadBackupData(const NFP::TagUuid& tag_uid, std::span<u8> data) const;
  70. Result WriteBackupData(const UniqueSerialNumber& uid, std::size_t uuid_size,
  71. std::span<const u8> data);
  72. Result WriteBackupData(const NFP::TagUuid& tag_uid, std::span<const u8> data);
  73. Result WriteNtf(std::span<const u8> data);
  74. u64 GetHandle() const;
  75. DeviceState GetCurrentState() const;
  76. Result GetNpadId(Core::HID::NpadIdType& out_npad_id) const;
  77. Kernel::KReadableEvent& GetActivateEvent() const;
  78. Kernel::KReadableEvent& GetDeactivateEvent() const;
  79. private:
  80. void NpadUpdate(Core::HID::ControllerTriggerType type);
  81. bool LoadNfcTag(u8 protocol, u8 tag_type, u8 uuid_length, UniqueSerialNumber uuid);
  82. bool LoadAmiiboData();
  83. void CloseNfcTag();
  84. NFP::AmiiboName GetAmiiboName(const NFP::AmiiboSettings& settings) const;
  85. void SetAmiiboName(NFP::AmiiboSettings& settings, const NFP::AmiiboName& amiibo_name) const;
  86. NFP::AmiiboDate GetAmiiboDate(s64 posix_time) const;
  87. s64 GetCurrentPosixTime() const;
  88. u64 RemoveVersionByte(u64 application_id) const;
  89. void UpdateSettingsCrc();
  90. void UpdateRegisterInfoCrc();
  91. void BuildAmiiboWithoutKeys(NFP::NTAG215File& stubbed_tag_data,
  92. const NFP::EncryptedNTAG215File& encrypted_file) const;
  93. bool is_controller_set{};
  94. int callback_key;
  95. const Core::HID::NpadIdType npad_id;
  96. Core::System& system;
  97. Core::HID::EmulatedController* npad_device = nullptr;
  98. KernelHelpers::ServiceContext& service_context;
  99. Kernel::KEvent* activate_event = nullptr;
  100. Kernel::KEvent* deactivate_event = nullptr;
  101. Kernel::KEvent* availability_change_event = nullptr;
  102. bool is_initialized{};
  103. NfcProtocol allowed_protocols{};
  104. DeviceState device_state{DeviceState::Unavailable};
  105. // NFP data
  106. bool is_data_moddified{};
  107. bool is_app_area_open{};
  108. bool is_plain_amiibo{};
  109. bool is_write_protected{};
  110. NFP::MountTarget mount_target{NFP::MountTarget::None};
  111. TagInfo real_tag_info{};
  112. NFP::NTAG215File tag_data{};
  113. NFP::EncryptedNTAG215File encrypted_tag_data{};
  114. };
  115. } // namespace Service::NFC