9 #define SEG_ADDR(s) ((uint32_t)(s) << 4)
11 #define MODE_LFB (1 << 14)
13 struct vbe_info *vbe_get_info(void)
15 struct vbe_info *info;
16 struct int86regs regs;
18 info = (struct vbe_info*)low_mem_buffer;
20 memcpy(info->sig, "VBE2", 4);
22 memset(®s, 0, sizeof regs);
23 regs.es = (uint32_t)info >> 4;
27 if((regs.eax & 0xffff) != 0x4f) {
34 struct vbe_mode_info *vbe_get_mode_info(int mode)
36 struct vbe_mode_info *mi;
37 struct int86regs regs;
39 mi = (struct vbe_mode_info*)(low_mem_buffer + 512);
41 memset(®s, 0, sizeof regs);
42 regs.es = (uint32_t)mi >> 4;
47 if((regs.eax & 0xffff) != 0x4f) {
54 int vbe_set_mode(int mode)
56 struct int86regs regs;
58 memset(®s, 0, sizeof regs);
63 if(regs.eax == 0x100) {
69 void print_mode_info(struct vbe_mode_info *mi)
71 static unsigned int maskbits[] = {0, 1, 3, 7, 0xf, 0x1f, 0x3f, 0x7f, 0xff};
73 printf("resolution: %dx%d\n", mi->xres, mi->yres);
74 printf("color depth: %d\n", mi->bpp);
75 printf("mode attributes: %x\n", mi->mode_attr);
76 printf("bytes per scanline: %d\n", mi->scanline_bytes);
77 printf("number of planes: %d\n", (int)mi->num_planes);
78 printf("number of banks: %d\n", (int)mi->num_banks);
79 printf("mem model: %d\n", (int)mi->mem_model);
80 printf("red bits: %d (mask: %x)\n", (int)mi->rmask_size, maskbits[mi->rmask_size] << mi->rpos);
81 printf("green bits: %d (mask: %x)\n", (int)mi->gmask_size, maskbits[mi->gmask_size] << mi->gpos);
82 printf("blue bits: %d (mask: %x)\n", (int)mi->bmask_size, maskbits[mi->bmask_size] << mi->bpos);
83 printf("framebuffer address: %x\n", (unsigned int)mi->fb_addr);
86 int vbe_get_edid(struct vbe_edid *edid)
88 struct int86regs regs;
90 memset(®s, 0, sizeof regs);
91 regs.es = (uint32_t)low_mem_buffer >> 4;
96 if((regs.eax & 0xffff) != 0x4f) {
99 memcpy(edid, low_mem_buffer, sizeof *edid);
103 int edid_preferred_resolution(struct vbe_edid *edid, int *xres, int *yres)
105 if(memcmp(edid->magic, VBE_EDID_MAGIC, 8) != 0) {
109 *xres = (int)edid->timing[0].hactive_lsb | ((int)(edid->timing[0].hact_hblank_msb & 0xf0) << 4);
110 *yres = (int)edid->timing[0].vactive_lsb | ((int)(edid->timing[0].vact_vblank_msb & 0xf0) << 4);
114 void print_edid(struct vbe_edid *edid)
119 if(memcmp(edid->magic, VBE_EDID_MAGIC, 8) != 0) {
120 printf("invalid EDID magic\n");
124 vendor[0] = (edid->vendor >> 10) & 0x1f;
125 vendor[1] = (edid->vendor >> 5) & 0x1f;
126 vendor[2] = edid->vendor & 0x1f;
128 printf("Manufacturer: %s\n", vendor);
130 edid_preferred_resolution(edid, &xres, &yres);
131 printf("Preferred resolution: %dx%d\n", xres, yres);