libctru/libctru/source/services/ir.c
2014-08-26 23:18:14 +02:00

232 lines
3.9 KiB
C

#include <stdlib.h>
#include <string.h>
#include <3ds.h>
static Handle iru_handle=0;
static Handle iru_sharedmem_handle=0;
static u32 *iru_sharedmem = NULL;
static u32 iru_sharedmem_size = 0;
Result irucmd_Initialize()
{
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00010000;
if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
ret = (Result)cmdbuf[1];
return ret;
}
Result irucmd_Shutdown()
{
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00020000;
if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
ret = (Result)cmdbuf[1];
return ret;
}
Result irucmd_StartSendTransfer(u8 *buf, u32 size)
{
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00030042;
cmdbuf[1] = size;
cmdbuf[2] = (size<<4) | 10;
cmdbuf[3] = (u32)buf;
if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
ret = (Result)cmdbuf[1];
return ret;
}
Result irucmd_WaitSendTransfer()
{
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00040000;
if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
ret = (Result)cmdbuf[1];
return ret;
}
Result irucmd_StartRecvTransfer(u32 size, u8 flag)
{
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x000500C2;
cmdbuf[1] = iru_sharedmem_size;
cmdbuf[2] = size;
cmdbuf[3] = (u8)flag;
cmdbuf[4] = 0;
cmdbuf[5] = iru_sharedmem_handle;
if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
ret = (Result)cmdbuf[1];
return ret;
}
Result irucmd_WaitRecvTransfer(u32 *transfercount)
{
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00060000;
if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
ret = (Result)cmdbuf[1];
*transfercount = cmdbuf[2];
return ret;
}
Result IRU_SetBitRate(u8 value)
{
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x00090040;
cmdbuf[1] = (u32)value;
if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
ret = (Result)cmdbuf[1];
return ret;
}
Result IRU_GetBitRate(u8 *out)
{
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x000A0000;
if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
ret = (Result)cmdbuf[1];
*out = (u8)cmdbuf[2];
return ret;
}
Result IRU_SetIRLEDState(u32 value)
{
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x000B0040;
cmdbuf[1] = value;
if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
ret = (Result)cmdbuf[1];
return ret;
}
Result IRU_GetIRLEDRecvState(u32 *out)
{
Result ret = 0;
u32 *cmdbuf = getThreadCommandBuffer();
cmdbuf[0] = 0x000C0000;
if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
ret = (Result)cmdbuf[1];
*out = cmdbuf[2];
return ret;
}
Result IRU_Initialize(u32 *sharedmem_addr, u32 sharedmem_size)
{
Result ret = 0;
if(iru_handle)return 0;
ret = srvGetServiceHandle(&iru_handle, "ir:u");
if(ret!=0)return ret;
ret = irucmd_Initialize();
if(ret!=0)return ret;
ret = svcCreateMemoryBlock(&iru_sharedmem_handle, (u32)sharedmem_addr, sharedmem_size, 1, 3);
if(ret!=0)return ret;
iru_sharedmem = sharedmem_addr;
iru_sharedmem_size = sharedmem_size;
return ret;
}
Result IRU_Shutdown()
{
Result ret = 0;
if(iru_handle==0)return 0;
ret = irucmd_Shutdown();
if(ret!=0)return ret;
svcCloseHandle(iru_handle);
svcCloseHandle(iru_sharedmem_handle);
iru_handle = 0;
iru_sharedmem_handle = 0;
return 0;
}
Handle IRU_GetServHandle()
{
return iru_handle;
}
Result IRU_SendData(u8 *buf, u32 size, u32 wait)
{
Result ret = 0;
ret = irucmd_StartSendTransfer(buf, size);
if(ret!=0)return ret;
if(wait==0)return 0;
return irucmd_WaitSendTransfer();
}
Result IRU_RecvData(u8 *buf, u32 size, u8 flag, u32 *transfercount, u32 wait)
{
Result ret = 0;
*transfercount = 0;
ret = irucmd_StartRecvTransfer(size, flag);
if(ret!=0)return ret;
if(wait)
{
ret = irucmd_WaitRecvTransfer(transfercount);
if(ret!=0)return ret;
if(buf)memcpy(buf, iru_sharedmem, size);
}
return 0;
}