Esempio n. 1
0
int vbe_get_mode_info(unsigned short mode, vbe_mode_info_t *vmi_p)
{
	mmap_t map;

	if (lm_alloc(sizeof(vbe_mode_info_t), &map) == NULL)
	{
		return 1;
	}

	struct reg86u reg86;

	reg86.u.b.intno = VBE_INTERRUPT_VECTOR; /* BIOS video services */
	reg86.u.b.ah = VBE_FUNCTION;
	reg86.u.b.al = VBE_RETURN_VBE_MODE_INFO;
	reg86.u.w.cx = mode;
	reg86.u.w.es = PB2BASE(map.phys);
	reg86.u.w.di = PB2OFF(map.phys);

	if (sys_int86(&reg86) == OK)
	{
		if (reg86.u.w.ax == VBE_FUNCTION_SUPPORTED | VBE_FUNCTION_CALL_SUCCESSFUL)
		{
			*vmi_p = *((vbe_mode_info_t *)map.virtual);
			lm_free(&map);
			return 0;
		}
	}
Esempio n. 2
0
int set_video_mode(unsigned short mode)
{
	struct reg86u reg;
	reg.u.w.ax = (VBE_IDENTIFIER<<8)|(VBE_F_SET_MODE); // VBE call, function 02 -- set VBE mode
	reg.u.w.bx = (BIT(LINEAR_MODEL_BIT))|mode; 							// set bit 14: linear framebuffer
	reg.u.b.intno = VIDEO_CARD_INT;
	if( sys_int86(&reg) != OK ) {
		printf("set_vbe_mode: sys_int86() failed \n");
		return 1;
	}
	if(reg.u.b.ah == VBE_FAIL)
	{
		printf("vg_init(): Function call failed\n");
		return 1;
	}
	else if(reg.u.b.ah == VBE_N_SUP)
	{
		printf("vg_init(): Function is not supported in current HW configuration\n");
		return 1;
	}
	else if(reg.u.b.ah == VBE_INVALID)
	{
		printf("vg_init(): Function is invalid in current video mode\n");
		return 1;
	}
	else if(reg.u.b.ah != VBE_OK)
	{
		printf("vg_init(): error setting mode %x", mode);
		return 1;
	}
	return 0;
}
Esempio n. 3
0
int vbe_get_mode_info(unsigned short mode, vbe_mode_info_t *vmi_p) {
  
  struct reg86u reg86;
  mmap_t memory;
  
  lm_init();
  
  lm_alloc(VBE_MODE_INFO_SIZE, &memory);
  
  reg86.u.w.ax = 0x4F01;
  reg86.u.w.cx =  1 << 14 | mode;
  reg86.u.w.es = PB2BASE(memory.phys);
  reg86.u.w.di = PB2OFF(memory.phys);
  reg86.u.b.intno = 0x10;
  
  if(sys_int86(&reg86) != OK){
	  printf("vbe_get_mode_info: sys_int86() failed \n");
	  return 1;
  }
  
  memcpy(vmi_p, memory.virtual, VBE_MODE_INFO_SIZE);
  
  lm_free(&memory);
  
  return 0;
}
Esempio n. 4
0
void *vg_init(unsigned short mode)
{
	struct reg86u reg86;

	reg86.u.b.intno = VBE_INTERRUPT_VECTOR; /* BIOS video services */
	reg86.u.b.ah = VBE_FUNCTION;
	reg86.u.b.al = VBE_SET_VBE_MODE;
	reg86.u.w.bx = mode | BIT(VBE_MODE_NUMBER_LINEAR_FLAT_FRAME_BUFFER_BIT);

	vbe_mode_info_t vbe_mode_info;
	if (sys_int86(&reg86) == OK)
	{
		if (reg86.u.w.ax == VBE_FUNCTION_SUPPORTED | VBE_FUNCTION_CALL_SUCCESSFUL)
		{
			if(vbe_get_mode_info(mode, &vbe_mode_info))
			{
				return NULL;
			}
			else
			{
				int r;
				struct mem_range mr;
				unsigned mr_size;

				h_res = vbe_mode_info.XResolution;
				v_res = vbe_mode_info.YResolution;
				bits_per_pixel = vbe_mode_info.BitsPerPixel;

				/* Allow memory mapping */

				mr.mr_base = vbe_mode_info.PhysBasePtr;
				mr_size = h_res * v_res * bits_per_pixel;
				mr.mr_limit = mr.mr_base + mr_size;

				if(sys_privctl(SELF, SYS_PRIV_ADD_MEM, &mr))
				{
					return NULL;
				}

				/* Map memory */

				video_mem = vm_map_phys(SELF, (void *)mr.mr_base, mr_size);

				if(video_mem != MAP_FAILED)
				{
					if ((double_buffer = malloc(h_res * v_res * bits_per_pixel / 8)) != NULL)
					{
						if ((mouse_buffer = malloc(h_res * v_res * bits_per_pixel / 8)) != NULL)
						{
							return video_mem;
						}
					}
				}
			}
		}
	}
	return NULL;
}
Esempio n. 5
0
void* vg_init(unsigned short mode) {
	struct mem_range mr;
	vbe_mode_info_t vmi_p;
	struct reg86u reg86;

	reg86.u.b.intno = BIOS_VIDEO;
	reg86.u.b.ah = VBE;
	reg86.u.b.al = SET_VBE;
	reg86.u.w.bx = BIT(LINEAR_BIT) | mode;

	if (sys_int86(&reg86)) {
		printf("vg_init()::bios call didn't return 0\n");
		return NULL;
	}

	if (vbe_get_mode_info(mode, &vmi_p) == -1) {
		printf("vg_init()::failed in vbe_get_mode_info");
		return NULL;
	}

	h_res = vmi_p.XResolution;
	v_res = vmi_p.YResolution;
	bits_per_pixel = vmi_p.BitsPerPixel;
	if (bits_per_pixel / 8 > 0)
		bytes_per_pixel = bits_per_pixel / 8;
	else
		bytes_per_pixel = 1;
	vram_size = h_res * v_res * bytes_per_pixel;

	int r;

	/* Allow memory mapping */

	mr.mr_base = vmi_p.PhysBasePtr;
	mr.mr_limit = mr.mr_base + vram_size;

	if (sys_privctl(SELF, SYS_PRIV_ADD_MEM, &mr) != 0) {
		panic("video_txt: sys_privctl (ADD_MEM) failed: %d\n", r);
		return NULL;
	}

	/* Map memory */

	video_mem = vm_map_phys(SELF, (void *) mr.mr_base, vram_size);
	buffer = malloc(vram_size);

	if (video_mem == MAP_FAILED) {
		panic("video_txt couldn't map video memory");
		return NULL;
	}

	return video_mem;

}
Esempio n. 6
0
int vg_exit() {
  struct reg86u reg86;

  reg86.u.b.intno = 0x10; /* BIOS video services */

  reg86.u.b.ah = 0x00;    /* Set Video Mode function */
  reg86.u.b.al = 0x03;    /* 80x25 text mode*/

  if( sys_int86(&reg86) != OK ) {
      printf("\tvg_exit(): sys_int86() failed \n");
      return 1;
  } else
      return 0;
}
Esempio n. 7
0
int vg_exit() {
	struct reg86u reg86;

	reg86.u.b.intno = BIOS_VIDEO; /* BIOS video services */

	reg86.u.b.ah = VIDEO; /* Set Video Mode function */
	reg86.u.b.al = SET_TEXT; /* 80x25 text mode*/

	if (sys_int86(&reg86) != OK) {
		printf("\tvg_exit(): sys_int86() failed \n");
		return 1;
	} else {
		return 0;
	}
}
Esempio n. 8
0
PRIVATE int put_pixel(unsigned short x, unsigned short y, unsigned int c) {

    if (x<0 || x>width) return EGFX_OUT_OF_RANGE;
    if (y<0 || y>height) return EGFX_OUT_OF_RANGE;
    if (bpp == 1) c = !!c;

    reg86.u.b.ah = 0x0c;
    reg86.u.b.al = c;
    reg86.u.w.cx = x;
    reg86.u.w.dx = y;
    reg86.u.b.intno = 0x10;
    sys_int86(&reg86);

    return 0;
}
Esempio n. 9
0
File: vbe.c Progetto: vascofg/lcom
int vbe_get_mode_info(unsigned short mode, vbe_mode_info_t *vmi_p) {
  
	struct reg86u registers;
	mmap_t address;

	lm_init();
	lm_alloc(VBE_MODE_INFO_BLOCK_SIZE, &address);
	registers.u.b.ah = 0x4F;
	registers.u.b.al = 0x01;
	registers.u.w.es = PB2BASE(address.phys);
	registers.u.w.di = PB2OFF(address.phys);
	registers.u.b.intno = 0x10;
	registers.u.w.cx = 1 << 14 | mode;
	sys_int86(&registers);
	vbe_unpack_mode_info(address.virtual, vmi_p);
	lm_free(&address);
	return 1;
}
Esempio n. 10
0
void * vg_init(unsigned long mode) {

	struct reg86u r;

	r.u.w.ax = 0x4F02; // VBE call, function 02 -- set VBE mode -- ah:0x4F invoking VBE function, al:0x02 function being called:set VBE mode
	r.u.w.bx = 1<<14|mode; // set bit 14: linear framebuffer
    r.u.b.intno = 0x10;

	if( sys_int86(&r) != OK ) {
		printf("set_vbe_mode: sys_int86() failed \n");
	}

/*
	vbe_mode_info_t info;

	if(vbe_get_mode_info(mode,&info)==1)
		printf("error in vbe_get_mode \n");

	h_res=info.XResolution;
	v_res=info.YResolution;
	bits_per_pixel=info.BitsPerPixel;
	*video_mem=info.PhysBasePtr;*/

	h_res=H_RES;
	v_res=V_RES;
	bits_per_pixel=BITS_PER_PIXEL;
	bytes_per_pixel=bits_per_pixel/8;

	int y;
	struct mem_range mr;
	/* Allow memory mapping */

	mr.mr_base = VRAM_PHYS_ADDR;
	mr.mr_limit = mr.mr_base + h_res*v_res;
	if( OK != (y = sys_privctl(SELF, SYS_PRIV_ADD_MEM, &mr)))
		panic("video_txt: sys_privctl (ADD_MEM) failed: %d\n", y);

	/* Map memory */
	video_mem = vm_map_phys(SELF, (void *)mr.mr_base, h_res*v_res);
	if(video_mem == MAP_FAILED) panic("video_txt couldn't map video memory");

    return NULL;
}
Esempio n. 11
0
PRIVATE int set_mode(gfx_mode_t mode) {
    int x, r;

    for (x=0; mode_list[x].al; x++) {
        if (mode == mode_list[x].mode) break;
    }
    if (mode_list[x].al == 0) return EGFX_UNSUPPORTED_MODE;
    reg86.u.b.ah = 0x00;
    reg86.u.b.al = mode_list[x].al;
    reg86.u.b.intno = 0x10;
    r = sys_int86(&reg86);
    if (r != OK) panic(myname, "BIOS call failed", r);

    current_mode = mode;

    width = mode_list[x].width;
    height = mode_list[x].height;
    bpp = mode_list[x].bpp;

    return 0;
}
Esempio n. 12
0
void * vg_init(unsigned long mode) {

	// -----------------------
	// -Non-Hardcoded Version-
	// -----------------------

	struct reg86u reg86;
	vbe_mode_info_t vmi;
	
	int r;
	struct mem_range mr;

	reg86.u.w.ax = 0x4F02;
	reg86.u.w.bx = 1<<14|mode;
	reg86.u.b.intno = 0x10;

	if(sys_int86(&reg86) != OK) {
		printf("set_vbe_mode: sys_int86() failed\n");
		return NULL;
	}
	else {
		vbe_get_mode_info(mode, &vmi);

		h_res = vmi.XResolution;
		v_res = vmi.YResolution;
		bits_per_pixel = vmi.BitsPerPixel;

		mr.mr_base = vmi.PhysBasePtr;
		mr.mr_limit = mr.mr_base + (h_res * v_res * (bits_per_pixel / 8));
		
		if((r = sys_privctl(SELF, SYS_PRIV_ADD_MEM, &mr)) != OK) {
			panic("vg_init: sys_privctl (ADD_MEM) failed: %d\n", r);
			return NULL;
		}
		else {
			video_mem = vm_map_phys(SELF, (void *)mr.mr_base, (h_res * v_res * (bits_per_pixel / 8)));

			if(video_mem == MAP_FAILED){
				panic("vg_init: Couldn't map video memory!\n");
				return NULL;
			} else
				return video_mem;
		}
	}

	// -------------------
	// -Hardcoded Version-
	// -------------------
	/*
	struct reg86u reg86;
	vbe_mode_info_t vmi;

	int r;
	struct mem_range mr;

	reg86.u.w.ax = 0x4F02;
	reg86.u.w.bx = 1<<14|mode;
	reg86.u.b.intno = 0x10;

	if(sys_int86(&reg86) != OK) {
		printf("set_vbe_mode: sys_int86() failed\n");
		return NULL;
	}
	else {

		h_res = H_RES;
		v_res = V_RES;
		bits_per_pixel = BITS_PER_PIXEL;

		mr.mr_base = VRAM_PHYS_ADDR;
		mr.mr_limit = mr.mr_base + (h_res * v_res * (bits_per_pixel / 8));

		if((r = sys_privctl(SELF, SYS_PRIV_ADD_MEM, &mr)) != OK) {
			panic("vg_init: sys_privctl (ADD_MEM) failed: %d\n", r);
			return NULL;
		}
		else {
			video_mem = vm_map_phys(SELF, (void *)mr.mr_base, (h_res * v_res * (bits_per_pixel / 8)));

			if(video_mem == MAP_FAILED){
				panic("vg_init: Couldn't map video memory!\n");
				return NULL;
			} else
				return video_mem;
		}
	}*/

}
Esempio n. 13
0
void *vg_init(unsigned short mode) {
	vbe_mode_info_t info;
	struct reg86u reg86;
	int r;
	struct mem_range mr;

	reg86.u.b.intno = BIOS_VIDEO_INT; /* BIOS video services */
	reg86.u.w.ax = SET_VBE_MODE; /* Set Video Mode function */
	reg86.u.w.bx = SET_LINEAR_MODE | mode; /* Mode */

	if (sys_int86(&reg86) != OK) { // Sets video mode
		printf("\tvg_init(): sys_int86() failed \n");
		return NULL;
	}

	switch (reg86.u.w.ax) {
	case VBE_FUNC_CALL_FAILED:
		printf("\tvg_init(): sys_int86() function call failed.\n");
		return NULL;
		break;
	case VBE_FUNC_NOT_SUPPORTED:
		printf("\tvg_init(): sys_int86() function not supported.\n");
		return NULL;
		break;
	case VBE_FUNC_INVALID_CUR_MODE:
		printf(
				"\tvg_init(): sys_int86() function invalid in current video mode.\n");
		return NULL;
		break;
	}

	if (lm_init() == NULL) {
		printf("\tvg_init(): lm_init() failed \n");
		return NULL;
	}

	if (vbe_get_mode_info(mode, &info) != OK) { // Gets info
		printf("\tvg_init(): vbe_get_mode_info() failed \n");
		return NULL;
	}

	h_res = info.XResolution;
	v_res = info.YResolution; //Sets global variables
	bits_per_pixel = info.BitsPerPixel;

	//Allow memory mapping

	mr.mr_base = (phys_bytes)(info.PhysBasePtr);
	mr.mr_limit = mr.mr_base
			+ info.XResolution * info.YResolution * info.BitsPerPixel / 8;

	if (OK != (r = sys_privctl(SELF, SYS_PRIV_ADD_MEM, &mr)))
		panic("video_txt: sys_privctl (ADD_MEM) failed: %d\n", r);

	// Map memory

	video_mem = vm_map_phys(SELF, (void *) mr.mr_base,
			info.XResolution * info.YResolution * info.BitsPerPixel / 8);

	double_buffer = malloc(h_res * v_res * sizeof(char));

	/*if(video_mem == MAP_FAILED)
	 panic("video_txt couldn't map video memory");*/

	return video_mem;
}
Esempio n. 14
0
void *vg_init(unsigned short mode)
{
	struct reg86u r;
	vbe_mode_info_t *info = malloc(sizeof(vbe_mode_info_t));

	if (vbe_get_mode_info(mode, info) != 0)
	{
		return NULL;
	}
	h_res=info->XResolution;
	v_res=info->YResolution;
	bits_per_pixel=info->BitsPerPixel;

	printf("%d\n", h_res);

	int erro;
	struct mem_range mr;

	/* Allow memory mapping */

	unsigned int vram_size = h_res * v_res * (bits_per_pixel/8);

	mr.mr_base = (phys_bytes)(info->PhysBasePtr);
	mr.mr_limit = mr.mr_base + vram_size;

	if( OK != (erro = sys_privctl(SELF, SYS_PRIV_ADD_MEM, &mr)))
		panic("video_gr: sys_privctl (ADD_MEM) failed: %d\n", erro);

	/* Map memory */

	video_mem = vm_map_phys(SELF, (void *)mr.mr_base, vram_size);

	if(video_mem == MAP_FAILED)
		panic("video_gr couldn't map video memory");

	r.u.w.ax = SET_MODE; // VBE call, function 02 -- set VBE mode
	r.u.w.bx = BIT(LINEAR_MODEL_BIT)|mode; // set bit 14: linear framebuffer
	r.u.b.intno = BIOS_SERVICE;
	if( sys_int86(&r) != OK ) {
		printf("set_vbe_mode: sys_int86() failed \n");
		return NULL;
	}
	switch(r.u.b.ah){
	case 0x01:
		printf("Function call failed \n");
		return NULL;
		break;
	case 0x02:
		printf("Function is not supported in current HW configuration \n");
		return NULL;
		break;
	case 0x03:
		printf("Function is invalid in current video mode \n");
		return NULL;
		break;
	default:
		break;
	}
	vram_phisical_address = info->PhysBasePtr;
	return video_mem;
}
Esempio n. 15
0
PUBLIC int gfx_ioctl(message *mess) {
    int r;

    switch (mess->REQUEST) {
        case GFX_REQUEST_SET_MODE:
            r = sys_vircopy(mess->IO_ENDPT, D, (vir_bytes) mess->ADDRESS,
                            SELF,           D, (vir_bytes) &mode,
                            sizeof(mode));
            if (r != OK) return EGFX_ERROR;
            if ((driver->modes & mode) == 0) return EGFX_UNSUPPORTED_MODE;
            return driver->set_mode(mode);
            break;
        case GFX_REQUEST_PUT_PIXEL:
            r = sys_vircopy(mess->IO_ENDPT, D, (vir_bytes) mess->ADDRESS,
                            SELF,           D, (vir_bytes) &pixel,
                            sizeof(pixel));
            if (r != OK) return EGFX_ERROR;
            return driver->put_pixel(pixel.x, pixel.y, pixel.c);
            break;
        case GFX_REQUEST_DRAW_LINE:
            r = sys_vircopy(mess->IO_ENDPT, D, (vir_bytes) mess->ADDRESS,
                            SELF,           D, (vir_bytes) &line,
                            sizeof(line));
            if (r != OK) return EGFX_ERROR;
            return driver->draw_line(line.x1, line.y1, line.x2, line.y2, line.c);
            break;
        case GFX_REQUEST_DRAW_LINE_HORI:
            r = sys_vircopy(mess->IO_ENDPT, D, (vir_bytes) mess->ADDRESS,
                            SELF,           D, (vir_bytes) &line,
                            sizeof(line));
            if (r != OK) return EGFX_ERROR;
            return driver->draw_line_hori(line.x1, line.y1, line.x2, line.c);
            break;
        case GFX_REQUEST_DRAW_LINE_VERT:
            r = sys_vircopy(mess->IO_ENDPT, D, (vir_bytes) mess->ADDRESS,
                            SELF,           D, (vir_bytes) &line,
                            sizeof(line));
            if (r != OK) return EGFX_ERROR;
            return driver->draw_line_vert(line.x1, line.y1, line.y2, line.c);
            break;
        case GFX_REQUEST_CLEAR_SCREEN:
            return driver->clear_screen();
        case GFX_REQUEST_DUMP_REGISTERS: {
            vga_registers_t regs;

            dump_registers(&regs);
            r = sys_vircopy(SELF,           D, (vir_bytes) &regs,
                            mess->IO_ENDPT, D, (vir_bytes) mess->ADDRESS,
                            sizeof(regs));
            if (r != OK) return EGFX_ERROR;
            return 0;
            break;
        }
        case GFX_REQUEST_RESET: {
            struct reg86u reg86;

            reg86.u.b.intno = 0x10;
            reg86.u.w.ax = 0x0003;
            r = sys_int86(&reg86);
            if (r != OK) return EGFX_ERROR;
            return 0;
            break;
        }
        case GFX_REQUEST_DRAW_RECT:
            r = sys_vircopy(mess->IO_ENDPT, D, (vir_bytes) mess->ADDRESS,
                            SELF,           D, (vir_bytes) &rect,
                            sizeof(rect));
            if (r != OK) return EGFX_ERROR;
            return driver->draw_rect(rect.x1, rect.y1, rect.x2, rect.y2, rect.c);
            break;
        case GFX_REQUEST_PUT_CHAR:
            r = sys_vircopy(mess->IO_ENDPT, D, (vir_bytes) mess->ADDRESS,
                            SELF,           D, (vir_bytes) &chr,
                            sizeof(chr));
            if (r != OK) return EGFX_ERROR;
            return driver->put_char(chr.x, chr.y, chr.c, chr.chr, chr.f);
            break;
        case GFX_REQUEST_PUT_STRING: {
            unsigned char *s;
            r = sys_vircopy(mess->IO_ENDPT, D, (vir_bytes) mess->ADDRESS,
                            SELF,           D, (vir_bytes) &string,
                            sizeof(string));
            if (r != OK) return EGFX_ERROR;
            s = malloc(string.len);
            if (!s) return EGFX_OUT_OF_MEMORY;
            r = sys_vircopy(mess->IO_ENDPT, D, (vir_bytes) string.s,
                            SELF,           D, (vir_bytes) s,
                            string.len);
            if (r != OK) {
                free(s);
                return EGFX_ERROR;
            }
            r = driver->put_string(string.x, string.y, string.c, s, string.len,
                                   string.f);
            free(s);
            return r;
            break;
        }
        default:
            break;
    }

    return 0;
}