Changeset 323a5aaf in mainline
- Timestamp:
- 2008-11-30T12:17:56Z (16 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 0ad9e47
- Parents:
- 57e76cb
- Files:
-
- 4 added
- 11 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/Makefile
r57e76cb r323a5aaf 127 127 endif 128 128 129 ifeq ($(CONFIG_I8042_INTERRUPT_DRIVEN),y) 130 DEFS += -DCONFIG_I8042_INTERRUPT_DRIVEN 131 endif 132 129 133 ifeq ($(CONFIG_NS16550_INTERRUPT_DRIVEN),y) 130 134 DEFS += -DCONFIG_NS16550_INTERRUPT_DRIVEN 135 endif 136 137 ifeq ($(CONFIG_IOSAPIC),y) 138 DEFS += -DCONFIG_IOSAPIC 131 139 endif 132 140 -
kernel/arch/ia64/include/interrupt.h
r57e76cb r323a5aaf 57 57 #define IRQ_MOUSE 252 58 58 #define INTERRUPT_SPURIOUS 15 59 #define LAGACY_INTERRUPT_BASE 0x20 59 60 60 61 /** General Exception codes. */ … … 153 154 extern void disabled_fp_register(uint64_t vector, istate_t *istate); 154 155 156 155 157 #endif 156 158 -
kernel/arch/ia64/src/drivers/ega.c
r57e76cb r323a5aaf 95 95 sysinfo_set_item_val("fb.width", NULL, ROW); 96 96 sysinfo_set_item_val("fb.height", NULL, ROWS); 97 sysinfo_set_item_val("fb.blinking", NULL, true); 97 98 sysinfo_set_item_val("fb.address.physical", NULL, VIDEORAM & 0xffffffff); 98 99 -
kernel/arch/ia64/src/ia64.c
r57e76cb r323a5aaf 64 64 65 65 /*NS16550 as a COM 1*/ 66 #define NS16550_IRQ 466 #define NS16550_IRQ (4+LAGACY_INTERRUPT_BASE) 67 67 #define NS16550_PORT 0x3f8 68 68 69 69 bootinfo_t *bootinfo; 70 71 static uint64_t iosapic_base=0xfec00000; 70 72 71 73 void arch_pre_main(void) … … 112 114 } 113 115 116 static void iosapic_init(void) 117 { 118 119 uint64_t IOSAPIC = PA2KA((unative_t)(iosapic_base))|FW_OFFSET; 120 int i; 121 122 123 for(i=0;i<16;i++) 124 { 125 126 if(i==2) continue; //Disable Cascade interrupt 127 ((uint32_t*)(IOSAPIC+0x00))[0]=0x10+2*i; 128 srlz_d(); 129 ((uint32_t*)(IOSAPIC+0x10))[0]=LAGACY_INTERRUPT_BASE+i; 130 srlz_d(); 131 ((uint32_t*)(IOSAPIC+0x00))[0]=0x10+2*i+1; 132 srlz_d(); 133 ((uint32_t*)(IOSAPIC+0x10))[0]=1<<(56-32); 134 srlz_d(); 135 } 136 137 } 138 139 114 140 void arch_post_mm_init(void) 115 141 { 116 142 if(config.cpu_active==1) 117 143 { 144 iosapic_init(); 145 118 146 irq_init(INR_COUNT, INR_COUNT); 119 147 #ifdef SKI … … 123 151 #endif 124 152 } 125 it_init(); 153 it_init(); 154 126 155 } 127 156 … … 143 172 i8042_poll(); 144 173 #ifdef CONFIG_NS16550 174 #ifndef CONFIG_NS16550_INTERRUPT_DRIVEN 145 175 ns16550_poll(); 176 #endif 146 177 #endif 147 178 thread_usleep(POLL_INTERVAL); … … 149 180 } 150 181 #endif 182 183 184 static void end_of_irq_void(void *cir_arg __attribute__((unused)),inr_t inr __attribute__((unused))) 185 { 186 return; 187 } 188 151 189 152 190 void arch_post_smp_init(void) … … 172 210 173 211 #ifdef CONFIG_NS16550 174 ns16550_init(kbd, NS16550_IRQ, NS16550_PORT ); // as a COM 1212 ns16550_init(kbd, NS16550_IRQ, NS16550_PORT,end_of_irq_void,NULL); // as a COM 1 175 213 #else 176 214 #endif … … 188 226 sysinfo_set_item_val("ia64_iospace.address", NULL, true); 189 227 sysinfo_set_item_val("ia64_iospace.address.virtual", NULL, IO_OFFSET); 228 229 230 231 190 232 191 233 } … … 238 280 #ifdef SKI 239 281 ski_kbd_grab(); 282 #else 283 i8042_grab(); 284 #ifdef CONFIG_NS16550 285 ns16550_grab(); 286 #endif 287 240 288 #endif 241 289 } … … 247 295 #ifdef SKI 248 296 ski_kbd_release(); 297 i8042_release(); 298 #else 299 #ifdef CONFIG_NS16550 300 ns16550_release(); 301 #endif 302 249 303 #endif 250 304 } -
kernel/arch/ia64/src/interrupt.c
r57e76cb r323a5aaf 236 236 } 237 237 238 static void end_of_local_irq( )238 static void end_of_local_irq(void) 239 239 { 240 240 asm volatile ("mov cr.eoi=r0;;"); … … 244 244 void external_interrupt(uint64_t vector, istate_t *istate) 245 245 { 246 irq_t *irq;247 246 cr_ivr_t ivr; 248 247 … … 250 249 srlz_d(); 251 250 252 irq = irq_dispatch_and_lock(ivr.vector);253 if (irq) {254 irq->handler(irq, irq->arg);255 spinlock_unlock(&irq->lock);256 } else {257 251 switch (ivr.vector) { 258 252 case INTERRUPT_SPURIOUS: … … 271 265 272 266 default: 273 panic("\nUnhandled External Interrupt Vector %d\n", 274 ivr.vector); 267 { 268 269 int ack=false; 270 irq_t *irq = irq_dispatch_and_lock(ivr.vector); 271 if (irq) { 272 /* 273 * The IRQ handler was found. 274 */ 275 276 if (irq->preack) { 277 /* Send EOI before processing the interrupt */ 278 end_of_local_irq(); 279 ack=true; 280 } 281 irq->handler(irq, irq->arg); 282 spinlock_unlock(&irq->lock); 283 } else { 284 /* 285 * Unhandled interrupt. 286 */ 287 end_of_local_irq(); 288 ack=true; 289 #ifdef CONFIG_DEBUG 290 printf("\nUnhandled External Interrupt Vector %d\n",ivr.vector); 291 #endif 292 } 293 if(!ack) end_of_local_irq(); 294 295 } 296 297 275 298 break; 276 299 } 277 }278 300 } 279 301 -
kernel/arch/ia64/src/ski/ski.c
r57e76cb r323a5aaf 45 45 #include <synch/spinlock.h> 46 46 #include <arch/asm.h> 47 #include <drivers/kbd.h> 47 48 48 49 #define SKI_KBD_INR 0 … … 228 229 sysinfo_set_item_val("kbd.inr", NULL, SKI_KBD_INR); 229 230 sysinfo_set_item_val("kbd.devno", NULL, ski_kbd_devno); 231 sysinfo_set_item_val("kbd.type", NULL, KBD_SKI); 230 232 } 231 233 -
kernel/genarch/src/kbd/ns16550.c
r57e76cb r323a5aaf 39 39 #include <genarch/kbd/scanc.h> 40 40 #include <genarch/kbd/scanc_sun.h> 41 #include <arch/drivers/kbd.h> 41 42 #ifndef ia64 42 #include <arch/drivers/kbd.h>43 43 #include <arch/drivers/ns16550.h> 44 44 #endif … … 131 131 ns16550_irq.cir_arg = cir_arg; 132 132 irq_register(&ns16550_irq); 133 134 135 while ((ns16550_lsr_read(&ns16550) & LSR_DATA_READY)) 136 ns16550_rbr_read(&ns16550); 137 133 138 134 139 sysinfo_set_item_val("kbd", NULL, true); 135 #ifndef ia64136 140 sysinfo_set_item_val("kbd.type", NULL, KBD_NS16550); 137 #endif138 141 sysinfo_set_item_val("kbd.devno", NULL, devno); 139 142 sysinfo_set_item_val("kbd.inr", NULL, inr); 140 143 sysinfo_set_item_val("kbd.address.virtual", NULL, port); 144 sysinfo_set_item_val("kbd.port", NULL, port); 141 145 142 146 #ifdef CONFIG_NS16550_INTERRUPT_DRIVEN … … 148 152 #ifdef ia64 149 153 uint8_t c; 154 // This switches rbr & ier to mode when accept baudrate constant 150 155 c = ns16550_lcr_read(&ns16550); 151 156 ns16550_lcr_write(&ns16550, 0x80 | c); -
kernel/generic/src/ipc/irq.c
r57e76cb r323a5aaf 101 101 code->cmds[i].value; 102 102 break; 103 #if defined(ia32) || defined(amd64) 103 #if defined(ia32) || defined(amd64) || defined(ia64) 104 104 case CMD_PORT_READ_1: 105 105 dstval = inb((long) code->cmds[i].addr); -
kernel/kernel.config
r57e76cb r323a5aaf 142 142 ! [ARCH=sparc64|ARCH=ia64] CONFIG_NS16550 (y/n) 143 143 144 # IOSapic on default address support (including legacy IRQ) 145 ! [ARCH=ia64] CONFIG_IOSAPIC (y/n) 146 147 # Interrupt-driven driver for Legacy Keyboard? 148 ! [CONFIG_IOSAPIC=y] CONFIG_I8042_INTERRUPT_DRIVEN (y/n) 149 144 150 # Interrupt-driven driver for NS16550? 145 ! [CONFIG_NS16550=y ] CONFIG_NS16550_INTERRUPT_DRIVEN (n/y)151 ! [CONFIG_NS16550=y&((ARCH!=ia64)|CONFIG_IOSAPIC=y)] CONFIG_NS16550_INTERRUPT_DRIVEN (y/n) 146 152 147 153 # Virtually indexed D-cache support -
uspace/srv/fb/ega.c
r57e76cb r323a5aaf 65 65 #define EGA_IO_SIZE 2 66 66 67 #define NORMAL_COLOR 0x0f 68 #define INVERTED_COLOR 0xf0 67 int ega_normal_color=0x0f; 68 int ega_inverted_color=0xf0; 69 70 #define NORMAL_COLOR ega_normal_color 71 #define INVERTED_COLOR ega_inverted_color 69 72 70 73 #define EGA_STYLE(fg,bg) ((fg) > (bg) ? NORMAL_COLOR : INVERTED_COLOR) … … 77 80 static char *scr_addr; 78 81 79 static unsigned int style = NORMAL_COLOR;82 static unsigned int style; 80 83 81 84 static void clrscr(void) … … 313 316 scr_width = sysinfo_value("fb.width"); 314 317 scr_height = sysinfo_value("fb.height"); 318 if(sysinfo_value("fb.blinking")) 319 { 320 ega_normal_color&=0x77; 321 ega_inverted_color&=0x77; 322 } 323 style = NORMAL_COLOR; 324 315 325 iospace_enable(task_get_id(), (void *) EGA_IO_ADDRESS, 2); 316 326 -
uspace/srv/kbd/arch/ia64/src/kbd.c
r57e76cb r323a5aaf 40 40 #include <kbd.h> 41 41 #include <keys.h> 42 #include <stdio.h> 43 #include <stdlib.h> 44 45 #include <unistd.h> 46 #include <align.h> 47 #include <async.h> 48 #include <ipc/ipc.h> 49 #include <errno.h> 50 #include <stdio.h> 51 #include <ddi.h> 52 #include <sysinfo.h> 53 #include <as.h> 54 #include <ipc/fb.h> 55 #include <ipc/ipc.h> 56 #include <ipc/ns.h> 57 #include <ipc/services.h> 58 #include <libarch/ddi.h> 59 42 60 43 61 #define KEY_F1 0x504f1b … … 54 72 #define KEY_F12 0x7e34325b1b 55 73 74 75 76 77 #define NSKEY_F1 0x415b5b1b 78 #define NSKEY_F2 0x425b5b1b 79 #define NSKEY_F3 0x435b5b1b 80 #define NSKEY_F4 0x445b5b1b 81 #define NSKEY_F5 0x455b5b1b 82 #define NSKEY_F6 0x37315b1b 83 #define NSKEY_F7 0x38315b1b 84 #define NSKEY_F8 0x39315b1b 85 #define NSKEY_F9 0x30325b1b 86 #define NSKEY_F10 0x31325b1b 87 #define NSKEY_F11 0x33325b1b 88 #define NSKEY_F12 0x34325b1b 89 90 56 91 #define FUNCTION_KEYS 0x100 92 93 94 #define KBD_SKI 1 95 #define KBD_LEGACY 2 96 #define KBD_NS16550 3 97 98 99 100 101 /* NS16550 registers */ 102 #define RBR_REG 0 /** Receiver Buffer Register. */ 103 #define IER_REG 1 /** Interrupt Enable Register. */ 104 #define IIR_REG 2 /** Interrupt Ident Register (read). */ 105 #define FCR_REG 2 /** FIFO control register (write). */ 106 #define LCR_REG 3 /** Line Control register. */ 107 #define MCR_REG 4 /** Modem Control Register. */ 108 #define LSR_REG 5 /** Line Status Register. */ 109 110 111 57 112 58 113 irq_cmd_t ski_cmds[1] = { … … 65 120 }; 66 121 122 123 124 irq_cmd_t ns16550_cmds[1] = { 125 { CMD_PORT_READ_1, 0, 0, 2 }, 126 }; 127 128 irq_code_t ns16550_kbd = { 129 1, 130 ns16550_cmds 131 }; 132 133 134 uint16_t ns16550_port; 135 136 int kbd_type; 137 67 138 int kbd_arch_init(void) 68 139 { 69 140 if (sysinfo_value("kbd")) { 70 ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &ski_kbd); 141 kbd_type=sysinfo_value("kbd.type"); 142 if(kbd_type==KBD_SKI) ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &ski_kbd); 143 if(kbd_type==KBD_NS16550) { 144 ns16550_kbd.cmds[0].addr= (void *) (sysinfo_value("kbd.port")+RBR_REG); 145 ipc_register_irq(sysinfo_value("kbd.inr"), sysinfo_value("kbd.devno"), 0, &ns16550_kbd); 146 iospace_enable(task_get_id(),ns16550_port=sysinfo_value("kbd.port"),8); 147 } 71 148 return 0; 72 149 } … … 82 159 } 83 160 */ 84 85 int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call) 161 #define LSR_DATA_READY 0x01 162 163 int kbd_ns16550_process(keybuffer_t *keybuffer, ipc_call_t *call) 164 { 165 static unsigned long buf = 0; 166 static int count = 0, esc_count=0; 167 168 int scan_code = IPC_GET_ARG2(*call); 169 170 if (scan_code == 0x1b) { 171 esc_count++; 172 if (esc_count == 3) { 173 __SYSCALL0(SYS_DEBUG_ENABLE_CONSOLE); 174 } 175 } else { 176 esc_count = 0; 177 } 178 179 if(scan_code==0x0d) return 1; //Delete CR 180 181 if(scan_code == 0x7e) { 182 switch (buf) { 183 case NSKEY_F6: 184 keybuffer_push(keybuffer,FUNCTION_KEYS | 6); 185 buf = count = 0; 186 return 1; 187 case NSKEY_F7: 188 keybuffer_push(keybuffer,FUNCTION_KEYS | 7); 189 buf = count = 0; 190 return 1; 191 case NSKEY_F8: 192 keybuffer_push(keybuffer,FUNCTION_KEYS | 8); 193 buf = count = 0; 194 return 1; 195 case NSKEY_F9: 196 keybuffer_push(keybuffer,FUNCTION_KEYS | 9); 197 buf = count = 0; 198 return 1; 199 case NSKEY_F10: 200 keybuffer_push(keybuffer,FUNCTION_KEYS | 10); 201 buf = count = 0; 202 return 1; 203 case NSKEY_F11: 204 keybuffer_push(keybuffer,FUNCTION_KEYS | 11); 205 buf = count = 0; 206 return 1; 207 case NSKEY_F12: 208 keybuffer_push(keybuffer,FUNCTION_KEYS | 12); 209 buf = count = 0; 210 return 1; 211 default: 212 keybuffer_push(keybuffer, buf & 0xff); 213 keybuffer_push(keybuffer, (buf >> 8) &0xff); 214 keybuffer_push(keybuffer, (buf >> 16) &0xff); 215 keybuffer_push(keybuffer, (buf >> 24) &0xff); 216 keybuffer_push(keybuffer, scan_code); 217 buf = count = 0; 218 return 1; 219 } 220 } 221 222 buf |= ((unsigned long) scan_code)<<(8*(count++)); 223 224 if((buf & 0xff) != (NSKEY_F1 & 0xff)) { 225 keybuffer_push(keybuffer, buf); 226 buf = count = 0; 227 return 1; 228 } 229 230 if (count <= 1) 231 return 1; 232 233 if ((buf & 0xffff) != (NSKEY_F1 & 0xffff)) { 234 235 keybuffer_push(keybuffer, buf & 0xff); 236 keybuffer_push(keybuffer, (buf >> 8) &0xff); 237 buf = count = 0; 238 return 1; 239 } 240 241 if (count <= 2) 242 return 1; 243 244 245 if ((buf & 0xffffff) != (NSKEY_F1 & 0xffffff) 246 && (buf & 0xffffff) != (NSKEY_F6 & 0xffffff) 247 && (buf & 0xffffff) != (NSKEY_F9 & 0xffffff) ) { 248 249 keybuffer_push(keybuffer, buf & 0xff); 250 keybuffer_push(keybuffer, (buf >> 8) &0xff); 251 keybuffer_push(keybuffer, (buf >> 16) &0xff); 252 buf = count = 0; 253 return 1; 254 } 255 256 if (count <= 3) 257 return 1; 258 259 switch (buf) { 260 case NSKEY_F1: 261 keybuffer_push(keybuffer,FUNCTION_KEYS | 1); 262 buf = count = 0; 263 return 1; 264 case NSKEY_F2: 265 keybuffer_push(keybuffer,FUNCTION_KEYS | 2); 266 buf = count = 0; 267 return 1; 268 case NSKEY_F3: 269 keybuffer_push(keybuffer,FUNCTION_KEYS | 3); 270 buf = count = 0; 271 return 1; 272 case NSKEY_F4: 273 keybuffer_push(keybuffer,FUNCTION_KEYS | 4); 274 buf = count = 0; 275 return 1; 276 case NSKEY_F5: 277 keybuffer_push(keybuffer,FUNCTION_KEYS | 5); 278 buf = count = 0; 279 return 1; 280 } 281 282 283 284 switch (buf) { 285 case NSKEY_F6: 286 case NSKEY_F7: 287 case NSKEY_F8: 288 case NSKEY_F9: 289 case NSKEY_F10: 290 case NSKEY_F11: 291 case NSKEY_F12: 292 return 1; 293 default: 294 keybuffer_push(keybuffer, buf & 0xff); 295 keybuffer_push(keybuffer, (buf >> 8) &0xff); 296 keybuffer_push(keybuffer, (buf >> 16) &0xff); 297 keybuffer_push(keybuffer, (buf >> 24) &0xff); 298 buf = count = 0; 299 return 1; 300 } 301 return 1; 302 } 303 304 305 306 307 308 309 310 int kbd_ski_process(keybuffer_t *keybuffer, ipc_call_t *call) 86 311 { 87 312 static unsigned long long buf = 0; … … 89 314 static int esc_count = 0; 90 315 int scan_code = IPC_GET_ARG2(*call); 91 316 92 317 /* 93 318 * Please preserve this code (it can be used to determine scancodes) … … 98 323 //keybuffer_push(keybuffer, ' '); 99 324 //*/ 325 100 326 101 327 if (scan_code) { … … 156 382 buf = count = 0; 157 383 } 158 159 384 return 1; 160 385 } 386 387 int kbd_arch_process(keybuffer_t *keybuffer, ipc_call_t *call) 388 { 389 printf("KBD Key pressed: %x(%c)\n",IPC_GET_ARG2(*call),IPC_GET_ARG2(*call)); 390 if(kbd_type==KBD_SKI) return kbd_ski_process(keybuffer,call); 391 if(kbd_type==KBD_NS16550) return kbd_ns16550_process(keybuffer,call); 392 393 394 } 395 396 161 397 162 398 /**
Note:
See TracChangeset
for help on using the changeset viewer.