Service cleanup.

This commit is contained in:
Steven Smith 2015-11-10 20:33:37 -08:00
parent 9c98fe54b1
commit 375fbce98a
61 changed files with 1847 additions and 2417 deletions

View File

@ -14,14 +14,16 @@ extern "C" {
#include <3ds/ipc.h> #include <3ds/ipc.h>
#include <3ds/svc.h> #include <3ds/svc.h>
#include <3ds/srv.h> #include <3ds/srv.h>
#include <3ds/linear.h>
#include <3ds/vram.h>
#include <3ds/os.h> #include <3ds/os.h>
#include <3ds/synchronization.h> #include <3ds/synchronization.h>
#include <3ds/gfx.h> #include <3ds/gfx.h>
#include <3ds/console.h> #include <3ds/console.h>
#include <3ds/util/utf.h> #include <3ds/util/utf.h>
#include <3ds/allocator/linear.h>
#include <3ds/allocator/mappable.h>
#include <3ds/allocator/vram.h>
#include <3ds/services/ac.h> #include <3ds/services/ac.h>
#include <3ds/services/am.h> #include <3ds/services/am.h>
#include <3ds/services/apt.h> #include <3ds/services/apt.h>
@ -31,7 +33,8 @@ extern "C" {
#include <3ds/services/csnd.h> #include <3ds/services/csnd.h>
#include <3ds/services/dsp.h> #include <3ds/services/dsp.h>
#include <3ds/services/fs.h> #include <3ds/services/fs.h>
#include <3ds/services/gsp.h> #include <3ds/services/gspgpu.h>
#include <3ds/services/gsplcd.h>
#include <3ds/services/hid.h> #include <3ds/services/hid.h>
#include <3ds/services/irrst.h> #include <3ds/services/irrst.h>
#include <3ds/services/httpc.h> #include <3ds/services/httpc.h>
@ -39,7 +42,8 @@ extern "C" {
#include <3ds/services/ns.h> #include <3ds/services/ns.h>
#include <3ds/services/pm.h> #include <3ds/services/pm.h>
#include <3ds/services/ps.h> #include <3ds/services/ps.h>
#include <3ds/services/ptm.h> #include <3ds/services/ptmu.h>
#include <3ds/services/ptmsysm.h>
#include <3ds/services/soc.h> #include <3ds/services/soc.h>
#include <3ds/services/mic.h> #include <3ds/services/mic.h>
#include <3ds/services/mvd.h> #include <3ds/services/mvd.h>

View File

@ -8,7 +8,7 @@
#pragma once #pragma once
#include <3ds/types.h> #include <3ds/types.h>
#include <3ds/services/gsp.h> #include <3ds/services/gspgpu.h>
/// Converts red, green, and blue components to packed RGB565. /// Converts red, green, and blue components to packed RGB565.
#define RGB565(r,g,b) (((b)&0x1f)|(((g)&0x3f)<<5)|(((r)&0x1f)<<11)) #define RGB565(r,g,b) (((b)&0x1f)|(((g)&0x3f)<<5)|(((r)&0x1f)<<11))
@ -63,7 +63,7 @@ void gfxInitDefault(void);
* @note Even if the double buffering is disabled, it will allocate two buffer per screen. * @note Even if the double buffering is disabled, it will allocate two buffer per screen.
* @note You should always call @ref gfxExit once done to free the memory and services * @note You should always call @ref gfxExit once done to free the memory and services
*/ */
void gfxInit(GSP_FramebufferFormats topFormat, GSP_FramebufferFormats bottomFormat, bool vrambuffers); void gfxInit(GSPGPU_FramebufferFormats topFormat, GSPGPU_FramebufferFormats bottomFormat, bool vrambuffers);
/** /**
* @brief Closes the gsp service and frees the framebuffers. * @brief Closes the gsp service and frees the framebuffers.
@ -86,14 +86,14 @@ void gfxSet3D(bool enable);
* @param screen The screen of which format should be changed * @param screen The screen of which format should be changed
* @param format One of the gsp pixel formats. * @param format One of the gsp pixel formats.
*/ */
void gfxSetScreenFormat(gfxScreen_t screen, GSP_FramebufferFormats format); void gfxSetScreenFormat(gfxScreen_t screen, GSPGPU_FramebufferFormats format);
/** /**
* @brief Gets a screen pixel format. * @brief Gets a screen pixel format.
* @param screen Screen to get the pixel format of. * @param screen Screen to get the pixel format of.
* @return the pixel format of the chosen screen set by ctrulib. * @return the pixel format of the chosen screen set by ctrulib.
*/ */
GSP_FramebufferFormats gfxGetScreenFormat(gfxScreen_t screen); GSPGPU_FramebufferFormats gfxGetScreenFormat(gfxScreen_t screen);
/** /**
* @brief Sets whether to use ctrulib's double buffering * @brief Sets whether to use ctrulib's double buffering

View File

@ -9,7 +9,7 @@
/** /**
* @brief Supported transfer pixel formats. * @brief Supported transfer pixel formats.
* @sa GSP_FramebufferFormats * @sa GSPGPU_FramebufferFormats
*/ */
typedef enum typedef enum
{ {

View File

@ -38,12 +38,12 @@ enum
}; };
/// Interpolation types. /// Interpolation types.
enum typedef enum
{ {
NDSP_INTERP_POLYPHASE = 0, ///< Polyphase interpolation NDSP_INTERP_POLYPHASE = 0, ///< Polyphase interpolation
NDSP_INTERP_LINEAR = 1, ///< Linear interpolation NDSP_INTERP_LINEAR = 1, ///< Linear interpolation
NDSP_INTERP_NONE = 2, ///< No interpolation NDSP_INTERP_NONE = 2, ///< No interpolation
}; } ndspInterpType;
///@} ///@}
@ -87,7 +87,6 @@ u16 ndspChnGetWaveBufSeq(int id);
///@{ ///@{
/** /**
* @brief Sets the format of a channel. * @brief Sets the format of a channel.
* @sa NDSP_Encoding
* @param id ID of the channel (0..23). * @param id ID of the channel (0..23).
* @param format Format to use. * @param format Format to use.
*/ */
@ -98,7 +97,7 @@ void ndspChnSetFormat(int id, u16 format);
* @param id ID of the channel (0..23). * @param id ID of the channel (0..23).
* @param type Interpolation type to use. * @param type Interpolation type to use.
*/ */
void ndspChnSetInterp(int id, int type); void ndspChnSetInterp(int id, ndspInterpType type);
/** /**
* @brief Sets the sample rate of a channel. * @brief Sets the sample rate of a channel.

View File

@ -7,27 +7,27 @@
///@name Data types ///@name Data types
///@{ ///@{
/// Sound output modes. /// Sound output modes.
enum typedef enum
{ {
NDSP_OUTPUT_MONO = 0, ///< Mono sound NDSP_OUTPUT_MONO = 0, ///< Mono sound
NDSP_OUTPUT_STEREO = 1, ///< Stereo sound NDSP_OUTPUT_STEREO = 1, ///< Stereo sound
NDSP_OUTPUT_SURROUND = 2, ///< 3D Surround sound NDSP_OUTPUT_SURROUND = 2, ///< 3D Surround sound
}; } ndspOutputMode;
// Clipping modes. // Clipping modes.
enum typedef enum
{ {
NDSP_CLIP_NORMAL = 0, ///< "Normal" clipping mode (?) NDSP_CLIP_NORMAL = 0, ///< "Normal" clipping mode (?)
NDSP_CLIP_SOFT = 1, ///< "Soft" clipping mode (?) NDSP_CLIP_SOFT = 1, ///< "Soft" clipping mode (?)
}; } ndspClippingMode;
// Surround speaker positions. // Surround speaker positions.
enum typedef enum
{ {
NDSP_SPKPOS_SQUARE = 0, ///<? NDSP_SPKPOS_SQUARE = 0, ///<?
NDSP_SPKPOS_WIDE = 1, ///<? NDSP_SPKPOS_WIDE = 1, ///<?
NDSP_SPKPOS_NUM = 2, ///<? NDSP_SPKPOS_NUM = 2, ///<?
}; } ndspSpeakerPos;
/// ADPCM data. /// ADPCM data.
typedef struct typedef struct
@ -118,13 +118,13 @@ void ndspSetMasterVol(float volume);
* @brief Sets the output mode. * @brief Sets the output mode.
* @param mode Output mode to set. Defaults to NDSP_OUTPUT_STEREO. * @param mode Output mode to set. Defaults to NDSP_OUTPUT_STEREO.
*/ */
void ndspSetOutputMode(int mode); void ndspSetOutputMode(ndspOutputMode mode);
/** /**
* @brief Sets the clipping mode. * @brief Sets the clipping mode.
* @param mode Clipping mode to set. Defaults to NDSP_CLIP_SOFT. * @param mode Clipping mode to set. Defaults to NDSP_CLIP_SOFT.
*/ */
void ndspSetClippingMode(int mode); void ndspSetClippingMode(ndspClippingMode mode);
/** /**
* @brief Sets the output count. * @brief Sets the output count.
@ -158,7 +158,7 @@ void ndspSurroundSetDepth(u16 depth);
* @brief Sets the surround sound position. * @brief Sets the surround sound position.
* @param pos Position to set. Defaults to NDSP_SPKPOS_SQUARE. * @param pos Position to set. Defaults to NDSP_SPKPOS_SQUARE.
*/ */
void ndspSurroundSetPos(u16 pos); void ndspSurroundSetPos(ndspSpeakerPos pos);
/** /**
* @brief Sets the surround sound rear ratio. * @brief Sets the surround sound rear ratio.

View File

@ -10,11 +10,11 @@ Result acInit(void);
/// Exits AC. /// Exits AC.
void acExit(void); void acExit(void);
/// Waits for the system to connect to the internet.
Result acWaitInternetConnection(void);
/** /**
* @brief Gets the current Wifi status. * @brief Gets the current Wifi status.
* @param out Pointer to output the current Wifi status to. (0 = not connected, 1 = O3DS Internet, 2 = N3DS Internet) * @param out Pointer to output the current Wifi status to. (0 = not connected, 1 = O3DS Internet, 2 = N3DS Internet)
*/ */
Result ACU_GetWifiStatus(u32 *out); Result ACU_GetWifiStatus(u32 *out);
/// Waits for the system to connect to the internet.
Result ACU_WaitInternetConnection(void);

View File

@ -15,7 +15,7 @@
* *
* Retrieved from http://3dbrew.org/wiki/NS_and_APT_Services#AppIDs * Retrieved from http://3dbrew.org/wiki/NS_and_APT_Services#AppIDs
*/ */
typedef enum{ typedef enum {
APPID_HOMEMENU = 0x101, ///< Home Menu APPID_HOMEMENU = 0x101, ///< Home Menu
APPID_CAMERA = 0x110, ///< Camera applet APPID_CAMERA = 0x110, ///< Camera applet
APPID_FRIENDS_LIST = 0x112, ///< Friends List applet APPID_FRIENDS_LIST = 0x112, ///< Friends List applet
@ -36,10 +36,10 @@ typedef enum{
APPID_MINT = 0x407, ///< mint APPID_MINT = 0x407, ///< mint
APPID_EXTRAPAD = 0x408, ///< extrapad APPID_EXTRAPAD = 0x408, ///< extrapad
APPID_MEMOLIB = 0x409, ///< memolib APPID_MEMOLIB = 0x409, ///< memolib
}NS_APPID; } NS_APPID;
/// App status values. /// App status values.
typedef enum{ typedef enum {
APP_NOTINITIALIZED, ///< App not initialized. APP_NOTINITIALIZED, ///< App not initialized.
APP_RUNNING, ///< App running. APP_RUNNING, ///< App running.
APP_SUSPENDED, ///< App suspended. APP_SUSPENDED, ///< App suspended.
@ -49,10 +49,10 @@ typedef enum{
APP_PREPARE_SLEEPMODE, ///< App preparing to enter sleep mode. APP_PREPARE_SLEEPMODE, ///< App preparing to enter sleep mode.
APP_APPLETSTARTED, ///< Applet started. APP_APPLETSTARTED, ///< Applet started.
APP_APPLETCLOSED ///< Applet closed. APP_APPLETCLOSED ///< Applet closed.
}APP_STATUS; } APT_AppStatus;
/// APT signals. /// APT signals.
enum { typedef enum {
APTSIGNAL_HOMEBUTTON = 1, ///< Home button pressed. APTSIGNAL_HOMEBUTTON = 1, ///< Home button pressed.
// 2: sleep-mode related? // 2: sleep-mode related?
APTSIGNAL_PREPARESLEEP = 3, ///< Prepare to enter sleep mode. APTSIGNAL_PREPARESLEEP = 3, ///< Prepare to enter sleep mode.
@ -64,10 +64,10 @@ enum {
APTSIGNAL_UTILITY = 9, ///< Utility called. APTSIGNAL_UTILITY = 9, ///< Utility called.
APTSIGNAL_SLEEPSYSTEM = 10, ///< System sleeping. APTSIGNAL_SLEEPSYSTEM = 10, ///< System sleeping.
APTSIGNAL_ERROR = 11 ///< Error occurred. APTSIGNAL_ERROR = 11 ///< Error occurred.
}; } APT_Signal;
/// APT hook types. /// APT hook types.
enum { typedef enum {
APTHOOK_ONSUSPEND = 0, ///< App suspended. APTHOOK_ONSUSPEND = 0, ///< App suspended.
APTHOOK_ONRESTORE, ///< App restored. APTHOOK_ONRESTORE, ///< App restored.
APTHOOK_ONSLEEP, ///< App sleeping. APTHOOK_ONSLEEP, ///< App sleeping.
@ -75,10 +75,10 @@ enum {
APTHOOK_ONEXIT, ///< App exiting. APTHOOK_ONEXIT, ///< App exiting.
APTHOOK_COUNT, ///< Number of APT hook types. APTHOOK_COUNT, ///< Number of APT hook types.
}; } APT_HookType;
/// APT hook function. /// APT hook function.
typedef void (*aptHookFn)(int hook, void* param); typedef void (*aptHookFn)(APT_HookType hook, void* param);
/// APT hook cookie. /// APT hook cookie.
typedef struct tag_aptHookCookie typedef struct tag_aptHookCookie
@ -107,13 +107,13 @@ void aptCloseSession(void);
* @brief Sets the app's status. * @brief Sets the app's status.
* @param status Status to set. * @param status Status to set.
*/ */
void aptSetStatus(APP_STATUS status); void aptSetStatus(APT_AppStatus status);
/** /**
* @brief Gets the app's status. * @brief Gets the app's status.
* @return The app's status. * @return The app's status.
*/ */
APP_STATUS aptGetStatus(void); APT_AppStatus aptGetStatus(void);
/** /**
* @brief Gets the app's power status. * @brief Gets the app's power status.
@ -278,7 +278,7 @@ Result APT_IsRegistered(NS_APPID appID, u8* out);
* @param appID ID of the application. * @param appID ID of the application.
* @param signalType Pointer to output the signal type to. * @param signalType Pointer to output the signal type to.
*/ */
Result APT_InquireNotification(u32 appID, u8* signalType); Result APT_InquireNotification(u32 appID, APT_Signal* signalType);
/** /**
* @brief Notifies an application to wait. * @brief Notifies an application to wait.

View File

@ -8,17 +8,17 @@
#include <3ds/types.h> #include <3ds/types.h>
/// Camera connection target ports. /// Camera connection target ports.
typedef enum { enum {
PORT_NONE = 0x0, ///< No port. PORT_NONE = 0x0, ///< No port.
PORT_CAM1 = BIT(0), ///< CAM1 port. PORT_CAM1 = BIT(0), ///< CAM1 port.
PORT_CAM2 = BIT(1), ///< CAM2 port. PORT_CAM2 = BIT(1), ///< CAM2 port.
// Port combinations. // Port combinations.
PORT_BOTH = PORT_CAM1 | PORT_CAM2, ///< Both ports. PORT_BOTH = PORT_CAM1 | PORT_CAM2, ///< Both ports.
} CAMU_Port; };
/// Camera combinations. /// Camera combinations.
typedef enum { enum {
SELECT_NONE = 0x0, ///< No camera. SELECT_NONE = 0x0, ///< No camera.
SELECT_OUT1 = BIT(0), ///< Outer camera 1. SELECT_OUT1 = BIT(0), ///< Outer camera 1.
SELECT_IN1 = BIT(1), ///< Inner camera 1. SELECT_IN1 = BIT(1), ///< Inner camera 1.
@ -29,7 +29,7 @@ typedef enum {
SELECT_OUT1_OUT2 = SELECT_OUT1 | SELECT_OUT2, ///< Both outer cameras. SELECT_OUT1_OUT2 = SELECT_OUT1 | SELECT_OUT2, ///< Both outer cameras.
SELECT_IN1_OUT2 = SELECT_IN1 | SELECT_OUT2, ///< Inner camera 1 and outer camera 2. SELECT_IN1_OUT2 = SELECT_IN1 | SELECT_OUT2, ///< Inner camera 1 and outer camera 2.
SELECT_ALL = SELECT_OUT1 | SELECT_IN1 | SELECT_OUT2, ///< All cameras. SELECT_ALL = SELECT_OUT1 | SELECT_IN1 | SELECT_OUT2, ///< All cameras.
} CAMU_CameraSelect; };
/// Camera contexts. /// Camera contexts.
typedef enum { typedef enum {
@ -200,7 +200,7 @@ typedef struct {
/// Batch camera configuration for use without a context. /// Batch camera configuration for use without a context.
typedef struct { typedef struct {
u8 camera; ///< #CAMU_CameraSelect Selected camera. u8 camera; ///< Selected camera.
s8 exposure; ///< Camera exposure. s8 exposure; ///< Camera exposure.
u8 whiteBalance; ///< #CAMU_WhiteBalance Camera white balance. u8 whiteBalance; ///< #CAMU_WhiteBalance Camera white balance.
s8 sharpness; ///< Camera sharpness. s8 sharpness; ///< Camera sharpness.
@ -224,7 +224,7 @@ typedef struct {
/// Batch camera configuration for use with a context. /// Batch camera configuration for use with a context.
typedef struct { typedef struct {
u8 camera; ///< #CAMU_CameraSelect Selected camera. u8 camera; ///< Selected camera.
u8 context; ///< #CAMU_Context Selected context. u8 context; ///< #CAMU_Context Selected context.
u8 flip; ///< #CAMU_Flip Camera image flip mode. u8 flip; ///< #CAMU_Flip Camera image flip mode.
u8 effect; ///< #CAMU_Effect Camera image special effects. u8 effect; ///< #CAMU_Effect Camera image special effects.
@ -233,7 +233,7 @@ typedef struct {
/// Batch camera configuration for use with a context and with detailed size information. /// Batch camera configuration for use with a context and with detailed size information.
typedef struct { typedef struct {
u8 camera; ///< #CAMU_CameraSelect Selected camera. u8 camera; ///< Selected camera.
u8 context; ///< #CAMU_Context Selected context. u8 context; ///< #CAMU_Context Selected context.
u8 flip; ///< #CAMU_Flip Camera image flip mode. u8 flip; ///< #CAMU_Flip Camera image flip mode.
u8 effect; ///< #CAMU_Effect Camera image special effects. u8 effect; ///< #CAMU_Effect Camera image special effects.
@ -263,40 +263,40 @@ void camExit(void);
* Begins capture on the specified camera port. * Begins capture on the specified camera port.
* @param port Port to begin capture on. * @param port Port to begin capture on.
*/ */
Result CAMU_StartCapture(CAMU_Port port); Result CAMU_StartCapture(u32 port);
/** /**
* Terminates capture on the specified camera port. * Terminates capture on the specified camera port.
* @param port Port to terminate capture on. * @param port Port to terminate capture on.
*/ */
Result CAMU_StopCapture(CAMU_Port port); Result CAMU_StopCapture(u32 port);
/** /**
* @brief Gets whether the specified camera port is busy. * @brief Gets whether the specified camera port is busy.
* @param busy Pointer to output the busy state to. * @param busy Pointer to output the busy state to.
* @param port Port to check. * @param port Port to check.
*/ */
Result CAMU_IsBusy(bool* busy, CAMU_Port port); Result CAMU_IsBusy(bool* busy, u32 port);
/** /**
* @brief Clears the buffer and error flags of the specified camera port. * @brief Clears the buffer and error flags of the specified camera port.
* @param port Port to clear. * @param port Port to clear.
*/ */
Result CAMU_ClearBuffer(CAMU_Port port); Result CAMU_ClearBuffer(u32 port);
/** /**
* @brief Gets a handle to the event signaled on vsync interrupts. * @brief Gets a handle to the event signaled on vsync interrupts.
* @param event Pointer to output the event handle to. * @param event Pointer to output the event handle to.
* @param port Port to use. * @param port Port to use.
*/ */
Result CAMU_GetVsyncInterruptEvent(Handle* event, CAMU_Port port); Result CAMU_GetVsyncInterruptEvent(Handle* event, u32 port);
/** /**
* @brief Gets a handle to the event signaled on camera buffer errors. * @brief Gets a handle to the event signaled on camera buffer errors.
* @param event Pointer to output the event handle to. * @param event Pointer to output the event handle to.
* @param port Port to use. * @param port Port to use.
*/ */
Result CAMU_GetBufferErrorInterruptEvent(Handle* event, CAMU_Port port); Result CAMU_GetBufferErrorInterruptEvent(Handle* event, u32 port);
/** /**
* @brief Initiates the process of receiving a camera frame. * @brief Initiates the process of receiving a camera frame.
@ -306,14 +306,14 @@ Result CAMU_GetBufferErrorInterruptEvent(Handle* event, CAMU_Port port);
* @param imageSize Size of the image to receive. * @param imageSize Size of the image to receive.
* @param transferUnit Transfer unit to use when receiving. * @param transferUnit Transfer unit to use when receiving.
*/ */
Result CAMU_SetReceiving(Handle* event, void* dst, CAMU_Port port, u32 imageSize, s16 transferUnit); Result CAMU_SetReceiving(Handle* event, void* dst, u32 port, u32 imageSize, s16 transferUnit);
/** /**
* @brief Gets whether the specified camera port has finished receiving image data. * @brief Gets whether the specified camera port has finished receiving image data.
* @param finishedReceiving Pointer to output the receiving status to. * @param finishedReceiving Pointer to output the receiving status to.
* @param port Port to check. * @param port Port to check.
*/ */
Result CAMU_IsFinishedReceiving(bool* finishedReceiving, CAMU_Port port); Result CAMU_IsFinishedReceiving(bool* finishedReceiving, u32 port);
/** /**
* @brief Sets the number of lines to transfer into an image buffer. * @brief Sets the number of lines to transfer into an image buffer.
@ -322,7 +322,7 @@ Result CAMU_IsFinishedReceiving(bool* finishedReceiving, CAMU_Port port);
* @param width Width of the image. * @param width Width of the image.
* @param height Height of the image. * @param height Height of the image.
*/ */
Result CAMU_SetTransferLines(CAMU_Port port, s16 lines, s16 width, s16 height); Result CAMU_SetTransferLines(u32 port, s16 lines, s16 width, s16 height);
/** /**
* @brief Gets the maximum number of lines that can be saved to an image buffer. * @brief Gets the maximum number of lines that can be saved to an image buffer.
@ -339,14 +339,14 @@ Result CAMU_GetMaxLines(s16* maxLines, s16 width, s16 height);
* @param width Width of the image. * @param width Width of the image.
* @param height Height of the image. * @param height Height of the image.
*/ */
Result CAMU_SetTransferBytes(CAMU_Port port, u32 bytes, s16 width, s16 height); Result CAMU_SetTransferBytes(u32 port, u32 bytes, s16 width, s16 height);
/** /**
* @brief Gets the number of bytes to transfer into an image buffer. * @brief Gets the number of bytes to transfer into an image buffer.
* @param transferBytes Pointer to write the number of bytes to. * @param transferBytes Pointer to write the number of bytes to.
* @param port Port to use. * @param port Port to use.
*/ */
Result CAMU_GetTransferBytes(u32* transferBytes, CAMU_Port port); Result CAMU_GetTransferBytes(u32* transferBytes, u32 port);
/** /**
* @brief Gets the maximum number of bytes that can be saved to an image buffer. * @brief Gets the maximum number of bytes that can be saved to an image buffer.
@ -361,14 +361,14 @@ Result CAMU_GetMaxBytes(u32* maxBytes, s16 width, s16 height);
* @param port Port to use. * @param port Port to use.
* @param trimming Whether image trimming is enabled. * @param trimming Whether image trimming is enabled.
*/ */
Result CAMU_SetTrimming(CAMU_Port port, bool trimming); Result CAMU_SetTrimming(u32 port, bool trimming);
/** /**
* @brief Gets whether image trimming is enabled. * @brief Gets whether image trimming is enabled.
* @param trimming Pointer to output the trim state to. * @param trimming Pointer to output the trim state to.
* @param port Port to use. * @param port Port to use.
*/ */
Result CAMU_IsTrimming(bool* trimming, CAMU_Port port); Result CAMU_IsTrimming(bool* trimming, u32 port);
/** /**
* @brief Sets the parameters used for trimming images. * @brief Sets the parameters used for trimming images.
@ -378,7 +378,7 @@ Result CAMU_IsTrimming(bool* trimming, CAMU_Port port);
* @param xEnd End X coordinate. * @param xEnd End X coordinate.
* @param yEnd End Y coordinate. * @param yEnd End Y coordinate.
*/ */
Result CAMU_SetTrimmingParams(CAMU_Port port, s16 xStart, s16 yStart, s16 xEnd, s16 yEnd); Result CAMU_SetTrimmingParams(u32 port, s16 xStart, s16 yStart, s16 xEnd, s16 yEnd);
/** /**
* @brief Gets the parameters used for trimming images. * @brief Gets the parameters used for trimming images.
@ -388,7 +388,7 @@ Result CAMU_SetTrimmingParams(CAMU_Port port, s16 xStart, s16 yStart, s16 xEnd,
* @param yEnd Pointer to write the end Y coordinate to. * @param yEnd Pointer to write the end Y coordinate to.
* @param port Port to use. * @param port Port to use.
*/ */
Result CAMU_GetTrimmingParams(s16* xStart, s16* yStart, s16* xEnd, s16* yEnd, CAMU_Port port); Result CAMU_GetTrimmingParams(s16* xStart, s16* yStart, s16* xEnd, s16* yEnd, u32 port);
/** /**
* @brief Sets the parameters used for trimming images, relative to the center of the image. * @brief Sets the parameters used for trimming images, relative to the center of the image.
@ -398,34 +398,34 @@ Result CAMU_GetTrimmingParams(s16* xStart, s16* yStart, s16* xEnd, s16* yEnd, CA
* @param camWidth Camera width. * @param camWidth Camera width.
* @param camHeight Camera height. * @param camHeight Camera height.
*/ */
Result CAMU_SetTrimmingParamsCenter(CAMU_Port port, s16 trimWidth, s16 trimHeight, s16 camWidth, s16 camHeight); Result CAMU_SetTrimmingParamsCenter(u32 port, s16 trimWidth, s16 trimHeight, s16 camWidth, s16 camHeight);
/** /**
* @brief Activates the specified camera. * @brief Activates the specified camera.
* @param select Camera to use. * @param select Camera to use.
*/ */
Result CAMU_Activate(CAMU_CameraSelect select); Result CAMU_Activate(u32 select);
/** /**
* @brief Switches the specified camera's active context. * @brief Switches the specified camera's active context.
* @param select Camera to use. * @param select Camera to use.
* @param context Context to use. * @param context Context to use.
*/ */
Result CAMU_SwitchContext(CAMU_CameraSelect select, CAMU_Context context); Result CAMU_SwitchContext(u32 select, CAMU_Context context);
/** /**
* @brief Sets the exposure value of the specified camera. * @brief Sets the exposure value of the specified camera.
* @param select Camera to use. * @param select Camera to use.
* @param exposure Exposure value to use. * @param exposure Exposure value to use.
*/ */
Result CAMU_SetExposure(CAMU_CameraSelect select, s8 exposure); Result CAMU_SetExposure(u32 select, s8 exposure);
/** /**
* @brief Sets the white balance mode of the specified camera. * @brief Sets the white balance mode of the specified camera.
* @param select Camera to use. * @param select Camera to use.
* @param whiteBalance White balance mode to use. * @param whiteBalance White balance mode to use.
*/ */
Result CAMU_SetWhiteBalance(CAMU_CameraSelect select, CAMU_WhiteBalance whiteBalance); Result CAMU_SetWhiteBalance(u32 select, CAMU_WhiteBalance whiteBalance);
/** /**
* @brief Sets the white balance mode of the specified camera. * @brief Sets the white balance mode of the specified camera.
@ -433,42 +433,42 @@ Result CAMU_SetWhiteBalance(CAMU_CameraSelect select, CAMU_WhiteBalance whiteBal
* @param select Camera to use. * @param select Camera to use.
* @param whiteBalance White balance mode to use. * @param whiteBalance White balance mode to use.
*/ */
Result CAMU_SetWhiteBalanceWithoutBaseUp(CAMU_CameraSelect select, CAMU_WhiteBalance whiteBalance); Result CAMU_SetWhiteBalanceWithoutBaseUp(u32 select, CAMU_WhiteBalance whiteBalance);
/** /**
* @brief Sets the sharpness of the specified camera. * @brief Sets the sharpness of the specified camera.
* @param select Camera to use. * @param select Camera to use.
* @param sharpness Sharpness to use. * @param sharpness Sharpness to use.
*/ */
Result CAMU_SetSharpness(CAMU_CameraSelect select, s8 sharpness); Result CAMU_SetSharpness(u32 select, s8 sharpness);
/** /**
* @brief Sets whether auto exposure is enabled on the specified camera. * @brief Sets whether auto exposure is enabled on the specified camera.
* @param select Camera to use. * @param select Camera to use.
* @param autoWhiteBalance Whether auto exposure is enabled. * @param autoWhiteBalance Whether auto exposure is enabled.
*/ */
Result CAMU_SetAutoExposure(CAMU_CameraSelect select, bool autoExposure); Result CAMU_SetAutoExposure(u32 select, bool autoExposure);
/** /**
* @brief Gets whether auto exposure is enabled on the specified camera. * @brief Gets whether auto exposure is enabled on the specified camera.
* @param autoExposure Pointer to output the auto exposure state to. * @param autoExposure Pointer to output the auto exposure state to.
* @param select Camera to use. * @param select Camera to use.
*/ */
Result CAMU_IsAutoExposure(bool* autoExposure, CAMU_CameraSelect select); Result CAMU_IsAutoExposure(bool* autoExposure, u32 select);
/** /**
* @brief Sets whether auto white balance is enabled on the specified camera. * @brief Sets whether auto white balance is enabled on the specified camera.
* @param select Camera to use. * @param select Camera to use.
* @param autoWhiteBalance Whether auto white balance is enabled. * @param autoWhiteBalance Whether auto white balance is enabled.
*/ */
Result CAMU_SetAutoWhiteBalance(CAMU_CameraSelect select, bool autoWhiteBalance); Result CAMU_SetAutoWhiteBalance(u32 select, bool autoWhiteBalance);
/** /**
* @brief Gets whether auto white balance is enabled on the specified camera. * @brief Gets whether auto white balance is enabled on the specified camera.
* @param autoWhiteBalance Pointer to output the auto white balance state to. * @param autoWhiteBalance Pointer to output the auto white balance state to.
* @param select Camera to use. * @param select Camera to use.
*/ */
Result CAMU_IsAutoWhiteBalance(bool* autoWhiteBalance, CAMU_CameraSelect select); Result CAMU_IsAutoWhiteBalance(bool* autoWhiteBalance, u32 select);
/** /**
* @brief Flips the image of the specified camera in the specified context. * @brief Flips the image of the specified camera in the specified context.
@ -476,7 +476,7 @@ Result CAMU_IsAutoWhiteBalance(bool* autoWhiteBalance, CAMU_CameraSelect select)
* @param flip Flip mode to use. * @param flip Flip mode to use.
* @param context Context to use. * @param context Context to use.
*/ */
Result CAMU_FlipImage(CAMU_CameraSelect select, CAMU_Flip flip, CAMU_Context context); Result CAMU_FlipImage(u32 select, CAMU_Flip flip, CAMU_Context context);
/** /**
* @brief Sets the image resolution of the given camera in the given context, in detail. * @brief Sets the image resolution of the given camera in the given context, in detail.
@ -489,7 +489,7 @@ Result CAMU_FlipImage(CAMU_CameraSelect select, CAMU_Flip flip, CAMU_Context con
* @param cropY1 Second crop point Y. * @param cropY1 Second crop point Y.
* @param context Context to use. * @param context Context to use.
*/ */
Result CAMU_SetDetailSize(CAMU_CameraSelect select, s16 width, s16 height, s16 cropX0, s16 cropY0, s16 cropX1, s16 cropY1, CAMU_Context context); Result CAMU_SetDetailSize(u32 select, s16 width, s16 height, s16 cropX0, s16 cropY0, s16 cropX1, s16 cropY1, CAMU_Context context);
/** /**
* @brief Sets the image resolution of the given camera in the given context. * @brief Sets the image resolution of the given camera in the given context.
@ -497,21 +497,21 @@ Result CAMU_SetDetailSize(CAMU_CameraSelect select, s16 width, s16 height, s16 c
* @param size Size to use. * @param size Size to use.
* @param context Context to use. * @param context Context to use.
*/ */
Result CAMU_SetSize(CAMU_CameraSelect select, CAMU_Size size, CAMU_Context context); Result CAMU_SetSize(u32 select, CAMU_Size size, CAMU_Context context);
/** /**
* @brief Sets the frame rate of the given camera. * @brief Sets the frame rate of the given camera.
* @param select Camera to use. * @param select Camera to use.
* @param frameRate Frame rate to use. * @param frameRate Frame rate to use.
*/ */
Result CAMU_SetFrameRate(CAMU_CameraSelect select, CAMU_FrameRate frameRate); Result CAMU_SetFrameRate(u32 select, CAMU_FrameRate frameRate);
/** /**
* @brief Sets the photo mode of the given camera. * @brief Sets the photo mode of the given camera.
* @param select Camera to use. * @param select Camera to use.
* @param photoMode Photo mode to use. * @param photoMode Photo mode to use.
*/ */
Result CAMU_SetPhotoMode(CAMU_CameraSelect select, CAMU_PhotoMode photoMode); Result CAMU_SetPhotoMode(u32 select, CAMU_PhotoMode photoMode);
/** /**
* @brief Sets the special effects of the given camera in the given context. * @brief Sets the special effects of the given camera in the given context.
@ -519,21 +519,21 @@ Result CAMU_SetPhotoMode(CAMU_CameraSelect select, CAMU_PhotoMode photoMode);
* @param effect Effect to use. * @param effect Effect to use.
* @param context Context to use. * @param context Context to use.
*/ */
Result CAMU_SetEffect(CAMU_CameraSelect select, CAMU_Effect effect, CAMU_Context context); Result CAMU_SetEffect(u32 select, CAMU_Effect effect, CAMU_Context context);
/** /**
* @brief Sets the contrast mode of the given camera. * @brief Sets the contrast mode of the given camera.
* @param select Camera to use. * @param select Camera to use.
* @param contrast Contrast mode to use. * @param contrast Contrast mode to use.
*/ */
Result CAMU_SetContrast(CAMU_CameraSelect select, CAMU_Contrast contrast); Result CAMU_SetContrast(u32 select, CAMU_Contrast contrast);
/** /**
* @brief Sets the lens correction mode of the given camera. * @brief Sets the lens correction mode of the given camera.
* @param select Camera to use. * @param select Camera to use.
* @param lensCorrection Lens correction mode to use. * @param lensCorrection Lens correction mode to use.
*/ */
Result CAMU_SetLensCorrection(CAMU_CameraSelect select, CAMU_LensCorrection lensCorrection); Result CAMU_SetLensCorrection(u32 select, CAMU_LensCorrection lensCorrection);
/** /**
* @brief Sets the output format of the given camera in the given context. * @brief Sets the output format of the given camera in the given context.
@ -541,7 +541,7 @@ Result CAMU_SetLensCorrection(CAMU_CameraSelect select, CAMU_LensCorrection lens
* @param format Format to output. * @param format Format to output.
* @param context Context to use. * @param context Context to use.
*/ */
Result CAMU_SetOutputFormat(CAMU_CameraSelect select, CAMU_OutputFormat format, CAMU_Context context); Result CAMU_SetOutputFormat(u32 select, CAMU_OutputFormat format, CAMU_Context context);
/** /**
* @brief Sets the region to base auto exposure off of for the specified camera. * @brief Sets the region to base auto exposure off of for the specified camera.
@ -551,7 +551,7 @@ Result CAMU_SetOutputFormat(CAMU_CameraSelect select, CAMU_OutputFormat format,
* @param width Width of the region. * @param width Width of the region.
* @param height Height of the region. * @param height Height of the region.
*/ */
Result CAMU_SetAutoExposureWindow(CAMU_CameraSelect select, s16 x, s16 y, s16 width, s16 height); Result CAMU_SetAutoExposureWindow(u32 select, s16 x, s16 y, s16 width, s16 height);
/** /**
* @brief Sets the region to base auto white balance off of for the specified camera. * @brief Sets the region to base auto white balance off of for the specified camera.
@ -561,21 +561,21 @@ Result CAMU_SetAutoExposureWindow(CAMU_CameraSelect select, s16 x, s16 y, s16 wi
* @param width Width of the region. * @param width Width of the region.
* @param height Height of the region. * @param height Height of the region.
*/ */
Result CAMU_SetAutoWhiteBalanceWindow(CAMU_CameraSelect select, s16 x, s16 y, s16 width, s16 height); Result CAMU_SetAutoWhiteBalanceWindow(u32 select, s16 x, s16 y, s16 width, s16 height);
/** /**
* @brief Sets whether the specified camera's noise filter is enabled. * @brief Sets whether the specified camera's noise filter is enabled.
* @param select Camera to use. * @param select Camera to use.
* @param noiseFilter Whether the noise filter is enabled. * @param noiseFilter Whether the noise filter is enabled.
*/ */
Result CAMU_SetNoiseFilter(CAMU_CameraSelect select, bool noiseFilter); Result CAMU_SetNoiseFilter(u32 select, bool noiseFilter);
/** /**
* @brief Synchronizes the specified cameras' vsync timing. * @brief Synchronizes the specified cameras' vsync timing.
* @param select1 First camera. * @param select1 First camera.
* @param select2 Second camera. * @param select2 Second camera.
*/ */
Result CAMU_SynchronizeVsyncTiming(CAMU_CameraSelect select1, CAMU_CameraSelect select2); Result CAMU_SynchronizeVsyncTiming(u32 select1, u32 select2);
/** /**
* @brief Gets the vsync timing record of the specified camera for the specified number of signals. * @brief Gets the vsync timing record of the specified camera for the specified number of signals.
@ -583,7 +583,7 @@ Result CAMU_SynchronizeVsyncTiming(CAMU_CameraSelect select1, CAMU_CameraSelect
* @param port Port to use. * @param port Port to use.
* @param past Number of past timings to retrieve. * @param past Number of past timings to retrieve.
*/ */
Result CAMU_GetLatestVsyncTiming(s64* timing, CAMU_Port port, u32 past); Result CAMU_GetLatestVsyncTiming(s64* timing, u32 port, u32 past);
/** /**
* @brief Gets the specified camera's stereo camera calibration data. * @brief Gets the specified camera's stereo camera calibration data.
@ -603,7 +603,7 @@ Result CAMU_SetStereoCameraCalibrationData(CAMU_StereoCameraCalibrationData data
* @param addr Address to write to. * @param addr Address to write to.
* @param data Data to write. * @param data Data to write.
*/ */
Result CAMU_WriteRegisterI2c(CAMU_CameraSelect select, u16 addr, u16 data); Result CAMU_WriteRegisterI2c(u32 select, u16 addr, u16 data);
/** /**
* @brief Writes to the specified MCU variable of the specified camera. * @brief Writes to the specified MCU variable of the specified camera.
@ -611,7 +611,7 @@ Result CAMU_WriteRegisterI2c(CAMU_CameraSelect select, u16 addr, u16 data);
* @param addr Address to write to. * @param addr Address to write to.
* @param data Data to write. * @param data Data to write.
*/ */
Result CAMU_WriteMcuVariableI2c(CAMU_CameraSelect select, u16 addr, u16 data); Result CAMU_WriteMcuVariableI2c(u32 select, u16 addr, u16 data);
/** /**
* @brief Reads the specified I2C register of the specified camera. * @brief Reads the specified I2C register of the specified camera.
@ -619,7 +619,7 @@ Result CAMU_WriteMcuVariableI2c(CAMU_CameraSelect select, u16 addr, u16 data);
* @param select Camera to read from. * @param select Camera to read from.
* @param addr Address to read. * @param addr Address to read.
*/ */
Result CAMU_ReadRegisterI2cExclusive(u16* data, CAMU_CameraSelect select, u16 addr); Result CAMU_ReadRegisterI2cExclusive(u16* data, u32 select, u16 addr);
/** /**
* @brief Reads the specified MCU variable of the specified camera. * @brief Reads the specified MCU variable of the specified camera.
@ -627,7 +627,7 @@ Result CAMU_ReadRegisterI2cExclusive(u16* data, CAMU_CameraSelect select, u16 ad
* @param select Camera to read from. * @param select Camera to read from.
* @param addr Address to read. * @param addr Address to read.
*/ */
Result CAMU_ReadMcuVariableI2cExclusive(u16* data, CAMU_CameraSelect select, u16 addr); Result CAMU_ReadMcuVariableI2cExclusive(u16* data, u32 select, u16 addr);
/** /**
* @brief Sets the specified camera's image quality calibration data. * @brief Sets the specified camera's image quality calibration data.
@ -663,7 +663,7 @@ Result CAMU_SetPackageParameterWithContextDetail(CAMU_PackageParameterContextDet
* @brief Gets the Y2R coefficient applied to image data by the camera. * @brief Gets the Y2R coefficient applied to image data by the camera.
* @param coefficient Pointer to output the Y2R coefficient to. * @param coefficient Pointer to output the Y2R coefficient to.
*/ */
Result CAMU_GetSuitableY2rStandardCoefficient(Y2R_StandardCoefficient* coefficient); Result CAMU_GetSuitableY2rStandardCoefficient(Y2RU_StandardCoefficient* coefficient);
/** /**
* @brief Plays the specified shutter sound. * @brief Plays the specified shutter sound.
@ -681,19 +681,19 @@ Result CAMU_DriverFinalize(void);
* @brief Gets the current activated camera. * @brief Gets the current activated camera.
* @param select Pointer to output the current activated camera to. * @param select Pointer to output the current activated camera to.
*/ */
Result CAMU_GetActivatedCamera(CAMU_CameraSelect* select); Result CAMU_GetActivatedCamera(u32* select);
/** /**
* @brief Gets the current sleep camera. * @brief Gets the current sleep camera.
* @param select Pointer to output the current sleep camera to. * @param select Pointer to output the current sleep camera to.
*/ */
Result CAMU_GetSleepCamera(CAMU_CameraSelect* select); Result CAMU_GetSleepCamera(u32* select);
/** /**
* @brief Sets the current sleep camera. * @brief Sets the current sleep camera.
* @param select Camera to set. * @param select Camera to set.
*/ */
Result CAMU_SetSleepCamera(CAMU_CameraSelect select); Result CAMU_SetSleepCamera(u32 select);
/** /**
* @brief Sets whether to enable synchronization of left and right camera brightnesses. * @brief Sets whether to enable synchronization of left and right camera brightnesses.

View File

@ -8,9 +8,32 @@
* @brief Initializes CFGNOR. * @brief Initializes CFGNOR.
* @param value Unknown, usually 1. * @param value Unknown, usually 1.
*/ */
Result cfgnorInit(u8 value);
/// Exits CFGNOR
void cfgnorExit(void);
/**
* @brief Dumps the NOR flash.
* @param buf Buffer to dump to.
* @param size Size of the buffer.
*/
Result cfgnorDumpFlash(u32 *buf, u32 size);
/**
* @brief Writes the NOR flash.
* @param buf Buffer to write from.
* @param size Size of the buffer.
*/
Result cfgnorWriteFlash(u32 *buf, u32 size);
/**
* @brief Initializes the CFGNOR session.
* @param value Unknown, usually 1.
*/
Result CFGNOR_Initialize(u8 value); Result CFGNOR_Initialize(u8 value);
/// Shuts down CFGNOR. /// Shuts down the CFGNOR session.
Result CFGNOR_Shutdown(void); Result CFGNOR_Shutdown(void);
/** /**
@ -28,17 +51,3 @@ Result CFGNOR_ReadData(u32 offset, u32 *buf, u32 size);
* @param size Size of the buffer. * @param size Size of the buffer.
*/ */
Result CFGNOR_WriteData(u32 offset, u32 *buf, u32 size); Result CFGNOR_WriteData(u32 offset, u32 *buf, u32 size);
/**
* @brief Dumps the NOR flash.
* @param buf Buffer to dump to.
* @param size Size of the buffer.
*/
Result CFGNOR_DumpFlash(u32 *buf, u32 size);
/**
* @brief Writes the NOR flash.
* @param buf Buffer to write from.
* @param size Size of the buffer.
*/
Result CFGNOR_WriteFlash(u32 *buf, u32 size);

View File

@ -27,7 +27,7 @@ typedef enum
CFG_LANGUAGE_PT = 9, ///< Portugese CFG_LANGUAGE_PT = 9, ///< Portugese
CFG_LANGUAGE_RU = 10, ///< Russian CFG_LANGUAGE_RU = 10, ///< Russian
CFG_LANGUAGE_TW = 11, ///< Traditional Chinese CFG_LANGUAGE_TW = 11, ///< Traditional Chinese
} CFG_Langage; } CFG_Language;
/// Initializes CFGU. /// Initializes CFGU.
Result cfguInit(void); Result cfguInit(void);
@ -90,6 +90,6 @@ Result CFGU_GetConfigInfoBlk2(u32 size, u32 blkID, u8* outData);
/** /**
* @brief Gets the system's language. * @brief Gets the system's language.
* @param language Pointer to write the language to. (see @ref CFG_Langage) * @param language Pointer to write the language to. (see @ref CFG_Language)
*/ */
Result CFGU_GetSystemLanguage(u8* language); Result CFGU_GetSystemLanguage(u8* language);

View File

@ -83,7 +83,7 @@ enum
}; };
/// Duty cycles for a PSG channel. /// Duty cycles for a PSG channel.
enum typedef enum
{ {
DutyCycle_0 = 7, ///< 0.0% duty cycle DutyCycle_0 = 7, ///< 0.0% duty cycle
DutyCycle_12 = 0, ///< 12.5% duty cycle DutyCycle_12 = 0, ///< 12.5% duty cycle
@ -93,7 +93,7 @@ enum
DutyCycle_62 = 4, ///< 62.5% duty cycle DutyCycle_62 = 4, ///< 62.5% duty cycle
DutyCycle_75 = 5, ///< 75.0% duty cycle DutyCycle_75 = 5, ///< 75.0% duty cycle
DutyCycle_87 = 6 ///< 87.5% duty cycle DutyCycle_87 = 6 ///< 87.5% duty cycle
}; } CSND_DutyCycle;
/// Channel info. /// Channel info.
typedef union typedef union
@ -142,6 +142,27 @@ Result CSND_AcquireCapUnit(u32* capUnit);
*/ */
Result CSND_ReleaseCapUnit(u32 capUnit); Result CSND_ReleaseCapUnit(u32 capUnit);
/**
* @brief Flushes the data cache of a memory region.
* @param adr Address of the memory region.
* @param size Size of the memory region.
*/
Result CSND_FlushDataCache(const void* adr, u32 size);
/**
* @brief Stores the data cache of a memory region.
* @param adr Address of the memory region.
* @param size Size of the memory region.
*/
Result CSND_StoreDataCache(const void* adr, u32 size);
/**
* @brief Invalidates the data cache of a memory region.
* @param adr Address of the memory region.
* @param size Size of the memory region.
*/
Result CSND_InvalidateDataCache(const void* adr, u32 size);
/** /**
* @brief Resets CSND. * @brief Resets CSND.
* Note: Currently breaks sound, don't use for now! * Note: Currently breaks sound, don't use for now!
@ -230,7 +251,7 @@ void CSND_SetInterp(u32 channel, bool interp);
* @param channel Channel to use. * @param channel Channel to use.
* @param duty Duty to set. * @param duty Duty to set.
*/ */
void CSND_SetDuty(u32 channel, u32 duty); void CSND_SetDuty(u32 channel, CSND_DutyCycle duty);
/** /**
* @brief Sets a channel's timer. * @brief Sets a channel's timer.
@ -281,7 +302,7 @@ void CSND_SetChnRegs(u32 flags, u32 physaddr0, u32 physaddr1, u32 totalbytesize,
* @param capVolumes Capture volume data. * @param capVolumes Capture volume data.
* @param duty Duty value to set. * @param duty Duty value to set.
*/ */
void CSND_SetChnRegsPSG(u32 flags, u32 chnVolumes, u32 capVolumes, u32 duty); void CSND_SetChnRegsPSG(u32 flags, u32 chnVolumes, u32 capVolumes, CSND_DutyCycle duty);
/** /**
* @brief Sets CSND's noise channel registers. * @brief Sets CSND's noise channel registers.
@ -365,7 +386,7 @@ Result CSND_UpdateInfo(bool waitDone);
* @param data0 First block of sound data. * @param data0 First block of sound data.
* @param data1 Second block of sound data. This is the block that will be looped over. * @param data1 Second block of sound data. This is the block that will be looped over.
* @param size Size of the sound data. * @param size Size of the sound data.
* *
* In this implementation if the loop mode is used, data1 must be in the range [data0 ; data0 + size]. Sound will be played once from data0 to data0 + size and then loop between data1 and data0+size. * In this implementation if the loop mode is used, data1 must be in the range [data0 ; data0 + size]. Sound will be played once from data0 to data0 + size and then loop between data1 and data0+size.
*/ */
Result csndPlaySound(int chn, u32 flags, u32 sampleRate, float vol, float pan, void* data0, void* data1, u32 size); Result csndPlaySound(int chn, u32 flags, u32 sampleRate, float vol, float pan, void* data0, void* data1, u32 size);

View File

@ -88,9 +88,7 @@ typedef struct
// 0x00 // 0x00
u16 name[0x106]; ///< UTF-16 encoded name u16 name[0x106]; ///< UTF-16 encoded name
// 0x20C // 0x20C
u8 shortName[0x09]; ///< 8.3 File name u8 shortName[0x0A]; ///< 8.3 File name
// 0x215
u8 unknown1; ///< ???
// 0x216 // 0x216
u8 shortExt[0x04]; ///< 8.3 File extension (set to spaces for directories) u8 shortExt[0x04]; ///< 8.3 File extension (set to spaces for directories)
// 0x21A // 0x21A
@ -127,7 +125,7 @@ Handle *fsGetSessionHandle(void);
* @param path Path to use. * @param path Path to use.
* @return The created FS_path instance. * @return The created FS_path instance.
*/ */
FS_path FS_makePath(FS_pathType type, const char *path); FS_path fsMakePath(FS_pathType type, const char *path);
/** /**
* @brief Initializes FSUSER. * @brief Initializes FSUSER.

View File

@ -1,10 +1,10 @@
/** /**
* @file gsp.h * @file gspgpu.h
* @brief GSP service. * @brief GSPGPU service.
*/ */
#pragma once #pragma once
#define GSP_REBASE_REG(r) ((r)-0x1EB00000) #define GSPGPU_REBASE_REG(r) ((r)-0x1EB00000)
/// Framebuffer information. /// Framebuffer information.
typedef struct typedef struct
@ -16,7 +16,7 @@ typedef struct
u32 format; ///< Framebuffer format, this u16 is written to the low u16 for LCD register 0x1EF00X70. u32 format; ///< Framebuffer format, this u16 is written to the low u16 for LCD register 0x1EF00X70.
u32 framebuf_dispselect; ///< Value for 0x1EF00X78, controls which framebuffer is displayed. u32 framebuf_dispselect; ///< Value for 0x1EF00X78, controls which framebuffer is displayed.
u32 unk; ///< Unknown. u32 unk; ///< Unknown.
} GSP_FramebufferInfo; } GSPGPU_FramebufferInfo;
/// Framebuffer format. /// Framebuffer format.
typedef enum typedef enum
@ -26,7 +26,7 @@ typedef enum
GSP_RGB565_OES=2, ///< RGB565. (2 bytes) GSP_RGB565_OES=2, ///< RGB565. (2 bytes)
GSP_RGB5_A1_OES=3, ///< RGB5A1. (2 bytes) GSP_RGB5_A1_OES=3, ///< RGB5A1. (2 bytes)
GSP_RGBA4_OES=4 ///< RGBA4. (2 bytes) GSP_RGBA4_OES=4 ///< RGBA4. (2 bytes)
}GSP_FramebufferFormats; } GSPGPU_FramebufferFormats;
/// Capture info entry. /// Capture info entry.
typedef struct typedef struct
@ -35,89 +35,82 @@ typedef struct
u32 *framebuf1_vaddr; ///< Right framebuffer. u32 *framebuf1_vaddr; ///< Right framebuffer.
u32 format; ///< Framebuffer format. u32 format; ///< Framebuffer format.
u32 framebuf_widthbytesize; ///< Framebuffer pitch. u32 framebuf_widthbytesize; ///< Framebuffer pitch.
} GSP_CaptureInfoEntry; } GSPGPU_CaptureInfoEntry;
/// Capture info. /// Capture info.
typedef struct typedef struct
{ {
GSP_CaptureInfoEntry screencapture[2]; ///< Capture info entries, one for each screen. GSPGPU_CaptureInfoEntry screencapture[2]; ///< Capture info entries, one for each screen.
} GSP_CaptureInfo; } GSPGPU_CaptureInfo;
/// GSP events. /// GSPGPU events.
typedef enum typedef enum
{ {
GSPEVENT_PSC0 = 0, ///< Memory fill completed. GSPGPU_EVENT_PSC0 = 0, ///< Memory fill completed.
GSPEVENT_PSC1, ///< TODO GSPGPU_EVENT_PSC1, ///< TODO
GSPEVENT_VBlank0, ///< TODO GSPGPU_EVENT_VBlank0, ///< TODO
GSPEVENT_VBlank1, ///< TODO GSPGPU_EVENT_VBlank1, ///< TODO
GSPEVENT_PPF, ///< Display transfer finished. GSPGPU_EVENT_PPF, ///< Display transfer finished.
GSPEVENT_P3D, ///< Command list processing finished. GSPGPU_EVENT_P3D, ///< Command list processing finished.
GSPEVENT_DMA, ///< TODO GSPGPU_EVENT_DMA, ///< TODO
GSPEVENT_MAX, ///< Used to know how many events there are. GSPGPU_EVENT_MAX, ///< Used to know how many events there are.
} GSP_Event; } GSPGPU_Event;
/// LCD screens. /// Initializes GSPGPU.
typedef enum
{
GSPLCD_TOP = BIT(0), ///< Top screen.
GSPLCD_BOTTOM = BIT(1), ///< Bottom screen.
GSPLCD_BOTH = GSPLCD_TOP | GSPLCD_BOTTOM, ///< Both screens.
}GSPLCD_Screens;
/// Initializes GSP.
Result gspInit(void); Result gspInit(void);
/// Exits GSP. /// Exits GSPGPU.
void gspExit(void); void gspExit(void);
/// Initializes GSPLCD.
Result gspLcdInit(void);
/// Exits GSPLCD.
void gspLcdExit(void);
/** /**
* @brief Initializes the GSP event handler. * @brief Initializes the GSPGPU event handler.
* @param gspEvent Event handle to use. * @param gspEvent Event handle to use.
* @param gspSharedMem GSP shared memory. * @param gspSharedMem GSP shared memory.
* @param gspThreadId ID of the GSP thread. * @param gspThreadId ID of the GSP thread.
*/ */
Result gspInitEventHandler(Handle gspEvent, vu8* gspSharedMem, u8 gspThreadId); Result gspInitEventHandler(Handle gspEvent, vu8* gspSharedMem, u8 gspThreadId);
/// Exits the GSP event handler. /// Exits the GSPGPU event handler.
void gspExitEventHandler(void); void gspExitEventHandler(void);
/** /**
* @brief Waits for a GSP event to occur. * @brief Waits for a GSPGPU event to occur.
* @param id ID of the event. * @param id ID of the event.
* @param Whether to discard the current event and wait for the next event. * @param Whether to discard the current event and wait for the next event.
*/ */
void gspWaitForEvent(GSP_Event id, bool nextEvent); void gspWaitForEvent(GSPGPU_Event id, bool nextEvent);
/// Waits for PSC0 /// Waits for PSC0
#define gspWaitForPSC0() gspWaitForEvent(GSPEVENT_PSC0, false) #define gspWaitForPSC0() gspWaitForEvent(GSPGPU_EVENT_PSC0, false)
/// Waits for PSC1 /// Waits for PSC1
#define gspWaitForPSC1() gspWaitForEvent(GSPEVENT_PSC1, false) #define gspWaitForPSC1() gspWaitForEvent(GSPGPU_EVENT_PSC1, false)
/// Waits for VBlank. /// Waits for VBlank.
#define gspWaitForVBlank() gspWaitForVBlank0() #define gspWaitForVBlank() gspWaitForVBlank0()
/// Waits for VBlank0. /// Waits for VBlank0.
#define gspWaitForVBlank0() gspWaitForEvent(GSPEVENT_VBlank0, true) #define gspWaitForVBlank0() gspWaitForEvent(GSPGPU_EVENT_VBlank0, true)
/// Waits for VBlank1. /// Waits for VBlank1.
#define gspWaitForVBlank1() gspWaitForEvent(GSPEVENT_VBlank1, true) #define gspWaitForVBlank1() gspWaitForEvent(GSPGPU_EVENT_VBlank1, true)
/// Waits for PPF. /// Waits for PPF.
#define gspWaitForPPF() gspWaitForEvent(GSPEVENT_PPF, false) #define gspWaitForPPF() gspWaitForEvent(GSPGPU_EVENT_PPF, false)
/// Waits for P3D. /// Waits for P3D.
#define gspWaitForP3D() gspWaitForEvent(GSPEVENT_P3D, false) #define gspWaitForP3D() gspWaitForEvent(GSPGPU_EVENT_P3D, false)
/// Waits for DMA. /// Waits for DMA.
#define gspWaitForDMA() gspWaitForEvent(GSPEVENT_DMA, false) #define gspWaitForDMA() gspWaitForEvent(GSPGPU_EVENT_DMA, false)
/**
* @brief Submits a GX command.
* @param sharedGspCmdBuf Command buffer to use.
* @param gxCommand GX command to execute.
*/
Result gspSubmitGxCommand(u32* sharedGspCmdBuf, u32 gxCommand[0x8]);
/** /**
* @brief Acquires GPU rights. * @brief Acquires GPU rights.
@ -132,7 +125,7 @@ Result GSPGPU_ReleaseRight(void);
* @brief Retrieves display capture info. * @brief Retrieves display capture info.
* @param captureinfo Pointer to output capture info to. * @param captureinfo Pointer to output capture info to.
*/ */
Result GSPGPU_ImportDisplayCaptureInfo(GSP_CaptureInfo *captureinfo); Result GSPGPU_ImportDisplayCaptureInfo(GSPGPU_CaptureInfo*captureinfo);
/// Sames the VRAM sys area. /// Sames the VRAM sys area.
Result GSPGPU_SaveVramSysArea(void); Result GSPGPU_SaveVramSysArea(void);
@ -151,7 +144,7 @@ Result GSPGPU_SetLcdForceBlack(u8 flags);
* @param screenid ID of the screen to update. * @param screenid ID of the screen to update.
* @param framebufinfo Framebuffer information to update with. * @param framebufinfo Framebuffer information to update with.
*/ */
Result GSPGPU_SetBufferSwap(u32 screenid, GSP_FramebufferInfo *framebufinfo); Result GSPGPU_SetBufferSwap(u32 screenid, GSPGPU_FramebufferInfo*framebufinfo);
/** /**
* @brief Flushes memory from the data cache. * @brief Flushes memory from the data cache.
@ -208,21 +201,3 @@ Result GSPGPU_UnregisterInterruptRelayQueue(void);
/// Triggers a handling of commands written to shared memory. /// Triggers a handling of commands written to shared memory.
Result GSPGPU_TriggerCmdReqQueue(void); Result GSPGPU_TriggerCmdReqQueue(void);
/**
* @brief Submits a GX command.
* @param sharedGspCmdBuf Command buffer to use.
* @param gxCommand GX command to execute.
*/
Result GSPGPU_SubmitGxCommand(u32* sharedGspCmdBuf, u32 gxCommand[0x8]);
/**
* @brief Powers off the backlight.
* @param screen Screen to power off.
*/
Result GSPLCD_PowerOffBacklight(GSPLCD_Screens screen);
/**
* @brief Powers on the backlight.
* @param screen Screen to power on.
*/
Result GSPLCD_PowerOnBacklight(GSPLCD_Screens screen);

View File

@ -0,0 +1,33 @@
/**
* @file gsplcd.h
* @brief GSPLCD service.
*/
#pragma once
#include <3ds/gfx.h> // For gfxScreen_t
/// LCD screens.
enum
{
GSPLCD_SCREEN_TOP = BIT(GFX_TOP), ///< Top screen.
GSPLCD_SCREEN_BOTTOM = BIT(GFX_BOTTOM), ///< Bottom screen.
GSPLCD_SCREEN_BOTH = GSPLCD_SCREEN_TOP | GSPLCD_SCREEN_BOTTOM, ///< Both screens.
};
/// Initializes GSPLCD.
Result gspLcdInit(void);
/// Exits GSPLCD.
void gspLcdExit(void);
/**
* @brief Powers on the backlight.
* @param screen Screen to power on.
*/
Result GSPLCD_PowerOnBacklight(u32 screen);
/**
* @brief Powers off the backlight.
* @param screen Screen to power off.
*/
Result GSPLCD_PowerOffBacklight(u32 screen);

View File

@ -7,7 +7,7 @@
//See also: http://3dbrew.org/wiki/HID_Services http://3dbrew.org/wiki/HID_Shared_Memory //See also: http://3dbrew.org/wiki/HID_Services http://3dbrew.org/wiki/HID_Shared_Memory
/// Key values. /// Key values.
typedef enum enum
{ {
KEY_A = BIT(0), ///< A KEY_A = BIT(0), ///< A
KEY_B = BIT(1), ///< B KEY_B = BIT(1), ///< B
@ -38,7 +38,7 @@ typedef enum
KEY_DOWN = KEY_DDOWN | KEY_CPAD_DOWN, ///< D-Pad Down or Circle Pad Down KEY_DOWN = KEY_DDOWN | KEY_CPAD_DOWN, ///< D-Pad Down or Circle Pad Down
KEY_LEFT = KEY_DLEFT | KEY_CPAD_LEFT, ///< D-Pad Left or Circle Pad Left KEY_LEFT = KEY_DLEFT | KEY_CPAD_LEFT, ///< D-Pad Left or Circle Pad Left
KEY_RIGHT = KEY_DRIGHT | KEY_CPAD_RIGHT, ///< D-Pad Right or Circle Pad Right KEY_RIGHT = KEY_DRIGHT | KEY_CPAD_RIGHT, ///< D-Pad Right or Circle Pad Right
} PAD_KEY; };
/// Touch position. /// Touch position.
typedef struct typedef struct

View File

@ -12,9 +12,9 @@ typedef struct {
/// HTTP request status. /// HTTP request status.
typedef enum { typedef enum {
HTTPCREQSTAT_INPROGRESS_REQSENT = 0x5, ///< Request in progress. HTTPC_STATUS_REQUEST_IN_PROGRESS = 0x5, ///< Request in progress.
HTTPCREQSTAT_DLREADY = 0x7 ///< Download ready. HTTPC_STATUS_DOWNLOAD_READY = 0x7 ///< Download ready.
} httpcReqStatus; } HTTPC_RequestStatus;
/// Result code returned when a download is pending. /// Result code returned when a download is pending.
#define HTTPC_RESULTCODE_DOWNLOADPENDING 0xd840a02b #define HTTPC_RESULTCODE_DOWNLOADPENDING 0xd840a02b
@ -66,7 +66,7 @@ Result httpcReceiveData(httpcContext *context, u8* buffer, u32 size);
* @param context Context to use. * @param context Context to use.
* @param out Pointer to output the HTTP request state to. * @param out Pointer to output the HTTP request state to.
*/ */
Result httpcGetRequestState(httpcContext *context, httpcReqStatus* out); Result httpcGetRequestState(httpcContext *context, HTTPC_RequestStatus* out);
/** /**
* @brief Gets the download size state of a HTTP context. * @brief Gets the download size state of a HTTP context.
@ -171,7 +171,7 @@ Result HTTPC_ReceiveData(Handle handle, Handle contextHandle, u8* buffer, u32 si
* @param contextHandle HTTP context handle to use. * @param contextHandle HTTP context handle to use.
* @param out Pointer to output the request state to. * @param out Pointer to output the request state to.
*/ */
Result HTTPC_GetRequestState(Handle handle, Handle contextHandle, httpcReqStatus* out); Result HTTPC_GetRequestState(Handle handle, Handle contextHandle, HTTPC_RequestStatus* out);
/** /**
* @brief Gets the download size state of a HTTP context. * @brief Gets the download size state of a HTTP context.

View File

@ -34,11 +34,40 @@ Result iruSendData(u8 *buf, u32 size, bool wait);
* @param buf Buffer to receive data to. * @param buf Buffer to receive data to.
* @param size Size of the buffer. * @param size Size of the buffer.
* @param flag Flags to receive data with. * @param flag Flags to receive data with.
* @param transfercount Pointer to write the bytes read to. * @param transfercount Pointer to output the number of bytes read to.
* @param wait Whether to wait for the data to be received. * @param wait Whether to wait for the data to be received.
*/ */
Result iruRecvData(u8 *buf, u32 size, u8 flag, u32 *transfercount, bool wait); Result iruRecvData(u8 *buf, u32 size, u8 flag, u32 *transfercount, bool wait);
/// Initializes the IR session.
Result IRU_Initialize(void);
/// Shuts down the IR session.
Result IRU_Shutdown(void);
/**
* @brief Begins sending data.
* @param buf Buffer to send.
* @param size Size of the buffer.
*/
Result IRU_StartSendTransfer(u8 *buf, u32 size);
/// Waits for a send operation to complete.
Result IRU_WaitSendTransfer(void);
/**
* @brief Begins receiving data.
* @param size Size of the data to receive.
* @param flag Flags to use when receiving.
*/
Result IRU_StartRecvTransfer(u32 size, u8 flag);
/**
* @brief Waits for a receive operation to complete.
* @param transfercount Pointer to output the number of bytes read to.
*/
Result IRU_WaitRecvTransfer(u32 *transfercount);
/** /**
* @brief Sets the IR bit rate. * @brief Sets the IR bit rate.
* @param value Bit rate to set. * @param value Bit rate to set.

View File

@ -10,22 +10,22 @@
typedef enum { typedef enum {
MVDMODE_COLORFORMATCONV, ///< Converting color formats. MVDMODE_COLORFORMATCONV, ///< Converting color formats.
MVDMODE_VIDEOPROCESSING ///< Processing video. MVDMODE_VIDEOPROCESSING ///< Processing video.
} mvdstdMode; } MVDSTD_Mode;
/// Input format. /// Input format.
typedef enum { typedef enum {
MVDTYPEIN_YUYV422 = 0x00010001, ///< YUYV422 MVD_INPUT_YUYV422 = 0x00010001, ///< YUYV422
MVDTYPEIN_H264 = 0x00020001 ///< H264 MVD_INPUT_H264 = 0x00020001 ///< H264
} mvdstdTypeInput; } MVDSTD_InputFormat;
/// Output format. /// Output format.
typedef enum { typedef enum {
MVDTYPEOUT_RGB565 = 0x00040002 ///< RGB565 MVD_OUTPUT_RGB565 = 0x00040002 ///< RGB565
} mvdstdTypeOutput; } MVDSTD_OutputFormat;
/// Processing configuration. /// Processing configuration.
typedef struct { typedef struct {
mvdstdTypeInput input_type; ///< Input type. MVDSTD_InputFormat input_type; ///< Input type.
u32 unk_x04; ///< Unknown. u32 unk_x04; ///< Unknown.
u32 unk_x08; ///< Unknown. u32 unk_x08; ///< Unknown.
u32 inwidth; ///< Input width. u32 inwidth; ///< Input width.
@ -38,13 +38,25 @@ typedef struct {
u32 outheight0; ///< First output width. Only set for H.264. u32 outheight0; ///< First output width. Only set for H.264.
u32 outwidth0; ///< First output height. Only set for H.264. u32 outwidth0; ///< First output height. Only set for H.264.
u32 unk_x54; ///< Unknown. u32 unk_x54; ///< Unknown.
mvdstdTypeOutput output_type; ///< Output type. MVDSTD_OutputFormat output_type; ///< Output type.
u32 outwidth1; ///< Second output width. u32 outwidth1; ///< Second output width.
u32 outheight1; ///< Second output height. u32 outheight1; ///< Second output height.
u32 physaddr_outdata0; ///< Physical address of output data. u32 physaddr_outdata0; ///< Physical address of output data.
u32 physaddr_outdata1_colorconv; ///< Physical address of color conversion output data. u32 physaddr_outdata1_colorconv; ///< Physical address of color conversion output data.
u32 unk_x6c[0xb0>>2]; ///< Unknown. u32 unk_x6c[0xb0>>2]; ///< Unknown.
} mvdstdConfig; } MVDSTD_Config;
/**
* @brief Initializes MVDSTD. Video processing / H.264 currently isn't supported.
* @param mode Mode to initialize MVDSTD to.
* @param input_type Type of input to process.
* @param output_type Type of output to produce.
* @param size Size of data to process. Not used when type == MVDTYPE_COLORFORMATCONV.
*/
Result mvdstdInit(MVDSTD_Mode mode, MVDSTD_InputFormat input_type, MVDSTD_OutputFormat output_type, u32 size);
/// Shuts down MVDSTD.
void mvdstdExit(void);
/** /**
* @brief Generates a default MVDSTD configuration. * @brief Generates a default MVDSTD configuration.
@ -57,25 +69,7 @@ typedef struct {
* @param vaddr_outdata0 Virtual address of the output data. * @param vaddr_outdata0 Virtual address of the output data.
* @param vaddr_outdata1_colorconv Virtual address of the color conversion output data. * @param vaddr_outdata1_colorconv Virtual address of the color conversion output data.
*/ */
void mvdstdGenerateDefaultConfig(mvdstdConfig *config, u32 input_width, u32 input_height, u32 output_width, u32 output_height, u32 *vaddr_colorconv_indata, u32 *vaddr_outdata0, u32 *vaddr_outdata1_colorconv); void mvdstdGenerateDefaultConfig(MVDSTD_Config*config, u32 input_width, u32 input_height, u32 output_width, u32 output_height, u32 *vaddr_colorconv_indata, u32 *vaddr_outdata0, u32 *vaddr_outdata1_colorconv);
/**
* @brief Initializes MVDSTD. Video processing / H.264 currently isn't supported.
* @param mode Mode to initialize MVDSTD to.
* @param input_type Type of input to process.
* @param output_type Type of output to produce.
* @param size Size of data to process. Not used when type == MVDTYPE_COLORFORMATCONV.
*/
Result mvdstdInit(mvdstdMode mode, mvdstdTypeInput input_type, mvdstdTypeOutput output_type, u32 size);
/// Shuts down MVDSTD.
void mvdstdExit(void);
/**
* @brief Sets the current configuration of MVDSTD.
* @param config Pointer to the configuration to set.
*/
Result mvdstdSetConfig(mvdstdConfig *config);
/** /**
* @brief Processes a frame. * @brief Processes a frame.
@ -84,5 +78,11 @@ Result mvdstdSetConfig(mvdstdConfig *config);
* @param h264_inframesize Size of the input frame. * @param h264_inframesize Size of the input frame.
* @param h264_frameid ID of the input frame. * @param h264_frameid ID of the input frame.
*/ */
Result mvdstdProcessFrame(mvdstdConfig *config, u32 *h264_vaddr_inframe, u32 h264_inframesize, u32 h264_frameid); Result mvdstdProcessFrame(MVDSTD_Config*config, u32 *h264_vaddr_inframe, u32 h264_inframesize, u32 h264_frameid);
/**
* @brief Sets the current configuration of MVDSTD.
* @param config Pointer to the configuration to set.
*/
Result MVDSTD_SetConfig(MVDSTD_Config* config);

View File

@ -7,28 +7,28 @@
/// PS AES algorithms. /// PS AES algorithms.
typedef enum typedef enum
{ {
ps_CBC_ENC, ///< CBC encoding. PS_ALGORITHM_CBC_ENC, ///< CBC encoding.
ps_CBC_DEC, ///< CBC decoding. PS_ALGORITHM_CBC_DEC, ///< CBC decoding.
ps_CTR_ENC, ///< CTR encoding. PS_ALGORITHM_CTR_ENC, ///< CTR encoding.
ps_CTR_DEC, ///< CTR decoding. PS_ALGORITHM_CTR_DEC, ///< CTR decoding.
ps_CCM_ENC, ///< CCM encoding. PS_ALGORITHM_CCM_ENC, ///< CCM encoding.
ps_CCM_DEC, ///< CCM decoding. PS_ALGORITHM_CCM_DEC, ///< CCM decoding.
} ps_aes_algo; } PS_AESAlgorithm;
/// PS key slots. /// PS key slots.
typedef enum typedef enum
{ {
ps_KEYSLOT_0D, ///< Key slot 0x0D. PS_KEYSLOT_0D, ///< Key slot 0x0D.
ps_KEYSLOT_2D, ///< Key slot 0x2D. PS_KEYSLOT_2D, ///< Key slot 0x2D.
ps_KEYSLOT_31, ///< Key slot 0x31. PS_KEYSLOT_31, ///< Key slot 0x31.
ps_KEYSLOT_38, ///< Key slot 0x38. PS_KEYSLOT_38, ///< Key slot 0x38.
ps_KEYSLOT_32, ///< Key slot 0x32. PS_KEYSLOT_32, ///< Key slot 0x32.
ps_KEYSLOT_39_DLP, ///< Key slot 0x39. (DLP) PS_KEYSLOT_39_DLP, ///< Key slot 0x39. (DLP)
ps_KEYSLOT_2E, ///< Key slot 0x2E. PS_KEYSLOT_2E, ///< Key slot 0x2E.
ps_KEYSLOT_INVALID, ///< Invalid key slot. PS_KEYSLOT_INVALID, ///< Invalid key slot.
ps_KEYSLOT_36, ///< Key slot 0x36. PS_KEYSLOT_36, ///< Key slot 0x36.
ps_KEYSLOT_39_NFC ///< Key slot 0x39. (NFC) PS_KEYSLOT_39_NFC ///< Key slot 0x39. (NFC)
} ps_aes_keytypes; } PS_AESKeyType;
/// Initializes PS. /// Initializes PS.
Result psInit(void); Result psInit(void);
@ -45,7 +45,7 @@ void psExit(void);
* @param key_type Key type to use. * @param key_type Key type to use.
* @param iv Pointer to the CTR/IV. * @param iv Pointer to the CTR/IV.
*/ */
Result PS_EncryptDecryptAes(u32 size, u8* in, u8* out, u32 aes_algo, u32 key_type, u8* iv); Result PS_EncryptDecryptAes(u32 size, u8* in, u8* out, PS_AESAlgorithm aes_algo, PS_AESKeyType key_type, u8* iv);
/** /**
* @brief Encrypts/Decrypts signed AES CCM data. * @brief Encrypts/Decrypts signed AES CCM data.
@ -61,7 +61,7 @@ Result PS_EncryptDecryptAes(u32 size, u8* in, u8* out, u32 aes_algo, u32 key_typ
* @param key_type Key type to use. * @param key_type Key type to use.
* @param nonce Pointer to the nonce. * @param nonce Pointer to the nonce.
*/ */
Result PS_EncryptSignDecryptVerifyAesCcm(u8* in, u32 in_size, u8* out, u32 out_size, u32 data_len, u32 mac_data_len, u32 mac_len, u32 aes_algo, u32 key_type, u8* nonce); Result PS_EncryptSignDecryptVerifyAesCcm(u8* in, u32 in_size, u8* out, u32 out_size, u32 data_len, u32 mac_data_len, u32 mac_len, PS_AESAlgorithm aes_algo, PS_AESKeyType key_type, u8* nonce);
/** /**
* @brief Gets the 64-bit console friend code seed. * @brief Gets the 64-bit console friend code seed.

View File

@ -0,0 +1,18 @@
/**
* @file ptmsysm.h
* @brief PTMSYSM service.
*/
#pragma once
/// Initializes ptm:sysm.
Result ptmSysmInit(void);
/// Exits ptm:sysm.
void ptmSysmExit(void);
/**
* @brief Configures the New 3DS' CPU clock speed and L2 cache.
* @param value Bit0: enable higher clock, Bit1: enable L2 cache.
*/
Result PTMSYSM_ConfigureNew3DSCPU(u8 value);

View File

@ -1,20 +1,14 @@
/** /**
* @file ptm.h * @file ptmu.h
* @brief PTM service. * @brief PTMU service.
*/ */
#pragma once #pragma once
/// Initializes PTM. /// Initializes PTMU.
Result ptmInit(void); Result ptmuInit(void);
/// Exits PTM. /// Exits PTMU.
void ptmExit(void); void ptmuExit(void);
/// Initializes ptm:sysm.
Result ptmSysmInit(void);
/// Exits ptm:sysm.
void ptmSysmExit(void);
/** /**
* @brief Gets the system's current shell state. * @brief Gets the system's current shell state.
@ -46,8 +40,3 @@ Result PTMU_GetPedometerState(u8 *out);
*/ */
Result PTMU_GetTotalStepCount(u32 *steps); Result PTMU_GetTotalStepCount(u32 *steps);
/**
* @brief Configures the New 3DS' CPU clock speed and L2 cache.
* @param value Bit0: enable higher clock, Bit1: enable L2 cache.
*/
Result PTMSYSM_ConfigureNew3DSCPU(u8 value);

View File

@ -10,16 +10,16 @@
typedef struct { typedef struct {
float x; ///< X coordinate. float x; ///< X coordinate.
float y; ///< Y coordinate. float y; ///< Y coordinate.
} qtmHeadtrackingInfoCoord; } QTM_HeadTrackingInfoCoord;
/// Head tracking info. /// Head tracking info.
typedef struct { typedef struct {
u8 flags[5]; ///< Flags. u8 flags[5]; ///< Flags.
u8 padding[3]; ///< Padding. u8 padding[3]; ///< Padding.
float floatdata_x08; ///< Unknown. Not used by System_Settings. float floatdata_x08; ///< Unknown. Not used by System_Settings.
qtmHeadtrackingInfoCoord coords0[4]; ///< Head coordinates. QTM_HeadTrackingInfoCoord coords0[4]; ///< Head coordinates.
u32 unk_x2c[5]; ///< Unknown. Not used by System_Settings. u32 unk_x2c[5]; ///< Unknown. Not used by System_Settings.
} qtmHeadtrackingInfo; } QTM_HeadTrackingInfo;
/// Initializes QTM. /// Initializes QTM.
Result qtmInit(void); Result qtmInit(void);
@ -33,18 +33,11 @@ void qtmExit(void);
*/ */
bool qtmCheckInitialized(void); bool qtmCheckInitialized(void);
/**
* @brief Gets the current head tracking info.
* @param val Normally 0.
* @param out Pointer to write head tracking info to.
*/
Result qtmGetHeadtrackingInfo(u64 val, qtmHeadtrackingInfo *out);
/** /**
* @brief Checks whether a head is fully detected. * @brief Checks whether a head is fully detected.
* @param info Tracking info to check. * @param info Tracking info to check.
*/ */
bool qtmCheckHeadFullyDetected(qtmHeadtrackingInfo *info); bool qtmCheckHeadFullyDetected(QTM_HeadTrackingInfo *info);
/** /**
* @brief Converts QTM coordinates to screen coordinates. * @brief Converts QTM coordinates to screen coordinates.
@ -54,5 +47,11 @@ bool qtmCheckHeadFullyDetected(qtmHeadtrackingInfo *info);
* @param x Pointer to output the screen X coordinate to. * @param x Pointer to output the screen X coordinate to.
* @param y Pointer to output the screen Y coordinate to. * @param y Pointer to output the screen Y coordinate to.
*/ */
Result qtmConvertCoordToScreen(qtmHeadtrackingInfoCoord *coord, float *screen_width, float *screen_height, u32 *x, u32 *y); Result qtmConvertCoordToScreen(QTM_HeadTrackingInfoCoord *coord, float *screen_width, float *screen_height, u32 *x, u32 *y);
/**
* @brief Gets the current head tracking info.
* @param val Normally 0.
* @param out Pointer to write head tracking info to.
*/
Result QTM_GetHeadTrackingInfo(u64 val, QTM_HeadTrackingInfo* out);

View File

@ -12,13 +12,13 @@
* @param context_size Size of the buffer, a multiple of 0x1000. * @param context_size Size of the buffer, a multiple of 0x1000.
* @note 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. * @note 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_Initialize(u32 *context_addr, u32 context_size); Result socInit(u32 *context_addr, u32 context_size);
/** /**
* @brief Closes the soc service. * @brief Closes the soc service.
* @note You need to call this in order to be able to use the buffer again. * @note You need to call this in order to be able to use the buffer again.
*/ */
Result SOC_Shutdown(void); Result socExit(void);
// this is supposed to be in unistd.h but newlib only puts it for cygwin // this is supposed to be in unistd.h but newlib only puts it for cygwin
/** /**

View File

@ -0,0 +1,39 @@
/**
* @file srvpm.h
* @brief srv:pm service.
*/
#pragma once
/// Initializes srv:pm.
Result srvPmInit(void);
/// Exits srv:pm.
void srvPmExit(void);
/**
* @brief Publishes a notification to a process.
* @param notificationId ID of the notification.
* @param process Process to publish to.
*/
Result SRVPM_PublishToProcess(u32 notificationId, Handle process);
/**
* @brief Publishes a notification to all processes.
* @param notificationId ID of the notification.
*/
Result SRVPM_PublishToAll(u32 notificationId);
/**
* @brief Registers a process with SRV.
* @param procid ID of the process.
* @param count Number of services within the service access control data.
* @param serviceaccesscontrol Service Access Control list.
*/
Result SRVPM_RegisterProcess(u32 procid, u32 count, void* serviceaccesscontrol);
/**
* @brief Unregisters a process with SRV.
* @param procid ID of the process.
*/
Result SRVPM_UnregisterProcess(u32 procid);

View File

@ -17,7 +17,7 @@ typedef enum
INPUT_YUV422_INDIV_16 = 0x2, ///< 16-bit per component, planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples).\n Usually named YUV422P16. INPUT_YUV422_INDIV_16 = 0x2, ///< 16-bit per component, planar YUV 4:2:2, 32bpp, (1 Cr & Cb sample per 2x1 Y samples).\n Usually named YUV422P16.
INPUT_YUV420_INDIV_16 = 0x3, ///< 16-bit per component, planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples).\n Usually named YUV420P16. INPUT_YUV420_INDIV_16 = 0x3, ///< 16-bit per component, planar YUV 4:2:0, 24bpp, (1 Cr & Cb sample per 2x2 Y samples).\n Usually named YUV420P16.
INPUT_YUV422_BATCH = 0x4, ///< 8-bit per component, packed YUV 4:2:2, 16bpp, (Y0 Cb Y1 Cr).\n Usually named YUYV422. INPUT_YUV422_BATCH = 0x4, ///< 8-bit per component, packed YUV 4:2:2, 16bpp, (Y0 Cb Y1 Cr).\n Usually named YUYV422.
} Y2R_InputFormat; } Y2RU_InputFormat;
/** /**
* @brief Output color formats * @brief Output color formats
@ -30,7 +30,7 @@ typedef enum
OUTPUT_RGB_24 = 0x1, OUTPUT_RGB_24 = 0x1,
OUTPUT_RGB_16_555 = 0x2, ///< The alpha bit is the 7th bit of the alpha value set by @ref Y2RU_SetAlpha OUTPUT_RGB_16_555 = 0x2, ///< The alpha bit is the 7th bit of the alpha value set by @ref Y2RU_SetAlpha
OUTPUT_RGB_16_565 = 0x3, OUTPUT_RGB_16_565 = 0x3,
} Y2R_OutputFormat; } Y2RU_OutputFormat;
/** /**
* @brief Rotation to be applied to the output * @brief Rotation to be applied to the output
@ -41,7 +41,7 @@ typedef enum
ROTATION_CLOCKWISE_90 = 0x1, ROTATION_CLOCKWISE_90 = 0x1,
ROTATION_CLOCKWISE_180 = 0x2, ROTATION_CLOCKWISE_180 = 0x2,
ROTATION_CLOCKWISE_270 = 0x3, ROTATION_CLOCKWISE_270 = 0x3,
} Y2R_Rotation; } Y2RU_Rotation;
/** /**
* @brief Block alignment of output * @brief Block alignment of output
@ -52,7 +52,7 @@ typedef enum
{ {
BLOCK_LINE = 0x0, ///< The result buffer will be laid out in linear format, the usual way. BLOCK_LINE = 0x0, ///< The result buffer will be laid out in linear format, the usual way.
BLOCK_8_BY_8 = 0x1, ///< The result will be stored as 8x8 blocks in Z-order.\n Useful for textures since it is the format used by the PICA200. BLOCK_8_BY_8 = 0x1, ///< The result will be stored as 8x8 blocks in Z-order.\n Useful for textures since it is the format used by the PICA200.
} Y2R_BlockAlignment; } Y2RU_BlockAlignment;
/** /**
* @brief Coefficients of the YUV->RGB conversion formula. * @brief Coefficients of the YUV->RGB conversion formula.
@ -78,12 +78,12 @@ typedef struct
u16 r_offset; u16 r_offset;
u16 g_offset; u16 g_offset;
u16 b_offset; u16 b_offset;
} Y2R_ColorCoefficients; } Y2RU_ColorCoefficients;
/** /**
* @brief Preset conversion coefficients based on ITU standards for the YUV->RGB formula. * @brief Preset conversion coefficients based on ITU standards for the YUV->RGB formula.
* *
* For more details refer to @ref Y2R_ColorCoefficients * For more details refer to @ref Y2RU_ColorCoefficients
*/ */
typedef enum typedef enum
{ {
@ -91,7 +91,7 @@ typedef enum
COEFFICIENT_ITU_R_BT_709 = 0x1, ///< Coefficients from the ITU-R BT.709 standard with PC ranges. COEFFICIENT_ITU_R_BT_709 = 0x1, ///< Coefficients from the ITU-R BT.709 standard with PC ranges.
COEFFICIENT_ITU_R_BT_601_SCALING = 0x2, ///< Coefficients from the ITU-R BT.601 standard with TV ranges. COEFFICIENT_ITU_R_BT_601_SCALING = 0x2, ///< Coefficients from the ITU-R BT.601 standard with TV ranges.
COEFFICIENT_ITU_R_BT_709_SCALING = 0x3, ///< Coefficients from the ITU-R BT.709 standard with TV ranges. COEFFICIENT_ITU_R_BT_709_SCALING = 0x3, ///< Coefficients from the ITU-R BT.709 standard with TV ranges.
} Y2R_StandardCoefficient; } Y2RU_StandardCoefficient;
/** /**
* @brief Structure used to configure all parameters at once. * @brief Structure used to configure all parameters at once.
@ -101,16 +101,16 @@ typedef enum
*/ */
typedef struct typedef struct
{ {
Y2R_InputFormat input_format : 8; ///< Value passed to @ref Y2RU_SetInputFormat Y2RU_InputFormat input_format : 8; ///< Value passed to @ref Y2RU_SetInputFormat
Y2R_OutputFormat output_format : 8; ///< Value passed to @ref Y2RU_SetOutputFormat Y2RU_OutputFormat output_format : 8; ///< Value passed to @ref Y2RU_SetOutputFormat
Y2R_Rotation rotation : 8; ///< Value passed to @ref Y2RU_SetRotation Y2RU_Rotation rotation : 8; ///< Value passed to @ref Y2RU_SetRotation
Y2R_BlockAlignment block_alignment : 8; ///< Value passed to @ref Y2RU_SetBlockAlignment Y2RU_BlockAlignment block_alignment : 8; ///< Value passed to @ref Y2RU_SetBlockAlignment
s16 input_line_width; ///< Value passed to @ref Y2RU_SetInputLineWidth s16 input_line_width; ///< Value passed to @ref Y2RU_SetInputLineWidth
s16 input_lines; ///< Value passed to @ref Y2RU_SetInputLines s16 input_lines; ///< Value passed to @ref Y2RU_SetInputLines
Y2R_StandardCoefficient standard_coefficient : 8; ///< Value passed to @ref Y2RU_SetStandardCoefficient Y2RU_StandardCoefficient standard_coefficient : 8; ///< Value passed to @ref Y2RU_SetStandardCoefficient
u8 unused; u8 unused;
u16 alpha; ///< Value passed to @ref Y2RU_SetAlpha u16 alpha; ///< Value passed to @ref Y2RU_SetAlpha
} Y2R_ConversionParams; } Y2RU_ConversionParams;
/** /**
* @brief Dithering weights * @brief Dithering weights
@ -134,9 +134,7 @@ typedef struct
u16 w3_xOdd_yEven; u16 w3_xOdd_yEven;
u16 w3_xEven_yOdd; u16 w3_xEven_yOdd;
u16 w3_xOdd_yOdd; u16 w3_xOdd_yOdd;
} Y2R_DitheringWeightParams; } Y2RU_DitheringWeightParams;
/** /**
* @brief Initializes the y2r service. * @brief Initializes the y2r service.
@ -145,7 +143,6 @@ typedef struct
*/ */
Result y2rInit(void); Result y2rInit(void);
/** /**
* @brief Closes the y2r service. * @brief Closes the y2r service.
* *
@ -153,24 +150,23 @@ Result y2rInit(void);
*/ */
void y2rExit(void); void y2rExit(void);
/** /**
* @brief Used to configure the input format. * @brief Used to configure the input format.
* *
* @note Prefer using @ref Y2RU_SetConversionParams if you have to set multiple parameters. * @note Prefer using @ref Y2RU_SetConversionParams if you have to set multiple parameters.
*/ */
Result Y2RU_SetInputFormat(Y2R_InputFormat format); Result Y2RU_SetInputFormat(Y2RU_InputFormat format);
Result Y2RU_GetInputFormat(Y2R_InputFormat* format); Result Y2RU_GetInputFormat(Y2RU_InputFormat* format);
/** /**
* @brief Used to configure the output format. * @brief Used to configure the output format.
* *
* @note Prefer using @ref Y2RU_SetConversionParams if you have to set multiple parameters. * @note Prefer using @ref Y2RU_SetConversionParams if you have to set multiple parameters.
*/ */
Result Y2RU_SetOutputFormat(Y2R_OutputFormat format); Result Y2RU_SetOutputFormat(Y2RU_OutputFormat format);
Result Y2RU_GetOutputFormat(Y2R_OutputFormat* format); Result Y2RU_GetOutputFormat(Y2RU_OutputFormat* format);
/** /**
* @brief Used to configure the rotation of the output. * @brief Used to configure the rotation of the output.
@ -179,18 +175,18 @@ Result Y2RU_GetOutputFormat(Y2R_OutputFormat* format);
* *
* @note Prefer using @ref Y2RU_SetConversionParams if you have to set multiple parameters. * @note Prefer using @ref Y2RU_SetConversionParams if you have to set multiple parameters.
*/ */
Result Y2RU_SetRotation(Y2R_Rotation rotation); Result Y2RU_SetRotation(Y2RU_Rotation rotation);
Result Y2RU_GetRotation(Y2R_Rotation* rotation); Result Y2RU_GetRotation(Y2RU_Rotation* rotation);
/** /**
* @brief Used to configure the alignment of the output buffer. * @brief Used to configure the alignment of the output buffer.
* *
* @note Prefer using @ref Y2RU_SetConversionParams if you have to set multiple parameters. * @note Prefer using @ref Y2RU_SetConversionParams if you have to set multiple parameters.
*/ */
Result Y2RU_SetBlockAlignment(Y2R_BlockAlignment alignment); Result Y2RU_SetBlockAlignment(Y2RU_BlockAlignment alignment);
Result Y2RU_GetBlockAlignment(Y2R_BlockAlignment* alignment); Result Y2RU_GetBlockAlignment(Y2RU_BlockAlignment* alignment);
///Sets the usage of spacial dithering ///Sets the usage of spacial dithering
Result Y2RU_SetSpacialDithering(bool enable); Result Y2RU_SetSpacialDithering(bool enable);
@ -229,25 +225,25 @@ Result Y2RU_GetInputLines(u16* num_lines);
/** /**
* @brief Used to configure the color conversion formula. * @brief Used to configure the color conversion formula.
* *
* See @ref Y2R_ColorCoefficients for more information about the coefficients. * See @ref Y2RU_ColorCoefficients for more information about the coefficients.
* *
* @note Prefer using @ref Y2RU_SetConversionParams if you have to set multiple parameters. * @note Prefer using @ref Y2RU_SetConversionParams if you have to set multiple parameters.
*/ */
Result Y2RU_SetCoefficients(const Y2R_ColorCoefficients* coefficients); Result Y2RU_SetCoefficients(const Y2RU_ColorCoefficients* coefficients);
Result Y2RU_GetCoefficients(Y2R_ColorCoefficients* coefficients); Result Y2RU_GetCoefficients(Y2RU_ColorCoefficients* coefficients);
/** /**
* @brief Used to configure the color conversion formula with ITU stantards coefficients. * @brief Used to configure the color conversion formula with ITU stantards coefficients.
* *
* See @ref Y2R_ColorCoefficients for more information about the coefficients. * See @ref Y2RU_ColorCoefficients for more information about the coefficients.
* *
* @note Prefer using @ref Y2RU_SetConversionParams if you have to set multiple parameters. * @note Prefer using @ref Y2RU_SetConversionParams if you have to set multiple parameters.
*/ */
Result Y2RU_SetStandardCoefficient(Y2R_StandardCoefficient coefficient); Result Y2RU_SetStandardCoefficient(Y2RU_StandardCoefficient coefficient);
///Retrieves the coeeficients associated to the given standard ///Retrieves the coeeficients associated to the given standard
Result Y2RU_GetStandardCoefficient(Y2R_ColorCoefficients* coefficients, Y2R_StandardCoefficient standardCoeff); Result Y2RU_GetStandardCoefficient(Y2RU_ColorCoefficients* coefficients, Y2RU_StandardCoefficient standardCoeff);
/** /**
* @brief Used to configure the alpha value of the output. * @brief Used to configure the alpha value of the output.
@ -403,17 +399,17 @@ Result Y2RU_IsDoneSendingYUYV(bool* is_done);
Result Y2RU_IsDoneReceiving(bool* is_done); Result Y2RU_IsDoneReceiving(bool* is_done);
/// Sets the dithering weights /// Sets the dithering weights
Result Y2RU_SetDitheringWeightParams(const Y2R_DitheringWeightParams* params); Result Y2RU_SetDitheringWeightParams(const Y2RU_DitheringWeightParams* params);
/// Retrieves the dithering weights /// Retrieves the dithering weights
Result Y2RU_GetDitheringWeightParams(Y2R_DitheringWeightParams* params); Result Y2RU_GetDitheringWeightParams(Y2RU_DitheringWeightParams* params);
/** /**
* @brief Sets all the parameters of Y2R_ConversionParams at once. * @brief Sets all the parameters of Y2RU_ConversionParams at once.
* *
* Faster than calling the individual value through Y2R_Set* because only one system call is made. * Faster than calling the individual value through Y2R_Set* because only one system call is made.
*/ */
Result Y2RU_SetConversionParams(const Y2R_ConversionParams* params); Result Y2RU_SetConversionParams(const Y2RU_ConversionParams* params);
/// Starts the conversion process /// Starts the conversion process
Result Y2RU_StartConversion(void); Result Y2RU_StartConversion(void);

View File

@ -16,23 +16,22 @@ Result srvExit(void);
*/ */
Handle *srvGetSessionHandle(void); Handle *srvGetSessionHandle(void);
/// Registers the current process as a client to the service API.
Result srvRegisterClient(void);
/** /**
* @brief Retrieves a service handle, bypassing the handle list. * @brief Retrieves a service handle, retrieving from the launcher handle list if possible.
* @param out Pointer to write the handle to.
* @param name Name of the service.
*/
Result srvGetServiceHandleDirect(Handle* out, const char* name);
/**
* @brief Retrieves a service handle.
* @param out Pointer to write the handle to. * @param out Pointer to write the handle to.
* @param name Name of the service. * @param name Name of the service.
*/ */
Result srvGetServiceHandle(Handle* out, const char* name); Result srvGetServiceHandle(Handle* out, const char* name);
/// Registers the current process as a client to the service API.
Result srvRegisterClient(void);
/**
* @brief Enables service notificatios, returning a notification semaphore.
* @param semaphoreOut Pointer to output the notification semaphore to.
*/
Result srvEnableNotification(Handle* semaphoreOut);
/** /**
* @brief Registers the current process as a service. * @brief Registers the current process as a service.
* @param out Pointer to write the service handle to. * @param out Pointer to write the service handle to.
@ -47,19 +46,69 @@ Result srvRegisterService(Handle* out, const char* name, int maxSessions);
*/ */
Result srvUnregisterService(const char* name); Result srvUnregisterService(const char* name);
/// Initializes the srv:pm port. /**
Result srvPmInit(void); * @brief Retrieves a service handle.
* @param out Pointer to output the handle to.
* @param name Name of the service.
*/
Result srvGetServiceHandleDirect(Handle* out, const char* name);
/** /**
* @brief Registers a process with srv:pm. * @brief Registers a port.
* @param procid ID of the process to register. * @param name Name of the port.
* @param count Number of services to register access to. * @param clientHandle Client handle of the port.
* @param serviceaccesscontrol Service access permissions of the process.
*/ */
Result srvRegisterProcess(u32 procid, u32 count, void *serviceaccesscontrol); Result srvRegisterPort(const char* name, Handle clientHandle);
/** /**
* @brief Unregisters a process with srv:pm. * @brief Unregisters a port.
* @param procid ID of the process to unregister. * @param name Name of the port.
*/ */
Result srvUnregisterProcess(u32 procid); Result srvUnregisterPort(const char* name);
/**
* @brief Retrieves a port handle.
* @param out Pointer to output the handle to.
* @param name Name of the port.
*/
Result srvGetPort(Handle* out, const char* name);
/**
* @brief Subscribes to a notification.
* @param notificationId ID of the notification.
*/
Result srvSubscribe(u32 notificationId);
/**
* @brief Unsubscribes from a notification.
* @param notificationId ID of the notification.
*/
Result srvUnsubscribe(u32 notificationId);
/**
* @brief Receives a notification.
* @param notificationIdOut Pointer to output the ID of the received notification to.
*/
Result srvReceiveNotification(u32* notificationIdOut);
/**
* @brief Publishes a notification to subscribers.
* @param notificationId ID of the notification.
* @param flags Flags to publish with. (bit 0 = only fire if not fired, bit 1 = report errors)
*/
Result srvPublishToSubscriber(u32 notificationId, u32 flags);
/**
* @brief Publishes a notification to subscribers and retrieves a list of all processes that were notified.
* @param processIdCountOut Pointer to output the number of process IDs to.
* @param processIdsOut Pointer to output the process IDs to. Should have size "60 * sizeof(u32)".
* @param notificationId ID of the notification.
*/
Result srvPublishAndGetSubscriber(u32* processIdCountOut, u32* processIdsOut, u32 notificationId);
/**
* @brief Checks whether a service is registered.
* @param registeredOut Pointer to output the registration status to.
* @param name Name of the service to check.
*/
Result srvIsServiceRegistered(bool* registeredOut, const char* name);

View File

@ -1,7 +1,7 @@
extern "C" extern "C"
{ {
#include <3ds/types.h> #include <3ds/types.h>
#include <3ds/linear.h> #include <3ds/allocator/linear.h>
#include <3ds/util/rbtree.h> #include <3ds/util/rbtree.h>
} }

View File

@ -1,7 +1,7 @@
extern "C" extern "C"
{ {
#include <3ds/types.h> #include <3ds/types.h>
#include <3ds/mappable.h> #include <3ds/allocator/mappable.h>
#include <3ds/util/rbtree.h> #include <3ds/util/rbtree.h>
} }

View File

@ -1,7 +1,7 @@
extern "C" extern "C"
{ {
#include <3ds/types.h> #include <3ds/types.h>
#include <3ds/vram.h> #include <3ds/allocator/vram.h>
#include <3ds/util/rbtree.h> #include <3ds/util/rbtree.h>
} }

View File

@ -1,15 +1,14 @@
#include <stdlib.h> #include <stdlib.h>
#include <stdio.h> #include <stdio.h>
#include <string.h>
#include <3ds/types.h> #include <3ds/types.h>
#include <3ds/gfx.h> #include <3ds/gfx.h>
#include <3ds/svc.h> #include <3ds/svc.h>
#include <3ds/linear.h> #include <3ds/allocator/linear.h>
#include <3ds/mappable.h> #include <3ds/allocator/mappable.h>
#include <3ds/vram.h> #include <3ds/allocator/vram.h>
#include <3ds/gpu/gx.h> #include <3ds/gpu/gx.h>
GSP_FramebufferInfo topFramebufferInfo, bottomFramebufferInfo; GSPGPU_FramebufferInfo topFramebufferInfo, bottomFramebufferInfo;
u8 gfxThreadID; u8 gfxThreadID;
u8* gfxSharedMemory; u8* gfxSharedMemory;
@ -24,22 +23,22 @@ static int doubleBuf[2] = {1,1};
Handle gspEvent, gspSharedMemHandle; Handle gspEvent, gspSharedMemHandle;
static GSP_FramebufferFormats topFormat = GSP_BGR8_OES; static GSPGPU_FramebufferFormats topFormat = GSP_BGR8_OES;
static GSP_FramebufferFormats botFormat = GSP_BGR8_OES; static GSPGPU_FramebufferFormats botFormat = GSP_BGR8_OES;
void gfxSet3D(bool enable) void gfxSet3D(bool enable)
{ {
enable3d=enable; enable3d=enable;
} }
void gfxSetScreenFormat(gfxScreen_t screen, GSP_FramebufferFormats format) { void gfxSetScreenFormat(gfxScreen_t screen, GSPGPU_FramebufferFormats format) {
if(screen==GFX_TOP) if(screen==GFX_TOP)
topFormat = format; topFormat = format;
else else
botFormat = format; botFormat = format;
} }
GSP_FramebufferFormats gfxGetScreenFormat(gfxScreen_t screen) { GSPGPU_FramebufferFormats gfxGetScreenFormat(gfxScreen_t screen) {
if(screen==GFX_TOP) if(screen==GFX_TOP)
return topFormat; return topFormat;
else else
@ -50,7 +49,7 @@ void gfxSetDoubleBuffering(gfxScreen_t screen, bool doubleBuffering) {
doubleBuf[screen] = doubleBuffering ? 1 : 0; // make sure they're the integer values '1' and '0' doubleBuf[screen] = doubleBuffering ? 1 : 0; // make sure they're the integer values '1' and '0'
} }
static u32 __get_bytes_per_pixel(GSP_FramebufferFormats format) { static u32 __get_bytes_per_pixel(GSPGPU_FramebufferFormats format) {
switch(format) { switch(format) {
case GSP_RGBA8_OES: case GSP_RGBA8_OES:
return 4; return 4;
@ -93,7 +92,7 @@ void gfxWriteFramebufferInfo(gfxScreen_t screen)
{ {
u8* framebufferInfoHeader=gfxSharedMemory+0x200+gfxThreadID*0x80; u8* framebufferInfoHeader=gfxSharedMemory+0x200+gfxThreadID*0x80;
if(screen==GFX_BOTTOM)framebufferInfoHeader+=0x40; if(screen==GFX_BOTTOM)framebufferInfoHeader+=0x40;
GSP_FramebufferInfo* framebufferInfo=(GSP_FramebufferInfo*)&framebufferInfoHeader[0x4]; GSPGPU_FramebufferInfo* framebufferInfo=(GSPGPU_FramebufferInfo*)&framebufferInfoHeader[0x4];
framebufferInfoHeader[0x0]^=doubleBuf[screen]; framebufferInfoHeader[0x0]^=doubleBuf[screen];
framebufferInfo[framebufferInfoHeader[0x0]]=(screen==GFX_TOP)?(topFramebufferInfo):(bottomFramebufferInfo); framebufferInfo[framebufferInfoHeader[0x0]]=(screen==GFX_TOP)?(topFramebufferInfo):(bottomFramebufferInfo);
framebufferInfoHeader[0x1]=1; framebufferInfoHeader[0x1]=1;
@ -101,7 +100,7 @@ void gfxWriteFramebufferInfo(gfxScreen_t screen)
static void (*screenFree)(void *) = NULL; static void (*screenFree)(void *) = NULL;
void gfxInit(GSP_FramebufferFormats topFormat, GSP_FramebufferFormats bottomFormat, bool vrambuffers) void gfxInit(GSPGPU_FramebufferFormats topFormat, GSPGPU_FramebufferFormats bottomFormat, bool vrambuffers)
{ {
void *(*screenAlloc)(size_t); void *(*screenAlloc)(size_t);
@ -162,7 +161,7 @@ void gfxInit(GSP_FramebufferFormats topFormat, GSP_FramebufferFormats bottomForm
currentBuffer[1]=0; currentBuffer[1]=0;
// Initialize event handler and wait for VBlank // Initialize event handler and wait for VBlank
gspInitEventHandler(gspEvent, (vu8*)gfxSharedMemory, gfxThreadID); gspInitEventHandler(gspEvent, (vu8*) gfxSharedMemory, gfxThreadID);
gspWaitForVBlank(); gspWaitForVBlank();
GSPGPU_SetLcdForceBlack(0x0); GSPGPU_SetLcdForceBlack(0x0);

View File

@ -7,7 +7,7 @@
#include <3ds/svc.h> #include <3ds/svc.h>
#include <3ds/srv.h> #include <3ds/srv.h>
#include <3ds/gpu/gx.h> #include <3ds/gpu/gx.h>
#include <3ds/services/gsp.h> #include <3ds/services/gspgpu.h>
u32* gxCmdBuf; u32* gxCmdBuf;
@ -20,7 +20,7 @@ Result GX_RequestDma(u32* src, u32* dst, u32 length)
gxCommand[3]=length; //size gxCommand[3]=length; //size
gxCommand[4]=gxCommand[5]=gxCommand[6]=gxCommand[7]=0x0; gxCommand[4]=gxCommand[5]=gxCommand[6]=gxCommand[7]=0x0;
return GSPGPU_SubmitGxCommand(gxCmdBuf, gxCommand); return gspSubmitGxCommand(gxCmdBuf, gxCommand);
} }
Result GX_ProcessCommandList(u32* buf0a, u32 buf0s, u8 flags) Result GX_ProcessCommandList(u32* buf0a, u32 buf0s, u8 flags)
@ -33,7 +33,7 @@ Result GX_ProcessCommandList(u32* buf0a, u32 buf0s, u8 flags)
gxCommand[4]=gxCommand[5]=gxCommand[6]=0x0; gxCommand[4]=gxCommand[5]=gxCommand[6]=0x0;
gxCommand[7]=(flags>>1)&1; //when non-zero, call svcFlushProcessDataCache() with the specified buffer gxCommand[7]=(flags>>1)&1; //when non-zero, call svcFlushProcessDataCache() with the specified buffer
return GSPGPU_SubmitGxCommand(gxCmdBuf, gxCommand); return gspSubmitGxCommand(gxCmdBuf, gxCommand);
} }
Result GX_MemoryFill(u32* buf0a, u32 buf0v, u32* buf0e, u16 control0, u32* buf1a, u32 buf1v, u32* buf1e, u16 control1) Result GX_MemoryFill(u32* buf0a, u32 buf0v, u32* buf0e, u16 control0, u32* buf1a, u32 buf1v, u32* buf1e, u16 control1)
@ -49,7 +49,7 @@ Result GX_MemoryFill(u32* buf0a, u32 buf0v, u32* buf0e, u16 control0, u32* buf1a
gxCommand[6]=(u32)buf1e; //buf1 end addr gxCommand[6]=(u32)buf1e; //buf1 end addr
gxCommand[7]=(control0)|(control1<<16); gxCommand[7]=(control0)|(control1<<16);
return GSPGPU_SubmitGxCommand(gxCmdBuf, gxCommand); return gspSubmitGxCommand(gxCmdBuf, gxCommand);
} }
// Flags, for applications this is 0x1001000 for the main screen, and 0x1000 for the sub screen. // Flags, for applications this is 0x1001000 for the main screen, and 0x1000 for the sub screen.
@ -64,7 +64,7 @@ Result GX_DisplayTransfer(u32* inadr, u32 indim, u32* outadr, u32 outdim, u32 fl
gxCommand[5]=flags; gxCommand[5]=flags;
gxCommand[6]=gxCommand[7]=0x0; gxCommand[6]=gxCommand[7]=0x0;
return GSPGPU_SubmitGxCommand(gxCmdBuf, gxCommand); return gspSubmitGxCommand(gxCmdBuf, gxCommand);
} }
Result GX_TextureCopy(u32* inadr, u32 indim, u32* outadr, u32 outdim, u32 size, u32 flags) Result GX_TextureCopy(u32* inadr, u32 indim, u32* outadr, u32 outdim, u32 size, u32 flags)
@ -79,7 +79,7 @@ Result GX_TextureCopy(u32* inadr, u32 indim, u32* outadr, u32 outdim, u32 size,
gxCommand[6]=flags; gxCommand[6]=flags;
gxCommand[7]=0x0; gxCommand[7]=0x0;
return GSPGPU_SubmitGxCommand(gxCmdBuf, gxCommand); return gspSubmitGxCommand(gxCmdBuf, gxCommand);
} }
Result GX_FlushCacheRegions(u32* buf0a, u32 buf0s, u32* buf1a, u32 buf1s, u32* buf2a, u32 buf2s) Result GX_FlushCacheRegions(u32* buf0a, u32 buf0s, u32* buf1a, u32 buf1s, u32* buf2a, u32 buf2s)
@ -94,5 +94,5 @@ Result GX_FlushCacheRegions(u32* buf0a, u32 buf0s, u32* buf1a, u32 buf1s, u32* b
gxCommand[6]=(u32)buf2s; //buf2 size gxCommand[6]=(u32)buf2s; //buf2 size
gxCommand[7]=0x0; gxCommand[7]=0x0;
return GSPGPU_SubmitGxCommand(gxCmdBuf, gxCommand); return gspSubmitGxCommand(gxCmdBuf, gxCommand);
} }

View File

@ -89,7 +89,7 @@ void ndspChnSetFormat(int id, u16 format)
ndspChn[id].format = format; ndspChn[id].format = format;
} }
void ndspChnSetInterp(int id, int type) void ndspChnSetInterp(int id, ndspInterpType type)
{ {
ndspChnSt* chn = &ndspChn[id]; ndspChnSt* chn = &ndspChn[id];
LightLock_Lock(&chn->lock); LightLock_Lock(&chn->lock);

View File

@ -296,7 +296,7 @@ static void ndspFinalize(bool suspend)
LightLock_Unlock(&ndspMutex); LightLock_Unlock(&ndspMutex);
} }
static void ndspAptHook(int hook, void* param) static void ndspAptHook(APT_HookType hook, void* param)
{ {
switch (hook) switch (hook)
{ {
@ -312,6 +312,9 @@ static void ndspAptHook(int hook, void* param)
bSleeping = true; bSleeping = true;
ndspFinalize(true); ndspFinalize(true);
break; break;
default:
break;
} }
} }
@ -544,7 +547,7 @@ void ndspSetMasterVol(float volume)
LightLock_Unlock(&ndspMaster.lock); LightLock_Unlock(&ndspMaster.lock);
} }
void ndspSetOutputMode(int mode) void ndspSetOutputMode(ndspOutputMode mode)
{ {
LightLock_Lock(&ndspMaster.lock); LightLock_Lock(&ndspMaster.lock);
ndspMaster.outputMode = mode; ndspMaster.outputMode = mode;
@ -552,7 +555,7 @@ void ndspSetOutputMode(int mode)
LightLock_Unlock(&ndspMaster.lock); LightLock_Unlock(&ndspMaster.lock);
} }
void ndspSetClippingMode(int mode) void ndspSetClippingMode(ndspClippingMode mode)
{ {
LightLock_Lock(&ndspMaster.lock); LightLock_Lock(&ndspMaster.lock);
ndspMaster.clippingMode = mode; ndspMaster.clippingMode = mode;
@ -587,7 +590,7 @@ void ndspSurroundSetDepth(u16 depth)
LightLock_Unlock(&ndspMaster.lock); LightLock_Unlock(&ndspMaster.lock);
} }
void ndspSurroundSetPos(u16 pos) void ndspSurroundSetPos(ndspSpeakerPos pos)
{ {
LightLock_Lock(&ndspMaster.lock); LightLock_Lock(&ndspMaster.lock);
ndspMaster.surround.pos = pos; ndspMaster.surround.pos = pos;

View File

@ -2,7 +2,7 @@
#include <3ds/result.h> #include <3ds/result.h>
#include <3ds/os.h> #include <3ds/os.h>
#include <3ds/svc.h> #include <3ds/svc.h>
#include <3ds/services/ptm.h> #include <3ds/services/ptmsysm.h>
#include <sys/time.h> #include <sys/time.h>
#include <reent.h> #include <reent.h>

View File

@ -29,51 +29,12 @@ void acExit(void)
svcCloseHandle(acHandle); svcCloseHandle(acHandle);
} }
// ptr=0x200-byte outbuf Result acWaitInternetConnection(void)
Result ACU_CreateDefaultConfig(u32 *ptr)
{ {
Result ret=0; Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 status = 0;
u32 *staticbufs = getThreadStaticBuffers(); while(R_SUCCEEDED(ret = ACU_GetWifiStatus(&status)) && status == 0);
return ret;
u32 savedValue0 = staticbufs[0];
u32 savedValue1 = staticbufs[1];
cmdbuf[0] = IPC_MakeHeader(0x1,0,0); // 0x00010000
staticbufs[0] = IPC_Desc_StaticBuffer(0x200,0);
staticbufs[1] = (u32)ptr;
if(R_FAILED(ret = svcSendSyncRequest(acHandle)))return ret;
staticbufs[0] = savedValue0;
staticbufs[1] = savedValue1;
return (Result)cmdbuf[1];
}
// Unknown what this cmd does at the time of writing. (ptr=0x200-byte inbuf/outbuf)
Result ACU_cmd26(u32 *ptr, u8 val)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
u32 *staticbufs = getThreadStaticBuffers();
u32 savedValue0 = staticbufs[0];
u32 savedValue1 = staticbufs[1];
cmdbuf[0] = IPC_MakeHeader(0x26,1,2); // 0x00260042
cmdbuf[1] = (u32)val;
staticbufs[0] = IPC_Desc_StaticBuffer(0x200,0);
staticbufs[1] = (u32)ptr;
cmdbuf[2] = IPC_Desc_StaticBuffer(0x200,0);
cmdbuf[3] = (u32)ptr;
if(R_FAILED(ret = svcSendSyncRequest(acHandle)))return ret;
staticbufs[0] = savedValue0;
staticbufs[1] = savedValue1;
return (Result)cmdbuf[1];
} }
Result ACU_GetWifiStatus(u32 *out) Result ACU_GetWifiStatus(u32 *out)
@ -89,21 +50,3 @@ Result ACU_GetWifiStatus(u32 *out)
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
Result ACU_WaitInternetConnection(void)
{
Result ret=0;
u32 outval=0;
if(R_FAILED(ret = acInit()))return ret;
while(1)
{
ret = ACU_GetWifiStatus(&outval);
if(R_SUCCEEDED(ret) && outval!=0)break;
}
acExit();
return ret;
}

View File

@ -10,7 +10,7 @@
#include <3ds/srv.h> #include <3ds/srv.h>
#include <3ds/synchronization.h> #include <3ds/synchronization.h>
#include <3ds/services/apt.h> #include <3ds/services/apt.h>
#include <3ds/services/gsp.h> #include <3ds/services/gspgpu.h>
#include <3ds/ipc.h> #include <3ds/ipc.h>
@ -37,8 +37,8 @@ u64 aptEventHandlerStack[APT_HANDLER_STACKSIZE/8]; // u64 so that it's 8-byte al
LightLock aptStatusMutex; LightLock aptStatusMutex;
Handle aptStatusEvent; Handle aptStatusEvent;
APP_STATUS aptStatus = APP_NOTINITIALIZED; APT_AppStatus aptStatus = APP_NOTINITIALIZED;
APP_STATUS aptStatusBeforeSleep = APP_NOTINITIALIZED; APT_AppStatus aptStatusBeforeSleep = APP_NOTINITIALIZED;
u32 aptStatusPower; u32 aptStatusPower;
Handle aptSleepSync; Handle aptSleepSync;
@ -53,7 +53,7 @@ static u32 __apt_launchapplet_parambufsize;
static aptHookCookie aptFirstHook; static aptHookCookie aptFirstHook;
static void aptCallHook(int hookType) static void aptCallHook(APT_HookType hookType)
{ {
aptHookCookie* c; aptHookCookie* c;
for (c = &aptFirstHook; c && c->callback; c = c->next) for (c = &aptFirstHook; c && c->callback; c = c->next)
@ -106,9 +106,9 @@ void aptInitCaptureInfo(u32 *ns_capinfo)
{ {
u32 tmp=0; u32 tmp=0;
u32 main_pixsz, sub_pixsz; u32 main_pixsz, sub_pixsz;
GSP_CaptureInfo gspcapinfo; GSPGPU_CaptureInfo gspcapinfo;
memset(&gspcapinfo, 0, sizeof(GSP_CaptureInfo)); memset(&gspcapinfo, 0, sizeof(GSPGPU_CaptureInfo));
// Get display-capture info from GSP. // Get display-capture info from GSP.
GSPGPU_ImportDisplayCaptureInfo(&gspcapinfo); GSPGPU_ImportDisplayCaptureInfo(&gspcapinfo);
@ -310,7 +310,7 @@ void aptAppletClosed(void)
} }
static void __handle_notification(void) { static void __handle_notification(void) {
u8 type; APT_Signal type;
Result ret=0; Result ret=0;
// Get notification type. // Get notification type.
@ -372,6 +372,9 @@ static void __handle_notification(void) {
aptSetStatus(aptStatusBeforeSleep); aptSetStatus(aptStatusBeforeSleep);
} }
break; break;
default:
break;
} }
} }
@ -656,16 +659,16 @@ void aptAppStarted(void)
} }
} }
APP_STATUS aptGetStatus(void) APT_AppStatus aptGetStatus(void)
{ {
APP_STATUS ret; APT_AppStatus ret;
LightLock_Lock(&aptStatusMutex); LightLock_Lock(&aptStatusMutex);
ret = aptStatus; ret = aptStatus;
LightLock_Unlock(&aptStatusMutex); LightLock_Unlock(&aptStatusMutex);
return ret; return ret;
} }
void aptSetStatus(APP_STATUS status) void aptSetStatus(APT_AppStatus status)
{ {
LightLock_Lock(&aptStatusMutex); LightLock_Lock(&aptStatusMutex);
@ -862,7 +865,7 @@ Result APT_IsRegistered(NS_APPID appID, u8* out)
return cmdbuf[1]; return cmdbuf[1];
} }
Result APT_InquireNotification(u32 appID, u8* signalType) Result APT_InquireNotification(u32 appID, APT_Signal* signalType)
{ {
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0xB,1,0); // 0xB0040 cmdbuf[0]=IPC_MakeHeader(0xB,1,0); // 0xB0040
@ -1137,7 +1140,7 @@ Result APT_CheckNew3DS_Application(u8 *out)
if(out) if(out)
{ {
*out = 0; *out = 0;
if(ret==0)*out=cmdbuf[2]; if(ret==0)*out=cmdbuf[2] & 0xFF;
} }
return ret; return ret;
@ -1156,7 +1159,7 @@ Result APT_CheckNew3DS_System(u8 *out)
if(out) if(out)
{ {
*out = 0; *out = 0;
if(ret==0)*out=cmdbuf[2]; if(ret==0)*out=cmdbuf[2] & 0xFF;
} }
return ret; return ret;

View File

@ -5,6 +5,7 @@
#include <3ds/synchronization.h> #include <3ds/synchronization.h>
#include <3ds/types.h> #include <3ds/types.h>
#include <3ds/result.h> #include <3ds/result.h>
#include <3ds/ipc.h>
Handle camHandle; Handle camHandle;
static int camRefCount; static int camRefCount;
@ -31,51 +32,51 @@ void camExit(void) {
svcCloseHandle(camHandle); svcCloseHandle(camHandle);
} }
Result CAMU_StartCapture(CAMU_Port port) { Result CAMU_StartCapture(u32 port) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00010040; cmdbuf[0] = IPC_MakeHeader(0x1,1,0); // 0x10040
cmdbuf[1] = port; cmdbuf[1] = port;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_StopCapture(CAMU_Port port) { Result CAMU_StopCapture(u32 port) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00020040; cmdbuf[0] = IPC_MakeHeader(0x2,1,0); // 0x20040
cmdbuf[1] = port; cmdbuf[1] = port;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_IsBusy(bool* busy, CAMU_Port port) { Result CAMU_IsBusy(bool* busy, u32 port) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00030040; cmdbuf[0] = IPC_MakeHeader(0x3,1,0); // 0x30040
cmdbuf[1] = port; cmdbuf[1] = port;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*busy = (bool) cmdbuf[2]; *busy = (bool) cmdbuf[2] & 0xFF;
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_ClearBuffer(CAMU_Port port) { Result CAMU_ClearBuffer(u32 port) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00040040; cmdbuf[0] = IPC_MakeHeader(0x4,1,0); // 0x40040
cmdbuf[1] = port; cmdbuf[1] = port;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_GetVsyncInterruptEvent(Handle* event, CAMU_Port port) { Result CAMU_GetVsyncInterruptEvent(Handle* event, u32 port) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00050040; cmdbuf[0] = IPC_MakeHeader(0x5,1,0); // 0x50040
cmdbuf[1] = port; cmdbuf[1] = port;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
@ -83,10 +84,10 @@ Result CAMU_GetVsyncInterruptEvent(Handle* event, CAMU_Port port) {
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_GetBufferErrorInterruptEvent(Handle* event, CAMU_Port port) { Result CAMU_GetBufferErrorInterruptEvent(Handle* event, u32 port) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00060040; cmdbuf[0] = IPC_MakeHeader(0x6,1,0); // 0x60040
cmdbuf[1] = port; cmdbuf[1] = port;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
@ -94,37 +95,37 @@ Result CAMU_GetBufferErrorInterruptEvent(Handle* event, CAMU_Port port) {
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetReceiving(Handle* event, void* dst, CAMU_Port port, u32 imageSize, s16 transferUnit) { Result CAMU_SetReceiving(Handle* event, void* dst, u32 port, u32 imageSize, s16 transferUnit) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00070102; cmdbuf[0] = IPC_MakeHeader(0x7,4,2); // 0x70102
cmdbuf[1] = (u32) dst; cmdbuf[1] = (u32) dst;
cmdbuf[2] = port; cmdbuf[2] = port;
cmdbuf[3] = imageSize; cmdbuf[3] = imageSize;
cmdbuf[4] = transferUnit; cmdbuf[4] = transferUnit;
cmdbuf[5] = 0; cmdbuf[5] = IPC_Desc_SharedHandles(1);
cmdbuf[6] = 0xFFFF8001; cmdbuf[6] = CUR_PROCESS_HANDLE;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*event = cmdbuf[3]; *event = cmdbuf[3];
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_IsFinishedReceiving(bool* finishedReceiving, CAMU_Port port) { Result CAMU_IsFinishedReceiving(bool* finishedReceiving, u32 port) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00080040; cmdbuf[0] = IPC_MakeHeader(0x8,1,0); // 0x80040
cmdbuf[1] = port; cmdbuf[1] = port;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*finishedReceiving = (bool) cmdbuf[2]; *finishedReceiving = (bool) cmdbuf[2] & 0xFF;
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetTransferLines(CAMU_Port port, s16 lines, s16 width, s16 height) { Result CAMU_SetTransferLines(u32 port, s16 lines, s16 width, s16 height) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00090100; cmdbuf[0] = IPC_MakeHeader(0x9,4,0); // 0x90100
cmdbuf[1] = port; cmdbuf[1] = port;
cmdbuf[2] = lines; cmdbuf[2] = lines;
cmdbuf[3] = width; cmdbuf[3] = width;
@ -137,19 +138,19 @@ Result CAMU_SetTransferLines(CAMU_Port port, s16 lines, s16 width, s16 height) {
Result CAMU_GetMaxLines(s16* maxLines, s16 width, s16 height) { Result CAMU_GetMaxLines(s16* maxLines, s16 width, s16 height) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x000A0080; cmdbuf[0] = IPC_MakeHeader(0xA,2,0); // 0xA0080
cmdbuf[1] = width; cmdbuf[1] = width;
cmdbuf[2] = height; cmdbuf[2] = height;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*maxLines = (s16) cmdbuf[2]; *maxLines = (s16) cmdbuf[2] & 0xFFFF;
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetTransferBytes(CAMU_Port port, u32 bytes, s16 width, s16 height) { Result CAMU_SetTransferBytes(u32 port, u32 bytes, s16 width, s16 height) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x000B0100; cmdbuf[0] = IPC_MakeHeader(0xB,4,0); // 0xB0100
cmdbuf[1] = port; cmdbuf[1] = port;
cmdbuf[2] = bytes; cmdbuf[2] = bytes;
cmdbuf[3] = width; cmdbuf[3] = width;
@ -159,10 +160,10 @@ Result CAMU_SetTransferBytes(CAMU_Port port, u32 bytes, s16 width, s16 height) {
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_GetTransferBytes(u32* transferBytes, CAMU_Port port) { Result CAMU_GetTransferBytes(u32* transferBytes, u32 port) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x000C0040; cmdbuf[0] = IPC_MakeHeader(0xC,1,0); // 0xC0040
cmdbuf[1] = port; cmdbuf[1] = port;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
@ -173,7 +174,7 @@ Result CAMU_GetTransferBytes(u32* transferBytes, CAMU_Port port) {
Result CAMU_GetMaxBytes(u32* maxBytes, s16 width, s16 height) { Result CAMU_GetMaxBytes(u32* maxBytes, s16 width, s16 height) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x000D0080; cmdbuf[0] = IPC_MakeHeader(0xD,2,0); // 0xD0080
cmdbuf[1] = width; cmdbuf[1] = width;
cmdbuf[2] = height; cmdbuf[2] = height;
@ -182,10 +183,10 @@ Result CAMU_GetMaxBytes(u32* maxBytes, s16 width, s16 height) {
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetTrimming(CAMU_Port port, bool trimming) { Result CAMU_SetTrimming(u32 port, bool trimming) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x000E0080; cmdbuf[0] = IPC_MakeHeader(0xE,2,0); // 0xE0080
cmdbuf[1] = port; cmdbuf[1] = port;
cmdbuf[2] = trimming; cmdbuf[2] = trimming;
@ -193,21 +194,21 @@ Result CAMU_SetTrimming(CAMU_Port port, bool trimming) {
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_IsTrimming(bool* trimming, CAMU_Port port) { Result CAMU_IsTrimming(bool* trimming, u32 port) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x000F0040; cmdbuf[0] = IPC_MakeHeader(0xF,1,0); // 0xF0040
cmdbuf[1] = port; cmdbuf[1] = port;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*trimming = (bool) cmdbuf[2]; *trimming = (bool) cmdbuf[2] & 0xFF;
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetTrimmingParams(CAMU_Port port, s16 xStart, s16 yStart, s16 xEnd, s16 yEnd) { Result CAMU_SetTrimmingParams(u32 port, s16 xStart, s16 yStart, s16 xEnd, s16 yEnd) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00100140; cmdbuf[0] = IPC_MakeHeader(0x10,5,0); // 0x100140
cmdbuf[1] = port; cmdbuf[1] = port;
cmdbuf[2] = xStart; cmdbuf[2] = xStart;
cmdbuf[3] = yStart; cmdbuf[3] = yStart;
@ -218,24 +219,24 @@ Result CAMU_SetTrimmingParams(CAMU_Port port, s16 xStart, s16 yStart, s16 xEnd,
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_GetTrimmingParams(s16* xStart, s16* yStart, s16* xEnd, s16* yEnd, CAMU_Port port) { Result CAMU_GetTrimmingParams(s16* xStart, s16* yStart, s16* xEnd, s16* yEnd, u32 port) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00110040; cmdbuf[0] = IPC_MakeHeader(0x11,1,0); // 0x110040
cmdbuf[1] = port; cmdbuf[1] = port;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*xStart = (s16) cmdbuf[2]; *xStart = (s16) cmdbuf[2] & 0xFFFF;
*yStart = (s16) cmdbuf[3]; *yStart = (s16) cmdbuf[3] & 0xFFFF;
*xEnd = (s16) cmdbuf[4]; *xEnd = (s16) cmdbuf[4] & 0xFFFF;
*yEnd = (s16) cmdbuf[5]; *yEnd = (s16) cmdbuf[5] & 0xFFFF;
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetTrimmingParamsCenter(CAMU_Port port, s16 trimWidth, s16 trimHeight, s16 camWidth, s16 camHeight) { Result CAMU_SetTrimmingParamsCenter(u32 port, s16 trimWidth, s16 trimHeight, s16 camWidth, s16 camHeight) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00120140; cmdbuf[0] = IPC_MakeHeader(0x12,5,0); // 0x120140
cmdbuf[1] = port; cmdbuf[1] = port;
cmdbuf[2] = trimWidth; cmdbuf[2] = trimWidth;
cmdbuf[3] = trimHeight; cmdbuf[3] = trimHeight;
@ -246,20 +247,20 @@ Result CAMU_SetTrimmingParamsCenter(CAMU_Port port, s16 trimWidth, s16 trimHeigh
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_Activate(CAMU_CameraSelect select) { Result CAMU_Activate(u32 select) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00130040; cmdbuf[0] = IPC_MakeHeader(0x13,1,0); // 0x130040
cmdbuf[1] = select; cmdbuf[1] = select;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SwitchContext(CAMU_CameraSelect select, CAMU_Context context) { Result CAMU_SwitchContext(u32 select, CAMU_Context context) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00140080; cmdbuf[0] = IPC_MakeHeader(0x14,2,0); // 0x140080
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = context; cmdbuf[2] = context;
@ -267,10 +268,10 @@ Result CAMU_SwitchContext(CAMU_CameraSelect select, CAMU_Context context) {
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetExposure(CAMU_CameraSelect select, s8 exposure) { Result CAMU_SetExposure(u32 select, s8 exposure) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00150080; cmdbuf[0] = IPC_MakeHeader(0x15,2,0); // 0x150080
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = exposure; cmdbuf[2] = exposure;
@ -278,10 +279,10 @@ Result CAMU_SetExposure(CAMU_CameraSelect select, s8 exposure) {
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetWhiteBalance(CAMU_CameraSelect select, CAMU_WhiteBalance whiteBalance) { Result CAMU_SetWhiteBalance(u32 select, CAMU_WhiteBalance whiteBalance) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00160080; cmdbuf[0] = IPC_MakeHeader(0x16,2,0); // 0x160080
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = whiteBalance; cmdbuf[2] = whiteBalance;
@ -289,10 +290,10 @@ Result CAMU_SetWhiteBalance(CAMU_CameraSelect select, CAMU_WhiteBalance whiteBal
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetWhiteBalanceWithoutBaseUp(CAMU_CameraSelect select, CAMU_WhiteBalance whiteBalance) { Result CAMU_SetWhiteBalanceWithoutBaseUp(u32 select, CAMU_WhiteBalance whiteBalance) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00170080; cmdbuf[0] = IPC_MakeHeader(0x17,2,0); // 0x170080
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = whiteBalance; cmdbuf[2] = whiteBalance;
@ -300,10 +301,10 @@ Result CAMU_SetWhiteBalanceWithoutBaseUp(CAMU_CameraSelect select, CAMU_WhiteBal
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetSharpness(CAMU_CameraSelect select, s8 sharpness) { Result CAMU_SetSharpness(u32 select, s8 sharpness) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00180080; cmdbuf[0] = IPC_MakeHeader(0x18,2,0); // 0x180080
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = sharpness; cmdbuf[2] = sharpness;
@ -311,10 +312,10 @@ Result CAMU_SetSharpness(CAMU_CameraSelect select, s8 sharpness) {
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetAutoExposure(CAMU_CameraSelect select, bool autoExposure) { Result CAMU_SetAutoExposure(u32 select, bool autoExposure) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00190080; cmdbuf[0] = IPC_MakeHeader(0x19,2,0); // 0x190080
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = autoExposure; cmdbuf[2] = autoExposure;
@ -322,21 +323,21 @@ Result CAMU_SetAutoExposure(CAMU_CameraSelect select, bool autoExposure) {
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_IsAutoExposure(bool* autoExposure, CAMU_CameraSelect select) { Result CAMU_IsAutoExposure(bool* autoExposure, u32 select) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x001A0040; cmdbuf[0] = IPC_MakeHeader(0x1A,1,0); // 0x1A0040
cmdbuf[1] = select; cmdbuf[1] = select;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*autoExposure = (bool) cmdbuf[2]; *autoExposure = (bool) cmdbuf[2] & 0xFF;
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetAutoWhiteBalance(CAMU_CameraSelect select, bool autoWhiteBalance) { Result CAMU_SetAutoWhiteBalance(u32 select, bool autoWhiteBalance) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x001B0080; cmdbuf[0] = IPC_MakeHeader(0x1B,2,0); // 0x1B0080
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = autoWhiteBalance; cmdbuf[2] = autoWhiteBalance;
@ -344,21 +345,21 @@ Result CAMU_SetAutoWhiteBalance(CAMU_CameraSelect select, bool autoWhiteBalance)
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_IsAutoWhiteBalance(bool* autoWhiteBalance, CAMU_CameraSelect select) { Result CAMU_IsAutoWhiteBalance(bool* autoWhiteBalance, u32 select) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x001C0040; cmdbuf[0] = IPC_MakeHeader(0x1C,1,0); // 0x1C0040
cmdbuf[1] = select; cmdbuf[1] = select;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*autoWhiteBalance = (bool) cmdbuf[2]; *autoWhiteBalance = (bool) cmdbuf[2] & 0xFF;
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_FlipImage(CAMU_CameraSelect select, CAMU_Flip flip, CAMU_Context context) { Result CAMU_FlipImage(u32 select, CAMU_Flip flip, CAMU_Context context) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x001D00C0; cmdbuf[0] = IPC_MakeHeader(0x1D,3,0); // 0x1D00C0
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = flip; cmdbuf[2] = flip;
cmdbuf[3] = context; cmdbuf[3] = context;
@ -367,10 +368,10 @@ Result CAMU_FlipImage(CAMU_CameraSelect select, CAMU_Flip flip, CAMU_Context con
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetDetailSize(CAMU_CameraSelect select, s16 width, s16 height, s16 cropX0, s16 cropY0, s16 cropX1, s16 cropY1, CAMU_Context context) { Result CAMU_SetDetailSize(u32 select, s16 width, s16 height, s16 cropX0, s16 cropY0, s16 cropX1, s16 cropY1, CAMU_Context context) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x001E0200; cmdbuf[0] = IPC_MakeHeader(0x1E,8,0); // 0x1E0200
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = width; cmdbuf[2] = width;
cmdbuf[3] = height; cmdbuf[3] = height;
@ -384,10 +385,10 @@ Result CAMU_SetDetailSize(CAMU_CameraSelect select, s16 width, s16 height, s16 c
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetSize(CAMU_CameraSelect select, CAMU_Size size, CAMU_Context context) { Result CAMU_SetSize(u32 select, CAMU_Size size, CAMU_Context context) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x001F00C0; cmdbuf[0] = IPC_MakeHeader(0x1F,3,0); // 0x1F00C0
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = size; cmdbuf[2] = size;
cmdbuf[3] = context; cmdbuf[3] = context;
@ -396,10 +397,10 @@ Result CAMU_SetSize(CAMU_CameraSelect select, CAMU_Size size, CAMU_Context conte
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetFrameRate(CAMU_CameraSelect select, CAMU_FrameRate frameRate) { Result CAMU_SetFrameRate(u32 select, CAMU_FrameRate frameRate) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00200080; cmdbuf[0] = IPC_MakeHeader(0x20,2,0); // 0x200080
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = frameRate; cmdbuf[2] = frameRate;
@ -407,10 +408,10 @@ Result CAMU_SetFrameRate(CAMU_CameraSelect select, CAMU_FrameRate frameRate) {
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetPhotoMode(CAMU_CameraSelect select, CAMU_PhotoMode photoMode) { Result CAMU_SetPhotoMode(u32 select, CAMU_PhotoMode photoMode) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00210080; cmdbuf[0] = IPC_MakeHeader(0x21,2,0); // 0x210080
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = photoMode; cmdbuf[2] = photoMode;
@ -418,10 +419,10 @@ Result CAMU_SetPhotoMode(CAMU_CameraSelect select, CAMU_PhotoMode photoMode) {
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetEffect(CAMU_CameraSelect select, CAMU_Effect effect, CAMU_Context context) { Result CAMU_SetEffect(u32 select, CAMU_Effect effect, CAMU_Context context) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x002200C0; cmdbuf[0] = IPC_MakeHeader(0x22,3,0); // 0x2200C0
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = effect; cmdbuf[2] = effect;
cmdbuf[3] = context; cmdbuf[3] = context;
@ -430,10 +431,10 @@ Result CAMU_SetEffect(CAMU_CameraSelect select, CAMU_Effect effect, CAMU_Context
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetContrast(CAMU_CameraSelect select, CAMU_Contrast contrast) { Result CAMU_SetContrast(u32 select, CAMU_Contrast contrast) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00230080; cmdbuf[0] = IPC_MakeHeader(0x23,2,0); // 0x230080
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = contrast; cmdbuf[2] = contrast;
@ -441,10 +442,10 @@ Result CAMU_SetContrast(CAMU_CameraSelect select, CAMU_Contrast contrast) {
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetLensCorrection(CAMU_CameraSelect select, CAMU_LensCorrection lensCorrection) { Result CAMU_SetLensCorrection(u32 select, CAMU_LensCorrection lensCorrection) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00240080; cmdbuf[0] = IPC_MakeHeader(0x24,2,0); // 0x240080
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = lensCorrection; cmdbuf[2] = lensCorrection;
@ -452,10 +453,10 @@ Result CAMU_SetLensCorrection(CAMU_CameraSelect select, CAMU_LensCorrection lens
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetOutputFormat(CAMU_CameraSelect select, CAMU_OutputFormat format, CAMU_Context context) { Result CAMU_SetOutputFormat(u32 select, CAMU_OutputFormat format, CAMU_Context context) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x002500C0; cmdbuf[0] = IPC_MakeHeader(0x25,2,0); // 0x2500C0
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = format; cmdbuf[2] = format;
cmdbuf[3] = context; cmdbuf[3] = context;
@ -464,10 +465,10 @@ Result CAMU_SetOutputFormat(CAMU_CameraSelect select, CAMU_OutputFormat format,
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetAutoExposureWindow(CAMU_CameraSelect select, s16 x, s16 y, s16 width, s16 height) { Result CAMU_SetAutoExposureWindow(u32 select, s16 x, s16 y, s16 width, s16 height) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00260140; cmdbuf[0] = IPC_MakeHeader(0x26,5,0); // 0x260140
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = x; cmdbuf[2] = x;
cmdbuf[3] = y; cmdbuf[3] = y;
@ -478,10 +479,10 @@ Result CAMU_SetAutoExposureWindow(CAMU_CameraSelect select, s16 x, s16 y, s16 wi
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetAutoWhiteBalanceWindow(CAMU_CameraSelect select, s16 x, s16 y, s16 width, s16 height) { Result CAMU_SetAutoWhiteBalanceWindow(u32 select, s16 x, s16 y, s16 width, s16 height) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00270140; cmdbuf[0] = IPC_MakeHeader(0x27,5,0); // 0x270140
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = x; cmdbuf[2] = x;
cmdbuf[3] = y; cmdbuf[3] = y;
@ -492,10 +493,10 @@ Result CAMU_SetAutoWhiteBalanceWindow(CAMU_CameraSelect select, s16 x, s16 y, s1
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetNoiseFilter(CAMU_CameraSelect select, bool noiseFilter) { Result CAMU_SetNoiseFilter(u32 select, bool noiseFilter) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00280080; cmdbuf[0] = IPC_MakeHeader(0x28,2,0); // 0x280080
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = noiseFilter; cmdbuf[2] = noiseFilter;
@ -503,10 +504,10 @@ Result CAMU_SetNoiseFilter(CAMU_CameraSelect select, bool noiseFilter) {
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SynchronizeVsyncTiming(CAMU_CameraSelect select1, CAMU_CameraSelect select2) { Result CAMU_SynchronizeVsyncTiming(u32 select1, u32 select2) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00290080; cmdbuf[0] = IPC_MakeHeader(0x29,2,0); // 0x290080
cmdbuf[1] = select1; cmdbuf[1] = select1;
cmdbuf[2] = select2; cmdbuf[2] = select2;
@ -514,10 +515,10 @@ Result CAMU_SynchronizeVsyncTiming(CAMU_CameraSelect select1, CAMU_CameraSelect
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_GetLatestVsyncTiming(s64* timing, CAMU_Port port, u32 past) { Result CAMU_GetLatestVsyncTiming(s64* timing, u32 port, u32 past) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x002A0080; cmdbuf[0] = IPC_MakeHeader(0x2A,2,0); // 0x2A0080
cmdbuf[1] = port; cmdbuf[1] = port;
cmdbuf[2] = past; cmdbuf[2] = past;
cmdbuf[49] = (past << 17) | 2; cmdbuf[49] = (past << 17) | 2;
@ -530,7 +531,7 @@ Result CAMU_GetLatestVsyncTiming(s64* timing, CAMU_Port port, u32 past) {
Result CAMU_GetStereoCameraCalibrationData(CAMU_StereoCameraCalibrationData* data) { Result CAMU_GetStereoCameraCalibrationData(CAMU_StereoCameraCalibrationData* data) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x002B0000; cmdbuf[0] = IPC_MakeHeader(0x2B,0,0); // 0x2B0000
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*data = *(CAMU_StereoCameraCalibrationData*) cmdbuf[2]; *data = *(CAMU_StereoCameraCalibrationData*) cmdbuf[2];
@ -540,17 +541,17 @@ Result CAMU_GetStereoCameraCalibrationData(CAMU_StereoCameraCalibrationData* dat
Result CAMU_SetStereoCameraCalibrationData(CAMU_StereoCameraCalibrationData data) { Result CAMU_SetStereoCameraCalibrationData(CAMU_StereoCameraCalibrationData data) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x002C0400; cmdbuf[0] = IPC_MakeHeader(0x2C,16,0); // 0x2C0400
*(CAMU_StereoCameraCalibrationData*) cmdbuf[1] = data; *(CAMU_StereoCameraCalibrationData*) cmdbuf[1] = data;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_WriteRegisterI2c(CAMU_CameraSelect select, u16 addr, u16 data) { Result CAMU_WriteRegisterI2c(u32 select, u16 addr, u16 data) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x002D00C0; cmdbuf[0] = IPC_MakeHeader(0x2D,3,0); // 0x2D00C0
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = addr; cmdbuf[2] = addr;
cmdbuf[3] = data; cmdbuf[3] = data;
@ -559,10 +560,10 @@ Result CAMU_WriteRegisterI2c(CAMU_CameraSelect select, u16 addr, u16 data) {
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_WriteMcuVariableI2c(CAMU_CameraSelect select, u16 addr, u16 data) { Result CAMU_WriteMcuVariableI2c(u32 select, u16 addr, u16 data) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x002E00C0; cmdbuf[0] = IPC_MakeHeader(0x2E,3,0); // 0x2E00C0
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = addr; cmdbuf[2] = addr;
cmdbuf[3] = data; cmdbuf[3] = data;
@ -571,34 +572,34 @@ Result CAMU_WriteMcuVariableI2c(CAMU_CameraSelect select, u16 addr, u16 data) {
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_ReadRegisterI2cExclusive(u16* data, CAMU_CameraSelect select, u16 addr) { Result CAMU_ReadRegisterI2cExclusive(u16* data, u32 select, u16 addr) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x002F0080; cmdbuf[0] = IPC_MakeHeader(0x2F,2,0); // 0x2F0080
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = addr; cmdbuf[2] = addr;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*data = (u16) cmdbuf[2]; *data = (u16) cmdbuf[2] & 0xFFFF;
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_ReadMcuVariableI2cExclusive(u16* data, CAMU_CameraSelect select, u16 addr) { Result CAMU_ReadMcuVariableI2cExclusive(u16* data, u32 select, u16 addr) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00300080; cmdbuf[0] = IPC_MakeHeader(0x30,2,0); // 0x300080
cmdbuf[1] = select; cmdbuf[1] = select;
cmdbuf[2] = addr; cmdbuf[2] = addr;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*data = (u16) cmdbuf[2]; *data = (u16) cmdbuf[2] & 0xFFFF;
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetImageQualityCalibrationData(CAMU_ImageQualityCalibrationData data) { Result CAMU_SetImageQualityCalibrationData(CAMU_ImageQualityCalibrationData data) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00310180; cmdbuf[0] = IPC_MakeHeader(0x31,6,0); // 0x310180
*(CAMU_ImageQualityCalibrationData*) cmdbuf[1] = data; *(CAMU_ImageQualityCalibrationData*) cmdbuf[1] = data;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
@ -608,7 +609,7 @@ Result CAMU_SetImageQualityCalibrationData(CAMU_ImageQualityCalibrationData data
Result CAMU_GetImageQualityCalibrationData(CAMU_ImageQualityCalibrationData* data) { Result CAMU_GetImageQualityCalibrationData(CAMU_ImageQualityCalibrationData* data) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00320000; cmdbuf[0] = IPC_MakeHeader(0x32,0,0); // 0x320000
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*data = *(CAMU_ImageQualityCalibrationData*) cmdbuf[2]; *data = *(CAMU_ImageQualityCalibrationData*) cmdbuf[2];
@ -618,7 +619,7 @@ Result CAMU_GetImageQualityCalibrationData(CAMU_ImageQualityCalibrationData* dat
Result CAMU_SetPackageParameterWithoutContext(CAMU_PackageParameterCameraSelect param) { Result CAMU_SetPackageParameterWithoutContext(CAMU_PackageParameterCameraSelect param) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x003302C0; cmdbuf[0] = IPC_MakeHeader(0x33,11,0); // 0x3302C0
*(CAMU_PackageParameterCameraSelect*) cmdbuf[1] = param; *(CAMU_PackageParameterCameraSelect*) cmdbuf[1] = param;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
@ -628,7 +629,7 @@ Result CAMU_SetPackageParameterWithoutContext(CAMU_PackageParameterCameraSelect
Result CAMU_SetPackageParameterWithContext(CAMU_PackageParameterContext param) { Result CAMU_SetPackageParameterWithContext(CAMU_PackageParameterContext param) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00340140; cmdbuf[0] = IPC_MakeHeader(0x34,5,0); // 0x340140
*(CAMU_PackageParameterContext*) cmdbuf[1] = param; *(CAMU_PackageParameterContext*) cmdbuf[1] = param;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
@ -638,27 +639,27 @@ Result CAMU_SetPackageParameterWithContext(CAMU_PackageParameterContext param) {
Result CAMU_SetPackageParameterWithContextDetail(CAMU_PackageParameterContextDetail param) { Result CAMU_SetPackageParameterWithContextDetail(CAMU_PackageParameterContextDetail param) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x003501C0; cmdbuf[0] = IPC_MakeHeader(0x35,7,0); // 0x3501C0
*(CAMU_PackageParameterContextDetail*) cmdbuf[1] = param; *(CAMU_PackageParameterContextDetail*) cmdbuf[1] = param;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_GetSuitableY2rStandardCoefficient(Y2R_StandardCoefficient* coefficient) { Result CAMU_GetSuitableY2rStandardCoefficient(Y2RU_StandardCoefficient* coefficient) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00360000; cmdbuf[0] = IPC_MakeHeader(0x36,0,0); // 0x360000
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*coefficient = (Y2R_StandardCoefficient) cmdbuf[2]; *coefficient = (Y2RU_StandardCoefficient) cmdbuf[2];
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_PlayShutterSound(CAMU_ShutterSoundType sound) { Result CAMU_PlayShutterSound(CAMU_ShutterSoundType sound) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00380040; cmdbuf[0] = IPC_MakeHeader(0x38,1,0); // 0x380040
cmdbuf[1] = sound; cmdbuf[1] = sound;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
@ -668,7 +669,7 @@ Result CAMU_PlayShutterSound(CAMU_ShutterSoundType sound) {
Result CAMU_DriverInitialize(void) { Result CAMU_DriverInitialize(void) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00390000; cmdbuf[0] = IPC_MakeHeader(0x39,0,0); // 0x390000
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1]; return cmdbuf[1];
@ -677,36 +678,36 @@ Result CAMU_DriverInitialize(void) {
Result CAMU_DriverFinalize(void) { Result CAMU_DriverFinalize(void) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x003A0000; cmdbuf[0] = IPC_MakeHeader(0x3A,0,0); // 0x3A0000
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_GetActivatedCamera(CAMU_CameraSelect* select) { Result CAMU_GetActivatedCamera(u32* select) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x003B0000; cmdbuf[0] = IPC_MakeHeader(0x3B,0,0); // 0x3B0000
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*select = (CAMU_CameraSelect) cmdbuf[2]; *select = (u32) cmdbuf[2];
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_GetSleepCamera(CAMU_CameraSelect* select) { Result CAMU_GetSleepCamera(u32* select) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x003C0000; cmdbuf[0] = IPC_MakeHeader(0x3C,0,0); // 0x3C0000
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
*select = (CAMU_CameraSelect) cmdbuf[2]; *select = (u32) cmdbuf[2];
return cmdbuf[1]; return cmdbuf[1];
} }
Result CAMU_SetSleepCamera(CAMU_CameraSelect select) { Result CAMU_SetSleepCamera(u32 select) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x003D0040; cmdbuf[0] = IPC_MakeHeader(0x3D,0,0); // 0x3D0040
cmdbuf[1] = select; cmdbuf[1] = select;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;
@ -716,7 +717,7 @@ Result CAMU_SetSleepCamera(CAMU_CameraSelect select) {
Result CAMU_SetBrightnessSynchronization(bool brightnessSynchronization) { Result CAMU_SetBrightnessSynchronization(bool brightnessSynchronization) {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x003E0040; cmdbuf[0] = IPC_MakeHeader(0x3E,1,0); // 0x3E0040
cmdbuf[1] = brightnessSynchronization; cmdbuf[1] = brightnessSynchronization;
if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(camHandle))) return ret;

View File

@ -6,76 +6,27 @@
#include <3ds/services/cfgnor.h> #include <3ds/services/cfgnor.h>
#include <3ds/ipc.h> #include <3ds/ipc.h>
Handle CFGNOR_handle; Handle cfgnorHandle;
Result CFGNOR_Initialize(u8 value) Result cfgnorInit(u8 value)
{ {
Result ret = 0; Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer(); if(R_FAILED(ret = srvGetServiceHandle(&cfgnorHandle, "cfg:nor")))return ret;
if(R_FAILED(ret = CFGNOR_Initialize(value))) svcCloseHandle(cfgnorHandle);
ret = srvGetServiceHandle(&CFGNOR_handle, "cfg:nor");
if(R_FAILED(ret))return ret;
cmdbuf[0] = IPC_MakeHeader(0x1,1,0); // 0x10040
cmdbuf[1] = (u32)value;
if(R_FAILED(ret = svcSendSyncRequest(CFGNOR_handle)))return ret;
ret = (Result)cmdbuf[1];
return ret; return ret;
} }
Result CFGNOR_Shutdown(void) void cfgnorExit(void)
{ {
Result ret = 0; if(cfgnorHandle != 0)
u32 *cmdbuf = getThreadCommandBuffer(); {
CFGNOR_Shutdown();
cmdbuf[0] = IPC_MakeHeader(0x2,0,0); // 0x20000 svcCloseHandle(cfgnorHandle);
cfgnorHandle = 0;
if(R_FAILED(ret = svcSendSyncRequest(CFGNOR_handle)))return ret; }
ret = (Result)cmdbuf[1];
svcCloseHandle(CFGNOR_handle);
CFGNOR_handle = 0;
return ret;
} }
Result CFGNOR_ReadData(u32 offset, u32 *buf, u32 size) Result cfgnorDumpFlash(u32 *buf, u32 size)
{
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x5,2,2); // 0x50082
cmdbuf[1] = offset;
cmdbuf[2] = size;
cmdbuf[3] = IPC_Desc_Buffer(size,IPC_BUFFER_W);
cmdbuf[4] = (u32)buf;
if(R_FAILED(ret = svcSendSyncRequest(CFGNOR_handle)))return ret;
ret = (Result)cmdbuf[1];
return ret;
}
Result CFGNOR_WriteData(u32 offset, u32 *buf, u32 size)
{
u32 ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x6,2,2); // 0x60082
cmdbuf[1] = offset;
cmdbuf[2] = size;
cmdbuf[3] = IPC_Desc_Buffer(size,IPC_BUFFER_R);
cmdbuf[4] = (u32)buf;
if(R_FAILED(ret = svcSendSyncRequest(CFGNOR_handle)))return ret;
ret = (Result)cmdbuf[1];
return ret;
}
Result CFGNOR_DumpFlash(u32 *buf, u32 size)
{ {
Result ret = 0; Result ret = 0;
u32 pos=0; u32 pos=0;
@ -92,7 +43,7 @@ Result CFGNOR_DumpFlash(u32 *buf, u32 size)
return ret; return ret;
} }
Result CFGNOR_WriteFlash(u32 *buf, u32 size) Result cfgnorWriteFlash(u32 *buf, u32 size)
{ {
Result ret = 0; Result ret = 0;
u32 pos=0; u32 pos=0;
@ -109,3 +60,60 @@ Result CFGNOR_WriteFlash(u32 *buf, u32 size)
return ret; return ret;
} }
Result CFGNOR_Initialize(u8 value)
{
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x1,1,0); // 0x10040
cmdbuf[1] = (u32)value;
if(R_FAILED(ret = svcSendSyncRequest(cfgnorHandle)))return ret;
return cmdbuf[1];
}
Result CFGNOR_Shutdown(void)
{
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x2,0,0); // 0x20000
if(R_FAILED(ret = svcSendSyncRequest(cfgnorHandle)))return ret;
return cmdbuf[1];
}
Result CFGNOR_ReadData(u32 offset, u32 *buf, u32 size)
{
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x5,2,2); // 0x50082
cmdbuf[1] = offset;
cmdbuf[2] = size;
cmdbuf[3] = IPC_Desc_Buffer(size,IPC_BUFFER_W);
cmdbuf[4] = (u32)buf;
if(R_FAILED(ret = svcSendSyncRequest(cfgnorHandle)))return ret;
return cmdbuf[1];
}
Result CFGNOR_WriteData(u32 offset, u32 *buf, u32 size)
{
u32 ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x6,2,2); // 0x60082
cmdbuf[1] = offset;
cmdbuf[2] = size;
cmdbuf[3] = IPC_Desc_Buffer(size,IPC_BUFFER_R);
cmdbuf[4] = (u32)buf;
if(R_FAILED(ret = svcSendSyncRequest(cfgnorHandle)))return ret;
return cmdbuf[1];
}

View File

@ -7,28 +7,28 @@
#include <3ds/services/cfgu.h> #include <3ds/services/cfgu.h>
#include <3ds/ipc.h> #include <3ds/ipc.h>
static Handle CFGU_handle; static Handle cfguHandle;
static int CFGU_refCount; static int cfguRefCount;
Result cfguInit(void) Result cfguInit(void)
{ {
Result ret; Result ret;
if (AtomicPostIncrement(&CFGU_refCount)) return 0; if (AtomicPostIncrement(&cfguRefCount)) return 0;
// cfg:i has the most commands, then cfg:s, then cfg:u // cfg:i has the most commands, then cfg:s, then cfg:u
ret = srvGetServiceHandle(&CFGU_handle, "cfg:i"); ret = srvGetServiceHandle(&cfguHandle, "cfg:i");
if(R_FAILED(ret)) ret = srvGetServiceHandle(&CFGU_handle, "cfg:s"); if(R_FAILED(ret)) ret = srvGetServiceHandle(&cfguHandle, "cfg:s");
if(R_FAILED(ret)) ret = srvGetServiceHandle(&CFGU_handle, "cfg:u"); if(R_FAILED(ret)) ret = srvGetServiceHandle(&cfguHandle, "cfg:u");
if(R_FAILED(ret)) AtomicDecrement(&CFGU_refCount); if(R_FAILED(ret)) AtomicDecrement(&cfguRefCount);
return ret; return ret;
} }
void cfguExit(void) void cfguExit(void)
{ {
if (AtomicDecrement(&CFGU_refCount)) return; if (AtomicDecrement(&cfguRefCount)) return;
svcCloseHandle(CFGU_handle); svcCloseHandle(cfguHandle);
} }
Result CFGU_SecureInfoGetRegion(u8* region) Result CFGU_SecureInfoGetRegion(u8* region)
@ -38,9 +38,9 @@ Result CFGU_SecureInfoGetRegion(u8* region)
cmdbuf[0] = IPC_MakeHeader(0x2,0,0); // 0x20000 cmdbuf[0] = IPC_MakeHeader(0x2,0,0); // 0x20000
if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(cfguHandle)))return ret;
*region = (u8)cmdbuf[2]; *region = (u8)cmdbuf[2] & 0xFF;
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -53,7 +53,7 @@ Result CFGU_GenHashConsoleUnique(u32 appIDSalt, u64* hash)
cmdbuf[0] = IPC_MakeHeader(0x3,1,0); // 0x30040 cmdbuf[0] = IPC_MakeHeader(0x3,1,0); // 0x30040
cmdbuf[1] = appIDSalt; cmdbuf[1] = appIDSalt;
if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(cfguHandle)))return ret;
*hash = (u64)cmdbuf[2]; *hash = (u64)cmdbuf[2];
*hash |= ((u64)cmdbuf[3])<<32; *hash |= ((u64)cmdbuf[3])<<32;
@ -68,9 +68,9 @@ Result CFGU_GetRegionCanadaUSA(u8* value)
cmdbuf[0] = IPC_MakeHeader(0x4,0,0); // 0x40000 cmdbuf[0] = IPC_MakeHeader(0x4,0,0); // 0x40000
if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(cfguHandle)))return ret;
*value = (u8)cmdbuf[2]; *value = (u8)cmdbuf[2] & 0xFF;
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -82,9 +82,9 @@ Result CFGU_GetSystemModel(u8* model)
cmdbuf[0] = IPC_MakeHeader(0x5,0,0); // 0x50000 cmdbuf[0] = IPC_MakeHeader(0x5,0,0); // 0x50000
if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(cfguHandle)))return ret;
*model = (u8)cmdbuf[2]; *model = (u8)cmdbuf[2] & 0xFF;
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -96,9 +96,9 @@ Result CFGU_GetModelNintendo2DS(u8* value)
cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000 cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000
if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(cfguHandle)))return ret;
*value = (u8)cmdbuf[2]; *value = (u8)cmdbuf[2] & 0xFF;
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -111,9 +111,9 @@ Result CFGU_GetCountryCodeString(u16 code, u16* string)
cmdbuf[0] = IPC_MakeHeader(0x9,1,0); // 0x90040 cmdbuf[0] = IPC_MakeHeader(0x9,1,0); // 0x90040
cmdbuf[1] = (u32)code; cmdbuf[1] = (u32)code;
if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(cfguHandle)))return ret;
*string = (u16)cmdbuf[2]; *string = (u16)cmdbuf[2] & 0xFFFF;
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -126,9 +126,9 @@ Result CFGU_GetCountryCodeID(u16 string, u16* code)
cmdbuf[0] = IPC_MakeHeader(0xA,1,0); // 0xA0040 cmdbuf[0] = IPC_MakeHeader(0xA,1,0); // 0xA0040
cmdbuf[1] = (u32)string; cmdbuf[1] = (u32)string;
if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(cfguHandle)))return ret;
*code = (u16)cmdbuf[2]; *code = (u16)cmdbuf[2] & 0xFFFF;
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -146,7 +146,7 @@ Result CFGU_GetConfigInfoBlk2(u32 size, u32 blkID, u8* outData)
cmdbuf[3] = IPC_Desc_Buffer(size,IPC_BUFFER_W); cmdbuf[3] = IPC_Desc_Buffer(size,IPC_BUFFER_W);
cmdbuf[4] = (u32)outData; cmdbuf[4] = (u32)outData;
if(R_FAILED(ret = svcSendSyncRequest(CFGU_handle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(cfguHandle)))return ret;
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }

View File

@ -4,7 +4,7 @@
#include <3ds/result.h> #include <3ds/result.h>
#include <3ds/svc.h> #include <3ds/svc.h>
#include <3ds/srv.h> #include <3ds/srv.h>
#include <3ds/mappable.h> #include <3ds/allocator/mappable.h>
#include <3ds/os.h> #include <3ds/os.h>
#include <3ds/services/csnd.h> #include <3ds/services/csnd.h>
#include <3ds/ipc.h> #include <3ds/ipc.h>
@ -26,19 +26,19 @@ static u32 csndCmdBlockSize = 0x2000;
static u32 csndCmdStartOff; static u32 csndCmdStartOff;
static u32 csndCmdCurOff; static u32 csndCmdCurOff;
static Result CSND_Initialize(void) static Result CSND_Initialize(Handle* mutex, Handle* sharedMem, u32 sharedMemSize, u32* offsets)
{ {
Result ret=0; Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x1,5,0); // 0x10140 cmdbuf[0] = IPC_MakeHeader(0x1,5,0); // 0x10140
cmdbuf[1] = csndSharedMemSize; cmdbuf[1] = sharedMemSize;
memcpy(&cmdbuf[2], &csndOffsets[0], 4*sizeof(u32)); memcpy(&cmdbuf[2], &offsets[0], 4*sizeof(u32));
if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
csndMutex = cmdbuf[3]; if(mutex) *mutex = cmdbuf[3];
csndSharedMemBlock = cmdbuf[4]; if(sharedMem) *sharedMem = cmdbuf[4];
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -55,6 +55,19 @@ static Result CSND_Shutdown()
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
static Result CSND_ExecuteCommands(u32 offset)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x3,1,0); // 0x30040
cmdbuf[1] = offset;
if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
return (Result)cmdbuf[1];
}
static Result CSND_AcquireSoundChannels(u32* channelMask) static Result CSND_AcquireSoundChannels(u32* channelMask)
{ {
Result ret=0; Result ret=0;
@ -108,6 +121,54 @@ Result CSND_ReleaseCapUnit(u32 capUnit)
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
Result CSND_FlushDataCache(const void* adr, u32 size)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x9,2,2); // 0x90082
cmdbuf[1] = (u32)adr;
cmdbuf[2] = size;
cmdbuf[3] = IPC_Desc_SharedHandles(1);
cmdbuf[4] = CUR_PROCESS_HANDLE;
if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
return cmdbuf[1];
}
Result CSND_StoreDataCache(const void* adr, u32 size)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0xA,2,2); // 0xA0082
cmdbuf[1] = (u32)adr;
cmdbuf[2] = size;
cmdbuf[3] = IPC_Desc_SharedHandles(1);
cmdbuf[4] = CUR_PROCESS_HANDLE;
if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
return cmdbuf[1];
}
Result CSND_InvalidateDataCache(const void* adr, u32 size)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0xB,2,2); // 0xB0082
cmdbuf[1] = (u32)adr;
cmdbuf[2] = size;
cmdbuf[3] = IPC_Desc_SharedHandles(1);
cmdbuf[4] = CUR_PROCESS_HANDLE;
if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
return cmdbuf[1];
}
Result CSND_Reset(void) Result CSND_Reset(void)
{ {
Result ret=0; Result ret=0;
@ -136,7 +197,7 @@ Result csndInit(void)
csndOffsets[3] = csndOffsets[2] + 2*8; // Offset to the input of command 0x00040080 csndOffsets[3] = csndOffsets[2] + 2*8; // Offset to the input of command 0x00040080
csndSharedMemSize = csndOffsets[3] + 0x3C; // Total size of the CSND shared memory csndSharedMemSize = csndOffsets[3] + 0x3C; // Total size of the CSND shared memory
ret = CSND_Initialize(); ret = CSND_Initialize(&csndMutex, &csndSharedMemBlock, csndSharedMemSize, csndOffsets);
if (R_FAILED(ret)) goto cleanup1; if (R_FAILED(ret)) goto cleanup1;
csndSharedMem = (vu32*)mappableAlloc(csndSharedMemSize); csndSharedMem = (vu32*)mappableAlloc(csndSharedMemSize);
@ -188,19 +249,6 @@ void csndExit(void)
} }
} }
static Result CSND_ExecuteCommands(u32 offset)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x3,1,0); // 0x30040
cmdbuf[1] = offset;
if(R_FAILED(ret = svcSendSyncRequest(csndHandle)))return ret;
return (Result)cmdbuf[1];
}
u32* csndAddCmd(int cmdid) u32* csndAddCmd(int cmdid)
{ {
vu16* ptr; vu16* ptr;
@ -318,7 +366,7 @@ void CSND_SetInterp(u32 channel, bool interp)
cmdparams[1] = interp ? 1 : 0; cmdparams[1] = interp ? 1 : 0;
} }
void CSND_SetDuty(u32 channel, u32 duty) void CSND_SetDuty(u32 channel, CSND_DutyCycle duty)
{ {
u32* cmdparams = csndAddCmd(0x007); u32* cmdparams = csndAddCmd(0x007);
@ -372,7 +420,7 @@ void CSND_SetChnRegs(u32 flags, u32 physaddr0, u32 physaddr1, u32 totalbytesize,
cmdparams[5] = totalbytesize; cmdparams[5] = totalbytesize;
} }
void CSND_SetChnRegsPSG(u32 flags, u32 chnVolumes, u32 capVolumes, u32 duty) void CSND_SetChnRegsPSG(u32 flags, u32 chnVolumes, u32 capVolumes, CSND_DutyCycle duty)
{ {
u32* cmdparams = csndAddCmd(0x00F); u32* cmdparams = csndAddCmd(0x00F);

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,3 @@
/*
gsp.c _ Gpu/lcd stuff.
*/
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <3ds/types.h> #include <3ds/types.h>
@ -9,20 +5,21 @@
#include <3ds/svc.h> #include <3ds/svc.h>
#include <3ds/srv.h> #include <3ds/srv.h>
#include <3ds/synchronization.h> #include <3ds/synchronization.h>
#include <3ds/services/gsp.h> #include <3ds/services/gspgpu.h>
#include <3ds/ipc.h>
#define GSP_EVENT_STACK_SIZE 0x1000 #define GSP_EVENT_STACK_SIZE 0x1000
Handle gspGpuHandle; Handle gspGpuHandle;
Handle gspLcdHandle; static int gspRefCount;
Handle gspEvents[GSPEVENT_MAX];
vu32 gspEventCounts[GSPEVENT_MAX]; Handle gspEvents[GSPGPU_EVENT_MAX];
vu32 gspEventCounts[GSPGPU_EVENT_MAX];
u64 gspEventStack[GSP_EVENT_STACK_SIZE/sizeof(u64)]; //u64 so that it's 8-byte aligned u64 gspEventStack[GSP_EVENT_STACK_SIZE/sizeof(u64)]; //u64 so that it's 8-byte aligned
volatile bool gspRunEvents; volatile bool gspRunEvents;
Handle gspEventThread; Handle gspEventThread;
static Handle gspEvent; static Handle gspEvent;
static int gspRefCount, gspLcdRefCount;
static vu8* gspEventData; static vu8* gspEventData;
static void gspEventThreadMain(void *arg); static void gspEventThreadMain(void *arg);
@ -46,7 +43,7 @@ Result gspInitEventHandler(Handle _gspEvent, vu8* _gspSharedMem, u8 gspThreadId)
{ {
// Create events // Create events
int i; int i;
for (i = 0; i < GSPEVENT_MAX; i ++) for (i = 0; i < GSPGPU_EVENT_MAX; i ++)
{ {
Result rc = svcCreateEvent(&gspEvents[i], 0); Result rc = svcCreateEvent(&gspEvents[i], 0);
if (rc != 0) if (rc != 0)
@ -75,13 +72,13 @@ void gspExitEventHandler(void)
// Free events // Free events
int i; int i;
for (i = 0; i < GSPEVENT_MAX; i ++) for (i = 0; i < GSPGPU_EVENT_MAX; i ++)
svcCloseHandle(gspEvents[i]); svcCloseHandle(gspEvents[i]);
} }
void gspWaitForEvent(GSP_Event id, bool nextEvent) void gspWaitForEvent(GSPGPU_Event id, bool nextEvent)
{ {
if(id>=GSPEVENT_MAX)return; if(id>= GSPGPU_EVENT_MAX)return;
if (nextEvent) if (nextEvent)
svcClearEvent(gspEvents[id]); svcClearEvent(gspEvents[id]);
@ -140,7 +137,7 @@ void gspEventThreadMain(void *arg)
if (curEvt == -1) if (curEvt == -1)
break; break;
if (curEvt < GSPEVENT_MAX) { if (curEvt < GSPGPU_EVENT_MAX) {
svcSignalEvent(gspEvents[curEvt]); svcSignalEvent(gspEvents[curEvt]);
gspEventCounts[curEvt]++; gspEventCounts[curEvt]++;
} }
@ -149,222 +146,10 @@ void gspEventThreadMain(void *arg)
svcExitThread(); svcExitThread();
} }
Result GSPGPU_WriteHWRegs(u32 regAddr, u32* data, u8 size)
{
if(size>0x80 || !data)return -1;
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x00010082; //request header code
cmdbuf[1]=regAddr;
cmdbuf[2]=size;
cmdbuf[3]=(size<<14)|2;
cmdbuf[4]=(u32)data;
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_WriteHWRegsWithMask(u32 regAddr, u32* data, u8 datasize, u32* maskdata, u8 masksize)
{
if(datasize>0x80 || !data)return -1;
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x00020084; //request header code
cmdbuf[1]=regAddr;
cmdbuf[2]=datasize;
cmdbuf[3]=(datasize<<14)|2;
cmdbuf[4]=(u32)data;
cmdbuf[5]=(masksize<<14)|0x402;
cmdbuf[6]=(u32)maskdata;
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_ReadHWRegs(u32 regAddr, u32* data, u8 size)
{
if(size>0x80 || !data)return -1;
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x00040080; //request header code
cmdbuf[1]=regAddr;
cmdbuf[2]=size;
cmdbuf[0x40]=(size<<14)|2;
cmdbuf[0x40+1]=(u32)data;
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_SetBufferSwap(u32 screenid, GSP_FramebufferInfo *framebufinfo)
{
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00050200;
cmdbuf[1] = screenid;
memcpy(&cmdbuf[2], framebufinfo, sizeof(GSP_FramebufferInfo));
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_FlushDataCache(const void* adr, u32 size)
{
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x00080082; //request header code
cmdbuf[1]=(u32)adr;
cmdbuf[2]=size;
cmdbuf[3]=0x0;
cmdbuf[4]=CUR_PROCESS_HANDLE;
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_InvalidateDataCache(const void* adr, u32 size)
{
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00090082;
cmdbuf[1] = (u32)adr;
cmdbuf[2] = size;
cmdbuf[3] = 0;
cmdbuf[4] = CUR_PROCESS_HANDLE;
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_SetLcdForceBlack(u8 flags)
{
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x000B0040; //request header code
cmdbuf[1]=flags;
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_TriggerCmdReqQueue(void)
{
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x000C0000; //request header code
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_RegisterInterruptRelayQueue(Handle eventHandle, u32 flags, Handle* outMemHandle, u8* threadID)
{
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x00130042; //request header code
cmdbuf[1]=flags;
cmdbuf[2]=0x0;
cmdbuf[3]=eventHandle;
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
if(threadID)*threadID=cmdbuf[2];
if(outMemHandle)*outMemHandle=cmdbuf[4];
return cmdbuf[1];
}
Result GSPGPU_UnregisterInterruptRelayQueue(void)
{
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x00140000; //request header code
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_AcquireRight(u8 flags)
{
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x160042; //request header code
cmdbuf[1]=flags;
cmdbuf[2]=0x0;
cmdbuf[3]=CUR_PROCESS_HANDLE;
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_ReleaseRight(void)
{
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x170000; //request header code
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_ImportDisplayCaptureInfo(GSP_CaptureInfo *captureinfo)
{
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x00180000; //request header code
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
ret = cmdbuf[1];
if(R_SUCCEEDED(ret))
memcpy(captureinfo, &cmdbuf[2], 0x20);
return ret;
}
Result GSPGPU_SaveVramSysArea(void)
{
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x00190000; //request header code
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_RestoreVramSysArea(void)
{
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=0x001A0000; //request header code
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
//essentially : get commandIndex and totalCommands, calculate offset of new command, copy command and update totalCommands //essentially : get commandIndex and totalCommands, calculate offset of new command, copy command and update totalCommands
//use LDREX/STREX because this data may also be accessed by the GSP module and we don't want to break stuff //use LDREX/STREX because this data may also be accessed by the GSP module and we don't want to break stuff
//(mostly, we could overwrite the buffer header with wrong data and make the GSP module reexecute old commands) //(mostly, we could overwrite the buffer header with wrong data and make the GSP module reexecute old commands)
Result GSPGPU_SubmitGxCommand(u32* sharedGspCmdBuf, u32 gxCommand[0x8]) Result gspSubmitGxCommand(u32* sharedGspCmdBuf, u32 gxCommand[0x8])
{ {
if(!sharedGspCmdBuf || !gxCommand)return -1; if(!sharedGspCmdBuf || !gxCommand)return -1;
@ -396,43 +181,214 @@ Result GSPGPU_SubmitGxCommand(u32* sharedGspCmdBuf, u32 gxCommand[0x8])
return 0; return 0;
} }
Result gspLcdInit(void) Result GSPGPU_WriteHWRegs(u32 regAddr, u32* data, u8 size)
{ {
Result res=0; if(size>0x80 || !data)return -1;
if (AtomicPostIncrement(&gspLcdRefCount)) return 0;
res = srvGetServiceHandle(&gspLcdHandle, "gsp::Lcd");
if (R_FAILED(res)) AtomicDecrement(&gspLcdRefCount);
return res;
}
void gspLcdExit(void) u32* cmdbuf=getThreadCommandBuffer();
{ cmdbuf[0]=IPC_MakeHeader(0x1,2,2); // 0x10082
if (AtomicDecrement(&gspLcdRefCount)) return; cmdbuf[1]=regAddr;
svcCloseHandle(gspLcdHandle); cmdbuf[2]=size;
} cmdbuf[3]=IPC_Desc_StaticBuffer(size, 0);
cmdbuf[4]=(u32)data;
Result GSPLCD_PowerOffBacklight(GSPLCD_Screens screen)
{
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00120040;
cmdbuf[1] = screen;
Result ret=0; Result ret=0;
if (R_FAILED(ret = svcSendSyncRequest(gspLcdHandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1]; return cmdbuf[1];
} }
Result GSPLCD_PowerOnBacklight(GSPLCD_Screens screen) Result GSPGPU_WriteHWRegsWithMask(u32 regAddr, u32* data, u8 datasize, u32* maskdata, u8 masksize)
{ {
u32 *cmdbuf = getThreadCommandBuffer(); if(datasize>0x80 || !data)return -1;
cmdbuf[0] = 0x00110040; u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[1] = screen; cmdbuf[0]=IPC_MakeHeader(0x2,2,4); // 0x20084
cmdbuf[1]=regAddr;
cmdbuf[2]=datasize;
cmdbuf[3]=IPC_Desc_StaticBuffer(datasize, 0);
cmdbuf[4]=(u32)data;
cmdbuf[5]=IPC_Desc_StaticBuffer(masksize, 1);
cmdbuf[6]=(u32)maskdata;
Result ret=0; Result ret=0;
if (R_FAILED(ret = svcSendSyncRequest(gspLcdHandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1]; return cmdbuf[1];
} }
Result GSPGPU_ReadHWRegs(u32 regAddr, u32* data, u8 size)
{
if(size>0x80 || !data)return -1;
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x4,2,0); // 0x40080
cmdbuf[1]=regAddr;
cmdbuf[2]=size;
cmdbuf[0x40]=IPC_Desc_StaticBuffer(size, 0);
cmdbuf[0x40+1]=(u32)data;
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_SetBufferSwap(u32 screenid, GSPGPU_FramebufferInfo*framebufinfo)
{
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x5,8,0); // 0x50200
cmdbuf[1] = screenid;
memcpy(&cmdbuf[2], framebufinfo, sizeof(GSPGPU_FramebufferInfo));
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_FlushDataCache(const void* adr, u32 size)
{
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x8,2,2); // 0x80082
cmdbuf[1]=(u32)adr;
cmdbuf[2]=size;
cmdbuf[3]=IPC_Desc_SharedHandles(1);
cmdbuf[4]=CUR_PROCESS_HANDLE;
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_InvalidateDataCache(const void* adr, u32 size)
{
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x9,2,2); // 0x90082
cmdbuf[1] = (u32)adr;
cmdbuf[2] = size;
cmdbuf[3] = IPC_Desc_SharedHandles(1);
cmdbuf[4] = CUR_PROCESS_HANDLE;
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_SetLcdForceBlack(u8 flags)
{
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0xB,1,0); // 0xB0040
cmdbuf[1]=flags;
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_TriggerCmdReqQueue(void)
{
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0xC,0,0); // 0xC0000
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_RegisterInterruptRelayQueue(Handle eventHandle, u32 flags, Handle* outMemHandle, u8* threadID)
{
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x13,1,2); // 0x130042
cmdbuf[1]=flags;
cmdbuf[2]=IPC_Desc_SharedHandles(1);
cmdbuf[3]=eventHandle;
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
if(threadID)*threadID=cmdbuf[2] & 0xFF;
if(outMemHandle)*outMemHandle=cmdbuf[4];
return cmdbuf[1];
}
Result GSPGPU_UnregisterInterruptRelayQueue(void)
{
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x14,0,0); // 0x140000
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_AcquireRight(u8 flags)
{
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x16,1,2); // 0x160042
cmdbuf[1]=flags;
cmdbuf[2]=IPC_Desc_SharedHandles(1);
cmdbuf[3]=CUR_PROCESS_HANDLE;
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_ReleaseRight(void)
{
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x17,0,0); // 0x170000
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_ImportDisplayCaptureInfo(GSPGPU_CaptureInfo*captureinfo)
{
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x18,0,0); // 0x180000
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
ret = cmdbuf[1];
if(R_SUCCEEDED(ret)) memcpy(captureinfo, &cmdbuf[2], 0x20);
return ret;
}
Result GSPGPU_SaveVramSysArea(void)
{
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x19,0,0); // 0x190000
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}
Result GSPGPU_RestoreVramSysArea(void)
{
u32* cmdbuf=getThreadCommandBuffer();
cmdbuf[0]=IPC_MakeHeader(0x1A,0,0); // 0x1A0000
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(gspGpuHandle)))return ret;
return cmdbuf[1];
}

View File

@ -0,0 +1,54 @@
#include <stdlib.h>
#include <string.h>
#include <3ds/types.h>
#include <3ds/ipc.h>
#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
#include <3ds/synchronization.h>
#include <3ds/services/gsplcd.h>
Handle gspLcdHandle;
static int gspLcdRefCount;
Result gspLcdInit(void)
{
Result res=0;
if (AtomicPostIncrement(&gspLcdRefCount)) return 0;
res = srvGetServiceHandle(&gspLcdHandle, "gsp::Lcd");
if (R_FAILED(res)) AtomicDecrement(&gspLcdRefCount);
return res;
}
void gspLcdExit(void)
{
if (AtomicDecrement(&gspLcdRefCount)) return;
svcCloseHandle(gspLcdHandle);
}
Result GSPLCD_PowerOnBacklight(u32 screen)
{
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x11,1,0); // 0x110040
cmdbuf[1] = screen;
Result ret=0;
if (R_FAILED(ret = svcSendSyncRequest(gspLcdHandle))) return ret;
return cmdbuf[1];
}
Result GSPLCD_PowerOffBacklight(u32 screen)
{
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x12,1,0); // 0x120040
cmdbuf[1] = screen;
Result ret=0;
if (R_FAILED(ret = svcSendSyncRequest(gspLcdHandle))) return ret;
return cmdbuf[1];
}

View File

@ -7,7 +7,7 @@
#include <3ds/result.h> #include <3ds/result.h>
#include <3ds/svc.h> #include <3ds/svc.h>
#include <3ds/srv.h> #include <3ds/srv.h>
#include <3ds/mappable.h> #include <3ds/allocator/mappable.h>
#include <3ds/synchronization.h> #include <3ds/synchronization.h>
#include <3ds/services/apt.h> #include <3ds/services/apt.h>
#include <3ds/services/hid.h> #include <3ds/services/hid.h>
@ -299,7 +299,7 @@ Result HIDUSER_GetSoundVolume(u8 *volume)
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(hidHandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(hidHandle)))return ret;
*volume = (u8)cmdbuf[2]; *volume = (u8)cmdbuf[2] & 0xFF;
return cmdbuf[1]; return cmdbuf[1];
} }

View File

@ -90,7 +90,7 @@ Result httpcReceiveData(httpcContext *context, u8* buffer, u32 size)
return HTTPC_ReceiveData(context->servhandle, context->httphandle, buffer, size); return HTTPC_ReceiveData(context->servhandle, context->httphandle, buffer, size);
} }
Result httpcGetRequestState(httpcContext *context, httpcReqStatus* out) Result httpcGetRequestState(httpcContext *context, HTTPC_RequestStatus* out)
{ {
return HTTPC_GetRequestState(context->servhandle, context->httphandle, out); return HTTPC_GetRequestState(context->servhandle, context->httphandle, out);
} }
@ -273,7 +273,7 @@ Result HTTPC_ReceiveData(Handle handle, Handle contextHandle, u8* buffer, u32 si
return cmdbuf[1]; return cmdbuf[1];
} }
Result HTTPC_GetRequestState(Handle handle, Handle contextHandle, httpcReqStatus* out) Result HTTPC_GetRequestState(Handle handle, Handle contextHandle, HTTPC_RequestStatus* out)
{ {
u32* cmdbuf=getThreadCommandBuffer(); u32* cmdbuf=getThreadCommandBuffer();
@ -310,13 +310,13 @@ Result HTTPC_GetResponseHeader(Handle handle, Handle contextHandle, char* name,
int name_len=strlen(name)+1; int name_len=strlen(name)+1;
cmdbuf[0]=0x001e00c4; //request header code cmdbuf[0]=IPC_MakeHeader(0x1E,3,4); // 0x1E00C4
cmdbuf[1]=contextHandle; cmdbuf[1]=contextHandle;
cmdbuf[2]=name_len; cmdbuf[2]=name_len;
cmdbuf[3]=valuebuf_maxsize; cmdbuf[3]=valuebuf_maxsize;
cmdbuf[4]=(name_len<<14)|0xC02; cmdbuf[4]=IPC_Desc_StaticBuffer(name_len, 3);
cmdbuf[5]=(u32)name; cmdbuf[5]=(u32)name;
cmdbuf[6]=(valuebuf_maxsize<<4)|0xC; cmdbuf[6]=IPC_Desc_Buffer(valuebuf_maxsize, IPC_BUFFER_W);
cmdbuf[7]=(u32)value; cmdbuf[7]=(u32)value;
Result ret=0; Result ret=0;

View File

@ -8,39 +8,117 @@
#include <3ds/services/ir.h> #include <3ds/services/ir.h>
#include <3ds/ipc.h> #include <3ds/ipc.h>
static Handle iru_handle; static Handle iruHandle;
static Handle iru_sharedmem_handle; static Handle iruSharedMemHandle;
static u32 *iru_sharedmem; static u32 *iruSharedMem;
static u32 iru_sharedmem_size; static u32 iruSharedMemSize;
static int iru_refcount; static int iruRefCount;
Result irucmd_Initialize(void) Result iruInit(u32 *sharedmem_addr, u32 sharedmem_size)
{
Result ret = 0;
if(AtomicPostIncrement(&iruRefCount)) return 0;
ret = srvGetServiceHandle(&iruHandle, "ir:u");
if(R_FAILED(ret))goto cleanup0;
ret = IRU_Initialize();
if(R_FAILED(ret))goto cleanup1;
ret = svcCreateMemoryBlock(&iruSharedMemHandle, (u32)sharedmem_addr, sharedmem_size, 1, 3);
if(R_FAILED(ret))goto cleanup2;
iruSharedMem = sharedmem_addr;
iruSharedMemSize = sharedmem_size;
return ret;
cleanup2:
IRU_Shutdown();
cleanup1:
svcCloseHandle(iruHandle);
cleanup0:
AtomicDecrement(&iruRefCount);
return ret;
}
void iruExit(void)
{
if(AtomicDecrement(&iruRefCount)) return;
IRU_Shutdown();
svcCloseHandle(iruHandle);
svcCloseHandle(iruSharedMemHandle);
iruHandle = 0;
iruSharedMemHandle = 0;
}
Handle iruGetServHandle(void)
{
return iruHandle;
}
Result iruSendData(u8 *buf, u32 size, bool wait)
{
Result ret = 0;
ret = IRU_StartSendTransfer(buf, size);
if(R_FAILED(ret))return ret;
if(!wait)return 0;
return IRU_WaitSendTransfer();
}
Result iruRecvData(u8 *buf, u32 size, u8 flag, u32 *transfercount, bool wait)
{
Result ret = 0;
*transfercount = 0;
ret = IRU_StartRecvTransfer(size, flag);
if(R_FAILED(ret))return ret;
if(wait)
{
ret = IRU_WaitRecvTransfer(transfercount);
if(R_FAILED(ret))return ret;
if(buf)memcpy(buf, iruSharedMem, size);
}
return 0;
}
Result IRU_Initialize(void)
{ {
Result ret = 0; Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x1,0,0); // 0x10000 cmdbuf[0] = IPC_MakeHeader(0x1,0,0); // 0x10000
if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(iruHandle)))return ret;
ret = (Result)cmdbuf[1]; ret = (Result)cmdbuf[1];
return ret; return ret;
} }
Result irucmd_Shutdown(void) Result IRU_Shutdown(void)
{ {
Result ret = 0; Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x2,0,0); // 0x20000 cmdbuf[0] = IPC_MakeHeader(0x2,0,0); // 0x20000
if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(iruHandle)))return ret;
ret = (Result)cmdbuf[1]; ret = (Result)cmdbuf[1];
return ret; return ret;
} }
Result irucmd_StartSendTransfer(u8 *buf, u32 size) Result IRU_StartSendTransfer(u8 *buf, u32 size)
{ {
Result ret = 0; Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();
@ -50,51 +128,51 @@ Result irucmd_StartSendTransfer(u8 *buf, u32 size)
cmdbuf[2] = IPC_Desc_Buffer(size,IPC_BUFFER_R); cmdbuf[2] = IPC_Desc_Buffer(size,IPC_BUFFER_R);
cmdbuf[3] = (u32)buf; cmdbuf[3] = (u32)buf;
if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(iruHandle)))return ret;
ret = (Result)cmdbuf[1]; ret = (Result)cmdbuf[1];
return ret; return ret;
} }
Result irucmd_WaitSendTransfer(void) Result IRU_WaitSendTransfer(void)
{ {
Result ret = 0; Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x4,0,0); // 0x40000 cmdbuf[0] = IPC_MakeHeader(0x4,0,0); // 0x40000
if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(iruHandle)))return ret;
ret = (Result)cmdbuf[1]; ret = (Result)cmdbuf[1];
return ret; return ret;
} }
Result irucmd_StartRecvTransfer(u32 size, u8 flag) Result IRU_StartRecvTransfer(u32 size, u8 flag)
{ {
Result ret = 0; Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x5,3,2); // 0x500C2 cmdbuf[0] = IPC_MakeHeader(0x5,3,2); // 0x500C2
cmdbuf[1] = iru_sharedmem_size; cmdbuf[1] = iruSharedMemSize;
cmdbuf[2] = size; cmdbuf[2] = size;
cmdbuf[3] = (u8)flag; cmdbuf[3] = (u8)flag;
cmdbuf[4] = IPC_Desc_SharedHandles(1); cmdbuf[4] = IPC_Desc_SharedHandles(1);
cmdbuf[5] = iru_sharedmem_handle; cmdbuf[5] = iruSharedMemHandle;
if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(iruHandle)))return ret;
ret = (Result)cmdbuf[1]; ret = (Result)cmdbuf[1];
return ret; return ret;
} }
Result irucmd_WaitRecvTransfer(u32 *transfercount) Result IRU_WaitRecvTransfer(u32 *transfercount)
{ {
Result ret = 0; Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000 cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000
if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(iruHandle)))return ret;
ret = (Result)cmdbuf[1]; ret = (Result)cmdbuf[1];
*transfercount = cmdbuf[2]; *transfercount = cmdbuf[2];
@ -110,7 +188,7 @@ Result IRU_SetBitRate(u8 value)
cmdbuf[0] = IPC_MakeHeader(0x9,1,0); // 0x90040 cmdbuf[0] = IPC_MakeHeader(0x9,1,0); // 0x90040
cmdbuf[1] = (u32)value; cmdbuf[1] = (u32)value;
if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(iruHandle)))return ret;
ret = (Result)cmdbuf[1]; ret = (Result)cmdbuf[1];
return ret; return ret;
@ -123,10 +201,10 @@ Result IRU_GetBitRate(u8 *out)
cmdbuf[0] = IPC_MakeHeader(0xA,0,0); // 0xA0000 cmdbuf[0] = IPC_MakeHeader(0xA,0,0); // 0xA0000
if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(iruHandle)))return ret;
ret = (Result)cmdbuf[1]; ret = (Result)cmdbuf[1];
*out = (u8)cmdbuf[2]; *out = (u8)cmdbuf[2] & 0xFF;
return ret; return ret;
} }
@ -139,7 +217,7 @@ Result IRU_SetIRLEDState(u32 value)
cmdbuf[0] = IPC_MakeHeader(0xB,1,0); // 0xB0040 cmdbuf[0] = IPC_MakeHeader(0xB,1,0); // 0xB0040
cmdbuf[1] = value; cmdbuf[1] = value;
if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(iruHandle)))return ret;
ret = (Result)cmdbuf[1]; ret = (Result)cmdbuf[1];
return ret; return ret;
@ -152,89 +230,10 @@ Result IRU_GetIRLEDRecvState(u32 *out)
cmdbuf[0] = IPC_MakeHeader(0xC,0,0); // 0xC0000 cmdbuf[0] = IPC_MakeHeader(0xC,0,0); // 0xC0000
if(R_FAILED(ret = svcSendSyncRequest(iru_handle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(iruHandle)))return ret;
ret = (Result)cmdbuf[1]; ret = (Result)cmdbuf[1];
*out = cmdbuf[2]; *out = cmdbuf[2];
return ret; return ret;
} }
Result iruInit(u32 *sharedmem_addr, u32 sharedmem_size)
{
Result ret = 0;
if(AtomicPostIncrement(&iru_refcount)) return 0;
ret = srvGetServiceHandle(&iru_handle, "ir:u");
if(R_FAILED(ret))goto cleanup0;
ret = irucmd_Initialize();
if(R_FAILED(ret))goto cleanup1;
ret = svcCreateMemoryBlock(&iru_sharedmem_handle, (u32)sharedmem_addr, sharedmem_size, 1, 3);
if(R_FAILED(ret))goto cleanup2;
iru_sharedmem = sharedmem_addr;
iru_sharedmem_size = sharedmem_size;
return ret;
cleanup2:
irucmd_Shutdown();
cleanup1:
svcCloseHandle(iru_handle);
cleanup0:
AtomicDecrement(&iru_refcount);
return ret;
}
void iruExit(void)
{
if(AtomicDecrement(&iru_refcount)) return;
irucmd_Shutdown();
svcCloseHandle(iru_handle);
svcCloseHandle(iru_sharedmem_handle);
iru_handle = 0;
iru_sharedmem_handle = 0;
}
Handle iruGetServHandle(void)
{
return iru_handle;
}
Result iruSendData(u8 *buf, u32 size, bool wait)
{
Result ret = 0;
ret = irucmd_StartSendTransfer(buf, size);
if(R_FAILED(ret))return ret;
if(!wait)return 0;
return irucmd_WaitSendTransfer();
}
Result iruRecvData(u8 *buf, u32 size, u8 flag, u32 *transfercount, bool wait)
{
Result ret = 0;
*transfercount = 0;
ret = irucmd_StartRecvTransfer(size, flag);
if(R_FAILED(ret))return ret;
if(wait)
{
ret = irucmd_WaitRecvTransfer(transfercount);
if(R_FAILED(ret))return ret;
if(buf)memcpy(buf, iru_sharedmem, size);
}
return 0;
}

View File

@ -7,7 +7,7 @@
#include <3ds/result.h> #include <3ds/result.h>
#include <3ds/svc.h> #include <3ds/svc.h>
#include <3ds/srv.h> #include <3ds/srv.h>
#include <3ds/mappable.h> #include <3ds/allocator/mappable.h>
#include <3ds/synchronization.h> #include <3ds/synchronization.h>
#include <3ds/services/irrst.h> #include <3ds/services/irrst.h>
#include <3ds/ipc.h> #include <3ds/ipc.h>

View File

@ -9,27 +9,27 @@
#include <3ds/svc.h> #include <3ds/svc.h>
#include <3ds/srv.h> #include <3ds/srv.h>
#include <3ds/os.h> #include <3ds/os.h>
#include <3ds/linear.h> #include <3ds/allocator/linear.h>
#include <3ds/synchronization.h> #include <3ds/synchronization.h>
#include <3ds/services/mvd.h> #include <3ds/services/mvd.h>
#include <3ds/ipc.h> #include <3ds/ipc.h>
Handle mvdstdHandle; Handle mvdstdHandle;
static int mvdstdRefCount; static int mvdstdRefCount;
static mvdstdMode mvdstd_mode; static MVDSTD_Mode mvdstd_mode;
static mvdstdTypeInput mvdstd_input_type; static MVDSTD_InputFormat mvdstd_input_type;
static mvdstdTypeOutput mvdstd_output_type; static MVDSTD_OutputFormat mvdstd_output_type;
static u32 *mvdstd_workbuf; static u32 *mvdstd_workbuf;
static size_t mvdstd_workbufsize; static size_t mvdstd_workbufsize;
static Result mvdstdipc_Initialize(u32 *buf, u32 bufsize, Handle kprocess) static Result MVDSTD_Initialize(u32* buf, u32 bufsize)
{ {
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x1,2,2); // 0x10082 cmdbuf[0] = IPC_MakeHeader(0x1,2,2); // 0x10082
cmdbuf[1] = (u32)buf; cmdbuf[1] = (u32)buf;
cmdbuf[2] = bufsize; cmdbuf[2] = bufsize;
cmdbuf[3] = IPC_Desc_SharedHandles(1); cmdbuf[3] = IPC_Desc_SharedHandles(1);
cmdbuf[4] = kprocess; cmdbuf[4] = CUR_PROCESS_HANDLE;
Result ret=0; Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(mvdstdHandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(mvdstdHandle)))return ret;
@ -37,7 +37,7 @@ static Result mvdstdipc_Initialize(u32 *buf, u32 bufsize, Handle kprocess)
return cmdbuf[1]; return cmdbuf[1];
} }
static Result mvdstdipc_Shutdown(void) static Result MVDSTD_Shutdown(void)
{ {
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x2,0,0); // 0x20000 cmdbuf[0] = IPC_MakeHeader(0x2,0,0); // 0x20000
@ -48,7 +48,7 @@ static Result mvdstdipc_Shutdown(void)
return cmdbuf[1]; return cmdbuf[1];
} }
static Result mvdstdipc_cmd18(void) static Result MVDSTD_cmd18(void)
{ {
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x18,0,0); // 0x180000 cmdbuf[0] = IPC_MakeHeader(0x18,0,0); // 0x180000
@ -59,7 +59,7 @@ static Result mvdstdipc_cmd18(void)
return cmdbuf[1]; return cmdbuf[1];
} }
static Result mvdstdipc_cmd19(void) static Result MVDSTD_cmd19(void)
{ {
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x19,0,0); // 0x190000 cmdbuf[0] = IPC_MakeHeader(0x19,0,0); // 0x190000
@ -70,7 +70,7 @@ static Result mvdstdipc_cmd19(void)
return cmdbuf[1]; return cmdbuf[1];
} }
static Result mvdstdipc_cmd1a(void) static Result MVDSTD_cmd1a(void)
{ {
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x1A,0,0); // 0x1A0000 cmdbuf[0] = IPC_MakeHeader(0x1A,0,0); // 0x1A0000
@ -81,25 +81,80 @@ static Result mvdstdipc_cmd1a(void)
return cmdbuf[1]; return cmdbuf[1];
} }
Result mvdstdSetConfig(mvdstdConfig *config) Result MVDSTD_SetConfig(MVDSTD_Config* config)
{ {
Result ret=0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x1E,1,4); // 0x1E0044 cmdbuf[0] = IPC_MakeHeader(0x1E,1,4); // 0x1E0044
cmdbuf[1] = sizeof(mvdstdConfig); cmdbuf[1] = sizeof(MVDSTD_Config);
cmdbuf[2] = IPC_Desc_SharedHandles(1); cmdbuf[2] = IPC_Desc_SharedHandles(1);
cmdbuf[3] = CUR_PROCESS_HANDLE; cmdbuf[3] = CUR_PROCESS_HANDLE;
cmdbuf[4] = IPC_Desc_Buffer(sizeof(mvdstdConfig),IPC_BUFFER_R); cmdbuf[4] = IPC_Desc_Buffer(sizeof(MVDSTD_Config),IPC_BUFFER_R);
cmdbuf[5] = (u32)config; cmdbuf[5] = (u32)config;
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(mvdstdHandle)))return ret; if(R_FAILED(ret=svcSendSyncRequest(mvdstdHandle)))return ret;
return cmdbuf[1]; return cmdbuf[1];
} }
void mvdstdGenerateDefaultConfig(mvdstdConfig *config, u32 input_width, u32 input_height, u32 output_width, u32 output_height, u32 *vaddr_colorconv_indata, u32 *vaddr_outdata0, u32 *vaddr_outdata1_colorconv) Result mvdstdInit(MVDSTD_Mode mode, MVDSTD_InputFormat input_type, MVDSTD_OutputFormat output_type, u32 size)
{ {
memset(config, 0, sizeof(mvdstdConfig)); Result ret=0;
mvdstd_workbufsize = size;
mvdstd_mode = mode;
mvdstd_input_type = input_type;
mvdstd_output_type = output_type;
if(mvdstd_mode==MVDMODE_COLORFORMATCONV)mvdstd_workbufsize = 1;
if(mvdstd_mode!=MVDMODE_COLORFORMATCONV)return -2;//Video processing / H.264 isn't supported atm.
if (AtomicPostIncrement(&mvdstdRefCount)) return 0;
if(R_FAILED(ret=srvGetServiceHandle(&mvdstdHandle, "mvd:STD"))) goto cleanup0;
mvdstd_workbuf = linearAlloc(mvdstd_workbufsize);
if(mvdstd_workbuf==NULL) goto cleanup1;
ret = MVDSTD_Initialize((u32*) osConvertOldLINEARMemToNew((u32) mvdstd_workbuf), mvdstd_workbufsize);
if(R_FAILED(ret)) goto cleanup2;
ret = MVDSTD_cmd18();
if(R_FAILED(ret)) goto cleanup3;
return ret;
cleanup3:
MVDSTD_Shutdown();
cleanup2:
linearFree(mvdstd_workbuf);
cleanup1:
svcCloseHandle(mvdstdHandle);
cleanup0:
AtomicDecrement(&mvdstdRefCount);
return ret;
}
void mvdstdExit(void)
{
if (AtomicDecrement(&mvdstdRefCount)) return;
if(mvdstd_mode==MVDMODE_COLORFORMATCONV)
{
MVDSTD_cmd19();
}
MVDSTD_Shutdown();
svcCloseHandle(mvdstdHandle);
linearFree(mvdstd_workbuf);
}
void mvdstdGenerateDefaultConfig(MVDSTD_Config*config, u32 input_width, u32 input_height, u32 output_width, u32 output_height, u32 *vaddr_colorconv_indata, u32 *vaddr_outdata0, u32 *vaddr_outdata1_colorconv)
{
memset(config, 0, sizeof(MVDSTD_Config));
config->input_type = mvdstd_input_type; config->input_type = mvdstd_input_type;
@ -135,61 +190,7 @@ void mvdstdGenerateDefaultConfig(mvdstdConfig *config, u32 input_width, u32 inpu
config->unk_x6c[(0x114-0x6c)>>2] = 0x100; config->unk_x6c[(0x114-0x6c)>>2] = 0x100;
} }
Result mvdstdInit(mvdstdMode mode, mvdstdTypeInput input_type, mvdstdTypeOutput output_type, u32 size) Result mvdstdProcessFrame(MVDSTD_Config*config, u32 *h264_vaddr_inframe, u32 h264_inframesize, u32 h264_frameid)
{
Result ret=0;
mvdstd_workbufsize = size;
mvdstd_mode = mode;
mvdstd_input_type = input_type;
mvdstd_output_type = output_type;
if(mvdstd_mode==MVDMODE_COLORFORMATCONV)mvdstd_workbufsize = 1;
if(mvdstd_mode!=MVDMODE_COLORFORMATCONV)return -2;//Video processing / H.264 isn't supported atm.
if (AtomicPostIncrement(&mvdstdRefCount)) return 0;
if(R_FAILED(ret=srvGetServiceHandle(&mvdstdHandle, "mvd:STD"))) goto cleanup0;
mvdstd_workbuf = linearAlloc(mvdstd_workbufsize);
if(mvdstd_workbuf==NULL) goto cleanup1;
ret = mvdstdipc_Initialize((u32*)osConvertOldLINEARMemToNew((u32)mvdstd_workbuf), mvdstd_workbufsize, CUR_PROCESS_HANDLE);
if(R_FAILED(ret)) goto cleanup2;
ret = mvdstdipc_cmd18();
if(R_FAILED(ret)) goto cleanup3;
return ret;
cleanup3:
mvdstdipc_Shutdown();
cleanup2:
linearFree(mvdstd_workbuf);
cleanup1:
svcCloseHandle(mvdstdHandle);
cleanup0:
AtomicDecrement(&mvdstdRefCount);
return ret;
}
void mvdstdExit(void)
{
if (AtomicDecrement(&mvdstdRefCount)) return;
if(mvdstd_mode==MVDMODE_COLORFORMATCONV)
{
mvdstdipc_cmd19();
}
mvdstdipc_Shutdown();
svcCloseHandle(mvdstdHandle);
linearFree(mvdstd_workbuf);
}
Result mvdstdProcessFrame(mvdstdConfig *config, u32 *h264_vaddr_inframe, u32 h264_inframesize, u32 h264_frameid)
{ {
Result ret; Result ret;
@ -197,9 +198,9 @@ Result mvdstdProcessFrame(mvdstdConfig *config, u32 *h264_vaddr_inframe, u32 h26
if(config==NULL)return -1; if(config==NULL)return -1;
if(mvdstd_mode!=MVDMODE_COLORFORMATCONV)return -2; if(mvdstd_mode!=MVDMODE_COLORFORMATCONV)return -2;
ret = mvdstdSetConfig(config); ret = MVDSTD_SetConfig(config);
if(R_FAILED(ret))return ret; if(R_FAILED(ret))return ret;
return mvdstdipc_cmd1a(); return MVDSTD_cmd1a();
} }

View File

@ -37,8 +37,7 @@ Result NS_LaunchTitle(u64 titleid, u32 launch_flags, u32 *procid)
if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret;
if(procid != NULL) if(procid != NULL) *procid = cmdbuf[2];
*procid = cmdbuf[2];
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
@ -59,4 +58,4 @@ Result NS_RebootToTitle(u8 mediatype, u64 titleid)
if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(nsHandle)))return ret;
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }

View File

@ -25,7 +25,7 @@ void psExit(void)
svcCloseHandle(psHandle); svcCloseHandle(psHandle);
} }
Result PS_EncryptDecryptAes(u32 size, u8* in, u8* out, u32 aes_algo, u32 key_type, u8* iv) Result PS_EncryptDecryptAes(u32 size, u8* in, u8* out, PS_AESAlgorithm aes_algo, PS_AESKeyType key_type, u8* iv)
{ {
Result ret = 0; Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();
@ -47,15 +47,15 @@ Result PS_EncryptDecryptAes(u32 size, u8* in, u8* out, u32 aes_algo, u32 key_typ
if(R_FAILED(ret = svcSendSyncRequest(psHandle)))return ret; if(R_FAILED(ret = svcSendSyncRequest(psHandle)))return ret;
_iv[0] = cmdbuf[2]; _iv[0] = cmdbuf[2] & 0xFF;
_iv[1] = cmdbuf[3]; _iv[1] = cmdbuf[3] & 0xFF;
_iv[2] = cmdbuf[4]; _iv[2] = cmdbuf[4] & 0xFF;
_iv[3] = cmdbuf[5]; _iv[3] = cmdbuf[5] & 0xFF;
return (Result)cmdbuf[1]; return (Result)cmdbuf[1];
} }
Result PS_EncryptSignDecryptVerifyAesCcm(u8* in, u32 in_size, u8* out, u32 out_size, u32 data_len, u32 mac_data_len, u32 mac_len, u32 aes_algo, u32 key_type, u8* nonce) Result PS_EncryptSignDecryptVerifyAesCcm(u8* in, u32 in_size, u8* out, u32 out_size, u32 data_len, u32 mac_data_len, u32 mac_len, PS_AESAlgorithm aes_algo, PS_AESKeyType key_type, u8* nonce)
{ {
Result ret = 0; Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();

View File

@ -1,122 +0,0 @@
#include <stdlib.h>
#include <3ds/types.h>
#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
#include <3ds/synchronization.h>
#include <3ds/services/ptm.h>
#include <3ds/ipc.h>
static Handle ptmHandle, ptmSysmHandle;
static int ptmRefCount, ptmSysmRefCount;
Result ptmInit(void)
{
if (AtomicPostIncrement(&ptmRefCount)) return 0;
Result res = srvGetServiceHandle(&ptmHandle, "ptm:u");
if (R_FAILED(res)) AtomicDecrement(&ptmRefCount);
return res;
}
void ptmExit(void)
{
if (AtomicDecrement(&ptmRefCount)) return;
svcCloseHandle(ptmHandle);
}
Result ptmSysmInit(void)
{
if (AtomicPostIncrement(&ptmSysmRefCount)) return 0;
Result res = srvGetServiceHandle(&ptmSysmHandle, "ptm:sysm");
if (R_FAILED(res)) AtomicDecrement(&ptmSysmRefCount);
return res;
}
void ptmSysmExit(void)
{
if (AtomicDecrement(&ptmSysmRefCount)) return;
svcCloseHandle(ptmSysmHandle);
}
Result PTMU_GetShellState(u8 *out)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000
if(R_FAILED(ret = svcSendSyncRequest(ptmHandle)))return ret;
*out = (u8)cmdbuf[2];
return (Result)cmdbuf[1];
}
Result PTMU_GetBatteryLevel(u8 *out)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x7,0,0); // 0x70000
if(R_FAILED(ret = svcSendSyncRequest(ptmHandle)))return ret;
*out = (u8)cmdbuf[2];
return (Result)cmdbuf[1];
}
Result PTMU_GetBatteryChargeState(u8 *out)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x8,0,0); // 0x80000
if(R_FAILED(ret = svcSendSyncRequest(ptmHandle)))return ret;
*out = (u8)cmdbuf[2];
return (Result)cmdbuf[1];
}
Result PTMU_GetPedometerState(u8 *out)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x9,0,0); // 0x90000
if(R_FAILED(ret = svcSendSyncRequest(ptmHandle)))return ret;
*out = (u8)cmdbuf[2];
return (Result)cmdbuf[1];
}
Result PTMU_GetTotalStepCount(u32 *steps)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0xC,0,0); // 0xC0000
if(R_FAILED(ret = svcSendSyncRequest(ptmHandle)))return ret;
*steps = cmdbuf[2];
return (Result)cmdbuf[1];
}
Result PTMSYSM_ConfigureNew3DSCPU(u8 value)
{
Result ret;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x818,1,0); // 0x08180040
cmdbuf[1] = value;
if(R_FAILED(ret = svcSendSyncRequest(ptmSysmHandle)))return ret;
return (Result)cmdbuf[1];
}

View File

@ -0,0 +1,39 @@
#include <stdlib.h>
#include <3ds/types.h>
#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
#include <3ds/synchronization.h>
#include <3ds/services/ptmsysm.h>
#include <3ds/ipc.h>
static Handle ptmSysmHandle;
static int ptmSysmRefCount;
Result ptmSysmInit(void)
{
if (AtomicPostIncrement(&ptmSysmRefCount)) return 0;
Result res = srvGetServiceHandle(&ptmSysmHandle, "ptm:sysm");
if (R_FAILED(res)) AtomicDecrement(&ptmSysmRefCount);
return res;
}
void ptmSysmExit(void)
{
if (AtomicDecrement(&ptmSysmRefCount)) return;
svcCloseHandle(ptmSysmHandle);
}
Result PTMSYSM_ConfigureNew3DSCPU(u8 value)
{
Result ret;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x818,1,0); // 0x08180040
cmdbuf[1] = value;
if(R_FAILED(ret = svcSendSyncRequest(ptmSysmHandle)))return ret;
return (Result)cmdbuf[1];
}

View File

@ -0,0 +1,96 @@
#include <stdlib.h>
#include <3ds/types.h>
#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
#include <3ds/synchronization.h>
#include <3ds/services/ptmu.h>
#include <3ds/ipc.h>
static Handle ptmuHandle;
static int ptmuRefCount;
Result ptmuInit(void)
{
if (AtomicPostIncrement(&ptmuRefCount)) return 0;
Result res = srvGetServiceHandle(&ptmuHandle, "ptm:u");
if (R_FAILED(res)) AtomicDecrement(&ptmuRefCount);
return res;
}
void ptmuExit(void)
{
if (AtomicDecrement(&ptmuRefCount)) return;
svcCloseHandle(ptmuHandle);
}
Result PTMU_GetShellState(u8 *out)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x6,0,0); // 0x60000
if(R_FAILED(ret = svcSendSyncRequest(ptmuHandle)))return ret;
*out = (u8)cmdbuf[2] & 0xFF;
return (Result)cmdbuf[1];
}
Result PTMU_GetBatteryLevel(u8 *out)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x7,0,0); // 0x70000
if(R_FAILED(ret = svcSendSyncRequest(ptmuHandle)))return ret;
*out = (u8)cmdbuf[2] & 0xFF;
return (Result)cmdbuf[1];
}
Result PTMU_GetBatteryChargeState(u8 *out)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x8,0,0); // 0x80000
if(R_FAILED(ret = svcSendSyncRequest(ptmuHandle)))return ret;
*out = (u8)cmdbuf[2] & 0xFF;
return (Result)cmdbuf[1];
}
Result PTMU_GetPedometerState(u8 *out)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x9,0,0); // 0x90000
if(R_FAILED(ret = svcSendSyncRequest(ptmuHandle)))return ret;
*out = (u8)cmdbuf[2] & 0xFF;
return (Result)cmdbuf[1];
}
Result PTMU_GetTotalStepCount(u32 *steps)
{
Result ret=0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0xC,0,0); // 0xC0000
if(R_FAILED(ret = svcSendSyncRequest(ptmuHandle)))return ret;
*steps = cmdbuf[2];
return (Result)cmdbuf[1];
}

View File

@ -1,6 +1,3 @@
/*
qtm.c - New3DS head-tracking
*/
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>
#include <3ds/types.h> #include <3ds/types.h>
@ -38,28 +35,7 @@ bool qtmCheckInitialized(void)
return qtmRefCount>0; return qtmRefCount>0;
} }
Result qtmGetHeadtrackingInfo(u64 val, qtmHeadtrackingInfo *out) bool qtmCheckHeadFullyDetected(QTM_HeadTrackingInfo *info)
{
u32* cmdbuf=getThreadCommandBuffer();
if(!qtmCheckInitialized())return -1;
cmdbuf[0]=IPC_MakeHeader(0x2,2,0); // 0x20080
cmdbuf[1] = val&0xFFFFFFFF;
cmdbuf[2] = val>>32;
Result ret=0;
if(R_FAILED(ret=svcSendSyncRequest(qtmHandle)))return ret;
ret = (Result)cmdbuf[1];
if(R_FAILED(ret))return ret;
if(out)memcpy(out, &cmdbuf[2], sizeof(qtmHeadtrackingInfo));
return 0;
}
bool qtmCheckHeadFullyDetected(qtmHeadtrackingInfo *info)
{ {
if(info==NULL)return false; if(info==NULL)return false;
@ -67,7 +43,7 @@ bool qtmCheckHeadFullyDetected(qtmHeadtrackingInfo *info)
return false; return false;
} }
Result qtmConvertCoordToScreen(qtmHeadtrackingInfoCoord *coord, float *screen_width, float *screen_height, u32 *x, u32 *y) Result qtmConvertCoordToScreen(QTM_HeadTrackingInfoCoord *coord, float *screen_width, float *screen_height, u32 *x, u32 *y)
{ {
float width = 200.0f; float width = 200.0f;
float height = 160.0f; float height = 160.0f;
@ -86,3 +62,21 @@ Result qtmConvertCoordToScreen(qtmHeadtrackingInfoCoord *coord, float *screen_wi
return 0; return 0;
} }
Result QTM_GetHeadTrackingInfo(u64 val, QTM_HeadTrackingInfo* out)
{
if(!qtmCheckInitialized())return -1;
Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x2,2,0); // 0x20080
cmdbuf[1] = val&0xFFFFFFFF;
cmdbuf[2] = val>>32;
if(R_FAILED(ret=svcSendSyncRequest(qtmHandle)))return ret;
if(out) memcpy(out, &cmdbuf[2], sizeof(QTM_HeadTrackingInfo));
return cmdbuf[1];
}

View File

@ -38,8 +38,7 @@ soc_devoptab =
.fchmod_r = NULL, .fchmod_r = NULL,
}; };
static Result SOCU_Initialize(Handle memhandle, u32 memsize)
static Result socu_cmd1(Handle memhandle, u32 memsize)
{ {
Result ret = 0; Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer(); u32 *cmdbuf = getThreadCommandBuffer();
@ -59,7 +58,23 @@ static Result socu_cmd1(Handle memhandle, u32 memsize)
return cmdbuf[1]; return cmdbuf[1];
} }
Result SOC_Initialize(u32 *context_addr, u32 context_size) static Result SOCU_Shutdown(void)
{
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x19,0,0); // 0x190000
ret = svcSendSyncRequest(SOCU_handle);
if(ret != 0) {
errno = SYNC_ERROR;
return ret;
}
return cmdbuf[1];
}
Result socInit(u32* context_addr, u32 context_size)
{ {
Result ret = 0; Result ret = 0;
@ -79,7 +94,7 @@ Result SOC_Initialize(u32 *context_addr, u32 context_size)
return ret; return ret;
} }
ret = socu_cmd1(socMemhandle, context_size); ret = SOCU_Initialize(socMemhandle, context_size);
if(ret != 0) if(ret != 0)
{ {
svcCloseHandle(socMemhandle); svcCloseHandle(socMemhandle);
@ -103,18 +118,15 @@ Result SOC_Initialize(u32 *context_addr, u32 context_size)
return 0; return 0;
} }
Result SOC_Shutdown(void) Result socExit(void)
{ {
Result ret = 0; Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
int dev; int dev;
svcCloseHandle(socMemhandle); svcCloseHandle(socMemhandle);
socMemhandle = 0; socMemhandle = 0;
cmdbuf[0] = IPC_MakeHeader(0x19,0,0); // 0x190000 ret = SOCU_Shutdown();
ret = svcSendSyncRequest(SOCU_handle);
svcCloseHandle(SOCU_handle); svcCloseHandle(SOCU_handle);
SOCU_handle = 0; SOCU_handle = 0;
@ -123,8 +135,7 @@ Result SOC_Shutdown(void)
if(dev >= 0) if(dev >= 0)
RemoveDevice("soc:"); RemoveDevice("soc:");
if(ret)return ret; return ret;
else return cmdbuf[1];
} }
static int static int

View File

@ -0,0 +1,83 @@
#include <stdlib.h>
#include <3ds/types.h>
#include <3ds/result.h>
#include <3ds/svc.h>
#include <3ds/srv.h>
#include <3ds/synchronization.h>
#include <3ds/services/srvpm.h>
#include <3ds/ipc.h>
static Handle srvPmHandle;
static int srvPmRefCount;
Result srvPmInit(void)
{
if (AtomicPostIncrement(&srvPmRefCount)) return 0;
Result res = srvGetServiceHandle(&srvPmHandle, "srv:pm");
if (R_FAILED(res)) AtomicDecrement(&srvPmRefCount);
return res;
}
void srvPmExit(void)
{
if (AtomicDecrement(&srvPmRefCount)) return;
svcCloseHandle(srvPmHandle);
}
Result SRVPM_PublishToProcess(u32 notificationId, Handle process)
{
Result rc = 0;
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x1,1,2); // 0x10042
cmdbuf[1] = notificationId;
cmdbuf[2] = IPC_Desc_SharedHandles(1);
cmdbuf[3] = process;
if(R_FAILED(rc = svcSendSyncRequest(srvPmHandle)))return rc;
return cmdbuf[1];
}
Result SRVPM_PublishToAll(u32 notificationId)
{
Result rc = 0;
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x2,1,0); // 0x20040
cmdbuf[1] = notificationId;
if(R_FAILED(rc = svcSendSyncRequest(srvPmHandle)))return rc;
return cmdbuf[1];
}
Result SRVPM_RegisterProcess(u32 procid, u32 count, void* serviceaccesscontrol)
{
Result rc = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x3,2,2); // 0x30082
cmdbuf[1] = procid;
cmdbuf[2] = count;
cmdbuf[3] = IPC_Desc_StaticBuffer(count*4,0);
cmdbuf[4] = (u32)serviceaccesscontrol;
if(R_FAILED(rc = svcSendSyncRequest(srvPmHandle))) return rc;
return cmdbuf[1];
}
Result SRVPM_UnregisterProcess(u32 procid)
{
Result rc = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x4,1,0); // 0x40040
cmdbuf[1] = procid;
if(R_FAILED(rc = svcSendSyncRequest(srvPmHandle))) return rc;
return cmdbuf[1];
}

View File

@ -34,7 +34,7 @@ void y2rExit(void)
svcCloseHandle(y2rHandle); svcCloseHandle(y2rHandle);
} }
Result Y2RU_SetInputFormat(Y2R_InputFormat format) Result Y2RU_SetInputFormat(Y2RU_InputFormat format)
{ {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
@ -45,7 +45,7 @@ Result Y2RU_SetInputFormat(Y2R_InputFormat format)
return cmdbuf[1]; return cmdbuf[1];
} }
Result Y2RU_GetInputFormat(Y2R_InputFormat* format) Result Y2RU_GetInputFormat(Y2RU_InputFormat* format)
{ {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
@ -56,7 +56,7 @@ Result Y2RU_GetInputFormat(Y2R_InputFormat* format)
return cmdbuf[1]; return cmdbuf[1];
} }
Result Y2RU_SetOutputFormat(Y2R_OutputFormat format) Result Y2RU_SetOutputFormat(Y2RU_OutputFormat format)
{ {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
@ -67,7 +67,7 @@ Result Y2RU_SetOutputFormat(Y2R_OutputFormat format)
return cmdbuf[1]; return cmdbuf[1];
} }
Result Y2RU_GetOutputFormat(Y2R_OutputFormat* format) Result Y2RU_GetOutputFormat(Y2RU_OutputFormat* format)
{ {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
@ -78,7 +78,7 @@ Result Y2RU_GetOutputFormat(Y2R_OutputFormat* format)
return cmdbuf[1]; return cmdbuf[1];
} }
Result Y2RU_SetRotation(Y2R_Rotation rotation) Result Y2RU_SetRotation(Y2RU_Rotation rotation)
{ {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
@ -89,7 +89,7 @@ Result Y2RU_SetRotation(Y2R_Rotation rotation)
return cmdbuf[1]; return cmdbuf[1];
} }
Result Y2RU_GetRotation(Y2R_Rotation* rotation) Result Y2RU_GetRotation(Y2RU_Rotation* rotation)
{ {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
@ -100,7 +100,7 @@ Result Y2RU_GetRotation(Y2R_Rotation* rotation)
return cmdbuf[1]; return cmdbuf[1];
} }
Result Y2RU_SetBlockAlignment(Y2R_BlockAlignment alignment) Result Y2RU_SetBlockAlignment(Y2RU_BlockAlignment alignment)
{ {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
@ -111,7 +111,7 @@ Result Y2RU_SetBlockAlignment(Y2R_BlockAlignment alignment)
return cmdbuf[1]; return cmdbuf[1];
} }
Result Y2RU_GetBlockAlignment(Y2R_BlockAlignment* alignment) Result Y2RU_GetBlockAlignment(Y2RU_BlockAlignment* alignment)
{ {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
@ -385,29 +385,29 @@ Result Y2RU_GetInputLines(u16* num_lines)
return cmdbuf[1]; return cmdbuf[1];
} }
Result Y2RU_SetCoefficients(const Y2R_ColorCoefficients* coefficients) Result Y2RU_SetCoefficients(const Y2RU_ColorCoefficients* coefficients)
{ {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x1E,4,0); // 0x1E0100 cmdbuf[0] = IPC_MakeHeader(0x1E,4,0); // 0x1E0100
memcpy(&cmdbuf[1], coefficients, sizeof(Y2R_ColorCoefficients)); memcpy(&cmdbuf[1], coefficients, sizeof(Y2RU_ColorCoefficients));
if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1]; return cmdbuf[1];
} }
Result Y2RU_GetCoefficients(Y2R_ColorCoefficients* coefficients) Result Y2RU_GetCoefficients(Y2RU_ColorCoefficients* coefficients)
{ {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x1F,0,0); // 0x1F0000 cmdbuf[0] = IPC_MakeHeader(0x1F,0,0); // 0x1F0000
if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
memcpy(coefficients,cmdbuf + 2, sizeof(Y2R_ColorCoefficients)); memcpy(coefficients,cmdbuf + 2, sizeof(Y2RU_ColorCoefficients));
return cmdbuf[1]; return cmdbuf[1];
} }
Result Y2RU_SetStandardCoefficient(Y2R_StandardCoefficient coefficient) Result Y2RU_SetStandardCoefficient(Y2RU_StandardCoefficient coefficient)
{ {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
@ -418,7 +418,7 @@ Result Y2RU_SetStandardCoefficient(Y2R_StandardCoefficient coefficient)
return cmdbuf[1]; return cmdbuf[1];
} }
Result Y2RU_GetStandardCoefficient(Y2R_ColorCoefficients* coefficients, Y2R_StandardCoefficient standardCoeff) Result Y2RU_GetStandardCoefficient(Y2RU_ColorCoefficients* coefficients, Y2RU_StandardCoefficient standardCoeff)
{ {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
@ -426,7 +426,7 @@ Result Y2RU_GetStandardCoefficient(Y2R_ColorCoefficients* coefficients, Y2R_Stan
cmdbuf[1] = standardCoeff; cmdbuf[1] = standardCoeff;
if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
memcpy(coefficients,cmdbuf + 2, sizeof(Y2R_ColorCoefficients)); memcpy(coefficients,cmdbuf + 2, sizeof(Y2RU_ColorCoefficients));
return cmdbuf[1]; return cmdbuf[1];
} }
@ -453,25 +453,25 @@ Result Y2RU_GetAlpha(u16* alpha)
} }
Result Y2RU_SetDitheringWeightParams(const Y2R_DitheringWeightParams* params) Result Y2RU_SetDitheringWeightParams(const Y2RU_DitheringWeightParams* params)
{ {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x24,8,0); // 0x240200 cmdbuf[0] = IPC_MakeHeader(0x24,8,0); // 0x240200
memcpy(&cmdbuf[1], params, sizeof(Y2R_DitheringWeightParams)); memcpy(&cmdbuf[1], params, sizeof(Y2RU_DitheringWeightParams));
if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1]; return cmdbuf[1];
} }
Result Y2RU_GetDitheringWeightParams(Y2R_DitheringWeightParams* params) Result Y2RU_GetDitheringWeightParams(Y2RU_DitheringWeightParams* params)
{ {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x25,0,0); // 0x250000 cmdbuf[0] = IPC_MakeHeader(0x25,0,0); // 0x250000
if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
memcpy(params,cmdbuf+2, sizeof(Y2R_DitheringWeightParams)); memcpy(params,cmdbuf+2, sizeof(Y2RU_DitheringWeightParams));
return cmdbuf[1]; return cmdbuf[1];
} }
@ -506,12 +506,12 @@ Result Y2RU_IsBusyConversion(bool* is_busy)
return cmdbuf[1]; return cmdbuf[1];
} }
Result Y2RU_SetConversionParams(const Y2R_ConversionParams* params) Result Y2RU_SetConversionParams(const Y2RU_ConversionParams* params)
{ {
Result ret = 0; Result ret = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x29,7,0); // 0x2901C0 cmdbuf[0] = IPC_MakeHeader(0x29,7,0); // 0x2901C0
memcpy(&cmdbuf[1], params, sizeof(Y2R_ConversionParams)); memcpy(&cmdbuf[1], params, sizeof(Y2RU_ConversionParams));
if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret; if (R_FAILED(ret = svcSendSyncRequest(y2rHandle))) return ret;
return cmdbuf[1]; return cmdbuf[1];

View File

@ -32,9 +32,6 @@ typedef struct {
extern service_list_t* __service_ptr; extern service_list_t* __service_ptr;
static Handle g_srv_handle;
static int __name_cmp(const char* a, const char* b) { static int __name_cmp(const char* a, const char* b) {
u32 i; u32 i;
@ -74,18 +71,19 @@ void __destroy_handle_list(void) {
__service_ptr->num = 0; __service_ptr->num = 0;
} }
static Handle srvHandle;
Result srvInit(void) Result srvInit(void)
{ {
Result rc = 0; Result rc = 0;
if(g_srv_handle != 0) return rc; if(srvHandle != 0) return rc;
if(R_FAILED(rc = svcConnectToPort(&g_srv_handle, "srv:")))return rc; if(R_FAILED(rc = svcConnectToPort(&srvHandle, "srv:pm"))) return rc;
if(R_FAILED(rc = srvRegisterClient())) { if(R_FAILED(rc = srvRegisterClient())) {
svcCloseHandle(g_srv_handle); svcCloseHandle(srvHandle);
g_srv_handle = 0; srvHandle = 0;
} }
return rc; return rc;
@ -93,45 +91,15 @@ Result srvInit(void)
Result srvExit(void) Result srvExit(void)
{ {
if(g_srv_handle != 0)svcCloseHandle(g_srv_handle); if(srvHandle != 0) svcCloseHandle(srvHandle);
g_srv_handle = 0; srvHandle = 0;
return 0; return 0;
} }
Handle *srvGetSessionHandle(void) Handle *srvGetSessionHandle(void)
{ {
return &g_srv_handle; return &srvHandle;
}
Result srvRegisterClient(void)
{
Result rc = 0;
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x1,0,2); // 0x10002
cmdbuf[1] = IPC_Desc_CurProcessHandle();
if(R_FAILED(rc = svcSendSyncRequest(g_srv_handle)))return rc;
return cmdbuf[1];
}
Result srvGetServiceHandleDirect(Handle* out, const char* name)
{
Result rc = 0;
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x5,4,0); // 0x50100
strncpy((char*) &cmdbuf[1], name,8);
cmdbuf[3] = strlen(name);
cmdbuf[4] = 0x0;
if(R_FAILED(rc = svcSendSyncRequest(g_srv_handle)))return rc;
*out = cmdbuf[3];
return cmdbuf[1];
} }
Result srvGetServiceHandle(Handle* out, const char* name) Result srvGetServiceHandle(Handle* out, const char* name)
@ -148,76 +116,210 @@ Result srvGetServiceHandle(Handle* out, const char* name)
return srvGetServiceHandleDirect(out, name); return srvGetServiceHandleDirect(out, name);
} }
Result srvRegisterClient(void)
{
Result rc = 0;
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x1,0,2); // 0x10002
cmdbuf[1] = IPC_Desc_CurProcessHandle();
if(R_FAILED(rc = svcSendSyncRequest(srvHandle)))return rc;
return cmdbuf[1];
}
Result srvEnableNotification(Handle* semaphoreOut)
{
Result rc = 0;
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x2,0,0);
if(R_FAILED(rc = svcSendSyncRequest(srvHandle)))return rc;
if(semaphoreOut) *semaphoreOut = cmdbuf[3];
return cmdbuf[1];
}
Result srvRegisterService(Handle* out, const char* name, int maxSessions) Result srvRegisterService(Handle* out, const char* name, int maxSessions)
{ {
Result rc = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x3,4,0); // 0x30100 cmdbuf[0] = IPC_MakeHeader(0x3,4,0); // 0x30100
strncpy((char*) &cmdbuf[1], name,8); strncpy((char*) &cmdbuf[1], name,8);
cmdbuf[3] = strlen(name); cmdbuf[3] = strlen(name);
cmdbuf[4] = maxSessions; cmdbuf[4] = maxSessions;
Result rc;
if(R_FAILED(rc = svcSendSyncRequest(g_srv_handle)))return rc;
*out = cmdbuf[3]; if(R_FAILED(rc = svcSendSyncRequest(srvHandle)))return rc;
if(out) *out = cmdbuf[3];
return cmdbuf[1]; return cmdbuf[1];
} }
Result srvUnregisterService(const char* name) Result srvUnregisterService(const char* name)
{ {
Result rc = 0;
u32* cmdbuf = getThreadCommandBuffer(); u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x4,3,0); // 0x400C0 cmdbuf[0] = IPC_MakeHeader(0x4,3,0); // 0x400C0
strncpy((char*) &cmdbuf[1], name,8); strncpy((char*) &cmdbuf[1], name,8);
cmdbuf[3] = strlen(name); cmdbuf[3] = strlen(name);
Result rc; if(R_FAILED(rc = svcSendSyncRequest(srvHandle)))return rc;
if(R_FAILED(rc = svcSendSyncRequest(g_srv_handle)))return rc;
return cmdbuf[1]; return cmdbuf[1];
} }
// Old srv:pm interface, will only work on systems where srv:pm was a port (<7.X) Result srvGetServiceHandleDirect(Handle* out, const char* name)
Result srvPmInit(void)
{
Result rc = 0;
if(R_FAILED(rc = svcConnectToPort(&g_srv_handle, "srv:pm")))return rc;
if(R_FAILED(rc = srvRegisterClient())) {
svcCloseHandle(g_srv_handle);
g_srv_handle = 0;
}
return rc;
}
Result srvRegisterProcess(u32 procid, u32 count, void *serviceaccesscontrol)
{ {
Result rc = 0; Result rc = 0;
u32* cmdbuf = getThreadCommandBuffer();
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x5,4,0); // 0x50100
strncpy((char*) &cmdbuf[1], name,8);
cmdbuf[3] = strlen(name);
cmdbuf[4] = 0x0;
if(R_FAILED(rc = svcSendSyncRequest(srvHandle)))return rc;
if(out) *out = cmdbuf[3];
cmdbuf[0] = IPC_MakeHeader(0x403,2,2); // 0x4030082 // <7.x
cmdbuf[1] = procid;
cmdbuf[2] = count;
cmdbuf[3] = IPC_Desc_StaticBuffer(count*4,0);
cmdbuf[4] = (u32)serviceaccesscontrol;
if(R_FAILED(rc = svcSendSyncRequest(g_srv_handle))) return rc;
return cmdbuf[1]; return cmdbuf[1];
} }
Result srvUnregisterProcess(u32 procid) Result srvRegisterPort(const char* name, Handle clientHandle)
{ {
Result rc = 0; Result rc = 0;
u32* cmdbuf = getThreadCommandBuffer();
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x6,3,2); // 0x600C2
strncpy((char*) &cmdbuf[1], name,8);
cmdbuf[3] = strlen(name);
cmdbuf[4] = IPC_Desc_SharedHandles(0);
cmdbuf[5] = clientHandle;
if(R_FAILED(rc = svcSendSyncRequest(srvHandle)))return rc;
return cmdbuf[1];
}
Result srvUnregisterPort(const char* name)
{
Result rc = 0;
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x7,3,0); // 0x700C0
strncpy((char*) &cmdbuf[1], name,8);
cmdbuf[3] = strlen(name);
if(R_FAILED(rc = svcSendSyncRequest(srvHandle)))return rc;
return cmdbuf[1];
}
Result srvGetPort(Handle* out, const char* name)
{
Result rc = 0;
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x8,4,0); // 0x80100
strncpy((char*) &cmdbuf[1], name,8);
cmdbuf[3] = strlen(name);
cmdbuf[4] = 0x0;
if(R_FAILED(rc = svcSendSyncRequest(srvHandle)))return rc;
if(out) *out = cmdbuf[3];
return cmdbuf[1];
}
Result srvSubscribe(u32 notificationId)
{
Result rc = 0;
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0x9,1,0); // 0x90040
cmdbuf[1] = notificationId;
if(R_FAILED(rc = svcSendSyncRequest(srvHandle)))return rc;
return cmdbuf[1];
}
Result srvUnsubscribe(u32 notificationId)
{
Result rc = 0;
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0xA,1,0); // 0xA0040
cmdbuf[1] = notificationId;
if(R_FAILED(rc = svcSendSyncRequest(srvHandle)))return rc;
return cmdbuf[1];
}
Result srvReceiveNotification(u32* notificationIdOut)
{
Result rc = 0;
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0xB,0,0); // 0xB0000
if(R_FAILED(rc = svcSendSyncRequest(srvHandle)))return rc;
if(notificationIdOut) *notificationIdOut = cmdbuf[2];
return cmdbuf[1];
}
Result srvPublishToSubscriber(u32 notificationId, u32 flags)
{
Result rc = 0;
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0xC,2,0); // 0xC0080
cmdbuf[1] = notificationId;
cmdbuf[2] = flags;
if(R_FAILED(rc = svcSendSyncRequest(srvHandle)))return rc;
return cmdbuf[1];
}
Result srvPublishAndGetSubscriber(u32* processIdCountOut, u32* processIdsOut, u32 notificationId)
{
Result rc = 0;
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0xD,1,0); // 0xD0040
cmdbuf[1] = notificationId;
if(R_FAILED(rc = svcSendSyncRequest(srvHandle)))return rc;
if(processIdCountOut) *processIdCountOut = cmdbuf[2];
if(processIdsOut) memcpy(processIdsOut, &cmdbuf[3], cmdbuf[2] * sizeof(u32));
return cmdbuf[1];
}
Result srvIsServiceRegistered(bool* registeredOut, const char* name)
{
Result rc = 0;
u32* cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = IPC_MakeHeader(0xE,3,0); // 0xE00C0
strncpy((char*) &cmdbuf[1], name,8);
cmdbuf[3] = strlen(name);
if(R_FAILED(rc = svcSendSyncRequest(srvHandle)))return rc;
if(registeredOut) *registeredOut = cmdbuf[2] & 0xFF;
cmdbuf[0] = IPC_MakeHeader(0x404,1,0); // 0x4040040 // <7.x
cmdbuf[1] = procid;
if(R_FAILED(rc = svcSendSyncRequest(g_srv_handle))) return rc;
return cmdbuf[1]; return cmdbuf[1];
} }