OSDN Git Service

1f4e672117335b736fbef18b63a8a54247b11391
[vaneos/vaneosmain.git] / bu / boot.c
1 /*!
2         \file boot.c
3         \Desc Kernel and Setting.
4         (C) 2014 VOSystems.
5 */
6
7 #include<multiboot.h>
8 #include<VaneOS.h>
9 #include<KeyBoard.h>
10 #include<Interrupt.h>
11 #include<GDT_IDT.h>
12 #include<stdio.h>
13 #include<scancode.h>
14 #include<memory.h>
15
16 /*PROTOTYPE*/
17 void outPortByte( unsigned short address, unsigned char value );
18 unsigned char inPortByte( unsigned short address );
19 void initPIC( void );
20 int setPitCounter( int freq, unsigned char counter, unsigned char mode );
21 void initPit( void );
22 void clear_state(void);
23
24 /*!
25         load.S call this function
26         
27         Set All & Call shell
28         (C)2014 VOSystems.
29         \create 2014/09/23
30         \update 2014/09/27
31         \author 2m
32 */
33 void cstart(unsigned long magic, mbi_t* info)
34 {
35         /*Common Settings*/
36         char cmd[100]={0};
37         struct MEMMAN *memman=(struct MEMMAN*)MEMMAN_ADDR;
38         
39         ClearScreen();
40         scan_code=0; break_flag=0;      system_key_code_flag=0;
41         screen=(unsigned short*)0xb8000;//VRam Setting
42         attr=WHITE;
43         
44         /*Start Set Main Code*/
45         printf("VOSystems Vane Operating System  [Version 0.2(build 300)]\n");
46         
47         /*Setting IDT*/
48         setupInterruptGate(DEF_IDT_INT_NUM_IRQ1,KeyBoard_Interrupt_asm);//Register Keyboard interrupt handler
49         setupInterruptGate(DEF_IDT_INT_NUM_IRQ0,Timer_Interrupt_asm);//Register Timer interrupt handler
50         idtr.size       = NUM_IDT * sizeof( GATE_DESCRIPTOR );
51         idtr.base       = ( GATE_DESCRIPTOR *)idt;
52         
53         load_idt();
54         printOK("Setting IDT.....");
55         
56         /*Setting GDT*/
57         /*set up null descriptor*/
58         gdt[NULL_DESCRIPTOR].limitLo    = DEF_GDT_NULL_LIMIT;
59         gdt[NULL_DESCRIPTOR].baseLo             = DEF_GDT_NULL_BASELO;
60         gdt[NULL_DESCRIPTOR].baseMid    = DEF_GDT_NULL_BASEMID;
61         gdt[NULL_DESCRIPTOR].flags              = DEF_GDT_NULL_FLAGS;
62         gdt[NULL_DESCRIPTOR].baseHi             = DEF_GDT_NULL_BASEHI;
63         /* set up code descriptor */
64         gdt[CODE_DESCRIPTOR].limitLo    = DEF_GDT_CODE_LIMIT;
65         gdt[CODE_DESCRIPTOR].baseLo             = DEF_GDT_CODE_BASELO;
66         gdt[CODE_DESCRIPTOR].baseMid    = DEF_GDT_CODE_BASEMID;
67         gdt[CODE_DESCRIPTOR].flags              = DEF_GDT_CODE_FLAGS;
68         gdt[CODE_DESCRIPTOR].baseHi             = DEF_GDT_CODE_BASEHI;
69
70         /* set up data descriptor */
71         gdt[DATA_DESCRIPTOR].limitLo    = DEF_GDT_DATA_LIMIT;
72         gdt[DATA_DESCRIPTOR].baseLo             = DEF_GDT_DATA_BASELO;
73         gdt[DATA_DESCRIPTOR].baseMid    = DEF_GDT_DATA_BASEMID;
74         gdt[DATA_DESCRIPTOR].flags              = DEF_GDT_DATA_FLAGS;
75         gdt[DATA_DESCRIPTOR].baseHi             = DEF_GDT_DATA_BASEHI;
76         
77         gdtr.size       = NUM_GDT * sizeof( SEGMENT_DESCRIPTOR );
78         gdtr.base       = ( SEGMENT_DESCRIPTOR *)gdt;
79         
80         load_gdt();
81         printOK("Setting GDT.....");
82                 
83         initPIC();
84         printOK("Init PIC.....");
85         
86         initKeyboard();
87         keyboardEnableKBD();
88         printOK("Init Keyboard.....");
89         
90         setPitCounter(100,DEF_PIT_COM_COUNTER0,DEF_PIT_COM_MODE_SQUAREWAVE);
91         initPit();
92         printOK("Init PIT.....");
93         
94         memman_init(memman);
95         memman_free(memman,0x00001000,0x0009e000);
96         memman_free(memman,0x00400000,((info->mem_lower+info->mem_upper)*1024)-0x00400000);
97         printOK("Starting Memory Manager.....");
98         
99         unsigned int info->
100         int* fat=(int*)memman_alloc_4k(memman,4*2880);
101         file_readfat(fat,(unsigned char*)(ADR_DISKIMG+0x000200));
102         printOK("Loading FAT File System.....");
103         
104         if(magic!=MULTIBOOT_BOOTLOADER_MAGIC){
105                 printFAIL("Loading Memory Info.....");
106                 
107         }else{
108                 printOK("Loading Memory Info.....");
109                 
110         }
111         printf("\nLowMemory = %d KiB , UpperMemory = %d KiB , TotalMemory = %d MiB\n\n",info->mem_lower,
112                 info->mem_upper,(info->mem_lower+info->mem_upper+1024)/1024);
113         printf("Free Memory = %d MiB\n",memman_total(memman)/(1024*1024));
114         
115         puts("KernelShell/Root/>");
116         scanf("%s",&cmd);
117         printf("%s",cmd);
118         while(1);
119         return;
120 }
121
122 void outPortByte( unsigned short address, unsigned char value )
123 {
124         __asm__ __volatile__( "out %%dx, %%al" : : "d"(address), "a"(value) );
125 }
126
127 unsigned char inPortByte( unsigned short address )
128 {
129         unsigned char data;
130
131         __asm__ __volatile__( "mov %%dx, %%ax" : : "a"(address) );
132         __asm__ __volatile__( "in %al, %dx" );
133         __asm__ __volatile__( "mov %%bl, %%al" : "=b"(data) );
134         return( data );
135 }
136
137 void initPIC( void )
138 {
139         disable();
140         
141         outPortByte( PORT_MASTER_PIC_COMMAND,   PIC_ICW1        );
142         outPortByte( PORT_SLAVE_PIC_COMMAND,    PIC_ICW1        );
143
144         outPortByte( PORT_MASTER_PIC_DATA,      PIC_MASTER_ICW2 );
145         outPortByte( PORT_SLAVE_PIC_DATA,       PIC_SLAVE_ICW2  );
146
147         outPortByte( PORT_MASTER_PIC_DATA,      PIC_MASTER_ICW3 );
148         outPortByte( PORT_SLAVE_PIC_DATA,       PIC_SLAVE_ICW3  );
149
150         outPortByte( PORT_MASTER_PIC_DATA,      PIC_MASTER_ICW4 );
151         outPortByte( PORT_SLAVE_PIC_DATA,       PIC_SLAVE_ICW4  );
152         
153         outPortByte( PORT_MASTER_PIC_IMR, (~PIC_IMR_MASK_IRQ0) & (~PIC_IMR_MASK_IRQ2 )  );
154         outPortByte( PORT_SLAVE_PIC_IMR, PIC_IMR_MASK_IRQ_ALL                           );
155         
156     outPortByte( PORT_MASTER_PIC_IMR, ( ~PIC_IMR_MASK_IRQ0 )
157                  & ( ~PIC_IMR_MASK_IRQ1 ) & ( ~PIC_IMR_MASK_IRQ2 ) );
158     outPortByte( PORT_SLAVE_PIC_IMR, PIC_IMR_MASK_IRQ_ALL          );
159     
160     enable();
161 }
162
163 int setPitCounter( int freq, unsigned char counter, unsigned char mode )
164 {
165         unsigned short  count;
166         unsigned char   command;
167
168         /* --------------------------------------------------------------------- */
169         /*      calculate frequency                                              */
170         /* --------------------------------------------------------------------- */
171         count = ( unsigned short )( DEF_PIT_CLOCK / freq );
172
173         /* --------------------------------------------------------------------- */
174         /*      make initial command                                             */
175         /* --------------------------------------------------------------------- */
176         command = mode | DEF_PIT_COM_RL_DATA | counter;
177
178         outPortByte( PIT_REG_CONTROL, command );
179
180         /* --------------------------------------------------------------------- */
181         /*      send counter value                                               */
182         /* --------------------------------------------------------------------- */
183         outPortByte( PIT_REG_COUNTER0, ( unsigned char )( count & 0xFF          ) );
184         outPortByte( PIT_REG_COUNTER0, ( unsigned char )( ( count >> 8 ) & 0xFF ) );
185 }
186
187 /*
188         Funtion     :initPit
189         Input       :void
190         Output      :void
191         Return      :void 
192
193         Description :initialize pic
194 */
195 void initPit( void )
196 {
197         /* --------------------------------------------------------------------- */
198         /*      set counter0 100Hz                                               */
199         /* --------------------------------------------------------------------- */
200         setPitCounter( 100, DEF_PIT_COM_COUNTER0,  DEF_PIT_COM_MODE_SQUAREWAVE );
201 }