diff --git a/examples/.gitignore b/examples/.gitignore new file mode 100644 index 0000000..a4149ca --- /dev/null +++ b/examples/.gitignore @@ -0,0 +1,3 @@ +build/ +*.3dsx +*.elf diff --git a/examples/gpu/source/main.c b/examples/gpu/source/main.c index 159454f..40c46e0 100644 --- a/examples/gpu/source/main.c +++ b/examples/gpu/source/main.c @@ -2,7 +2,7 @@ #include #include #include -#include <3ds/3ds.h> +#include <3ds.h> #include "math.h" #include "test_vsh_shbin.h" #include "test_png_bin.h" diff --git a/libctru/include/3ds.h b/libctru/include/3ds.h new file mode 100644 index 0000000..6628e69 --- /dev/null +++ b/libctru/include/3ds.h @@ -0,0 +1,32 @@ +#pragma once + +#ifdef __cplusplus +extern "C" { +#endif + +//might be missing some +#include <3ds/types.h> +#include <3ds/svc.h> +#include <3ds/srv.h> +#include <3ds/os.h> +#include <3ds/gfx.h> + +#include <3ds/services/ac.h> +#include <3ds/services/apt.h> +#include <3ds/services/cfgnor.h> +#include <3ds/services/csnd.h> +#include <3ds/services/fs.h> +#include <3ds/services/gsp.h> +#include <3ds/services/hid.h> +#include <3ds/services/httpc.h> +#include <3ds/services/ir.h> +#include <3ds/services/ptm.h> +#include <3ds/services/soc.h> + +#include <3ds/gpu/gx.h> +#include <3ds/gpu/gpu.h> +#include <3ds/gpu/shdr.h> + +#ifdef __cplusplus +} +#endif diff --git a/libctru/include/3ds/3ds.h b/libctru/include/3ds/3ds.h deleted file mode 100644 index 724712e..0000000 --- a/libctru/include/3ds/3ds.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifndef __3DS_H - -//might be missing some -#include <3ds/types.h> -#include <3ds/srv.h> -#include <3ds/APT.h> -#include <3ds/GSP.h> -#include <3ds/GX.h> -#include <3ds/GPU.h> -#include <3ds/HID.h> -#include <3ds/SHDR.h> -#include <3ds/svc.h> -#include <3ds/os.h> -#include <3ds/gfx.h> - -#endif diff --git a/libctru/include/3ds/gfx.h b/libctru/include/3ds/gfx.h index 4c5b5e1..27923a9 100644 --- a/libctru/include/3ds/gfx.h +++ b/libctru/include/3ds/gfx.h @@ -1,6 +1,4 @@ -#ifndef GFX_H -#define GFX_H - +#pragma once #include <3ds/types.h> typedef enum @@ -34,5 +32,3 @@ void* gfxAllocLinear(size_t size); extern u8* gfxTopLeftFramebuffers[2]; extern u8* gfxSubFramebuffers[2]; extern u8* gfxBottomFramebuffers[2]; - -#endif diff --git a/libctru/include/3ds/GPU.h b/libctru/include/3ds/gpu/gpu.h similarity index 98% rename from libctru/include/3ds/GPU.h rename to libctru/include/3ds/gpu/gpu.h index 2d521e9..0b2ee2a 100644 --- a/libctru/include/3ds/GPU.h +++ b/libctru/include/3ds/gpu/gpu.h @@ -1,5 +1,4 @@ -#ifndef GPU_H -#define GPU_H +#pragma once void GPU_Init(Handle *gsphandle); void GPU_Reset(u32* gxbuf, u32* gpuBuf, u32 gpuBufSize); @@ -96,5 +95,3 @@ void GPU_SetTexEnv(u8 id, u16 rgbSources, u16 alphaSources, u16 rgbOperands, u16 void GPU_DrawArray(GPU_Primitive_t primitive, u32 n); void GPU_DrawElements(GPU_Primitive_t primitive, u32* indexArray, u32 n); - -#endif diff --git a/libctru/include/3ds/GX.h b/libctru/include/3ds/gpu/gx.h similarity index 95% rename from libctru/include/3ds/GX.h rename to libctru/include/3ds/gpu/gx.h index ad9e941..396a752 100644 --- a/libctru/include/3ds/GX.h +++ b/libctru/include/3ds/gpu/gx.h @@ -1,5 +1,4 @@ -#ifndef GX_H -#define GX_H +#pragma once #define GX_BUFFER_DIM(w, h) (((h)<<16)|((w)&0xFFFF)) @@ -9,5 +8,3 @@ Result GX_SetMemoryFill(u32* gxbuf, u32* buf0a, u32 buf0v, u32* buf0e, u16 width Result GX_SetDisplayTransfer(u32* gxbuf, u32* inadr, u32 indim, u32* outadr, u32 outdim, u32 flags); Result GX_SetTextureCopy(u32* gxbuf, u32* inadr, u32 indim, u32* outadr, u32 outdim, u32 size, u32 flags); Result GX_SetCommandList_First(u32* gxbuf, u32* buf0a, u32 buf0s, u32* buf1a, u32 buf1s, u32* buf2a, u32 buf2s); - -#endif diff --git a/libctru/include/3ds/SHDR.h b/libctru/include/3ds/gpu/shdr.h similarity index 96% rename from libctru/include/3ds/SHDR.h rename to libctru/include/3ds/gpu/shdr.h index e6808f8..459aa0b 100644 --- a/libctru/include/3ds/SHDR.h +++ b/libctru/include/3ds/gpu/shdr.h @@ -1,5 +1,4 @@ -#ifndef SHDR_H -#define SHDR_H +#pragma once typedef enum{ VERTEX_SHDR=0x0, @@ -67,5 +66,3 @@ void DVLP_SendOpDesc(DVLP_s* dvlp); void DVLE_SendOutmap(DVLE_s* dvle); void DVLE_SendConstants(DVLE_s* dvle); - -#endif diff --git a/libctru/include/3ds/os.h b/libctru/include/3ds/os.h index 0ae7eeb..c267590 100644 --- a/libctru/include/3ds/os.h +++ b/libctru/include/3ds/os.h @@ -1,5 +1,4 @@ -#ifndef OS_H -#define OS_H +#pragma once #define SYSTEM_VERSION(major, minor, revision) \ (((major)<<24)|((minor)<<16)|((revision)<<8)) @@ -8,5 +7,3 @@ u32 osConvertVirtToPhys(u32 vaddr); const char* osStrError(u32 error); u32 osGetFirmVersion(); u32 osGetKernelVersion(); - -#endif diff --git a/libctru/include/3ds/AC.h b/libctru/include/3ds/services/ac.h similarity index 78% rename from libctru/include/3ds/AC.h rename to libctru/include/3ds/services/ac.h index 0205d76..3db84fa 100644 --- a/libctru/include/3ds/AC.h +++ b/libctru/include/3ds/services/ac.h @@ -1,11 +1,7 @@ -#ifndef AC_H -#define AC_H +#pragma once Result acInit(); Result acExit(); Result ACU_GetWifiStatus(Handle* servhandle, u32 *out); Result ACU_WaitInternetConnection(); - -#endif - diff --git a/libctru/include/3ds/APT.h b/libctru/include/3ds/services/apt.h similarity index 98% rename from libctru/include/3ds/APT.h rename to libctru/include/3ds/services/apt.h index aae153c..1a1e644 100644 --- a/libctru/include/3ds/APT.h +++ b/libctru/include/3ds/services/apt.h @@ -1,5 +1,4 @@ -#ifndef APT_H -#define APT_H +#pragma once // TODO : find a better place to put this #define RUNFLAG_APTWORKAROUND (BIT(0)) @@ -68,5 +67,3 @@ Result APT_ReplySleepQuery(Handle* handle, NS_APPID appID, u32 a); Result APT_ReplySleepNotificationComplete(Handle* handle, NS_APPID appID); Result APT_PrepareToCloseApplication(Handle* handle, u8 a); Result APT_CloseApplication(Handle* handle, u32 a, u32 b, u32 c); - -#endif diff --git a/libctru/include/3ds/CFGNOR.h b/libctru/include/3ds/services/cfgnor.h similarity index 86% rename from libctru/include/3ds/CFGNOR.h rename to libctru/include/3ds/services/cfgnor.h index b6ca73d..6bcfd71 100644 --- a/libctru/include/3ds/CFGNOR.h +++ b/libctru/include/3ds/services/cfgnor.h @@ -1,5 +1,4 @@ -#ifndef CFGNOR_H -#define CFGNOR_H +#pragma once Result CFGNOR_Initialize(u8 value); Result CFGNOR_Shutdown(); @@ -7,6 +6,3 @@ Result CFGNOR_ReadData(u32 offset, u32 *buf, u32 size); Result CFGNOR_WriteData(u32 offset, u32 *buf, u32 size); Result CFGNOR_DumpFlash(u32 *buf, u32 size); Result CFGNOR_WriteFlash(u32 *buf, u32 size); - -#endif - diff --git a/libctru/include/3ds/CSND.h b/libctru/include/3ds/services/csnd.h similarity index 96% rename from libctru/include/3ds/CSND.h rename to libctru/include/3ds/services/csnd.h index 6ac0b89..f607955 100644 --- a/libctru/include/3ds/CSND.h +++ b/libctru/include/3ds/services/csnd.h @@ -1,5 +1,4 @@ -#ifndef CSND_H -#define CSND_H +#pragma once #define CSND_SHAREDMEM_DEFAULT 0x10004000 @@ -29,6 +28,3 @@ Result CSND_sharedmemtype0_cmdupdatestate(int waitdone); Result CSND_getchannelstate(u32 entryindex, u32 *out); Result CSND_getchannelstate_isplaying(u32 entryindex, u8 *status); - -#endif - diff --git a/libctru/include/3ds/FS.h b/libctru/include/3ds/services/fs.h similarity index 94% rename from libctru/include/3ds/FS.h rename to libctru/include/3ds/services/fs.h index b0e82f6..2fced27 100644 --- a/libctru/include/3ds/FS.h +++ b/libctru/include/3ds/services/fs.h @@ -1,20 +1,12 @@ #pragma once -#ifndef FS_H -#define FS_H +#include +#include <3ds/types.h> /*! @file FS.h * * Filesystem Services */ -#include -#include <3ds/types.h> - -#ifdef __cplusplus -extern "C" -{ -#endif - /*! @defgroup fs_open_flags FS Open Flags * * @sa FSUSER_OpenFile @@ -147,6 +139,9 @@ Result FSUSER_CloseArchive(Handle* handle, FS_archive* archive); Result FSUSER_CreateDirectory(Handle* handle, FS_archive archive, FS_path dirLowPath); Result FSUSER_DeleteFile(Handle *handle, FS_archive archive, FS_path fileLowPath); Result FSUSER_DeleteDirectory(Handle *handle, FS_archive archive, FS_path dirLowPath); +Result FSUSER_GetSdmcArchiveResource(Handle *handle, u32 *sectorSize, u32 *clusterSize, u32 *numClusters, u32 *freeClusters); +Result FSUSER_IsSdmcDetected(Handle *handle, u32 *detected); +Result FSUSER_IsSdmcWritable(Handle *handle, u32 *writable); Result FSFILE_Close(Handle handle); Result FSFILE_Read(Handle handle, u32 *bytesRead, u64 offset, void *buffer, u32 size); @@ -159,9 +154,3 @@ Result FSFILE_Flush(Handle handle); Result FSDIR_Read(Handle handle, u32 *entriesRead, u32 entrycount, FS_dirent *buffer); Result FSDIR_Close(Handle handle); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/libctru/include/3ds/GSP.h b/libctru/include/3ds/services/gsp.h similarity index 98% rename from libctru/include/3ds/GSP.h rename to libctru/include/3ds/services/gsp.h index 7a86c57..f7ddfc2 100644 --- a/libctru/include/3ds/GSP.h +++ b/libctru/include/3ds/services/gsp.h @@ -1,5 +1,4 @@ -#ifndef GSP_H -#define GSP_H +#pragma once #define GSP_REBASE_REG(r) ((r)-0x1EB00000) @@ -80,5 +79,3 @@ Result GSPGPU_RegisterInterruptRelayQueue(Handle *handle, Handle eventHandle, u3 Result GSPGPU_UnregisterInterruptRelayQueue(Handle* handle); Result GSPGPU_TriggerCmdReqQueue(Handle *handle); Result GSPGPU_SubmitGxCommand(u32* sharedGspCmdBuf, u32 gxCommand[0x8], Handle* handle); - -#endif diff --git a/libctru/include/3ds/HID.h b/libctru/include/3ds/services/hid.h similarity index 97% rename from libctru/include/3ds/HID.h rename to libctru/include/3ds/services/hid.h index b361ebd..3e73eee 100644 --- a/libctru/include/3ds/HID.h +++ b/libctru/include/3ds/services/hid.h @@ -1,5 +1,4 @@ -#ifndef HID_H -#define HID_H +#pragma once #define HID_SHAREDMEM_DEFAULT (0x10000000) @@ -66,5 +65,3 @@ Result HIDUSER_EnableAccelerometer(); Result HIDUSER_DisableAccelerometer(); Result HIDUSER_EnableGyroscope(); Result HIDUSER_DisableGyroscope(); - -#endif diff --git a/libctru/include/3ds/HTTPC.h b/libctru/include/3ds/services/httpc.h similarity index 93% rename from libctru/include/3ds/HTTPC.h rename to libctru/include/3ds/services/httpc.h index 3ceeb66..5e53e6f 100644 --- a/libctru/include/3ds/HTTPC.h +++ b/libctru/include/3ds/services/httpc.h @@ -1,5 +1,4 @@ -#ifndef HTTPC_H -#define HTTPC_H +#pragma once Result HTTPC_Initialize(Handle handle); Result HTTPC_InitializeConnectionSession(Handle handle, Handle contextHandle); @@ -9,5 +8,3 @@ Result HTTPC_SetProxyDefault(Handle handle, Handle contextHandle); Result HTTPC_AddRequestHeaderField(Handle handle, Handle contextHandle, char* name, char* value); Result HTTPC_BeginRequest(Handle handle, Handle contextHandle); Result HTTPC_ReceiveData(Handle handle, Handle contextHandle, u8* buffer, u32 size); - -#endif diff --git a/libctru/include/3ds/IR.h b/libctru/include/3ds/services/ir.h similarity index 93% rename from libctru/include/3ds/IR.h rename to libctru/include/3ds/services/ir.h index 8c09d66..8134607 100644 --- a/libctru/include/3ds/IR.h +++ b/libctru/include/3ds/services/ir.h @@ -1,5 +1,4 @@ -#ifndef IR_H -#define IR_H +#pragma once Result IRU_Initialize(u32 *sharedmem_addr, u32 sharedmem_size);//The permissions for the specified memory is set to RO. This memory must be already mapped. Result IRU_Shutdown(); @@ -10,6 +9,3 @@ Result IRU_SetBitRate(u8 value); Result IRU_GetBitRate(u8 *out); Result IRU_SetIRLEDState(u32 value); Result IRU_GetIRLEDRecvState(u32 *out); - -#endif - diff --git a/libctru/include/3ds/PTM.h b/libctru/include/3ds/services/ptm.h similarity index 81% rename from libctru/include/3ds/PTM.h rename to libctru/include/3ds/services/ptm.h index aa761f4..7c595b9 100644 --- a/libctru/include/3ds/PTM.h +++ b/libctru/include/3ds/services/ptm.h @@ -1,10 +1,7 @@ -#ifndef PTM_H -#define PTM_H +#pragma once Result ptmInit(); Result ptmExit(); Result PTMU_GetBatteryLevel(Handle* servhandle, u8 *out); Result PTMU_GetBatteryChargeState(Handle* servhandle, u8 *out); - -#endif diff --git a/libctru/include/3ds/SOC.h b/libctru/include/3ds/services/soc.h similarity index 89% rename from libctru/include/3ds/SOC.h rename to libctru/include/3ds/services/soc.h index 3dc33ef..32fb909 100644 --- a/libctru/include/3ds/SOC.h +++ b/libctru/include/3ds/services/soc.h @@ -1,8 +1,5 @@ -#ifndef SOC_H -#define SOC_H +#pragma once Result SOC_Initialize(u32 *context_addr, u32 context_size);//Example context_size: 0x48000. The specified context buffer can no longer be accessed by the process which called this function, since the userland permissions for this block are set to no-access. Result SOC_Shutdown(); int SOC_GetErrno(); - -#endif diff --git a/libctru/include/3ds/srv.h b/libctru/include/3ds/srv.h index 09d5afe..5012eeb 100644 --- a/libctru/include/3ds/srv.h +++ b/libctru/include/3ds/srv.h @@ -1,9 +1,6 @@ -#ifndef SRV_H -#define SRV_H +#pragma once Result srvInit(); Result srvExit(); Result srvRegisterClient(); Result srvGetServiceHandle(Handle* out, char* name); - -#endif diff --git a/libctru/include/3ds/types.h b/libctru/include/3ds/types.h index 5a9924e..8ea8125 100644 --- a/libctru/include/3ds/types.h +++ b/libctru/include/3ds/types.h @@ -2,12 +2,12 @@ types.h _ Various system types. */ -#ifndef TYPES_H -#define TYPES_H +#pragma once #include #include #include +#include #define U64_MAX UINT64_MAX @@ -36,5 +36,3 @@ typedef s32 Result; typedef void (*ThreadFunc)(u32); #define BIT(n) (1U<<(n)) - -#endif diff --git a/libctru/source/gfx.c b/libctru/source/gfx.c index e3c78c4..0f7596b 100644 --- a/libctru/source/gfx.c +++ b/libctru/source/gfx.c @@ -1,12 +1,7 @@ #include #include #include - -#include <3ds/types.h> -#include <3ds/GSP.h> -#include <3ds/GX.h> -#include <3ds/svc.h> -#include <3ds/gfx.h> +#include <3ds.h> GSP_FramebufferInfo topFramebufferInfo, bottomFramebufferInfo; diff --git a/libctru/source/gpu/gpu.c b/libctru/source/gpu/gpu.c index e9e8067..5c995f8 100644 --- a/libctru/source/gpu/gpu.c +++ b/libctru/source/gpu/gpu.c @@ -4,11 +4,7 @@ #include #include -#include <3ds/types.h> -#include <3ds/GSP.h> -#include <3ds/GX.h> -#include <3ds/GPU.h> -#include <3ds/svc.h> +#include <3ds.h> u32* gpuCmdBuf; u32 gpuCmdBufSize; diff --git a/libctru/source/gpu/shdr.c b/libctru/source/gpu/shdr.c index 542f60b..bab4166 100644 --- a/libctru/source/gpu/shdr.c +++ b/libctru/source/gpu/shdr.c @@ -4,12 +4,7 @@ #include #include -#include <3ds/types.h> -#include <3ds/GSP.h> -#include <3ds/GX.h> -#include <3ds/GPU.h> -#include <3ds/SHDR.h> -#include <3ds/svc.h> +#include <3ds.h> //please don't feed this an invalid SHBIN diff --git a/libctru/source/initSystem.c b/libctru/source/initSystem.c index 0e89d63..b1ad146 100644 --- a/libctru/source/initSystem.c +++ b/libctru/source/initSystem.c @@ -1,7 +1,6 @@ #include -#include <3ds/types.h> -#include <3ds/svc.h> #include +#include <3ds.h> // System globals we define here int __system_argc; diff --git a/libctru/source/os.c b/libctru/source/os.c index b8d828f..f09bf24 100644 --- a/libctru/source/os.c +++ b/libctru/source/os.c @@ -1,6 +1,4 @@ -#include <3ds/types.h> -#include <3ds/svc.h> -#include <3ds/os.h> +#include <3ds.h> u32 osConvertVirtToPhys(u32 vaddr) { diff --git a/libctru/source/services/ac.c b/libctru/source/services/ac.c index 1b382d8..e99db11 100644 --- a/libctru/source/services/ac.c +++ b/libctru/source/services/ac.c @@ -1,8 +1,5 @@ #include -#include <3ds/types.h> -#include <3ds/AC.h> -#include <3ds/svc.h> -#include <3ds/srv.h> +#include <3ds.h> static Handle acHandle; diff --git a/libctru/source/services/apt.c b/libctru/source/services/apt.c index 9fe25c3..bda13b6 100644 --- a/libctru/source/services/apt.c +++ b/libctru/source/services/apt.c @@ -4,11 +4,7 @@ #include #include -#include <3ds/types.h> -#include <3ds/srv.h> -#include <3ds/APT.h> -#include <3ds/GSP.h> -#include <3ds/svc.h> +#include <3ds.h> #define APT_HANDLER_STACKSIZE (0x1000) diff --git a/libctru/source/services/cfgnor.c b/libctru/source/services/cfgnor.c index 45aa4e3..2041b99 100644 --- a/libctru/source/services/cfgnor.c +++ b/libctru/source/services/cfgnor.c @@ -1,8 +1,5 @@ #include -#include <3ds/types.h> -#include <3ds/svc.h> -#include <3ds/srv.h> -#include <3ds/CFGNOR.h> +#include <3ds.h> Handle CFGNOR_handle = 0; diff --git a/libctru/source/services/csnd.c b/libctru/source/services/csnd.c index 3663ab6..9eb11bb 100644 --- a/libctru/source/services/csnd.c +++ b/libctru/source/services/csnd.c @@ -1,10 +1,6 @@ #include #include -#include <3ds/types.h> -#include <3ds/os.h> -#include <3ds/svc.h> -#include <3ds/srv.h> -#include <3ds/CSND.h> +#include <3ds.h> //See here regarding CSND shared-mem commands, etc: http://3dbrew.org/wiki/CSND_Shared_Memory diff --git a/libctru/source/services/fs.c b/libctru/source/services/fs.c index cdd2f31..be5bbd0 100644 --- a/libctru/source/services/fs.c +++ b/libctru/source/services/fs.c @@ -1,8 +1,5 @@ #include -#include <3ds/types.h> -#include <3ds/FS.h> -#include <3ds/srv.h> -#include <3ds/svc.h> +#include <3ds.h> /*! @internal * @@ -609,6 +606,156 @@ FSUSER_CloseArchive(Handle *handle, return cmdbuf[1]; } +/*! Get SD FAT information + * + * @param[in] handle fs:USER handle + * @param[out] sectorSize Sector size (bytes) + * @param[out] clusterSize Cluster size (bytes) + * @param[out] numClusters Total number of clusters + * @param[out] freeClusters Number of free clusters + * + * @returns error + * + * @internal + * + * #### Request + * + * Index Word | Description + * -----------|------------------------- + * 0 | Header code [0x08140000] + * + * #### Response + * + * Index Word | Description + * -----------|------------------------- + * 0 | Header code + * 1 | Result code + * 2 | Sector (bytes) + * 3 | Cluster (bytes) + * 4 | Partition capacity (clusters) + * 5 | Free space (clusters) + */ +Result +FSUSER_GetSdmcArchiveResource(Handle *handle, + u32 *sectorSize, + u32 *clusterSize, + u32 *numClusters, + u32 *freeClusters) +{ + if(!handle) + handle = &fsuHandle; + + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = 0x08140000; + + Result ret = 0; + if((ret = svcSendSyncRequest(*handle))) + return ret; + + if(sectorSize) + *sectorSize = cmdbuf[2]; + + if(clusterSize) + *clusterSize = cmdbuf[3]; + + if(numClusters) + *numClusters = cmdbuf[4]; + + if(freeClusters) + *freeClusters = cmdbuf[5]; + + return cmdbuf[1]; +} + +/*! Check if SD card is detected + * + * @param[in] handle fs:USER handle + * @param[out] detected Output detected state + * + * @returns error + * + * @internal + * + * #### Request + * + * Index Word | Description + * -----------|------------------------- + * 0 | Header code [0x08170000] + * + * #### Response + * + * Index Word | Description + * -----------|------------------------- + * 0 | Header code + * 1 | Result code + * 2 | Whether SD is detected + */ +Result +FSUSER_IsSdmcDetected(Handle *handle, + u32 *detected) +{ + if(!handle) + handle = &fsuHandle; + + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = 0x08170000; + + Result ret = 0; + if((ret = svcSendSyncRequest(*handle))) + return ret; + + if(detected) + *detected = cmdbuf[2]; + + return cmdbuf[1]; +} + +/*! Check if SD card is writable + * + * @param[in] handle fs:USER handle + * @param[out] writable Output writable state + * + * @returns error + * + * @internal + * + * #### Request + * + * Index Word | Description + * -----------|------------------------- + * 0 | Header code [0x08180000] + * + * #### Response + * + * Index Word | Description + * -----------|------------------------- + * 0 | Header code + * 1 | Result code + * 2 | Whether SD is writable + */ +Result +FSUSER_IsSdmcWritable(Handle *handle, + u32 *writable) +{ + if(!handle) + handle = &fsuHandle; + + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = 0x08180000; + + Result ret = 0; + if((ret = svcSendSyncRequest(*handle))) + return ret; + + if(writable) + *writable = cmdbuf[2]; + + return cmdbuf[1]; +} + /*! Close an open file * * @param[in] handle Open file handle diff --git a/libctru/source/services/gsp.c b/libctru/source/services/gsp.c index 377547a..d92d7ea 100644 --- a/libctru/source/services/gsp.c +++ b/libctru/source/services/gsp.c @@ -4,10 +4,7 @@ #include #include -#include <3ds/types.h> -#include <3ds/GSP.h> -#include <3ds/svc.h> -#include <3ds/srv.h> +#include <3ds.h> #define GSP_EVENT_STACK_SIZE 0x1000 diff --git a/libctru/source/services/gx.c b/libctru/source/services/gx.c index 5b42eb1..c4fd8a1 100644 --- a/libctru/source/services/gx.c +++ b/libctru/source/services/gx.c @@ -3,10 +3,7 @@ */ #include -#include <3ds/types.h> -#include <3ds/GSP.h> -#include <3ds/GX.h> -#include <3ds/svc.h> +#include <3ds.h> Result GX_RequestDma(u32* gxbuf, u32* src, u32* dst, u32 length) { diff --git a/libctru/source/services/hid.c b/libctru/source/services/hid.c index b85ce9a..e67e60d 100644 --- a/libctru/source/services/hid.c +++ b/libctru/source/services/hid.c @@ -3,10 +3,7 @@ */ #include #include -#include <3ds/types.h> -#include <3ds/HID.h> -#include <3ds/srv.h> -#include <3ds/svc.h> +#include <3ds.h> Handle hidHandle; Handle hidMemHandle; diff --git a/libctru/source/services/httpc.c b/libctru/source/services/httpc.c index ce61824..d9e7ec7 100644 --- a/libctru/source/services/httpc.c +++ b/libctru/source/services/httpc.c @@ -1,7 +1,5 @@ #include -#include <3ds/types.h> -#include <3ds/HTTPC.h> -#include <3ds/svc.h> +#include <3ds.h> Result HTTPC_Initialize(Handle handle) { diff --git a/libctru/source/services/ir.c b/libctru/source/services/ir.c index b2e4078..22ec39a 100644 --- a/libctru/source/services/ir.c +++ b/libctru/source/services/ir.c @@ -1,9 +1,6 @@ #include #include -#include <3ds/types.h> -#include <3ds/svc.h> -#include <3ds/srv.h> -#include <3ds/IR.h> +#include <3ds.h> static Handle iru_handle=0; static Handle iru_sharedmem_handle=0; diff --git a/libctru/source/services/ptm.c b/libctru/source/services/ptm.c index 136c512..8fa21fc 100644 --- a/libctru/source/services/ptm.c +++ b/libctru/source/services/ptm.c @@ -1,8 +1,5 @@ #include -#include <3ds/types.h> -#include <3ds/svc.h> -#include <3ds/srv.h> -#include <3ds/PTM.h> +#include <3ds.h> static Handle ptmHandle; diff --git a/libctru/source/services/soc.c b/libctru/source/services/soc.c index 3e488c6..3791b9f 100644 --- a/libctru/source/services/soc.c +++ b/libctru/source/services/soc.c @@ -1,8 +1,3 @@ -#include <3ds/types.h> -#include <3ds/svc.h> -#include <3ds/srv.h> -#include <3ds/SOC.h> - #include #include #include @@ -10,6 +5,7 @@ #include #include #include +#include <3ds.h> Handle SOCU_handle = 0; static int SOCU_errno = 0; diff --git a/libctru/source/srv.c b/libctru/source/srv.c index 40f98d6..06f3d8b 100644 --- a/libctru/source/srv.c +++ b/libctru/source/srv.c @@ -3,9 +3,7 @@ */ #include -#include <3ds/types.h> -#include <3ds/srv.h> -#include <3ds/svc.h> +#include <3ds.h> /*