Move xbox's i2c support to a separate file, and add support of xbox's
LEDs switching. Currently it initializes leds to red, and immediately
after base init is done (means video has been initialized) they are
turned to orange (good for debugging).
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c
Added: trunk/reactos/boot/freeldr/freeldr/arch/i386/xboxi2c.c
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/xboxvideo.c
Modified: trunk/reactos/boot/freeldr/freeldr/freeldr_base.xml
Modified:
trunk/reactos/boot/freeldr/freeldr/include/arch/i386/machxbox.h
_____
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c
2005-12-10 00:28:41 UTC (rev 20033)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/machxbox.c
2005-12-10 13:50:36 UTC (rev 20034)
@@ -22,6 +22,9 @@
VOID
XboxMachInit(const char *CmdLine)
{
+ /* Set LEDs to red before anything is initialized */
+ XboxSetLED("rrrr");
+
/* Initialize our stuff */
XboxMemInit();
XboxVideoInit();
@@ -55,4 +58,7 @@
MachVtbl.DiskGetCacheableBlockCount = XboxDiskGetCacheableBlockCount;
MachVtbl.RTCGetCurrentDateTime = XboxRTCGetCurrentDateTime;
MachVtbl.HwDetect = XboxHwDetect;
+
+ /* Set LEDs to orange after init */
+ XboxSetLED("oooo");
}
_____
Added: trunk/reactos/boot/freeldr/freeldr/arch/i386/xboxi2c.c
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/xboxi2c.c
2005-12-10 00:28:41 UTC (rev 20033)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/xboxi2c.c
2005-12-10 13:50:36 UTC (rev 20034)
@@ -0,0 +1,224 @@
+/* $Id: xboxhw.c 19190 2005-11-13 04:50:55Z fireball $
+ *
+ * FreeLoader
+ *
+ * This program is free software; you can redistribute it and/or
modify
+ * it under the terms of the GNU General Public License as published
by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ */
+
+#include <freeldr.h>
+
+// These functions are used only inside xbox-specific code
+// thus I didn't include them in header
+
+#define I2C_IO_BASE 0xc000
+
+static BOOL
+WriteToSMBus(UCHAR Address, UCHAR bRegister, UCHAR Size, ULONG
Data_to_smbus)
+{
+ int nRetriesToLive=50;
+
+ while(READ_PORT_USHORT((PUSHORT) (I2C_IO_BASE+0)) & 0x0800)
+ {
+ ; // Franz's spin while bus busy with any master traffic
+ }
+
+ while(nRetriesToLive--)
+ {
+ UCHAR b;
+ unsigned int temp;
+
+ WRITE_PORT_UCHAR((PUCHAR)(I2C_IO_BASE + 4), (Address << 1) | 0);
+ WRITE_PORT_UCHAR((PUCHAR)(I2C_IO_BASE + 8), bRegister);
+
+ switch (Size)
+ {
+ case 4:
+ WRITE_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 9), Data_to_smbus &
0xff);
+ WRITE_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 9), (Data_to_smbus >>
8) & 0xff );
+ WRITE_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 9), (Data_to_smbus >>
16) & 0xff );
+ WRITE_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 9), (Data_to_smbus >>
24) & 0xff );
+ WRITE_PORT_USHORT((PUSHORT) (I2C_IO_BASE + 6), 4);
+ break;
+ case 2:
+ WRITE_PORT_USHORT((PUSHORT) (I2C_IO_BASE + 6),
Data_to_smbus&0xffff);
+ break;
+ default: // 1
+ WRITE_PORT_USHORT((PUSHORT) (I2C_IO_BASE + 6),
Data_to_smbus&0xff);
+ break;
+ }
+
+
+ temp = READ_PORT_USHORT((PUSHORT) (I2C_IO_BASE + 0));
+ WRITE_PORT_USHORT((PUSHORT) (I2C_IO_BASE + 0), temp); // clear
down all preexisting errors
+
+ switch (Size)
+ {
+ case 4:
+ WRITE_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 2), 0x1d); // DWORD
modus
+ break;
+ case 2:
+ WRITE_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 2), 0x1b); // WORD
modus
+ break;
+ default: // 1
+ WRITE_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 2), 0x1a); // BYTE
modus
+ break;
+ }
+
+ b = 0;
+
+ while( (b&0x36)==0 )
+ {
+ b=READ_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 0));
+ }
+
+ if ((b&0x10) != 0)
+ {
+ return TRUE;
+ }
+
+ StallExecutionProcessor(1);
+ }
+
+ return FALSE;
+}
+
+
+static BOOL
+ReadfromSMBus(UCHAR Address, UCHAR bRegister, UCHAR Size, ULONG
*Data_to_smbus)
+{
+ int nRetriesToLive=50;
+
+ while (0 != (READ_PORT_USHORT((PUSHORT) (I2C_IO_BASE + 0)) & 0x0800))
+ {
+ ; /* Franz's spin while bus busy with any master traffic */
+ }
+
+ while (0 != nRetriesToLive--)
+ {
+ UCHAR b;
+ int temp;
+
+ WRITE_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 4), (Address << 1) | 1);
+ WRITE_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 8), bRegister);
+
+ temp = READ_PORT_USHORT((USHORT *) (I2C_IO_BASE + 0));
+ WRITE_PORT_USHORT((PUSHORT) (I2C_IO_BASE + 0), temp); /* clear
down all preexisting errors */
+
+ switch (Size)
+ {
+ case 4:
+ WRITE_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 2), 0x0d); /*
DWORD modus ? */
+ break;
+ case 2:
+ WRITE_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 2), 0x0b); /*
WORD modus */
+ break;
+ default:
+ WRITE_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 2), 0x0a); //
BYTE
+ break;
+ }
+
+ b = 0;
+
+ while (0 == (b & 0x36))
+ {
+ b = READ_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 0));
+ }
+
+ if (0 != (b & 0x24))
+ {
+ /* printf("I2CTransmitByteGetReturn error %x\n", b); */
+ }
+
+ if(0 == (b & 0x10))
+ {
+ /* printf("I2CTransmitByteGetReturn no complete, retry\n");
*/
+ }
+ else
+ {
+ switch (Size)
+ {
+ case 4:
+ READ_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 6));
+ READ_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 9));
+ READ_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 9));
+ READ_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 9));
+ READ_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 9));
+ break;
+ case 2:
+ *Data_to_smbus = READ_PORT_USHORT((USHORT *)
(I2C_IO_BASE + 6));
+ break;
+ default:
+ *Data_to_smbus = READ_PORT_UCHAR((PUCHAR) (I2C_IO_BASE
+ 6));
+ break;
+ }
+
+
+ return TRUE;
+ }
+ }
+
+ return FALSE;
+}
+
+BOOL
+I2CTransmitByteGetReturn(UCHAR bPicAddressI2cFormat, UCHAR
bDataToWrite, ULONG *Return)
+{
+ return ReadfromSMBus(bPicAddressI2cFormat, bDataToWrite, 1, Return);
+}
+
+// transmit a word, no returned data from I2C device
+static BOOL
+I2CTransmitWord(UCHAR bPicAddressI2cFormat, USHORT wDataToWrite)
+{
+ return
WriteToSMBus(bPicAddressI2cFormat,(wDataToWrite>>8)&0xff,1,(wDataToWrite
&0xff));
+}
+
+static void
+I2cSetFrontpanelLed(UCHAR b)
+{
+ I2CTransmitWord( 0x10, 0x800 | b); // sequencing thanks to Jarin the
Penguin!
+ I2CTransmitWord( 0x10, 0x701);
+}
+
+// Set the pattern of the LED.
+// r = Red, g = Green, o = Orange, x = Off
+// This func is taken from cromwell, all credits goes for them
+void
+XboxSetLED(UCHAR *pattern) {
+ char *x = pattern;
+ int r, g;
+
+ if(strlen(pattern) == 4) {
+ r = g = 0;
+ while (*x) {
+ r *= 2;
+ g *= 2;
+ switch (*x) {
+ case 'r':
+ r++;
+ break;
+ case 'g':
+ g++;
+ break;
+ case 'o':
+ r++;
+ g++;
+ break;
+ }
+ x++;
+ }
+ I2cSetFrontpanelLed(((r<<4) & 0xF0) + (g & 0xF));
+ }
+}
Property changes on:
trunk/reactos/boot/freeldr/freeldr/arch/i386/xboxi2c.c
___________________________________________________________________
Name: svn:eol-style
+ native
_____
Modified: trunk/reactos/boot/freeldr/freeldr/arch/i386/xboxvideo.c
--- trunk/reactos/boot/freeldr/freeldr/arch/i386/xboxvideo.c
2005-12-10 00:28:41 UTC (rev 20033)
+++ trunk/reactos/boot/freeldr/freeldr/arch/i386/xboxvideo.c
2005-12-10 13:50:36 UTC (rev 20034)
@@ -22,8 +22,6 @@
#include <freeldr.h>
-#define I2C_IO_BASE 0xc000
-
static PVOID FrameBuffer;
static ULONG ScreenWidth;
static ULONG ScreenHeight;
@@ -39,6 +37,8 @@
#define MAKE_COLOR(Red, Green, Blue) (0xff000000 | (((Red) & 0xff) <<
16) | (((Green) & 0xff) << 8) | ((Blue) & 0xff))
+BOOL I2CTransmitByteGetReturn(UCHAR bPicAddressI2cFormat, UCHAR
bDataToWrite, ULONG *Return);
+
static VOID
XboxVideoOutputChar(UCHAR Char, unsigned X, unsigned Y, ULONG FgColor,
ULONG BgColor)
{
@@ -119,91 +119,6 @@
XboxVideoOutputChar(Ch, X, Y, FgColor, BgColor);
}
-static BOOL
-ReadfromSMBus(UCHAR Address, UCHAR bRegister, UCHAR Size, ULONG
*Data_to_smbus)
-{
- int nRetriesToLive=50;
-
- while (0 != (READ_PORT_USHORT((PUSHORT) (I2C_IO_BASE + 0)) & 0x0800))
- {
- ; /* Franz's spin while bus busy with any master traffic */
- }
-
- while (0 != nRetriesToLive--)
- {
- UCHAR b;
- int temp;
-
- WRITE_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 4), (Address << 1) | 1);
- WRITE_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 8), bRegister);
-
- temp = READ_PORT_USHORT((USHORT *) (I2C_IO_BASE + 0));
- WRITE_PORT_USHORT((PUSHORT) (I2C_IO_BASE + 0), temp); /* clear
down all preexisting errors */
-
- switch (Size)
- {
- case 4:
- WRITE_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 2), 0x0d); /*
DWORD modus ? */
- break;
- case 2:
- WRITE_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 2), 0x0b); /*
WORD modus */
- break;
- default:
- WRITE_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 2), 0x0a); //
BYTE
- break;
- }
-
- b = 0;
-
- while (0 == (b & 0x36))
- {
- b = READ_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 0));
- }
-
- if (0 != (b & 0x24))
- {
- /* printf("I2CTransmitByteGetReturn error %x\n", b); */
- }
-
- if(0 == (b & 0x10))
- {
- /* printf("I2CTransmitByteGetReturn no complete, retry\n");
*/
- }
- else
- {
- switch (Size)
- {
- case 4:
- READ_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 6));
- READ_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 9));
- READ_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 9));
- READ_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 9));
- READ_PORT_UCHAR((PUCHAR) (I2C_IO_BASE + 9));
- break;
- case 2:
- *Data_to_smbus = READ_PORT_USHORT((USHORT *)
(I2C_IO_BASE + 6));
- break;
- default:
- *Data_to_smbus = READ_PORT_UCHAR((PUCHAR) (I2C_IO_BASE
+ 6));
- break;
- }
-
-
- return TRUE;
- }
- }
-
- return FALSE;
-}
-
-
-static BOOL
-I2CTransmitByteGetReturn(UCHAR bPicAddressI2cFormat, UCHAR
bDataToWrite, ULONG *Return)
-{
- return ReadfromSMBus(bPicAddressI2cFormat, bDataToWrite, 1, Return);
-}
-
-
VOID
XboxVideoInit(VOID)
{
_____
Modified: trunk/reactos/boot/freeldr/freeldr/freeldr_base.xml
--- trunk/reactos/boot/freeldr/freeldr/freeldr_base.xml 2005-12-10
00:28:41 UTC (rev 20033)
+++ trunk/reactos/boot/freeldr/freeldr/freeldr_base.xml 2005-12-10
13:50:36 UTC (rev 20034)
@@ -36,6 +36,7 @@
<file>xboxdisk.c</file>
<file>xboxfont.c</file>
<file>xboxhw.c</file>
+ <file>xboxi2c.c</file>
<file>xboxmem.c</file>
<file>xboxrtc.c</file>
<file>xboxvideo.c</file>
_____
Modified:
trunk/reactos/boot/freeldr/freeldr/include/arch/i386/machxbox.h
--- trunk/reactos/boot/freeldr/freeldr/include/arch/i386/machxbox.h
2005-12-10 00:28:41 UTC (rev 20033)
+++ trunk/reactos/boot/freeldr/freeldr/include/arch/i386/machxbox.h
2005-12-10 13:50:36 UTC (rev 20034)
@@ -60,6 +60,9 @@
VOID XboxHwDetect(VOID);
+VOID XboxSetLED(UCHAR *Pattern);
+
+
#endif /* __I386_HWXBOX_H_ */
/* EOF */