SMC: Difference between revisions

From Xenon Wiki
Jump to navigation Jump to search
imported>Bertl
(SMC and commands (template))
 
No edit summary
Line 59: Line 59:
! style="border-bottom:2px solid gray;" | ID
! style="border-bottom:2px solid gray;" | ID
! style="border-bottom:2px solid gray;" | Len
! style="border-bottom:2px solid gray;" | Len
! style="border-bottom:2px solid gray;" | Example
! style="border-bottom:2px solid gray;" | Example Query
! style="border-bottom:2px solid gray;" | Reply
! style="border-bottom:2px solid gray;" | Example Reply
! style="border-bottom:2px solid gray;" | Purpose
! style="border-bottom:2px solid gray;" | Purpose
|-
|-
| [[SMC Command 0x01|0x01]]
| [[SMC Command 0x01|0x01]]
| 1:2
| 1:6
| "\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
| "\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
| <tt> 01 12</tt>
| <tt> 01 12 00 00 00 00</tt>
| power on type
| power on type
|-
|-
Line 74: Line 74:
| <tt> 04 602f 212223 01 00000000</tt>  
| <tt> 04 602f 212223 01 00000000</tt>  
| real time clock
| real time clock
|-
| [[SMC Command 0x11|0x11]]
| 6:2
| "\x11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"
| <tt> 11 02</tt>
| read ana
|-
|}
|}

Revision as of 14:26, 25 March 2010

The System Management Controller

The System Management Controller (SMC) is an 8051/8052 core inside the Southbridge. It manages the power sequencing, and is always active when the Xbox 360 has (standby or full) power applied. It controls the frontpanel, has a Realtime clock, decodes IR, manages temperatures, fans, DVDROM tray and a bunch of other things. It talks with the frontpanel board to set the LEDs. When the system is running, the kernel can communicate with the SMC, for example to query the realtime clock, open the dvd-tray etc.

The FIFO

Sending a Message

Communication between kernel and SMC happens over a bidirectional FIFO (at ea001080 / ea001090).
All messages and replies are 16 byte long and have the command id in the first byte.

void smc_send(void *msg)
{
      while (!(readl(0xea001084) & 4))    // wait for FIFO ready
              cpu_relax();

      writel(4, 0xea001084);              // start message
      writesl(0xea001080, msg, 4);        // send 16 bytes
      writel(0, 0xea001084);              // end message
}

Receiving a Reply

Some messages have replies, which will be returned as 16 byte sequence similar to the message (they also have the command id in the first byte).

int smc_read_reply(void *msg)
{
      if (!(readl(0xea001094) & 4))       // do we have a reply?
              return 0;

      writel(4, 0xea001094);              // start reply
      readsl(0xea001090, msg, 4);         // read 16 bytes
      writel(0, 0xea001094);              // end reply
      return 1;
}

Command Messages

ID Len Example Purpose
0x82 2-3 "\x82\0x04\0x31\0\0\0\0\0\0\0\0\0\0\0\0\0" set standby/power

Query Messages

ID Len Example Query Example Reply Purpose
0x01 1:6 "\x01\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 01 12 00 00 00 00 power on type
0x04 1:11 "\x04\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 04 602f 212223 01 00000000 real time clock
0x11 6:2 "\x11\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" 11 02 read ana