Rev 4581 | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4581 | Rev 4718 | ||
|---|---|---|---|
| Line 67... | Line 67... | ||
| 67 | /** Information about framebuffer */ |
67 | /** Information about framebuffer */ |
| 68 | struct { |
68 | struct { |
| 69 | int phone; /**< Framebuffer phone */ |
69 | int phone; /**< Framebuffer phone */ |
| 70 | ipcarg_t cols; /**< Framebuffer columns */ |
70 | ipcarg_t cols; /**< Framebuffer columns */ |
| 71 | ipcarg_t rows; /**< Framebuffer rows */ |
71 | ipcarg_t rows; /**< Framebuffer rows */ |
| - | 72 | int color_cap; /**< Color capabilities (FB_CCAP_xxx) */ |
|
| 72 | } fb_info; |
73 | } fb_info; |
| 73 | 74 | ||
| 74 | typedef struct { |
75 | typedef struct { |
| 75 | size_t index; /**< Console index */ |
76 | size_t index; /**< Console index */ |
| 76 | size_t refcount; /**< Connection reference count */ |
77 | size_t refcount; /**< Connection reference count */ |
| Line 170... | Line 171... | ||
| 170 | set_rgb_color(attrs->a.r.fg_color, attrs->a.r.bg_color); |
171 | set_rgb_color(attrs->a.r.fg_color, attrs->a.r.bg_color); |
| 171 | break; |
172 | break; |
| 172 | } |
173 | } |
| 173 | } |
174 | } |
| 174 | 175 | ||
| - | 176 | static int ccap_fb_to_con(int ccap_fb, int *ccap_con) |
|
| - | 177 | { |
|
| - | 178 | switch (ccap_fb) { |
|
| - | 179 | case FB_CCAP_NONE: *ccap_con = CONSOLE_CCAP_NONE; break; |
|
| - | 180 | case FB_CCAP_STYLE: *ccap_con = CONSOLE_CCAP_STYLE; break; |
|
| - | 181 | case FB_CCAP_INDEXED: *ccap_con = CONSOLE_CCAP_INDEXED; break; |
|
| - | 182 | case FB_CCAP_RGB: *ccap_con = CONSOLE_CCAP_RGB; break; |
|
| - | 183 | default: return EINVAL; |
|
| - | 184 | } |
|
| - | 185 | ||
| - | 186 | return EOK; |
|
| - | 187 | } |
|
| - | 188 | ||
| 175 | /** Send an area of screenbuffer to the FB driver. */ |
189 | /** Send an area of screenbuffer to the FB driver. */ |
| 176 | static void fb_update_area(console_t *cons, ipcarg_t x0, ipcarg_t y0, ipcarg_t width, ipcarg_t height) |
190 | static void fb_update_area(console_t *cons, ipcarg_t x0, ipcarg_t y0, ipcarg_t width, ipcarg_t height) |
| 177 | { |
191 | { |
| 178 | if (interbuffer) { |
192 | if (interbuffer) { |
| 179 | ipcarg_t x; |
193 | ipcarg_t x; |
| Line 524... | Line 538... | ||
| 524 | ipc_callid_t callid; |
538 | ipc_callid_t callid; |
| 525 | ipc_call_t call; |
539 | ipc_call_t call; |
| 526 | ipcarg_t arg1; |
540 | ipcarg_t arg1; |
| 527 | ipcarg_t arg2; |
541 | ipcarg_t arg2; |
| 528 | ipcarg_t arg3; |
542 | ipcarg_t arg3; |
| - | 543 | ||
| - | 544 | int cons_ccap; |
|
| - | 545 | int rc; |
|
| 529 | 546 | ||
| 530 | async_serialize_start(); |
547 | async_serialize_start(); |
| 531 | if (cons->refcount == 0) |
548 | if (cons->refcount == 0) |
| 532 | gcons_notify_connect(cons->index); |
549 | gcons_notify_connect(cons->index); |
| 533 | 550 | ||
| Line 549... | Line 566... | ||
| 549 | case IPC_M_PHONE_HUNGUP: |
566 | case IPC_M_PHONE_HUNGUP: |
| 550 | cons->refcount--; |
567 | cons->refcount--; |
| 551 | if (cons->refcount == 0) |
568 | if (cons->refcount == 0) |
| 552 | gcons_notify_disconnect(cons->index); |
569 | gcons_notify_disconnect(cons->index); |
| 553 | return; |
570 | return; |
| 554 | case VFS_READ: |
571 | case VFS_OUT_READ: |
| 555 | async_serialize_end(); |
572 | async_serialize_end(); |
| 556 | cons_read(cons, callid, &call); |
573 | cons_read(cons, callid, &call); |
| 557 | async_serialize_start(); |
574 | async_serialize_start(); |
| 558 | continue; |
575 | continue; |
| 559 | case VFS_WRITE: |
576 | case VFS_OUT_WRITE: |
| 560 | async_serialize_end(); |
577 | async_serialize_end(); |
| 561 | cons_write(cons, callid, &call); |
578 | cons_write(cons, callid, &call); |
| 562 | async_serialize_start(); |
579 | async_serialize_start(); |
| 563 | continue; |
580 | continue; |
| 564 | case VFS_SYNC: |
581 | case VFS_OUT_SYNC: |
| 565 | fb_pending_flush(); |
582 | fb_pending_flush(); |
| 566 | if (cons == active_console) { |
583 | if (cons == active_console) { |
| 567 | async_req_0_0(fb_info.phone, FB_FLUSH); |
584 | async_req_0_0(fb_info.phone, FB_FLUSH); |
| 568 | 585 | ||
| 569 | curs_goto(cons->scr.position_x, cons->scr.position_y); |
586 | curs_goto(cons->scr.position_x, cons->scr.position_y); |
| Line 586... | Line 603... | ||
| 586 | break; |
603 | break; |
| 587 | case CONSOLE_GET_SIZE: |
604 | case CONSOLE_GET_SIZE: |
| 588 | arg1 = fb_info.cols; |
605 | arg1 = fb_info.cols; |
| 589 | arg2 = fb_info.rows; |
606 | arg2 = fb_info.rows; |
| 590 | break; |
607 | break; |
| - | 608 | case CONSOLE_GET_COLOR_CAP: |
|
| - | 609 | rc = ccap_fb_to_con(fb_info.color_cap, &cons_ccap); |
|
| - | 610 | if (rc != EOK) { |
|
| - | 611 | ipc_answer_0(callid, rc); |
|
| - | 612 | continue; |
|
| - | 613 | } |
|
| - | 614 | arg1 = cons_ccap; |
|
| - | 615 | break; |
|
| 591 | case CONSOLE_SET_STYLE: |
616 | case CONSOLE_SET_STYLE: |
| 592 | fb_pending_flush(); |
617 | fb_pending_flush(); |
| 593 | arg1 = IPC_GET_ARG1(call); |
618 | arg1 = IPC_GET_ARG1(call); |
| 594 | screenbuffer_set_style(&cons->scr, arg1); |
619 | screenbuffer_set_style(&cons->scr, arg1); |
| 595 | if (cons == active_console) |
620 | if (cons == active_console) |
| Line 637... | Line 662... | ||
| 637 | change_console(prev_console); |
662 | change_console(prev_console); |
| 638 | } |
663 | } |
| 639 | 664 | ||
| 640 | static bool console_init(void) |
665 | static bool console_init(void) |
| 641 | { |
666 | { |
| - | 667 | ipcarg_t color_cap; |
|
| - | 668 | ||
| 642 | /* Connect to keyboard driver */ |
669 | /* Connect to keyboard driver */ |
| 643 | kbd_phone = ipc_connect_me_to_blocking(PHONE_NS, SERVICE_KEYBOARD, 0, 0); |
670 | kbd_phone = ipc_connect_me_to_blocking(PHONE_NS, SERVICE_KEYBOARD, 0, 0); |
| 644 | if (kbd_phone < 0) { |
671 | if (kbd_phone < 0) { |
| 645 | printf(NAME ": Failed to connect to keyboard service\n"); |
672 | printf(NAME ": Failed to connect to keyboard service\n"); |
| 646 | return false; |
673 | return false; |
| Line 672... | Line 699... | ||
| 672 | gcons_init(fb_info.phone); |
699 | gcons_init(fb_info.phone); |
| 673 | 700 | ||
| 674 | /* Synchronize, the gcons could put something in queue */ |
701 | /* Synchronize, the gcons could put something in queue */ |
| 675 | async_req_0_0(fb_info.phone, FB_FLUSH); |
702 | async_req_0_0(fb_info.phone, FB_FLUSH); |
| 676 | async_req_0_2(fb_info.phone, FB_GET_CSIZE, &fb_info.cols, &fb_info.rows); |
703 | async_req_0_2(fb_info.phone, FB_GET_CSIZE, &fb_info.cols, &fb_info.rows); |
| - | 704 | async_req_0_1(fb_info.phone, FB_GET_COLOR_CAP, &color_cap); |
|
| - | 705 | fb_info.color_cap = color_cap; |
|
| 677 | 706 | ||
| 678 | /* Set up shared memory buffer. */ |
707 | /* Set up shared memory buffer. */ |
| 679 | size_t ib_size = sizeof(keyfield_t) * fb_info.cols * fb_info.rows; |
708 | size_t ib_size = sizeof(keyfield_t) * fb_info.cols * fb_info.rows; |
| 680 | interbuffer = as_get_mappable_page(ib_size); |
709 | interbuffer = as_get_mappable_page(ib_size); |
| 681 | 710 | ||