diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/hle/service/nfc/nfc.cpp | 105 | ||||
| -rw-r--r-- | src/core/hle/service/nfc/nfc.h | 122 | ||||
| -rw-r--r-- | src/core/hle/service/nfc/nfc_m.cpp | 21 | ||||
| -rw-r--r-- | src/core/hle/service/nfc/nfc_u.cpp | 21 | 
4 files changed, 249 insertions, 20 deletions
| diff --git a/src/core/hle/service/nfc/nfc.cpp b/src/core/hle/service/nfc/nfc.cpp index e248285f9..fd3c7d9c2 100644 --- a/src/core/hle/service/nfc/nfc.cpp +++ b/src/core/hle/service/nfc/nfc.cpp @@ -11,6 +11,81 @@ namespace Service {  namespace NFC {  static Kernel::SharedPtr<Kernel::Event> tag_in_range_event; +static Kernel::SharedPtr<Kernel::Event> tag_out_of_range_event; +static TagState nfc_tag_state = TagState::NotInitialized; +static CommunicationStatus nfc_status = CommunicationStatus::NfcInitialized; + +void Initialize(Interface* self) { +    u32* cmd_buff = Kernel::GetCommandBuffer(); + +    u8 param = static_cast<u8>(cmd_buff[1] & 0xFF); + +    nfc_tag_state = TagState::NotScanning; + +    cmd_buff[1] = RESULT_SUCCESS.raw; // No error +    LOG_WARNING(Service_NFC, "(STUBBED) called, param=%u", param); +} + +void Shutdown(Interface* self) { +    u32* cmd_buff = Kernel::GetCommandBuffer(); + +    u8 param = static_cast<u8>(cmd_buff[1] & 0xFF); +    nfc_tag_state = TagState::NotInitialized; + +    cmd_buff[1] = RESULT_SUCCESS.raw; // No error +    LOG_WARNING(Service_NFC, "(STUBBED) called, param=%u", param); +} + +void StartCommunication(Interface* self) { +    u32* cmd_buff = Kernel::GetCommandBuffer(); + +    cmd_buff[1] = RESULT_SUCCESS.raw; // No error +    LOG_WARNING(Service_NFC, "(STUBBED) called"); +} + +void StopCommunication(Interface* self) { +    u32* cmd_buff = Kernel::GetCommandBuffer(); + +    cmd_buff[1] = RESULT_SUCCESS.raw; // No error +    LOG_WARNING(Service_NFC, "(STUBBED) called"); +} + +void StartTagScanning(Interface* self) { +    u32* cmd_buff = Kernel::GetCommandBuffer(); + +    nfc_tag_state = TagState::TagInRange; +    tag_in_range_event->Signal(); + +    cmd_buff[1] = RESULT_SUCCESS.raw; // No error +    LOG_WARNING(Service_NFC, "(STUBBED) called"); +} + +void StopTagScanning(Interface* self) { +    u32* cmd_buff = Kernel::GetCommandBuffer(); + +    nfc_tag_state = TagState::NotScanning; + +    cmd_buff[1] = RESULT_SUCCESS.raw; // No error +    LOG_WARNING(Service_NFC, "(STUBBED) called"); +} + +void LoadAmiiboData(Interface* self) { +    u32* cmd_buff = Kernel::GetCommandBuffer(); + +    nfc_tag_state = TagState::TagDataLoaded; + +    cmd_buff[1] = RESULT_SUCCESS.raw; // No error +    LOG_WARNING(Service_NFC, "(STUBBED) called"); +} + +void ResetTagScanState(Interface* self) { +    u32* cmd_buff = Kernel::GetCommandBuffer(); + +    nfc_tag_state = TagState::NotScanning; + +    cmd_buff[1] = RESULT_SUCCESS.raw; // No error +    LOG_WARNING(Service_NFC, "(STUBBED) called"); +}  void GetTagInRangeEvent(Interface* self) {      u32* cmd_buff = Kernel::GetCommandBuffer(); @@ -22,16 +97,46 @@ void GetTagInRangeEvent(Interface* self) {      LOG_WARNING(Service_NFC, "(STUBBED) called");  } +void GetTagOutOfRangeEvent(Interface* self) { +    u32* cmd_buff = Kernel::GetCommandBuffer(); + +    cmd_buff[0] = IPC::MakeHeader(0xC, 1, 2); +    cmd_buff[1] = RESULT_SUCCESS.raw; +    cmd_buff[2] = IPC::CopyHandleDesc(); +    cmd_buff[3] = Kernel::g_handle_table.Create(tag_out_of_range_event).MoveFrom(); +    LOG_WARNING(Service_NFC, "(STUBBED) called"); +} + +void GetTagState(Interface* self) { +    u32* cmd_buff = Kernel::GetCommandBuffer(); + +    cmd_buff[1] = RESULT_SUCCESS.raw; // No error +    cmd_buff[2] = static_cast<u8>(nfc_tag_state); +    LOG_DEBUG(Service_NFC, "(STUBBED) called"); +} + +void CommunicationGetStatus(Interface* self) { +    u32* cmd_buff = Kernel::GetCommandBuffer(); + +    cmd_buff[1] = RESULT_SUCCESS.raw; // No error +    cmd_buff[2] = static_cast<u8>(nfc_status); +    LOG_DEBUG(Service_NFC, "(STUBBED) called"); +} +  void Init() {      AddService(new NFC_M());      AddService(new NFC_U());      tag_in_range_event =          Kernel::Event::Create(Kernel::ResetType::OneShot, "NFC::tag_in_range_event"); +    tag_out_of_range_event = +        Kernel::Event::Create(Kernel::ResetType::OneShot, "NFC::tag_out_range_event"); +    nfc_tag_state = TagState::NotInitialized;  }  void Shutdown() {      tag_in_range_event = nullptr; +    tag_out_of_range_event = nullptr;  }  } // namespace NFC diff --git a/src/core/hle/service/nfc/nfc.h b/src/core/hle/service/nfc/nfc.h index b02354201..a013bdae7 100644 --- a/src/core/hle/service/nfc/nfc.h +++ b/src/core/hle/service/nfc/nfc.h @@ -4,12 +4,103 @@  #pragma once +#include "common/common_types.h" +  namespace Service {  class Interface;  namespace NFC { +enum class TagState : u8 { +    NotInitialized = 0, +    NotScanning = 1, +    Scanning = 2, +    TagInRange = 3, +    TagOutOfRange = 4, +    TagDataLoaded = 5, +}; + +enum class CommunicationStatus : u8 { +    AttemptInitialize = 1, +    NfcInitialized = 2, +}; + +/** + * NFC::Initialize service function + *  Inputs: + *      0 : Header code [0x00010040] + *      1 : (u8) unknown parameter. Can be either value 0x1 or 0x2 + *  Outputs: + *      1 : Result of function, 0 on success, otherwise error code + */ +void Initialize(Interface* self); + +/** + * NFC::Shutdown service function + *  Inputs: + *      0 : Header code [0x00020040] + *      1 : (u8) unknown parameter + *  Outputs: + *      1 : Result of function, 0 on success, otherwise error code + */ +void Shutdown(Interface* self); + +/** + * NFC::StartCommunication service function + *  Inputs: + *      0 : Header code [0x00030000] + *  Outputs: + *      1 : Result of function, 0 on success, otherwise error code + */ +void StartCommunication(Interface* self); + +/** + * NFC::StopCommunication service function + *  Inputs: + *      0 : Header code [0x00040000] + *  Outputs: + *      1 : Result of function, 0 on success, otherwise error code + */ +void StopCommunication(Interface* self); + +/** + * NFC::StartTagScanning service function + *  Inputs: + *      0 : Header code [0x00050040] + *      1 : (u16) unknown. This is normally 0x0 + *  Outputs: + *      1 : Result of function, 0 on success, otherwise error code + */ +void StartTagScanning(Interface* self); + +/** + * NFC::StopTagScanning service function + *  Inputs: + *      0 : Header code [0x00060000] + *  Outputs: + *      1 : Result of function, 0 on success, otherwise error code + */ +void StopTagScanning(Interface* self); + +/** + * NFC::LoadAmiiboData service function + *  Inputs: + *      0 : Header code [0x00070000] + *  Outputs: + *      1 : Result of function, 0 on success, otherwise error code + */ +void LoadAmiiboData(Interface* self); + +/** + * NFC::ResetTagScanState service function + *  Inputs: + *      0 : Header code [0x00080000] + *  Outputs: + *      1 : Result of function, 0 on success, otherwise error code + */ +void ResetTagScanState(Interface* self); +  /**   * NFC::GetTagInRangeEvent service function   *  Inputs: @@ -21,6 +112,37 @@ namespace NFC {   */  void GetTagInRangeEvent(Interface* self); +/** + * NFC::GetTagOutOfRangeEvent service function + *  Inputs: + *      0 : Header code [0x000C0000] + *  Outputs: + *      1 : Result of function, 0 on success, otherwise error code + *      2 : Copy handle descriptor + *      3 : Event Handle + */ +void GetTagOutOfRangeEvent(Interface* self); + +/** + * NFC::GetTagState service function + *  Inputs: + *      0 : Header code [0x000D0000] + *  Outputs: + *      1 : Result of function, 0 on success, otherwise error code + *      2 : (u8) Tag state + */ +void GetTagState(Interface* self); + +/** + * NFC::CommunicationGetStatus service function + *  Inputs: + *      0 : Header code [0x000F0000] + *  Outputs: + *      1 : Result of function, 0 on success, otherwise error code + *      2 : (u8) Communication state + */ +void CommunicationGetStatus(Interface* self); +  /// Initialize all NFC services.  void Init(); diff --git a/src/core/hle/service/nfc/nfc_m.cpp b/src/core/hle/service/nfc/nfc_m.cpp index f43b4029a..ebe637650 100644 --- a/src/core/hle/service/nfc/nfc_m.cpp +++ b/src/core/hle/service/nfc/nfc_m.cpp @@ -11,18 +11,19 @@ namespace NFC {  const Interface::FunctionInfo FunctionTable[] = {      // clang-format off      // nfc:u shared commands -    {0x00010040, nullptr, "Initialize"}, -    {0x00020040, nullptr, "Shutdown"}, -    {0x00030000, nullptr, "StartCommunication"}, -    {0x00040000, nullptr, "StopCommunication"}, -    {0x00050040, nullptr, "StartTagScanning"}, -    {0x00060000, nullptr, "StopTagScanning"}, -    {0x00070000, nullptr, "LoadAmiiboData"}, -    {0x00080000, nullptr, "ResetTagScanState"}, +    {0x00010040, Initialize, "Initialize"}, +    {0x00020040, Shutdown, "Shutdown"}, +    {0x00030000, StartCommunication, "StartCommunication"}, +    {0x00040000, StopCommunication, "StopCommunication"}, +    {0x00050040, StartTagScanning, "StartTagScanning"}, +    {0x00060000, StopTagScanning, "StopTagScanning"}, +    {0x00070000, LoadAmiiboData, "LoadAmiiboData"}, +    {0x00080000, ResetTagScanState, "ResetTagScanState"},      {0x00090002, nullptr, "UpdateStoredAmiiboData"},      {0x000B0000, GetTagInRangeEvent, "GetTagInRangeEvent"}, -    {0x000D0000, nullptr, "GetTagState"}, -    {0x000F0000, nullptr, "CommunicationGetStatus"}, +    {0x000C0000, GetTagOutOfRangeEvent, "GetTagOutOfRangeEvent"}, +    {0x000D0000, GetTagState, "GetTagState"}, +    {0x000F0000, CommunicationGetStatus, "CommunicationGetStatus"},      {0x00100000, nullptr, "GetTagInfo2"},      {0x00110000, nullptr, "GetTagInfo"},      {0x00120000, nullptr, "CommunicationGetResult"}, diff --git a/src/core/hle/service/nfc/nfc_u.cpp b/src/core/hle/service/nfc/nfc_u.cpp index 4b5200ae8..5a40c7874 100644 --- a/src/core/hle/service/nfc/nfc_u.cpp +++ b/src/core/hle/service/nfc/nfc_u.cpp @@ -10,18 +10,19 @@ namespace NFC {  const Interface::FunctionInfo FunctionTable[] = {      // clang-format off -    {0x00010040, nullptr, "Initialize"}, -    {0x00020040, nullptr, "Shutdown"}, -    {0x00030000, nullptr, "StartCommunication"}, -    {0x00040000, nullptr, "StopCommunication"}, -    {0x00050040, nullptr, "StartTagScanning"}, -    {0x00060000, nullptr, "StopTagScanning"}, -    {0x00070000, nullptr, "LoadAmiiboData"}, -    {0x00080000, nullptr, "ResetTagScanState"}, +    {0x00010040, Initialize, "Initialize"}, +    {0x00020040, Shutdown, "Shutdown"}, +    {0x00030000, StartCommunication, "StartCommunication"}, +    {0x00040000, StopCommunication, "StopCommunication"}, +    {0x00050040, StartTagScanning, "StartTagScanning"}, +    {0x00060000, StopTagScanning, "StopTagScanning"}, +    {0x00070000, LoadAmiiboData, "LoadAmiiboData"}, +    {0x00080000, ResetTagScanState, "ResetTagScanState"},      {0x00090002, nullptr, "UpdateStoredAmiiboData"},      {0x000B0000, GetTagInRangeEvent, "GetTagInRangeEvent"}, -    {0x000D0000, nullptr, "GetTagState"}, -    {0x000F0000, nullptr, "CommunicationGetStatus"}, +    {0x000C0000, GetTagOutOfRangeEvent, "GetTagOutOfRangeEvent"}, +    {0x000D0000, GetTagState, "GetTagState"}, +    {0x000F0000, CommunicationGetStatus, "CommunicationGetStatus"},      {0x00100000, nullptr, "GetTagInfo2"},      {0x00110000, nullptr, "GetTagInfo"},      {0x00120000, nullptr, "CommunicationGetResult"}, | 
