Changeset 22cf454d in mainline


Ignore:
Timestamp:
2006-05-05T10:32:21Z (19 years ago)
Author:
Jakub Vana <jakub.vana@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
e3c762cd
Parents:
bdc5c516
Message:

ia32 VESA FB support

Files:
2 added
8 edited

Legend:

Unmodified
Added
Removed
  • Makefile

    rbdc5c516 r22cf454d  
    8181ifeq ($(CONFIG_VHPT),y)
    8282        DEFS += -DCONFIG_VHPT
     83endif
     84ifeq ($(CONFIG_FB),y)
     85        DEFS += -DCONFIG_VESA_WIDTH=$(CONFIG_VESA_WIDTH)
     86        DEFS += -DCONFIG_VESA_HEIGHT=$(CONFIG_VESA_HEIGHT)
     87        DEFS += -DCONFIG_VESA_BPP=$(CONFIG_VESA_BPP)
    8388endif
    8489
  • arch/ia32/Makefile.inc

    rbdc5c516 r22cf454d  
    137137        arch/$(ARCH)/src/drivers/i8259.c \
    138138        arch/$(ARCH)/src/drivers/ega.c \
     139        arch/$(ARCH)/src/drivers/vesa.c \
    139140        arch/$(ARCH)/src/boot/boot.S \
    140141        arch/$(ARCH)/src/fpu_context.c \
  • arch/ia32/include/pm.h

    rbdc5c516 r22cf454d  
    3131
    3232#define IDT_ITEMS 64
    33 #define GDT_ITEMS 7
     33#define GDT_ITEMS 8
     34
     35#define VESA_INIT_SEGMENT 0x8000
    3436
    3537#define NULL_DES        0
     
    4042#define TSS_DES         5
    4143#define TLS_DES         6 /* Pointer to Thread-Local-Storage data */
     44#define VESA_INIT_DES 7
    4245
    4346#define selector(des)   ((des)<<3)
  • arch/ia32/src/boot/boot.S

    rbdc5c516 r22cf454d  
    3535#define START_STACK (BOOT_OFFSET - BOOT_STACK_SIZE)
    3636
     37
     38
     39
     40
     41
     42
     43
     44
    3745.section K_TEXT_START, "ax"
    3846
     
    6977        pushl %ebx                                                      # save parameters from GRUB
    7078        pushl %eax
     79
     80#ifdef CONFIG_FB
     81        mov $vesa_init,%esi;
     82        mov $VESA_INIT_SEGMENT<<4,%edi;
     83        mov $e_vesa_init-vesa_init,%ecx;
     84        cld;
     85        rep movsb;
     86
     87        mov $VESA_INIT_SEGMENT<<4,%edi;
     88        call *%edi;
     89        mov %esi,KA2PA(vesa_ph_addr);
     90        mov %di,KA2PA(vesa_height);
     91        shr $16,%edi;
     92        mov %di,KA2PA(vesa_width);
     93        mov %bx,KA2PA(vesa_scanline);
     94        shr $16,%ebx;
     95        mov %bx,KA2PA(vesa_bpp);
     96#endif 
    7197       
    7298        call map_kernel                                                 # map kernel and turn paging on
     
    231257        ret
    232258
     259#ifdef CONFIG_FB
     260vesa_init:
     261        jmp $selector(VESA_INIT_DES),$vesa_init_real-vesa_init;
     262.code16
     263vesa_init_real:
     264
     265        mov %cr0,%eax;
     266        and $~1,%eax;
     267        mov %eax,%cr0;
     268
     269
     270        jmp $VESA_INIT_SEGMENT,$vesa_init_real2-vesa_init;
     271
     272vesa_init_real2:       
     273
     274
     275        mov %esp,%ebp;
     276        mov %ss,%cx;
     277        mov $VESA_INIT_SEGMENT,%bx;
     278        mov %bx,%ss;
     279        mov $0x0000fffc,%esp;
     280        push %ds;
     281        push %es;
     282        push %fs;
     283        push %gs;
     284        push %ebp;
     285        push %cx;
     286
     287        mov %bx,%ds;
     288        mov %bx,%es;
     289        mov %bx,%fs;
     290        mov %bx,%gs;
     291
     292       
     293        mov $vesa_idt-vesa_init,%ebx;
     294        lidtl (%ebx);
     295
     296#define VESA_INFO_SIZE 1024
     297
     298#define VESA_MODE_LIST_PTR_OFFSET 14
     299#define VESA_MODE_WIDTH_OFFSET 18
     300#define VESA_MODE_HEIGHT_OFFSET 20
     301#define VESA_MODE_BPP_OFFSET 25
     302#define VESA_MODE_SCANLINE_OFFSET 16
     303#define VESA_MODE_PHADDR_OFFSET 40
     304
     305#define VESA_END_OF_MODES 0xffff
     306
     307#define VESA_OK 0x4f
     308
     309#define VESA_GET_INFO 0x4f00
     310#define VESA_GET_MODE_INFO 0x4f01
     311#define VESA_SET_MODE 0x4f02
     312
     313#define CONFIG_VESA_BPP_a 255
     314
     315#if CONFIG_VESA_BPP==24
     316#undef CONFIG_VESA_BPP_a
     317#define CONFIG_VESA_BPP_a 32
     318#endif
     319
     320
     321        mov $VESA_GET_INFO,%ax;
     322        mov $e_vesa_init-vesa_init,%di
     323        push %di;
     324        int $0x10;     
     325        pop %di;
     326        cmp $VESA_OK,%al;
     327        jnz 0f;
     328        mov 2+VESA_MODE_LIST_PTR_OFFSET(%di),%si;
     329        mov %si,%gs;
     330        mov VESA_MODE_LIST_PTR_OFFSET(%di),%si;
     331
     332        add $VESA_INFO_SIZE,%di;
     333
     3341:# Try next mode
     335        mov %gs:(%si),%cx;
     336        cmp $VESA_END_OF_MODES,%cx;
     337        jz 0f;
     338        inc %si;
     339        inc %si;
     340        push %cx;
     341        push %di;
     342        push %si;
     343        mov $VESA_GET_MODE_INFO,%ax;
     344        int $0x10;
     345        pop %si;
     346        pop %di;
     347        pop %cx;
     348        cmp $VESA_OK,%al;
     349        jnz 0f;
     350
     351
     352        mov $CONFIG_VESA_WIDTH,%ax;
     353        cmp VESA_MODE_WIDTH_OFFSET(%di),%ax;
     354        jnz 1b;
     355        mov $CONFIG_VESA_HEIGHT,%ax;
     356        cmp VESA_MODE_HEIGHT_OFFSET(%di),%ax;
     357        jnz 1b;
     358        mov $CONFIG_VESA_BPP,%al;
     359        cmp VESA_MODE_BPP_OFFSET(%di),%al;
     360        jz 2f;
     361        mov $CONFIG_VESA_BPP_a,%al;
     362        cmp VESA_MODE_BPP_OFFSET(%di),%al;
     363        jnz 1b;
     364
     3652:
     366
     367        mov %cx,%bx;
     368        or $0xC000,%bx;
     369        push %di;
     370        mov $VESA_SET_MODE,%ax;
     371        int $0x10;
     372        pop %di;
     373        cmp $VESA_OK,%al;
     374        jnz 0f;
     375       
     376        mov VESA_MODE_PHADDR_OFFSET(%di),%esi;
     377        mov VESA_MODE_WIDTH_OFFSET(%di),%ax;
     378        shl $16,%eax;
     379        mov VESA_MODE_HEIGHT_OFFSET(%di),%ax;
     380        mov VESA_MODE_BPP_OFFSET(%di),%bl;
     381        xor %bh,%bh;
     382        shl $16,%ebx;
     383        mov VESA_MODE_SCANLINE_OFFSET(%di),%bx;
     384        mov %eax,%edi;
     385       
     386       
     387
     3888:     
     389
     390        mov %cr0,%eax;
     391        or $1,%eax;
     392        mov %eax,%cr0;
     393
     394        jmp 9f;
     3959:
     396
     397        pop %cx;
     398        pop %ebp;
     399        pop %gs;
     400        pop %fs;
     401        pop %es;
     402        pop %ds;
     403        mov %cx,%ss;
     404        mov %ebp,%esp;
     405
     406        ljmpl $KTEXT,$(vesa_init_protect-vesa_init+VESA_INIT_SEGMENT<<4);
     407
     408vesa_init_protect:     
     409.code32
     410        ret;
     411
     4120:      #Error no Prefered mode found
     413
     414        mov $0x111,%cx;
     415        push %di;
     416        push %cx;
     417        mov $VESA_GET_MODE_INFO,%ax;
     418        int $0x10;
     419        pop %cx;
     420        pop %di;
     421        cmp $VESA_OK,%al;
     422        jnz 1f;
     423        jmp 2b;
     424
     4251:mov $0x0003,%ax;
     426        int $0x10;
     427        mov $0xffffffff,%edi; /* EGA text mode used, because of problems with VESA */
     428        jmp 8;
     429
     430
     431vesa_idt:
     432.word 0x03ff
     433.long 0
     434.align 4
     435e_vesa_init:
     436#endif 
     437
     438
    233439
    234440.section K_DATA_START, "aw", @progbits
     441
     442
    235443
    236444.align 4096
  • arch/ia32/src/ia32.c

    rbdc5c516 r22cf454d  
    3535
    3636#include <arch/ega.h>
     37#include <arch/vesa.h>
    3738#include <genarch/i8042/i8042.h>
    3839#include <arch/i8254.h>
     
    7677{
    7778        if (config.cpu_active == 1) {
     79
     80#ifdef CONFIG_FB
     81                if (vesa_present()) vesa_init();
     82                else
     83#endif
    7884                ega_init();     /* video */
     85               
     86               
    7987                /* Enable debugger */
    8088                debugger_init();
  • arch/ia32/src/pm.c

    rbdc5c516 r22cf454d  
    6767        { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    6868        /* TLS descriptor */
    69         { 0xffff, 0, 0, AR_PRESENT | AR_DATA | AR_WRITABLE | DPL_USER, 0xf, 0, 0, 1, 1, 0 }
     69        { 0xffff, 0, 0, AR_PRESENT | AR_DATA | AR_WRITABLE | DPL_USER, 0xf, 0, 0, 1, 1, 0 },
     70        /* VESA Init descriptor */
     71        { 0xffff, 0, VESA_INIT_SEGMENT>>12, AR_PRESENT | AR_CODE | DPL_KERNEL, 0xf, 0, 0, 0, 0, 0 },
     72       
    7073};
    7174
  • genarch/src/fb/fb.c

    rbdc5c516 r22cf454d  
    238238static void fb_putchar(chardev_t *dev, char ch)
    239239{
    240         spinlock_lock(&fb->lock);
     240        spinlock_lock(&fb_lock);
    241241       
    242242        switch (ch) {
     
    274274        invert_cursor();
    275275       
    276         spinlock_unlock(&fb->lock);
     276        spinlock_unlock(&fb_lock);
    277277}
    278278
  • kernel.config

    rbdc5c516 r22cf454d  
    4747
    4848# Framebuffer support
    49 ! [(ARCH=mips32&MIPS_MACHINE=lgxemul)|(ARCH=mips32&MIPS_MACHINE=bgxemul)] CONFIG_FB (y/n)
     49! [(ARCH=mips32&MIPS_MACHINE=lgxemul)|(ARCH=mips32&MIPS_MACHINE=bgxemul)|(ARCH=ia32)|(ARCH=amd64)] CONFIG_FB (y/n)
     50
     51# Framebuffer width
     52@ "320"
     53@ "640"
     54@ "800"
     55@ "1024"
     56@ "1280"
     57@ "1600"
     58@ "2048"
     59! [(ARCH=ia32|ARCH=amd64)&CONFIG_FB=y] CONFIG_VESA_WIDTH (choice)
     60
     61# Framebuffer height
     62@ "200"
     63@ "240"
     64@ "400"
     65@ "480"
     66@ "600"
     67@ "768"
     68@ "1024"
     69@ "1200"
     70@ "1536"
     71! [(ARCH=ia32|ARCH=amd64)&CONFIG_FB=y] CONFIG_VESA_HEIGHT (choice)
     72
     73# Framebuffer depth
     74@ "8"
     75@ "16"
     76@ "24"
     77! [(ARCH=ia32|ARCH=amd64)&CONFIG_FB=y] CONFIG_VESA_BPP (choice)
     78
     79
    5080
    5181# Support for SMP
Note: See TracChangeset for help on using the changeset viewer.