3 \Desc Kernel and Setting.
17 void outPortByte( unsigned short address, unsigned char value );
18 unsigned char inPortByte( unsigned short address );
20 int setPitCounter( int freq, unsigned char counter, unsigned char mode );
22 void clear_state(void);
25 load.S call this function
33 void cstart(unsigned long magic, mbi_t* info)
37 struct MEMMAN *memman=(struct MEMMAN*)MEMMAN_ADDR;
40 scan_code=0; break_flag=0; system_key_code_flag=0;
41 screen=(unsigned short*)0xb8000;//VRam Setting
44 /*Start Set Main Code*/
45 printf("VOSystems Vane Operating System [Version 0.2(build 300)]\n");
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;
54 printOK("Setting IDT.....");
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;
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;
77 gdtr.size = NUM_GDT * sizeof( SEGMENT_DESCRIPTOR );
78 gdtr.base = ( SEGMENT_DESCRIPTOR *)gdt;
81 printOK("Setting GDT.....");
84 printOK("Init PIC.....");
88 printOK("Init Keyboard.....");
90 setPitCounter(100,DEF_PIT_COM_COUNTER0,DEF_PIT_COM_MODE_SQUAREWAVE);
92 printOK("Init PIT.....");
95 memman_free(memman,0x00001000,0x0009e000);
96 memman_free(memman,0x00400000,((info->mem_lower+info->mem_upper)*1024)-0x00400000);
97 printOK("Starting Memory Manager.....");
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.....");
104 if(magic!=MULTIBOOT_BOOTLOADER_MAGIC){
105 printFAIL("Loading Memory Info.....");
108 printOK("Loading Memory Info.....");
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));
115 puts("KernelShell/Root/>");
122 void outPortByte( unsigned short address, unsigned char value )
124 __asm__ __volatile__( "out %%dx, %%al" : : "d"(address), "a"(value) );
127 unsigned char inPortByte( unsigned short address )
131 __asm__ __volatile__( "mov %%dx, %%ax" : : "a"(address) );
132 __asm__ __volatile__( "in %al, %dx" );
133 __asm__ __volatile__( "mov %%bl, %%al" : "=b"(data) );
141 outPortByte( PORT_MASTER_PIC_COMMAND, PIC_ICW1 );
142 outPortByte( PORT_SLAVE_PIC_COMMAND, PIC_ICW1 );
144 outPortByte( PORT_MASTER_PIC_DATA, PIC_MASTER_ICW2 );
145 outPortByte( PORT_SLAVE_PIC_DATA, PIC_SLAVE_ICW2 );
147 outPortByte( PORT_MASTER_PIC_DATA, PIC_MASTER_ICW3 );
148 outPortByte( PORT_SLAVE_PIC_DATA, PIC_SLAVE_ICW3 );
150 outPortByte( PORT_MASTER_PIC_DATA, PIC_MASTER_ICW4 );
151 outPortByte( PORT_SLAVE_PIC_DATA, PIC_SLAVE_ICW4 );
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 );
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 );
163 int setPitCounter( int freq, unsigned char counter, unsigned char mode )
165 unsigned short count;
166 unsigned char command;
168 /* --------------------------------------------------------------------- */
169 /* calculate frequency */
170 /* --------------------------------------------------------------------- */
171 count = ( unsigned short )( DEF_PIT_CLOCK / freq );
173 /* --------------------------------------------------------------------- */
174 /* make initial command */
175 /* --------------------------------------------------------------------- */
176 command = mode | DEF_PIT_COM_RL_DATA | counter;
178 outPortByte( PIT_REG_CONTROL, command );
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 ) );
193 Description :initialize pic
197 /* --------------------------------------------------------------------- */
198 /* set counter0 100Hz */
199 /* --------------------------------------------------------------------- */
200 setPitCounter( 100, DEF_PIT_COM_COUNTER0, DEF_PIT_COM_MODE_SQUAREWAVE );