Changes in kernel/genarch/src/drivers/ega/ega.c [63e27ef:a35b458] in mainline
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
kernel/genarch/src/drivers/ega/ega.c
r63e27ef ra35b458 63 63 typedef struct { 64 64 IRQ_SPINLOCK_DECLARE(lock); 65 65 66 66 parea_t parea; 67 67 68 68 uint32_t cursor; 69 69 uint8_t *addr; … … 86 86 if ((ch >= 0x0000) && (ch <= 0x007f)) 87 87 return ch; 88 88 89 89 if (ch == 0x00a0) 90 90 return 255; 91 91 92 92 if (ch == 0x00a1) 93 93 return 173; 94 94 95 95 if ((ch >= 0x00a2) && (ch <= 0x00a3)) 96 96 return (ch - 7); 97 97 98 98 if (ch == 0x00a5) 99 99 return 157; 100 100 101 101 if (ch == 0x00aa) 102 102 return 166; 103 103 104 104 if (ch == 0x00ab) 105 105 return 174; 106 106 107 107 if (ch == 0x00ac) 108 108 return 170; 109 109 110 110 if (ch == 0x00b0) 111 111 return 248; 112 112 113 113 if (ch == 0x00b1) 114 114 return 241; 115 115 116 116 if (ch == 0x00b2) 117 117 return 253; 118 118 119 119 if (ch == 0x00b5) 120 120 return 230; 121 121 122 122 if (ch == 0x00b7) 123 123 return 250; 124 124 125 125 if (ch == 0x00ba) 126 126 return 167; 127 127 128 128 if (ch == 0x00bb) 129 129 return 175; 130 130 131 131 if (ch == 0x00bc) 132 132 return 172; 133 133 134 134 if (ch == 0x00bd) 135 135 return 171; 136 136 137 137 if (ch == 0x00bf) 138 138 return 168; 139 139 140 140 if ((ch >= 0x00c4) && (ch <= 0x00c5)) 141 141 return (ch - 54); 142 142 143 143 if (ch == 0x00c6) 144 144 return 146; 145 145 146 146 if (ch == 0x00c7) 147 147 return 128; 148 148 149 149 if (ch == 0x00c9) 150 150 return 144; 151 151 152 152 if (ch == 0x00d1) 153 153 return 165; 154 154 155 155 if (ch == 0x00d6) 156 156 return 153; 157 157 158 158 if (ch == 0x00dc) 159 159 return 154; 160 160 161 161 if (ch == 0x00df) 162 162 return 225; 163 163 164 164 if (ch == 0x00e0) 165 165 return 133; 166 166 167 167 if (ch == 0x00e1) 168 168 return 160; 169 169 170 170 if (ch == 0x00e2) 171 171 return 131; 172 172 173 173 if (ch == 0x00e4) 174 174 return 132; 175 175 176 176 if (ch == 0x00e5) 177 177 return 134; 178 178 179 179 if (ch == 0x00e6) 180 180 return 145; 181 181 182 182 if (ch == 0x00e7) 183 183 return 135; 184 184 185 185 if (ch == 0x00e8) 186 186 return 138; 187 187 188 188 if (ch == 0x00e9) 189 189 return 130; 190 190 191 191 if ((ch >= 0x00ea) && (ch <= 0x00eb)) 192 192 return (ch - 98); 193 193 194 194 if (ch == 0x00ec) 195 195 return 141; 196 196 197 197 if (ch == 0x00ed) 198 198 return 161; 199 199 200 200 if (ch == 0x00ee) 201 201 return 140; 202 202 203 203 if (ch == 0x00ef) 204 204 return 139; 205 205 206 206 if (ch == 0x00f1) 207 207 return 164; 208 208 209 209 if (ch == 0x00f2) 210 210 return 149; 211 211 212 212 if (ch == 0x00f3) 213 213 return 162; 214 214 215 215 if (ch == 0x00f4) 216 216 return 147; 217 217 218 218 if (ch == 0x00f6) 219 219 return 148; 220 220 221 221 if (ch == 0x00f7) 222 222 return 246; 223 223 224 224 if (ch == 0x00f9) 225 225 return 151; 226 226 227 227 if (ch == 0x00fa) 228 228 return 163; 229 229 230 230 if (ch == 0x00fb) 231 231 return 150; 232 232 233 233 if (ch == 0x00fc) 234 234 return 129; 235 235 236 236 if (ch == 0x00ff) 237 237 return 152; 238 238 239 239 if (ch == 0x0192) 240 240 return 159; 241 241 242 242 if (ch == 0x0393) 243 243 return 226; 244 244 245 245 if (ch == 0x0398) 246 246 return 233; 247 247 248 248 if (ch == 0x03a3) 249 249 return 228; 250 250 251 251 if (ch == 0x03a6) 252 252 return 232; 253 253 254 254 if (ch == 0x03a9) 255 255 return 234; 256 256 257 257 if (ch == 0x03b1) 258 258 return 224; 259 259 260 260 if (ch == 0x03b4) 261 261 return 235; 262 262 263 263 if (ch == 0x03b5) 264 264 return 238; 265 265 266 266 if (ch == 0x03c0) 267 267 return 227; 268 268 269 269 if (ch == 0x03c3) 270 270 return 229; 271 271 272 272 if (ch == 0x03c4) 273 273 return 231; 274 274 275 275 if (ch == 0x03c6) 276 276 return 237; 277 277 278 278 if (ch == 0x207f) 279 279 return 252; 280 280 281 281 if (ch == 0x20a7) 282 282 return 158; 283 283 284 284 if (ch == 0x2219) 285 285 return 249; 286 286 287 287 if (ch == 0x221a) 288 288 return 251; 289 289 290 290 if (ch == 0x221e) 291 291 return 236; 292 292 293 293 if (ch == 0x2229) 294 294 return 239; 295 295 296 296 if (ch == 0x2248) 297 297 return 247; 298 298 299 299 if (ch == 0x2261) 300 300 return 240; 301 301 302 302 if (ch == 0x2264) 303 303 return 243; 304 304 305 305 if (ch == 0x2265) 306 306 return 242; 307 307 308 308 if (ch == 0x2310) 309 309 return 169; 310 310 311 311 if ((ch >= 0x2320) && (ch <= 0x2321)) 312 312 return (ch - 8748); 313 313 314 314 if (ch == 0x2500) 315 315 return 196; 316 316 317 317 if (ch == 0x2502) 318 318 return 179; 319 319 320 320 if (ch == 0x250c) 321 321 return 218; 322 322 323 323 if (ch == 0x2510) 324 324 return 191; 325 325 326 326 if (ch == 0x2514) 327 327 return 192; 328 328 329 329 if (ch == 0x2518) 330 330 return 217; 331 331 332 332 if (ch == 0x251c) 333 333 return 195; 334 334 335 335 if (ch == 0x2524) 336 336 return 180; 337 337 338 338 if (ch == 0x252c) 339 339 return 194; 340 340 341 341 if (ch == 0x2534) 342 342 return 193; 343 343 344 344 if (ch == 0x253c) 345 345 return 197; 346 346 347 347 if (ch == 0x2550) 348 348 return 205; 349 349 350 350 if (ch == 0x2551) 351 351 return 186; 352 352 353 353 if ((ch >= 0x2552) && (ch <= 0x2553)) 354 354 return (ch - 9341); 355 355 356 356 if (ch == 0x2554) 357 357 return 201; 358 358 359 359 if (ch == 0x2555) 360 360 return 184; 361 361 362 362 if (ch == 0x2556) 363 363 return 183; 364 364 365 365 if (ch == 0x2557) 366 366 return 187; 367 367 368 368 if (ch == 0x2558) 369 369 return 212; 370 370 371 371 if (ch == 0x2559) 372 372 return 211; 373 373 374 374 if (ch == 0x255a) 375 375 return 200; 376 376 377 377 if (ch == 0x255b) 378 378 return 190; 379 379 380 380 if (ch == 0x255c) 381 381 return 189; 382 382 383 383 if (ch == 0x255d) 384 384 return 188; 385 385 386 386 if ((ch >= 0x255e) && (ch <= 0x255f)) 387 387 return (ch - 9368); 388 388 389 389 if (ch == 0x2560) 390 390 return 204; 391 391 392 392 if ((ch >= 0x2561) && (ch <= 0x2562)) 393 393 return (ch - 9388); 394 394 395 395 if (ch == 0x2563) 396 396 return 185; 397 397 398 398 if ((ch >= 0x2564) && (ch <= 0x2565)) 399 399 return (ch - 9363); 400 400 401 401 if (ch == 0x2566) 402 402 return 203; 403 403 404 404 if ((ch >= 0x2567) && (ch <= 0x2568)) 405 405 return (ch - 9368); 406 406 407 407 if (ch == 0x2569) 408 408 return 202; 409 409 410 410 if (ch == 0x256a) 411 411 return 216; 412 412 413 413 if (ch == 0x256b) 414 414 return 215; 415 415 416 416 if (ch == 0x256c) 417 417 return 206; 418 418 419 419 if (ch == 0x2580) 420 420 return 223; 421 421 422 422 if (ch == 0x2584) 423 423 return 220; 424 424 425 425 if (ch == 0x2588) 426 426 return 219; 427 427 428 428 if (ch == 0x258c) 429 429 return 221; 430 430 431 431 if (ch == 0x2590) 432 432 return 222; 433 433 434 434 if ((ch >= 0x2591) && (ch <= 0x2593)) 435 435 return (ch - 9441); 436 436 437 437 return 256; 438 438 } … … 445 445 if (instance->cursor < EGA_SCREEN) 446 446 return; 447 447 448 448 memmove((void *) instance->backbuf, 449 449 (void *) (instance->backbuf + EGA_COLS * 2), … … 451 451 memsetw(instance->backbuf + (EGA_SCREEN - EGA_COLS) * 2, 452 452 EGA_COLS, EMPTY_CHAR); 453 453 454 454 if ((!instance->parea.mapped) || (console_override)) { 455 455 memmove((void *) instance->addr, … … 459 459 EGA_COLS, EMPTY_CHAR); 460 460 } 461 461 462 462 instance->cursor = instance->cursor - EGA_COLS; 463 463 } … … 492 492 pio_write_8(instance->base + EGA_INDEX_REG, 0x0f); 493 493 uint8_t lo = pio_read_8(instance->base + EGA_DATA_REG); 494 494 495 495 instance->cursor = (hi << 8) | lo; 496 496 } else 497 497 instance->cursor = 0; 498 498 499 499 if (instance->cursor >= EGA_SCREEN) 500 500 instance->cursor = 0; 501 501 502 502 if ((instance->cursor % EGA_COLS) != 0) 503 503 instance->cursor = 504 504 (instance->cursor + EGA_COLS) - instance->cursor % EGA_COLS; 505 505 506 506 memsetw(instance->backbuf + instance->cursor * 2, 507 507 EGA_SCREEN - instance->cursor, EMPTY_CHAR); 508 508 509 509 if ((!instance->parea.mapped) || (console_override)) 510 510 memsetw(instance->addr + instance->cursor * 2, 511 511 EGA_SCREEN - instance->cursor, EMPTY_CHAR); 512 512 513 513 ega_check_cursor(instance); 514 514 ega_move_cursor(instance); … … 521 521 uint8_t glyph; 522 522 uint8_t style; 523 523 524 524 if ((index >> 8)) { 525 525 glyph = U_SPECIAL; … … 529 529 style = STYLE; 530 530 } 531 531 532 532 instance->backbuf[instance->cursor * 2] = glyph; 533 533 instance->backbuf[instance->cursor * 2 + 1] = style; 534 534 535 535 if ((!instance->parea.mapped) || (console_override)) { 536 536 instance->addr[instance->cursor * 2] = glyph; … … 542 542 { 543 543 ega_instance_t *instance = (ega_instance_t *) dev->data; 544 544 545 545 irq_spinlock_lock(&instance->lock, true); 546 546 547 547 switch (ch) { 548 548 case '\n': … … 565 565 ega_check_cursor(instance); 566 566 ega_move_cursor(instance); 567 567 568 568 irq_spinlock_unlock(&instance->lock, true); 569 569 } … … 572 572 { 573 573 ega_instance_t *instance = (ega_instance_t *) dev->data; 574 574 575 575 irq_spinlock_lock(&instance->lock, true); 576 576 577 577 memcpy(instance->addr, instance->backbuf, EGA_VRAM_SIZE); 578 578 ega_move_cursor(instance); 579 579 ega_show_cursor(instance); 580 580 581 581 irq_spinlock_unlock(&instance->lock, true); 582 582 } … … 587 587 if (!egadev) 588 588 return NULL; 589 589 590 590 ega_instance_t *instance = malloc(sizeof(ega_instance_t), FRAME_ATOMIC); 591 591 if (!instance) { … … 593 593 return NULL; 594 594 } 595 595 596 596 outdev_initialize("egadev", egadev, &egadev_ops); 597 597 egadev->data = instance; 598 598 599 599 irq_spinlock_initialize(&instance->lock, "*ega.instance.lock"); 600 600 601 601 instance->base = base; 602 602 instance->addr = (uint8_t *) km_map(addr, EGA_VRAM_SIZE, … … 608 608 return NULL; 609 609 } 610 610 611 611 instance->backbuf = (uint8_t *) malloc(EGA_VRAM_SIZE, 0); 612 612 if (!instance->backbuf) { … … 616 616 return NULL; 617 617 } 618 618 619 619 link_initialize(&instance->parea.link); 620 620 instance->parea.pbase = addr; … … 623 623 instance->parea.mapped = false; 624 624 ddi_parea_register(&instance->parea); 625 625 626 626 /* Synchronize the back buffer and cursor position. */ 627 627 memcpy(instance->backbuf, instance->addr, EGA_VRAM_SIZE); 628 628 ega_sync_cursor(instance); 629 629 630 630 if (!fb_exported) { 631 631 /* … … 640 640 sysinfo_set_item_val("fb.blinking", NULL, true); 641 641 sysinfo_set_item_val("fb.address.physical", NULL, addr); 642 642 643 643 fb_exported = true; 644 644 } 645 645 646 646 return egadev; 647 647 }
Note:
See TracChangeset
for help on using the changeset viewer.