From 61fabbe1bcb65d29a1f454f8c133d7c204f2d8a5 Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Fri, 18 Oct 2019 23:09:57 -0700 Subject: [PATCH] i2c: update for new-ipc --- nx/include/switch/services/i2c.h | 2 +- nx/source/services/i2c.c | 185 ++++++------------------------- 2 files changed, 34 insertions(+), 153 deletions(-) diff --git a/nx/include/switch/services/i2c.h b/nx/include/switch/services/i2c.h index a36044c3..9f74465c 100644 --- a/nx/include/switch/services/i2c.h +++ b/nx/include/switch/services/i2c.h @@ -6,7 +6,7 @@ */ #pragma once #include "../types.h" -#include "sm.h" +#include "../sf/service.h" typedef enum { I2cDevice_DebugPad = 0, diff --git a/nx/source/services/i2c.c b/nx/source/services/i2c.c index 3f667f4b..05bf83bb 100644 --- a/nx/source/services/i2c.c +++ b/nx/source/services/i2c.c @@ -1,32 +1,18 @@ -#include "types.h" -#include "result.h" -#include "arm/atomics.h" -#include "kernel/ipc.h" +#define NX_SERVICE_ASSUME_NON_DOMAIN +#include "service_guard.h" #include "services/i2c.h" -#include "services/sm.h" +#include "runtime/hosversion.h" static Service g_i2cSrv; -static u64 g_refCnt; -Result i2cInitialize(void) { - Result rc = 0; +NX_GENERATE_SERVICE_GUARD(i2c); - atomicIncrement64(&g_refCnt); - - if (serviceIsActive(&g_i2cSrv)) - return 0; - - rc = smGetService(&g_i2cSrv, "i2c"); - - if (R_FAILED(rc)) i2cExit(); - - return rc; +Result _i2cInitialize(void) { + return smGetService(&g_i2cSrv, "i2c"); } -void i2cExit(void) { - if (atomicDecrement64(&g_refCnt) == 0) { - serviceClose(&g_i2cSrv); - } +void _i2cCleanup(void) { + serviceClose(&g_i2cSrv); } Service* i2cGetServiceSession(void) { @@ -34,145 +20,40 @@ Service* i2cGetServiceSession(void) { } Result i2cOpenSession(I2cSession *out, I2cDevice dev) { - IpcCommand c; - ipcInitialize(&c); - - struct { - u64 magic; - u64 cmd_id; - u32 device; - } *raw; - - raw = serviceIpcPrepareHeader(&g_i2cSrv, &c, sizeof(*raw)); - - raw->magic = SFCI_MAGIC; - raw->cmd_id = 1; - raw->device = dev; - - Result rc = serviceIpcDispatch(&g_i2cSrv); - - if (R_SUCCEEDED(rc)) { - IpcParsedCommand r; - struct { - u64 magic; - u64 result; - } *resp; - - serviceIpcParse(&g_i2cSrv, &r, sizeof(*resp)); - resp = r.Raw; - - rc = resp->result; - - if (R_SUCCEEDED(rc)) { - serviceCreateSubservice(&out->s, &g_i2cSrv, &r, 0); - } - } - - return rc; + const u32 in = dev; + return serviceDispatchIn(&g_i2cSrv, 1, in, + .out_num_objects = 1, + .out_objects = &out->s, + ); } Result i2csessionSendAuto(I2cSession *s, const void *buf, size_t size, I2cTransactionOption option) { - IpcCommand c; - ipcInitialize(&c); - ipcAddSendSmart(&c, s->s.pointer_buffer_size, buf, size, 0); - - struct { - u64 magic; - u64 cmd_id; - u32 option; - } *raw; - - raw = serviceIpcPrepareHeader(&s->s, &c, sizeof(*raw)); - - raw->magic = SFCI_MAGIC; - raw->cmd_id = 10; - raw->option = option; - - Result rc = serviceIpcDispatch(&s->s); - - if (R_SUCCEEDED(rc)) { - IpcParsedCommand r; - struct { - u64 magic; - u64 result; - } *resp; - - serviceIpcParse(&s->s, &r, sizeof(*resp)); - resp = r.Raw; - - rc = resp->result; - } - - return rc; + const u32 in = option; + return serviceDispatchIn(&s->s, 10, in, + .buffer_attrs = { SfBufferAttr_In | SfBufferAttr_HipcAutoSelect }, + .buffers = { { buf, size } }, + ); } Result i2csessionReceiveAuto(I2cSession *s, void *buf, size_t size, I2cTransactionOption option) { - IpcCommand c; - ipcInitialize(&c); - ipcAddRecvSmart(&c, s->s.pointer_buffer_size, buf, size, 0); - - struct { - u64 magic; - u64 cmd_id; - u32 option; - } *raw; - - raw = serviceIpcPrepareHeader(&s->s, &c, sizeof(*raw)); - - raw->magic = SFCI_MAGIC; - raw->cmd_id = 11; - raw->option = option; - - Result rc = serviceIpcDispatch(&s->s); - - if (R_SUCCEEDED(rc)) { - IpcParsedCommand r; - struct { - u64 magic; - u64 result; - } *resp; - - serviceIpcParse(&s->s, &r, sizeof(*resp)); - resp = r.Raw; - - rc = resp->result; - } - - return rc; + const u32 in = option; + return serviceDispatchIn(&s->s, 11, in, + .buffer_attrs = { SfBufferAttr_Out | SfBufferAttr_HipcAutoSelect }, + .buffers = { { buf, size } }, + ); } Result i2csessionExecuteCommandList(I2cSession *s, void *dst, size_t dst_size, const void *cmd_list, size_t cmd_list_size) { - IpcCommand c; - ipcInitialize(&c); - ipcAddSendStatic(&c, cmd_list, cmd_list_size, 0); - ipcAddRecvSmart(&c, s->s.pointer_buffer_size, dst, dst_size, 0); - - struct { - u64 magic; - u64 cmd_id; - } *raw; - - raw = serviceIpcPrepareHeader(&s->s, &c, sizeof(*raw)); - - raw->magic = SFCI_MAGIC; - raw->cmd_id = 12; - - Result rc = serviceIpcDispatch(&s->s); - - if (R_SUCCEEDED(rc)) { - IpcParsedCommand r; - struct { - u64 magic; - u64 result; - } *resp; - - serviceIpcParse(&s->s, &r, sizeof(*resp)); - resp = r.Raw; - - rc = resp->result; - } - - return rc; + return serviceDispatch(&s->s, 12, + .buffer_attrs = { + SfBufferAttr_Out | SfBufferAttr_HipcAutoSelect, + SfBufferAttr_In | SfBufferAttr_HipcPointer, + }, + .buffers = { + { dst, dst_size }, + { cmd_list, cmd_list_size }, + }, + ); } void i2csessionClose(I2cSession *s) {