diff --git a/libctru/include/ctr/AC.h b/libctru/include/ctr/AC.h new file mode 100644 index 0000000..dd3e78a --- /dev/null +++ b/libctru/include/ctr/AC.h @@ -0,0 +1,8 @@ +#ifndef AC_H +#define AC_H + +Result ACU_GetWifiStatus(Handle servhandle, u32 *out); +Result ACU_WaitInternetConnection(); + +#endif + diff --git a/libctru/source/AC.c b/libctru/source/AC.c new file mode 100644 index 0000000..87242ea --- /dev/null +++ b/libctru/source/AC.c @@ -0,0 +1,87 @@ +#include +#include +#include +#include + +#include +#include +#include + +Result ACU_cmd1(Handle servhandle, u32 *ptr)//Unknown what this cmd does at the time of writing. (ptr=0x200-byte outbuf) +{ + u32 tmp0, tmp1; + Result ret=0; + u32 *cmdbuf = getThreadCommandBuffer(); + + tmp0 = cmdbuf[0x100>>2]; + tmp1 = cmdbuf[0x104>>2]; + + cmdbuf[0] = 0x00010000; + cmdbuf[0x100>>2] = 0x00800002; + cmdbuf[0x104>>2] = (u32)ptr; + + if((ret = svc_sendSyncRequest(servhandle))!=0)return ret; + + cmdbuf[0x100>>2] = tmp0; + cmdbuf[0x104>>2] = tmp1; + + return (Result)cmdbuf[1]; +} + +Result ACU_cmd26(Handle servhandle, u32 *ptr, u8 val)//Unknown what this cmd does at the time of writing. (ptr=0x200-byte inbuf/outbuf) +{ + u32 tmp0, tmp1; + Result ret=0; + u32 *cmdbuf = getThreadCommandBuffer(); + + tmp0 = cmdbuf[0x100>>2]; + tmp1 = cmdbuf[0x104>>2]; + + cmdbuf[0] = 0x00260042; + cmdbuf[1] = (u32)val; + cmdbuf[0x100>>2] = 0x00800002; + cmdbuf[0x104>>2] = (u32)ptr; + cmdbuf[2] = 0x00800002; + cmdbuf[3] = (u32)ptr; + + if((ret = svc_sendSyncRequest(servhandle))!=0)return ret; + + cmdbuf[0x100>>2] = tmp0; + cmdbuf[0x104>>2] = tmp1; + + return (Result)cmdbuf[1]; +} + +Result ACU_GetWifiStatus(Handle servhandle, u32 *out) +{ + Result ret=0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = 0x000D0000; + + if((ret = svc_sendSyncRequest(servhandle))!=0)return ret; + + *out = cmdbuf[2]; + + return (Result)cmdbuf[1]; +} + +Result ACU_WaitInternetConnection() +{ + Handle servhandle = 0; + Result ret=0; + u32 outval=0; + + if((ret = srv_getServiceHandle(NULL, &servhandle, "ac:u"))!=0)return ret; + + while(1) + { + ret = ACU_GetWifiStatus(servhandle, &outval); + if(ret==0 && outval==1)break; + } + + svc_closeHandle(servhandle); + + return ret; +} +