|
|
|
@ -20,7 +20,6 @@ namespace ErrCodes {
|
|
|
|
|
constexpr ResultCode DeviceNotFound(ErrorModule::NFP, 64);
|
|
|
|
|
constexpr ResultCode WrongDeviceState(ErrorModule::NFP, 73);
|
|
|
|
|
constexpr ResultCode ApplicationAreaIsNotInitialized(ErrorModule::NFP, 128);
|
|
|
|
|
constexpr ResultCode NoApplicationArea(ErrorModule::NFP, 152);
|
|
|
|
|
constexpr ResultCode ApplicationAreaExist(ErrorModule::NFP, 168);
|
|
|
|
|
} // namespace ErrCodes
|
|
|
|
|
|
|
|
|
@ -97,7 +96,7 @@ void IUser::ListDevices(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 3};
|
|
|
|
|
rb.Push(ResultSuccess);
|
|
|
|
|
rb.Push(devices.size());
|
|
|
|
|
rb.Push(static_cast<s32>(devices.size()));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void IUser::StartDetection(Kernel::HLERequestContext& ctx) {
|
|
|
|
@ -184,7 +183,8 @@ void IUser::OpenApplicationArea(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
IPC::RequestParser rp{ctx};
|
|
|
|
|
const auto device_handle{rp.Pop<u64>()};
|
|
|
|
|
const auto access_id{rp.Pop<u32>()};
|
|
|
|
|
LOG_INFO(Service_NFP, "called, device_handle={}, access_id={}", device_handle, access_id);
|
|
|
|
|
LOG_WARNING(Service_NFP, "(STUBBED) called, device_handle={}, access_id={}", device_handle,
|
|
|
|
|
access_id);
|
|
|
|
|
|
|
|
|
|
// TODO(german77): Loop through all interfaces
|
|
|
|
|
if (device_handle == nfp_interface.GetHandle()) {
|
|
|
|
@ -212,7 +212,7 @@ void IUser::GetApplicationArea(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
ctx.WriteBuffer(data);
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 3};
|
|
|
|
|
rb.Push(result);
|
|
|
|
|
rb.PushRaw<u32>(data.size());
|
|
|
|
|
rb.Push(static_cast<u32>(data.size()));
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -226,7 +226,8 @@ void IUser::SetApplicationArea(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
IPC::RequestParser rp{ctx};
|
|
|
|
|
const auto device_handle{rp.Pop<u64>()};
|
|
|
|
|
const auto data{ctx.ReadBuffer()};
|
|
|
|
|
LOG_INFO(Service_NFP, "called, device_handle={}, data_size={}", device_handle, data.size());
|
|
|
|
|
LOG_WARNING(Service_NFP, "(STUBBED) called, device_handle={}, data_size={}", device_handle,
|
|
|
|
|
data.size());
|
|
|
|
|
|
|
|
|
|
// TODO(german77): Loop through all interfaces
|
|
|
|
|
if (device_handle == nfp_interface.GetHandle()) {
|
|
|
|
@ -247,8 +248,8 @@ void IUser::CreateApplicationArea(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
const auto device_handle{rp.Pop<u64>()};
|
|
|
|
|
const auto access_id{rp.Pop<u32>()};
|
|
|
|
|
const auto data{ctx.ReadBuffer()};
|
|
|
|
|
LOG_INFO(Service_NFP, "called, device_handle={}, data_size={}, access_id={}", device_handle,
|
|
|
|
|
access_id, data.size());
|
|
|
|
|
LOG_WARNING(Service_NFP, "(STUBBED) called, device_handle={}, data_size={}, access_id={}",
|
|
|
|
|
device_handle, access_id, data.size());
|
|
|
|
|
|
|
|
|
|
// TODO(german77): Loop through all interfaces
|
|
|
|
|
if (device_handle == nfp_interface.GetHandle()) {
|
|
|
|
@ -338,7 +339,7 @@ void IUser::GetModelInfo(Kernel::HLERequestContext& ctx) {
|
|
|
|
|
const auto result = nfp_interface.GetModelInfo(model_info);
|
|
|
|
|
ctx.WriteBuffer(model_info);
|
|
|
|
|
IPC::ResponseBuilder rb{ctx, 2};
|
|
|
|
|
rb.Push(ResultSuccess);
|
|
|
|
|
rb.Push(result);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -488,7 +489,7 @@ bool Module::Interface::LoadAmiibo(const std::vector<u8>& buffer) {
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LOG_INFO(Service_NFP, "New Amiibo detected");
|
|
|
|
|
LOG_INFO(Service_NFP, "Amiibo detected");
|
|
|
|
|
std::memcpy(&amiibo, buffer.data(), sizeof(amiibo));
|
|
|
|
|
|
|
|
|
|
if (!IsAmiiboValid()) {
|
|
|
|
@ -510,21 +511,21 @@ void Module::Interface::CloseAmiibo() {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool Module::Interface::IsAmiiboValid() const {
|
|
|
|
|
LOG_INFO(Service_NFP, "uuid_lock=0x{0:x}", amiibo.uuid_lock);
|
|
|
|
|
LOG_INFO(Service_NFP, "compability_container=0x{0:x}", amiibo.compability_container);
|
|
|
|
|
LOG_INFO(Service_NFP, "crypto_init=0x{0:x}", amiibo.crypto_init);
|
|
|
|
|
LOG_INFO(Service_NFP, "write_count={}", amiibo.write_count);
|
|
|
|
|
LOG_DEBUG(Service_NFP, "uuid_lock=0x{0:x}", amiibo.uuid_lock);
|
|
|
|
|
LOG_DEBUG(Service_NFP, "compability_container=0x{0:x}", amiibo.compability_container);
|
|
|
|
|
LOG_DEBUG(Service_NFP, "crypto_init=0x{0:x}", amiibo.crypto_init);
|
|
|
|
|
LOG_DEBUG(Service_NFP, "write_count={}", amiibo.write_count);
|
|
|
|
|
|
|
|
|
|
LOG_INFO(Service_NFP, "character_id=0x{0:x}", amiibo.model_info.character_id);
|
|
|
|
|
LOG_INFO(Service_NFP, "character_variant={}", amiibo.model_info.character_variant);
|
|
|
|
|
LOG_INFO(Service_NFP, "amiibo_type={}", amiibo.model_info.amiibo_type);
|
|
|
|
|
LOG_INFO(Service_NFP, "model_number=0x{0:x}", amiibo.model_info.model_number);
|
|
|
|
|
LOG_INFO(Service_NFP, "series={}", amiibo.model_info.series);
|
|
|
|
|
LOG_INFO(Service_NFP, "fixed_value=0x{0:x}", amiibo.model_info.fixed);
|
|
|
|
|
LOG_DEBUG(Service_NFP, "character_id=0x{0:x}", amiibo.model_info.character_id);
|
|
|
|
|
LOG_DEBUG(Service_NFP, "character_variant={}", amiibo.model_info.character_variant);
|
|
|
|
|
LOG_DEBUG(Service_NFP, "amiibo_type={}", amiibo.model_info.amiibo_type);
|
|
|
|
|
LOG_DEBUG(Service_NFP, "model_number=0x{0:x}", amiibo.model_info.model_number);
|
|
|
|
|
LOG_DEBUG(Service_NFP, "series={}", amiibo.model_info.series);
|
|
|
|
|
LOG_DEBUG(Service_NFP, "fixed_value=0x{0:x}", amiibo.model_info.fixed);
|
|
|
|
|
|
|
|
|
|
LOG_INFO(Service_NFP, "tag_dynamic_lock=0x{0:x}", amiibo.tag_dynamic_lock);
|
|
|
|
|
LOG_INFO(Service_NFP, "tag_CFG0=0x{0:x}", amiibo.tag_CFG0);
|
|
|
|
|
LOG_INFO(Service_NFP, "tag_CFG1=0x{0:x}", amiibo.tag_CFG1);
|
|
|
|
|
LOG_DEBUG(Service_NFP, "tag_dynamic_lock=0x{0:x}", amiibo.tag_dynamic_lock);
|
|
|
|
|
LOG_DEBUG(Service_NFP, "tag_CFG0=0x{0:x}", amiibo.tag_CFG0);
|
|
|
|
|
LOG_DEBUG(Service_NFP, "tag_CFG1=0x{0:x}", amiibo.tag_CFG1);
|
|
|
|
|
|
|
|
|
|
// Check against all know constants on an amiibo binary
|
|
|
|
|
if (amiibo.uuid_lock != 0xE00F) {
|
|
|
|
@ -701,7 +702,7 @@ ResultCode Module::Interface::OpenApplicationArea(u32 access_id) {
|
|
|
|
|
is_application_area_initialized = true;
|
|
|
|
|
}
|
|
|
|
|
if (!is_application_area_initialized) {
|
|
|
|
|
LOG_ERROR(Service_NFP, "Application area is not initialized");
|
|
|
|
|
LOG_WARNING(Service_NFP, "Application area is not initialized");
|
|
|
|
|
return ErrCodes::ApplicationAreaIsNotInitialized;
|
|
|
|
|
}
|
|
|
|
|
return ResultSuccess;
|
|
|
|
|