mirror of
https://github.com/taigrr/gopher-os
synced 2025-01-18 04:43:13 -08:00
Provide method for querying framebuffer info
This commit is contained in:
parent
558cbf5f17
commit
244c8af752
@ -47,6 +47,38 @@ type mmapHeader struct {
|
|||||||
entryVersion uint32
|
entryVersion uint32
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// FramebufferType defines the type of the initialized framebuffer.
|
||||||
|
type FramebufferType uint8
|
||||||
|
|
||||||
|
const (
|
||||||
|
// FrameBufferTypeIndexed specifies a 256-color palette.
|
||||||
|
FrameBufferTypeIndexed FramebufferType = iota
|
||||||
|
|
||||||
|
// FramebufferTypeRGB specifies direct RGB mode.
|
||||||
|
FramebufferTypeRGB
|
||||||
|
|
||||||
|
// FramebufferTypeEGA specifies EGA text mode.
|
||||||
|
FramebufferTypeEGA
|
||||||
|
)
|
||||||
|
|
||||||
|
// FramebufferInfo provides information about the initialized framebuffer.
|
||||||
|
type FramebufferInfo struct {
|
||||||
|
// The framebuffer physical address.
|
||||||
|
PhysAddr uint64
|
||||||
|
|
||||||
|
// Row pitch in bytes.
|
||||||
|
Pitch uint32
|
||||||
|
|
||||||
|
// Width and height in pixels (or characters if Type = FramebufferTypeEGA)
|
||||||
|
Width, Height uint32
|
||||||
|
|
||||||
|
// Bits per pixel (non EGA modes only).
|
||||||
|
Bpp uint8
|
||||||
|
|
||||||
|
// Framebuffer type.
|
||||||
|
Type FramebufferType
|
||||||
|
}
|
||||||
|
|
||||||
// MemoryEntryType defines the type of a MemoryMapEntry.
|
// MemoryEntryType defines the type of a MemoryMapEntry.
|
||||||
type MemoryEntryType uint32
|
type MemoryEntryType uint32
|
||||||
|
|
||||||
@ -86,7 +118,7 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// MemRegionVisitor defies a visitor function that gets invoked by VisitMemRegions
|
// MemRegionVisitor defies a visitor function that gets invoked by VisitMemRegions
|
||||||
// for each memory region defined by the boot loader
|
// for each memory region provided by the boot loader.
|
||||||
type MemRegionVisitor func(entry *MemoryMapEntry)
|
type MemRegionVisitor func(entry *MemoryMapEntry)
|
||||||
|
|
||||||
// SetInfoPtr updates the internal multiboot information pointer to the given
|
// SetInfoPtr updates the internal multiboot information pointer to the given
|
||||||
@ -124,6 +156,19 @@ func VisitMemRegions(visitor MemRegionVisitor) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetFramebufferInfo returns information about the framebuffer initialized by the
|
||||||
|
// bootloader. This function returns nil if no framebuffer info is available.
|
||||||
|
func GetFramebufferInfo() *FramebufferInfo {
|
||||||
|
var info *FramebufferInfo
|
||||||
|
|
||||||
|
curPtr, size := findTagByType(tagFramebufferInfo)
|
||||||
|
if size != 0 {
|
||||||
|
info = (*FramebufferInfo)(unsafe.Pointer(curPtr))
|
||||||
|
}
|
||||||
|
|
||||||
|
return info
|
||||||
|
}
|
||||||
|
|
||||||
// findTagByType scans the multiboot info data looking for the start of of the
|
// findTagByType scans the multiboot info data looking for the start of of the
|
||||||
// specified type. It returns a pointer to the tag contents start offset and
|
// specified type. It returns a pointer to the tag contents start offset and
|
||||||
// the content length exluding the tag header.
|
// the content length exluding the tag header.
|
||||||
|
@ -89,6 +89,33 @@ func TestVisitMemRegion(t *testing.T) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestGetFramebufferInfo(t *testing.T) {
|
||||||
|
SetInfoPtr(uintptr(unsafe.Pointer(&emptyInfoData[0])))
|
||||||
|
|
||||||
|
if GetFramebufferInfo() != nil {
|
||||||
|
t.Fatalf("expected GetFramebufferInfo() to return nil when no framebuffer tag is present")
|
||||||
|
}
|
||||||
|
|
||||||
|
SetInfoPtr(uintptr(unsafe.Pointer(&multibootInfoTestData[0])))
|
||||||
|
fbInfo := GetFramebufferInfo()
|
||||||
|
|
||||||
|
if fbInfo.Type != FramebufferTypeEGA {
|
||||||
|
t.Errorf("expected framebuffer type to be %d; got %d", FramebufferTypeEGA, fbInfo.Type)
|
||||||
|
}
|
||||||
|
|
||||||
|
if fbInfo.PhysAddr != 0xB8000 {
|
||||||
|
t.Errorf("expected physical address for EGA text mode to be 0xB8000; got %x", fbInfo.PhysAddr)
|
||||||
|
}
|
||||||
|
|
||||||
|
if fbInfo.Width != 80 || fbInfo.Height != 25 {
|
||||||
|
t.Errorf("expected framebuffer dimensions to be 80x25; got %dx%d", fbInfo.Width, fbInfo.Height)
|
||||||
|
}
|
||||||
|
|
||||||
|
if fbInfo.Pitch != 160 {
|
||||||
|
t.Errorf("expected pitch to be 160; got %x", fbInfo.Pitch)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var (
|
var (
|
||||||
emptyInfoData = []byte{
|
emptyInfoData = []byte{
|
||||||
0, 0, 0, 0, // size
|
0, 0, 0, 0, // size
|
||||||
|
Loading…
x
Reference in New Issue
Block a user