Rev 4581 | Go to most recent revision | 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 |