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 | ||||
| } | ||||
| 
 | ||||
| // 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. | ||||
| type MemoryEntryType uint32 | ||||
| 
 | ||||
| @ -86,7 +118,7 @@ var ( | ||||
| ) | ||||
| 
 | ||||
| // 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) | ||||
| 
 | ||||
| // 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 | ||||
| // specified type. It returns a pointer to the tag contents start offset and | ||||
| // 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 ( | ||||
| 	emptyInfoData = []byte{ | ||||
| 		0, 0, 0, 0, // size | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user