LibXenon
Bare-metal Xbox 360 homebrew library
Loading...
Searching...
No Matches
xenon_smc.c
Go to the documentation of this file.
1#include "xenon_smc.h"
2#include "../xenon_uart/xenon_uart.h"
3#include <stdint.h>
4#include <string.h>
5#include <stdio.h>
6#include <pci/io.h>
7#include <stdarg.h> //For custom printf
8
9#define SMC_BASE 0xea001000
10
11void uprintf(const char* format, ...) {
12 va_list args;
13 va_start(args, format);
14 char tmp[2048];
15 vsprintf(tmp, format, args);
16 uart_puts(tmp);
17 va_end(args);
18}
19
20void xenon_smc_send_message(const unsigned char *msg)
21{
22/* uprintf("SEND: ");
23 int i;
24 for (i = 0; i < 16; ++i)
25 uprintf("%02x ", msg[i]);
26 uprintf("\n");
27*/
28 while (!(read32(SMC_BASE + 0x84) & 4));
29 write32(SMC_BASE + 0x84, 4);
30 write32n(SMC_BASE + 0x80, *(uint32_t*)(msg + 0));
31 write32n(SMC_BASE + 0x80, *(uint32_t*)(msg + 4));
32 write32n(SMC_BASE + 0x80, *(uint32_t*)(msg + 8));
33 write32n(SMC_BASE + 0x80, *(uint32_t*)(msg + 12));
34 write32(SMC_BASE + 0x84, 0);
35}
36
37int xenon_smc_receive_message(unsigned char *msg)
38{
39 if (read32(SMC_BASE + 0x94) & 4)
40 {
41 uint32_t *msgl = (uint32_t*)msg;
42 int i;
43 write32(SMC_BASE + 0x94, 4);
44 for (i = 0; i < 4; ++i)
45 *msgl++ = read32n(SMC_BASE + 0x90);
46 write32(SMC_BASE + 0x94, 0);
47 return 0;
48 }
49 return -1;
50}
51
52/* store the last IR keypress */
54
56 int ret = xenon_smc_last_ir;
58 return ret;
59}
60
61void xenon_smc_handle_bulk(unsigned char *msg)
62{
63 switch (msg[1])
64 {
65 case 0x11:
66 case 0x20:
67 uprintf("SMC power message\n");
68 break;
69 case 0x23:
70 //uprintf("IR RX [%02x %02x]\n", msg[2], msg[3]);
71 xenon_smc_last_ir = msg[3];
72 break;
73 case 0x60 ... 0x65:
74
75 uprintf("DVD cover state: %02x\n", msg[1]);
76 break;
77 default:
78 uprintf("unknown SMC bulk msg: %02x\n", msg[1]);
79 break;
80 }
81}
82
84{
85 uint8_t buf[16];
86 memset(buf, 0, 16);
87
88 if (!xenon_smc_receive_message(buf)) {
89 if (buf[0] == 0x83)
90 {
92 }
93 return 0;
94 }
95 return -1;
96}
97
98int xenon_smc_receive_response(unsigned char *msg)
99{
100 while (1)
101 {
103 continue;
104
105/* uprintf("REC: ");
106 int i;
107 for (i = 0; i < 16; ++i)
108 uprintf("%02x ", msg[i]);
109 uprintf("\n");
110*/
111 if (msg[0] == 0x83)
112 {
114 continue;
115 }
116 return 0;
117 }
118}
119
121{
122 uint8_t buf[16];
123
124 memset(buf, 0, 16);
125
126 buf[0] = 0x11;
127 buf[1] = 0x60;
128 buf[3] = 0x80 | 0x70;
129
130 buf[6] = addr;
131
132 buf[8] = val;
133 buf[9] = val >> 8;
134 buf[10] = val >> 16;
135 buf[11] = val >> 24;
136
138
140 if (buf[1] != 0)
141 {
142 uprintf("xenon_smc_ana_write failed, addr=%02x, err=%d\n", addr, buf[1]);
143 return -1;
144 }
145
146 return 0;
147}
148
150{
151 uint8_t buf[16];
152 memset(buf, 0, 16);
153
154 buf[0] = 0x11;
155 buf[1] = 0x10;
156 buf[2] = 5;
157 buf[3] = 0x80 | 0x70;
158 buf[5] = 0xF0;
159 buf[6] = addr;
160
163 if (buf[1] != 0)
164 {
165 uprintf("xenon_smc_ana_read failed, addr=%02x, err=%d\n", addr, buf[1]);
166 return -1;
167 }
168 *val = buf[4] | (buf[5] << 8) | (buf[6] << 16) | (buf[7] << 24);
169 return 0;
170}
171
173{
174 uint8_t buf[16];
175 memset(buf, 0, 16);
176
177 buf[0] = 0x11;
178 buf[1] = (lock)?3:5;
179
181
183 if (buf[1] != 0)
184 {
185 uprintf("xenon_smc_i2c_ddc_lock failed, err=%d\n", buf[1]);
186 return -1;
187 }
188
189 return 0;
190}
191
193{
194 uint8_t buf[16];
195 memset(buf, 0, 16);
196
197 int tmp=(addr>=0x200)?0x3d:0x39;
198 int ddc=(addr>=0x1d0 && addr<=0x1f5);
199
200 buf[0] = 0x11;
201 buf[1] = (ddc)?0x21:0x20;
202 buf[3] = tmp | 0x80; //3d
203
204 buf[6] = addr & 0xff; //3a
205 buf[7] = val;
206
208
210 if (buf[1] != 0)
211 {
212 uprintf("xenon_smc_i2c_write failed, addr=%04x, err=%d\n", addr, buf[1]);
213 return -1;
214 }
215
216 return 0;
217}
218
220{
221 uint8_t buf[16];
222 memset(buf, 0, 16);
223
224 int tmp=(addr>=0x200)?0x3d:0x39;
225 int ddc=(addr>=0x1d0 && addr<=0x1f5);
226
227 buf[0] = 0x11; //40
228 buf[1] = (ddc)?0x11:0x10;//3f
229 buf[2] = 1; //3e
230 buf[3] = buf[5] = tmp | 0x80; //3d 3b
231 buf[6] = addr & 0xff; //3a
232
235 if (buf[1] != 0)
236 {
237 uprintf("xenon_smc_i2c_read failed, addr=%04x, err=%d\n", addr, buf[1]);
238 return -1;
239 }
240 *val = buf[3];
241 return 0;
242}
243
244void xenon_smc_set_led(int override, int value)
245{
246 uint8_t buf[16];
247 memset(buf, 0, 16);
248
249 buf[0] = 0x99;
250 buf[1] = override;
251 buf[2] = value;
252
254}
255
256void xenon_smc_set_power_led(int override, int state, int startanim)
257{
258 uint8_t buf[16];
259 memset(buf, 0, 16);
260
261 buf[0] = 0x8C;
262 buf[1] = (override ? 1 : 0) | (state ? 0 : 2);
263 buf[2] = startanim;
264
266}
267
269{
270 uint8_t buf[16] = {0x82, 0x01};
272}
273
275{
276 uint8_t buf[16] = {0x82, 0x04, 0x30, 0x00};
278}
279
281{
282 uint8_t buf[16] = {0x8c, 0x01, 0x00,0,0,0,0,0,0,0,0,0,0,0,0,0};
284 buf[2] = 0x01;
286}
287
289{
290 uint8_t buf[16] = {0x07};
293 int i;
294 for (i = 0; i < 4; ++i)
295 *data++ = (buf[i * 2 + 1] | (buf[i * 2 + 2] << 8));
296}
297
299{
300 uint8_t buf[16] = {0x0f};
303 return buf[1];
304}
305
307{
308 uint8_t buf[16] = {0x88, algorithm};
310}
void lock(unsigned int *lock)
static uint32_t val
Definition: io.h:17
u32 uint32_t
Definition: libfdt_env.h:11
u16 uint16_t
Definition: libfdt_env.h:10
u8 uint8_t
Definition: libfdt_env.h:9
int xenon_smc_i2c_read(uint16_t addr, uint8_t *val)
Definition: xenon_smc.c:219
int xenon_smc_last_ir
Definition: xenon_smc.c:53
void xenon_smc_set_power_led(int override, int state, int startanim)
Definition: xenon_smc.c:256
void xenon_smc_send_message(const unsigned char *msg)
Definition: xenon_smc.c:20
void xenon_smc_power_reboot(void)
Definition: xenon_smc.c:274
int xenon_smc_poll()
Definition: xenon_smc.c:83
void xenon_smc_set_fan_algorithm(int algorithm)
Definition: xenon_smc.c:306
#define SMC_BASE
Definition: xenon_smc.c:9
void xenon_smc_start_bootanim(void)
Definition: xenon_smc.c:280
void xenon_smc_power_shutdown(void)
Definition: xenon_smc.c:268
void uprintf(const char *format,...)
Definition: xenon_smc.c:11
int xenon_smc_receive_message(unsigned char *msg)
Definition: xenon_smc.c:37
void xenon_smc_set_led(int override, int value)
Definition: xenon_smc.c:244
int xenon_smc_read_avpack(void)
Definition: xenon_smc.c:298
int xenon_smc_receive_response(unsigned char *msg)
Definition: xenon_smc.c:98
int xenon_smc_i2c_write(uint16_t addr, uint8_t val)
Definition: xenon_smc.c:192
int xenon_smc_ana_write(uint8_t addr, uint32_t val)
Definition: xenon_smc.c:120
int xenon_smc_ana_read(uint8_t addr, uint32_t *val)
Definition: xenon_smc.c:149
int xenon_smc_i2c_ddc_lock(int lock)
Definition: xenon_smc.c:172
void xenon_smc_query_sensors(uint16_t *data)
Definition: xenon_smc.c:288
void xenon_smc_handle_bulk(unsigned char *msg)
Definition: xenon_smc.c:61
int xenon_smc_get_ir()
Definition: xenon_smc.c:55
void uart_puts(unsigned char *s)
Definition: xenon_uart.c:30
union @15 data