- Fix a bug in MmGetPhysicalAddress.

- Don't hang in the clock interrupt anymore, for now we'll just ignore it (but it works! :D)
- Make all unimplemented bootvid functions hang the system, so we can better stop at progress-points.
- Implement VidInitialize:
  - We allocate a 640x480@16bpp framebuffer using contiguous physical memory (our MMU code survives!).
  - We setup the LCD controller timings and framebuffer address.
  - We enable the LCD
- For debugging, we're also drawing a nice little test pattern... and it works! We have GUI Code :)


svn path=/trunk/; revision=33974
This commit is contained in:
ReactOS Portable Systems Group 2008-06-15 03:32:52 +00:00
parent 0ea44bde8f
commit bfd0d8594d
3 changed files with 163 additions and 9 deletions

View file

@ -2,8 +2,97 @@
#define NDEBUG
#include "debug.h"
#define LCDTIMING0_PPL(x) ((((x) / 16 - 1) & 0x3f) << 2)
#define LCDTIMING1_LPP(x) (((x) & 0x3ff) - 1)
#define LCDCONTROL_LCDPWR (1 << 11)
#define LCDCONTROL_LCDEN (1)
#define LCDCONTROL_LCDBPP(x) (((x) & 7) << 1)
#define LCDCONTROL_LCDTFT (1 << 5)
#define PL110_LCDTIMING0 (PVOID)0xE0020000
#define PL110_LCDTIMING1 (PVOID)0xE0020004
#define PL110_LCDTIMING2 (PVOID)0xE0020008
#define PL110_LCDUPBASE (PVOID)0xE0020010
#define PL110_LCDLPBASE (PVOID)0xE0020014
#define PL110_LCDCONTROL (PVOID)0xE0020018
#define READ_REGISTER_ULONG(r) (*(volatile ULONG * const)(r))
#define WRITE_REGISTER_ULONG(r, v) (*(volatile ULONG *)(r) = (v))
#define READ_REGISTER_USHORT(r) (*(volatile USHORT * const)(r))
#define WRITE_REGISTER_USHORT(r, v) (*(volatile USHORT *)(r) = (v))
PUSHORT VgaArmBase;
typedef struct _VGA_COLOR
{
UCHAR Red;
UCHAR Green;
UCHAR Blue;
} VGA_COLOR;
VGA_COLOR VidpVga8To16BitTransform[16] =
{
{0x00, 0x00, 0x00}, // Black
{0x00, 0x00, 0x08}, // Blue
{0x00, 0x08, 0x00}, // Green
{0x00, 0x08, 0x08}, // Cyan
{0x08, 0x00, 0x00}, // Red
{0x08, 0x00, 0x08}, // Magenta
{0x08, 0x08, 0x00}, // Brown
{0x10, 0x10, 0x10}, // Light Gray
{0x08, 0x08, 0x08}, // Dark Gray
{0x00, 0x00, 0x1F}, // Light Blue
{0x00, 0x1F, 0x00}, // Light Green
{0x00, 0x1F, 0x1F}, // Light Cyan
{0x1F, 0x00, 0x00}, // Light Red
{0x1F, 0x00, 0x1F}, // Light Magenta
{0x1F, 0x1F, 0x00}, // Yellow
{0x1F, 0x1F, 0x1F}, // White
};
/* PRIVATE FUNCTIONS *********************************************************/
USHORT
FORCEINLINE
VidpBuildColor(IN UCHAR Color)
{
UCHAR Red, Green, Blue;
//
// Extract color components
//
Red = VidpVga8To16BitTransform[Color].Red;
Green = VidpVga8To16BitTransform[Color].Green;
Blue = VidpVga8To16BitTransform[Color].Blue;
//
// Build the 16-bit color mask
//
return ((Blue & 0x1F) << 11) | ((Green & 0x1F) << 6) | ((Red & 0x1F));
}
VOID
FORCEINLINE
VidpSetPixel(IN ULONG Left,
IN ULONG Top,
IN UCHAR Color)
{
PUSHORT PixelPosition;
//
// Calculate the pixel position
//
PixelPosition = &VgaArmBase[Left + (Top * 640)];
//
// Set our color
//
WRITE_REGISTER_USHORT(PixelPosition, VidpBuildColor(Color));
}
/* PUBLIC FUNCTIONS **********************************************************/
/*
@ -12,11 +101,67 @@
BOOLEAN
NTAPI
VidInitialize(IN BOOLEAN SetMode)
{
DPRINT1("bv-arm\n");
UNIMPLEMENTED;
while (TRUE);
return FALSE;
{
PHYSICAL_ADDRESS Physical;
DPRINT1("bv-arm v0.1\n");
//
// Allocate framebuffer
// 600kb works out to 640x480@16bpp
//
Physical.QuadPart = -1;
VgaArmBase = MmAllocateContiguousMemory(600 * 1024, Physical);
if (!VgaArmBase) return FALSE;
//
// Get physical address
//
Physical = MmGetPhysicalAddress(VgaArmBase);
if (!Physical.QuadPart) return FALSE;
DPRINT1("[BV-ARM] Frame Buffer @ 0x%p 0p%p\n", VgaArmBase, Physical.LowPart);
//
// Set framebuffer address
//
WRITE_REGISTER_ULONG(PL110_LCDUPBASE, Physical.LowPart);
WRITE_REGISTER_ULONG(PL110_LCDLPBASE, Physical.LowPart);
//
// Initialize timings to 640x480
//
WRITE_REGISTER_ULONG(PL110_LCDTIMING0, LCDTIMING0_PPL(640));
WRITE_REGISTER_ULONG(PL110_LCDTIMING1, LCDTIMING1_LPP(480));
//
// Enable the LCD Display
//
WRITE_REGISTER_ULONG(PL110_LCDCONTROL,
LCDCONTROL_LCDEN |
LCDCONTROL_LCDTFT |
LCDCONTROL_LCDPWR |
LCDCONTROL_LCDBPP(4));
#if DBG
//
// Draw an RGB test pattern
//
int y, x;
for (y = 0; y < 480; y += 40)
{
for (x = 0; x < 640; x++)
{
VidpSetPixel(x, y, 12);
VidpSetPixel(x, y + 10, 9);
VidpSetPixel(x, y + 20, 10);
VidpSetPixel(x, y + 30, 15);
}
}
#endif
//
// We are done!
//
return TRUE;
}
/*
@ -27,6 +172,7 @@ NTAPI
VidResetDisplay(IN BOOLEAN HalReset)
{
UNIMPLEMENTED;
while (TRUE);
}
/*
@ -37,6 +183,7 @@ NTAPI
VidSetTextColor(ULONG Color)
{
UNIMPLEMENTED;
while (TRUE);
return 0;
}
@ -51,6 +198,7 @@ VidDisplayStringXY(PUCHAR String,
BOOLEAN Transparent)
{
UNIMPLEMENTED;
while (TRUE);
}
/*
@ -64,6 +212,7 @@ VidSetScrollRegion(ULONG x1,
ULONG y2)
{
UNIMPLEMENTED;
while (TRUE);
}
/*
@ -74,6 +223,7 @@ NTAPI
VidCleanUp(VOID)
{
UNIMPLEMENTED;
while (TRUE);
}
/*
@ -89,6 +239,7 @@ VidBufferToScreenBlt(IN PUCHAR Buffer,
IN ULONG Delta)
{
UNIMPLEMENTED;
while (TRUE);
}
/*
@ -99,6 +250,7 @@ NTAPI
VidDisplayString(PUCHAR String)
{
UNIMPLEMENTED;
while (TRUE);
}
/*
@ -111,6 +263,7 @@ VidBitBlt(PUCHAR Buffer,
ULONG Top)
{
UNIMPLEMENTED;
while (TRUE);
}
/*
@ -126,6 +279,7 @@ VidScreenToBufferBlt(PUCHAR Buffer,
ULONG Delta)
{
UNIMPLEMENTED;
while (TRUE);
}
/*
@ -140,5 +294,5 @@ VidSolidColorFill(IN ULONG Left,
IN UCHAR Color)
{
UNIMPLEMENTED;
while (TRUE);
}

View file

@ -529,9 +529,9 @@ HalpClockInterrupt(VOID)
//
// Clear the interrupt
//
DPRINT1("CLOCK INTERRUPT!!!\n");
//DPRINT1("CLOCK INTERRUPT!!!\n");
WRITE_REGISTER_ULONG(TIMER_INT_CLEAR, 1);
while (TRUE);
//while (TRUE);
}
VOID

View file

@ -583,7 +583,7 @@ MmGetPhysicalAddress(IN PVOID Address)
//
// Return the information
//
ASSERT(PointerPte->u.Hard.L2.Small.Type != SmallPte);
ASSERT(PointerPte->u.Hard.L2.Small.Type == SmallPte);
PhysicalAddress.QuadPart = PointerPte->u.Hard.L2.Small.BaseAddress;
PhysicalAddress.QuadPart <<= PAGE_SHIFT;
PhysicalAddress.LowPart += BYTE_OFFSET(Address);