From c5250ab5676661717ab26158dd4890cc61975f46 Mon Sep 17 00:00:00 2001 From: yellows8 Date: Tue, 22 Apr 2014 16:13:18 -0400 Subject: [PATCH] Added code for the cfg:nor service. --- libctru/include/ctr/CFGNOR.h | 12 ++++ libctru/source/CFGNOR.c | 113 +++++++++++++++++++++++++++++++++++ 2 files changed, 125 insertions(+) create mode 100644 libctru/include/ctr/CFGNOR.h create mode 100644 libctru/source/CFGNOR.c diff --git a/libctru/include/ctr/CFGNOR.h b/libctru/include/ctr/CFGNOR.h new file mode 100644 index 0000000..b6ca73d --- /dev/null +++ b/libctru/include/ctr/CFGNOR.h @@ -0,0 +1,12 @@ +#ifndef CFGNOR_H +#define CFGNOR_H + +Result CFGNOR_Initialize(u8 value); +Result CFGNOR_Shutdown(); +Result CFGNOR_ReadData(u32 offset, u32 *buf, u32 size); +Result CFGNOR_WriteData(u32 offset, u32 *buf, u32 size); +Result CFGNOR_DumpFlash(u32 *buf, u32 size); +Result CFGNOR_WriteFlash(u32 *buf, u32 size); + +#endif + diff --git a/libctru/source/CFGNOR.c b/libctru/source/CFGNOR.c new file mode 100644 index 0000000..c8695d8 --- /dev/null +++ b/libctru/source/CFGNOR.c @@ -0,0 +1,113 @@ +#include +#include +#include + +#include +#include +#include + +#include + +Handle CFGNOR_handle = 0; + +Result CFGNOR_Initialize(u8 value) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + ret = srv_getServiceHandle(NULL, &CFGNOR_handle, "cfg:nor"); + if(ret!=0)return ret; + + cmdbuf[0] = 0x00010040; + cmdbuf[1] = (u32)value; + + if((ret = svc_sendSyncRequest(CFGNOR_handle))!=0)return ret; + + ret = (Result)cmdbuf[1]; + return ret; +} + +Result CFGNOR_Shutdown() +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = 0x00020000; + + if((ret = svc_sendSyncRequest(CFGNOR_handle))!=0)return ret; + ret = (Result)cmdbuf[1]; + + svc_closeHandle(CFGNOR_handle); + CFGNOR_handle = 0; + + return ret; +} + +Result CFGNOR_ReadData(u32 offset, u32 *buf, u32 size) +{ + Result ret = 0; + u32 *cmdbuf = getThreadCommandBuffer(); + + cmdbuf[0] = 0x00050082; + cmdbuf[1] = offset; + cmdbuf[2] = size; + cmdbuf[3] = (size<<4) | 12; + cmdbuf[4] = (u32)buf; + + if((ret = svc_sendSyncRequest(CFGNOR_handle))!=0)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] = 0x00060082; + cmdbuf[1] = offset; + cmdbuf[2] = size; + cmdbuf[3] = (size<<4) | 10; + cmdbuf[4] = (u32)buf; + + if((ret = svc_sendSyncRequest(CFGNOR_handle))!=0)return ret; + + ret = (Result)cmdbuf[1]; + return ret; +} + +Result CFGNOR_DumpFlash(u32 *buf, u32 size) +{ + Result ret = 0; + u32 pos=0; + u32 chunksize = 0x100; + + for(pos=0; pos>2], chunksize); + if(ret!=0)break; + } + + return ret; +} + +Result CFGNOR_WriteFlash(u32 *buf, u32 size) +{ + Result ret = 0; + u32 pos=0; + u32 chunksize = 0x100; + + for(pos=0; pos>2], chunksize); + if(ret!=0)break; + } + + return ret; +} +