My Project
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules
ir.c
Go to the documentation of this file.
1 #include <stdlib.h>
2 #include <string.h>
3 #include <3ds.h>
4 
5 static Handle iru_handle=0;
6 static Handle iru_sharedmem_handle=0;
7 static u32 *iru_sharedmem = NULL;
8 static u32 iru_sharedmem_size = 0;
9 
11 {
12  Result ret = 0;
13  u32 *cmdbuf = getThreadCommandBuffer();
14 
15  cmdbuf[0] = 0x00010000;
16 
17  if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
18  ret = (Result)cmdbuf[1];
19 
20  return ret;
21 }
22 
24 {
25  Result ret = 0;
26  u32 *cmdbuf = getThreadCommandBuffer();
27 
28  cmdbuf[0] = 0x00020000;
29 
30  if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
31  ret = (Result)cmdbuf[1];
32 
33  return ret;
34 }
35 
37 {
38  Result ret = 0;
39  u32 *cmdbuf = getThreadCommandBuffer();
40 
41  cmdbuf[0] = 0x00030042;
42  cmdbuf[1] = size;
43  cmdbuf[2] = (size<<4) | 10;
44  cmdbuf[3] = (u32)buf;
45 
46  if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
47  ret = (Result)cmdbuf[1];
48 
49  return ret;
50 }
51 
53 {
54  Result ret = 0;
55  u32 *cmdbuf = getThreadCommandBuffer();
56 
57  cmdbuf[0] = 0x00040000;
58 
59  if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
60  ret = (Result)cmdbuf[1];
61 
62  return ret;
63 }
64 
66 {
67  Result ret = 0;
68  u32 *cmdbuf = getThreadCommandBuffer();
69 
70  cmdbuf[0] = 0x000500C2;
71  cmdbuf[1] = iru_sharedmem_size;
72  cmdbuf[2] = size;
73  cmdbuf[3] = (u8)flag;
74  cmdbuf[4] = 0;
75  cmdbuf[5] = iru_sharedmem_handle;
76 
77  if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
78  ret = (Result)cmdbuf[1];
79 
80  return ret;
81 }
82 
84 {
85  Result ret = 0;
86  u32 *cmdbuf = getThreadCommandBuffer();
87 
88  cmdbuf[0] = 0x00060000;
89 
90  if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
91  ret = (Result)cmdbuf[1];
92 
93  *transfercount = cmdbuf[2];
94 
95  return ret;
96 }
97 
99 {
100  Result ret = 0;
101  u32 *cmdbuf = getThreadCommandBuffer();
102 
103  cmdbuf[0] = 0x00090040;
104  cmdbuf[1] = (u32)value;
105 
106  if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
107  ret = (Result)cmdbuf[1];
108 
109  return ret;
110 }
111 
113 {
114  Result ret = 0;
115  u32 *cmdbuf = getThreadCommandBuffer();
116 
117  cmdbuf[0] = 0x000A0000;
118 
119  if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
120  ret = (Result)cmdbuf[1];
121 
122  *out = (u8)cmdbuf[2];
123 
124  return ret;
125 }
126 
128 {
129  Result ret = 0;
130  u32 *cmdbuf = getThreadCommandBuffer();
131 
132  cmdbuf[0] = 0x000B0040;
133  cmdbuf[1] = value;
134 
135  if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
136  ret = (Result)cmdbuf[1];
137 
138  return ret;
139 }
140 
142 {
143  Result ret = 0;
144  u32 *cmdbuf = getThreadCommandBuffer();
145 
146  cmdbuf[0] = 0x000C0000;
147 
148  if((ret = svcSendSyncRequest(iru_handle))!=0)return ret;
149  ret = (Result)cmdbuf[1];
150 
151  *out = cmdbuf[2];
152 
153  return ret;
154 }
155 
156 Result IRU_Initialize(u32 *sharedmem_addr, u32 sharedmem_size)
157 {
158  Result ret = 0;
159 
160  if(iru_handle)return 0;
161 
162  ret = srvGetServiceHandle(&iru_handle, "ir:u");
163  if(ret!=0)return ret;
164 
165  ret = irucmd_Initialize();
166  if(ret!=0)return ret;
167 
168  ret = svcCreateMemoryBlock(&iru_sharedmem_handle, (u32)sharedmem_addr, sharedmem_size, 1, 3);
169  if(ret!=0)return ret;
170 
171  iru_sharedmem = sharedmem_addr;
172  iru_sharedmem_size = sharedmem_size;
173 
174  return ret;
175 }
176 
178 {
179  Result ret = 0;
180 
181  if(iru_handle==0)return 0;
182 
183  ret = irucmd_Shutdown();
184  if(ret!=0)return ret;
185 
186  svcCloseHandle(iru_handle);
187  svcCloseHandle(iru_sharedmem_handle);
188 
189  iru_handle = 0;
190  iru_sharedmem_handle = 0;
191 
192  return 0;
193 }
194 
196 {
197  return iru_handle;
198 }
199 
200 Result IRU_SendData(u8 *buf, u32 size, u32 wait)
201 {
202  Result ret = 0;
203 
204  ret = irucmd_StartSendTransfer(buf, size);
205  if(ret!=0)return ret;
206 
207  if(wait==0)return 0;
208 
209  return irucmd_WaitSendTransfer();
210 }
211 
212 Result IRU_RecvData(u8 *buf, u32 size, u8 flag, u32 *transfercount, u32 wait)
213 {
214  Result ret = 0;
215 
216  *transfercount = 0;
217 
218  ret = irucmd_StartRecvTransfer(size, flag);
219  if(ret!=0)return ret;
220 
221  if(wait)
222  {
223  ret = irucmd_WaitRecvTransfer(transfercount);
224  if(ret!=0)return ret;
225 
226  if(buf)memcpy(buf, iru_sharedmem, size);
227  }
228 
229  return 0;
230 }
231 
Result irucmd_Shutdown()
Definition: ir.c:23
s32 Result
Definition: types.h:42
s32 svcCloseHandle(Handle handle)
Result srvGetServiceHandle(Handle *out, const char *name)
Definition: srv.c:109
Result irucmd_WaitRecvTransfer(u32 *transfercount)
Definition: ir.c:83
Result irucmd_StartRecvTransfer(u32 size, u8 flag)
Definition: ir.c:65
Result irucmd_StartSendTransfer(u8 *buf, u32 size)
Definition: ir.c:36
u32 Handle
Definition: types.h:41
u32 * getThreadCommandBuffer(void)
uint8_t u8
Definition: types.h:21
Result IRU_SendData(u8 *buf, u32 size, u32 wait)
Definition: ir.c:200
Result IRU_GetIRLEDRecvState(u32 *out)
Definition: ir.c:141
Result IRU_RecvData(u8 *buf, u32 size, u8 flag, u32 *transfercount, u32 wait)
Definition: ir.c:212
uint32_t u32
Definition: types.h:23
Result IRU_Shutdown()
Definition: ir.c:177
Result IRU_GetBitRate(u8 *out)
Definition: ir.c:112
Result irucmd_Initialize()
Definition: ir.c:10
Result IRU_Initialize(u32 *sharedmem_addr, u32 sharedmem_size)
Definition: ir.c:156
Handle IRU_GetServHandle()
Definition: ir.c:195
s32 svcSendSyncRequest(Handle session)
Result IRU_SetBitRate(u8 value)
Definition: ir.c:98
Result irucmd_WaitSendTransfer()
Definition: ir.c:52
Result IRU_SetIRLEDState(u32 value)
Definition: ir.c:127
s32 svcCreateMemoryBlock(Handle *memblock, u32 addr, u32 size, MemPerm my_perm, MemPerm other_perm)