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; +} +