Subversion Repositories HelenOS-historic

Rev

Rev 1547 | Rev 1555 | Go to most recent revision | Only display areas with differences | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1547 Rev 1552
1
/*
1
/*
2
 * Copyright (C) 2006 Ondrej Palkovsky
2
 * Copyright (C) 2006 Ondrej Palkovsky
3
 * All rights reserved.
3
 * All rights reserved.
4
 *
4
 *
5
 * Redistribution and use in source and binary forms, with or without
5
 * Redistribution and use in source and binary forms, with or without
6
 * modification, are permitted provided that the following conditions
6
 * modification, are permitted provided that the following conditions
7
 * are met:
7
 * are met:
8
 *
8
 *
9
 * - Redistributions of source code must retain the above copyright
9
 * - Redistributions of source code must retain the above copyright
10
 *   notice, this list of conditions and the following disclaimer.
10
 *   notice, this list of conditions and the following disclaimer.
11
 * - Redistributions in binary form must reproduce the above copyright
11
 * - Redistributions in binary form must reproduce the above copyright
12
 *   notice, this list of conditions and the following disclaimer in the
12
 *   notice, this list of conditions and the following disclaimer in the
13
 *   documentation and/or other materials provided with the distribution.
13
 *   documentation and/or other materials provided with the distribution.
14
 * - The name of the author may not be used to endorse or promote products
14
 * - The name of the author may not be used to endorse or promote products
15
 *   derived from this software without specific prior written permission.
15
 *   derived from this software without specific prior written permission.
16
 *
16
 *
17
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
17
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
18
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
18
 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
19
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
19
 * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
20
 * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
21
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
21
 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
22
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
22
 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
23
 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24
 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
25
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
 */
27
 */
28
 
28
 
29
#include <ipc/fb.h>
29
#include <ipc/fb.h>
30
#include <ipc/ipc.h>
30
#include <ipc/ipc.h>
31
#include <async.h>
31
#include <async.h>
32
#include <stdio.h>
32
#include <stdio.h>
33
#include <sys/mman.h>
33
#include <sys/mman.h>
34
#include <string.h>
34
#include <string.h>
35
 
35
 
36
#include "console.h"
36
#include "console.h"
37
#include "gcons.h"
37
#include "gcons.h"
38
 
38
 
39
#define CONSOLE_TOP      65
39
#define CONSOLE_TOP      65
40
#define CONSOLE_MARGIN   10
40
#define CONSOLE_MARGIN   10
41
 
41
 
42
#define STATUS_START    120
42
#define STATUS_START    120
43
#define STATUS_SPACE    5
43
#define STATUS_SPACE    5
44
#define STATUS_WIDTH    40
44
#define STATUS_WIDTH    40
45
#define STATUS_HEIGHT   30
45
#define STATUS_HEIGHT   30
46
 
46
 
47
#define MAIN_COLOR      0xffffff
47
#define MAIN_COLOR      0xffffff
48
 
48
 
49
static int use_gcons = 0;
49
static int use_gcons = 0;
50
static ipcarg_t xres,yres;
50
static ipcarg_t xres,yres;
51
 
51
 
52
static int console_vp;
52
static int console_vp;
53
static int cstatus_vp[CONSOLE_COUNT];
53
static int cstatus_vp[CONSOLE_COUNT];
54
static int console_has_input[CONSOLE_COUNT];
54
static int console_has_input[CONSOLE_COUNT];
55
static int cstat_row, cstat_col; /* Size of cstatus buttons */
55
static int cstat_row, cstat_col; /* Size of cstatus buttons */
56
 
56
 
57
static int fbphone;
57
static int fbphone;
58
 
58
 
59
enum butstate {
59
enum butstate {
60
    CONS_ACTIVE = 0,
60
    CONS_ACTIVE = 0,
61
    CONS_IDLE,
61
    CONS_IDLE,
62
    CONS_HAS_INPUT,
62
    CONS_HAS_INPUT,
63
    CONS_DISCONNECTED
63
    CONS_DISCONNECTED
64
};
64
};
65
 
65
 
66
static struct {
66
static struct {
67
    int fgcolor;
67
    int fgcolor;
68
    int bgcolor;
68
    int bgcolor;
69
} stat_colors[] = {
69
} stat_colors[] = {
70
    {0xd0d0d0, 0x808080},
70
    {0xd0d0d0, 0x808080},
71
    {0xd0d0d0, 0x0},
71
    {0xd0d0d0, 0x0},
72
    {0xd0d0d0, 0xa04040},
72
    {0xd0d0d0, 0xa04040},
73
    {0xd0d0d0, 0x0}
73
    {0xd0d0d0, 0x0}
74
};
74
};
75
 
75
 
76
static int active_console = 0;
76
static int active_console = 0;
77
 
77
 
78
static void vp_switch(int vp)
78
static void vp_switch(int vp)
79
{
79
{
80
    nsend_call(fbphone,FB_VIEWPORT_SWITCH, vp);
80
    nsend_call(fbphone,FB_VIEWPORT_SWITCH, vp);
81
}
81
}
82
 
82
 
83
/** Create view port */
83
/** Create view port */
84
static int vp_create(unsigned int x, unsigned int y,
84
static int vp_create(unsigned int x, unsigned int y,
85
             unsigned int width, unsigned int height)
85
             unsigned int width, unsigned int height)
86
{
86
{
87
    /* Init function, use ipc_call_sync */
87
    /* Init function, use ipc_call_sync */
88
    return ipc_call_sync_2(fbphone, FB_VIEWPORT_CREATE,
88
    return ipc_call_sync_2(fbphone, FB_VIEWPORT_CREATE,
89
                   (x << 16) | y, (width << 16) | height,
89
                   (x << 16) | y, (width << 16) | height,
90
                   NULL, NULL);
90
                   NULL, NULL);
91
}
91
}
92
 
92
 
93
static void clear(void)
93
static void clear(void)
94
{
94
{
95
    nsend_call(fbphone, FB_CLEAR, 0);
95
    nsend_call(fbphone, FB_CLEAR, 0);
96
   
96
   
97
}
97
}
98
 
98
 
99
static void set_style(int fgcolor, int bgcolor)
99
static void set_style(int fgcolor, int bgcolor)
100
{
100
{
101
    nsend_call_2(fbphone, FB_SET_STYLE, fgcolor, bgcolor);
101
    nsend_call_2(fbphone, FB_SET_STYLE, fgcolor, bgcolor);
102
}
102
}
103
 
103
 
104
static void putch(char c, int row, int col)
104
static void putch(char c, int row, int col)
105
{
105
{
106
    nsend_call_3(fbphone, FB_PUTCHAR, c, row, col);
106
    nsend_call_3(fbphone, FB_PUTCHAR, c, row, col);
107
}
107
}
108
 
108
 
109
static void draw_stat(int consnum, enum butstate state)
109
static void draw_stat(int consnum, enum butstate state)
110
{
110
{
111
    char data[5];
111
    char data[5];
112
    int i;
112
    int i;
113
   
113
   
114
    vp_switch(cstatus_vp[consnum]);
114
    vp_switch(cstatus_vp[consnum]);
115
    set_style(stat_colors[state].fgcolor, stat_colors[state].bgcolor);
115
    set_style(stat_colors[state].fgcolor, stat_colors[state].bgcolor);
116
    clear();
116
    clear();
117
    if (state != CONS_DISCONNECTED) {
117
    if (state != CONS_DISCONNECTED) {
118
        snprintf(data, 5, "%d", consnum+1);
118
        snprintf(data, 5, "%d", consnum+1);
119
        for (i=0;data[i];i++)
119
        for (i=0;data[i];i++)
120
            putch(data[i], 0, i);
120
            putch(data[i], 0, i);
121
    }
121
    }
122
}
122
}
123
 
123
 
124
void gcons_change_console(int consnum)
124
void gcons_change_console(int consnum)
125
{
125
{
126
    if (!use_gcons)
126
    if (!use_gcons)
127
        return;
127
        return;
128
   
128
 
-
 
129
    if (active_console != -1)
129
    draw_stat(active_console, CONS_IDLE);
130
        draw_stat(active_console, CONS_IDLE);
130
    active_console = consnum;
131
    active_console = consnum;
131
    draw_stat(consnum, CONS_ACTIVE);
132
    draw_stat(consnum, CONS_ACTIVE);
132
    console_has_input[consnum] = 0;
133
    console_has_input[consnum] = 0;
133
 
134
 
134
    vp_switch(console_vp);
135
    vp_switch(console_vp);
135
}
136
}
136
 
137
 
-
 
138
/** Notification function that gets called on new output to virtual console */
137
void gcons_notify_char(int consnum)
139
void gcons_notify_char(int consnum)
138
{
140
{
139
    if (!use_gcons)
141
    if (!use_gcons)
140
        return;
142
        return;
141
 
143
 
142
    if (consnum == active_console || console_has_input[consnum])
144
    if (consnum == active_console || console_has_input[consnum])
143
        return;
145
        return;
144
 
146
 
145
    console_has_input[consnum] = 1;
147
    console_has_input[consnum] = 1;
-
 
148
 
-
 
149
    if (active_console == -1)
-
 
150
        return;
-
 
151
 
146
    draw_stat(consnum, CONS_HAS_INPUT);
152
    draw_stat(consnum, CONS_HAS_INPUT);
147
   
153
   
148
    vp_switch(console_vp);
154
    vp_switch(console_vp);
-
 
155
 
-
 
156
}
-
 
157
 
-
 
158
/** Change to kernel console */
-
 
159
void gcons_in_kernel(void)
-
 
160
{
-
 
161
    draw_stat(active_console, CONS_IDLE);
-
 
162
    active_console = -1; /* Set to kernel console */
-
 
163
    vp_switch(0);
149
}
164
}
150
 
165
 
-
 
166
/** Draw a PPM pixmap to framebuffer
-
 
167
 *
-
 
168
 * @param logo Pointer to PPM data
-
 
169
 * @param size Size of PPM data
-
 
170
 * @param x Coordinate of upper left corner
-
 
171
 * @param y Coordinate of upper left corner
-
 
172
 */
151
static void draw_pixmap(char *logo, size_t size, int x, int y)
173
static void draw_pixmap(char *logo, size_t size, int x, int y)
152
{
174
{
153
    char *shm;
175
    char *shm;
154
    int rc;
176
    int rc;
155
 
177
 
156
    /* Create area */
178
    /* Create area */
157
    shm = mmap(NULL, size, PROTO_READ | PROTO_WRITE, MAP_SHARED | MAP_ANONYMOUS, 0, 0);
179
    shm = mmap(NULL, size, PROTO_READ | PROTO_WRITE, MAP_SHARED | MAP_ANONYMOUS, 0, 0);
158
    if (shm == MAP_FAILED)
180
    if (shm == MAP_FAILED)
159
        return;
181
        return;
160
 
182
 
161
    memcpy(shm, logo, size);
183
    memcpy(shm, logo, size);
162
    /* Send area */
184
    /* Send area */
163
    rc = sync_send_2(fbphone, FB_PREPARE_SHM, (ipcarg_t)shm, 0, NULL, NULL);
185
    rc = sync_send_2(fbphone, FB_PREPARE_SHM, (ipcarg_t)shm, 0, NULL, NULL);
164
    if (rc)
186
    if (rc)
165
        goto exit;
187
        goto exit;
166
    rc = sync_send_3(fbphone, IPC_M_AS_AREA_SEND, (ipcarg_t)shm, 0, PROTO_READ, NULL, NULL, NULL);
188
    rc = sync_send_3(fbphone, IPC_M_AS_AREA_SEND, (ipcarg_t)shm, 0, PROTO_READ, NULL, NULL, NULL);
167
    if (rc)
189
    if (rc)
168
        goto drop;
190
        goto drop;
169
    /* Draw logo */
191
    /* Draw logo */
170
    send_call_2(fbphone, FB_DRAW_PPM, x, y);
192
    send_call_2(fbphone, FB_DRAW_PPM, x, y);
171
drop:
193
drop:
172
    /* Drop area */
194
    /* Drop area */
173
    nsend_call(fbphone, FB_DROP_SHM, 0);
195
    nsend_call(fbphone, FB_DROP_SHM, 0);
174
exit:      
196
exit:      
175
    /* Remove area */
197
    /* Remove area */
176
    munmap(shm, size);
198
    munmap(shm, size);
177
}
199
}
178
 
200
 
179
extern char _binary_helenos_ppm_start[0];
201
extern char _binary_helenos_ppm_start[0];
180
extern int _binary_helenos_ppm_size;
202
extern int _binary_helenos_ppm_size;
181
extern char _binary_nameic_ppm_start[0];
203
extern char _binary_nameic_ppm_start[0];
182
extern int _binary_nameic_ppm_size;
204
extern int _binary_nameic_ppm_size;
183
void gcons_redraw_console(void)
205
void gcons_redraw_console(void)
184
{
206
{
185
    int i;
207
    int i;
186
    size_t hsize = (size_t)&_binary_helenos_ppm_size;
208
    size_t hsize = (size_t)&_binary_helenos_ppm_size;
187
 
209
 
188
    if (!use_gcons)
210
    if (!use_gcons)
189
        return;
211
        return;
190
   
212
   
191
    vp_switch(0);
213
    vp_switch(0);
192
    set_style(MAIN_COLOR, MAIN_COLOR);
214
    set_style(MAIN_COLOR, MAIN_COLOR);
193
    clear();
215
    clear();
194
    draw_pixmap(_binary_helenos_ppm_start, (size_t)&_binary_helenos_ppm_size, xres-64, 0);
216
    draw_pixmap(_binary_helenos_ppm_start, (size_t)&_binary_helenos_ppm_size, xres-64, 0);
195
    draw_pixmap(_binary_nameic_ppm_start, (size_t)&_binary_nameic_ppm_size, 5, 10);
217
    draw_pixmap(_binary_nameic_ppm_start, (size_t)&_binary_nameic_ppm_size, 5, 10);
196
 
218
 
197
 
219
 
198
    for (i=0;i < CONSOLE_COUNT; i++)
220
    for (i=0;i < CONSOLE_COUNT; i++)
199
        draw_stat(i, i == active_console ? CONS_ACTIVE : CONS_DISCONNECTED);
221
        draw_stat(i, i == active_console ? CONS_ACTIVE : CONS_DISCONNECTED);
200
    vp_switch(console_vp);
222
    vp_switch(console_vp);
201
}
223
}
202
 
224
 
203
/** Initialize nice graphical console environment */
225
/** Initialize nice graphical console environment */
204
void gcons_init(int phone)
226
void gcons_init(int phone)
205
{
227
{
206
    int rc;
228
    int rc;
207
    int i;
229
    int i;
208
 
230
 
209
    fbphone = phone;
231
    fbphone = phone;
210
 
232
 
211
    rc = ipc_call_sync_2(phone, FB_GET_RESOLUTION, 0, 0, &xres, &yres);
233
    rc = ipc_call_sync_2(phone, FB_GET_RESOLUTION, 0, 0, &xres, &yres);
212
    if (rc)
234
    if (rc)
213
        return;
235
        return;
214
   
236
   
215
    if (xres < 800 || yres < 600)
237
    if (xres < 800 || yres < 600)
216
        return;
238
        return;
217
 
239
 
218
    /* create console viewport */
240
    /* create console viewport */
219
    console_vp = vp_create(CONSOLE_MARGIN, CONSOLE_TOP, xres-2*CONSOLE_MARGIN,
241
    console_vp = vp_create(CONSOLE_MARGIN, CONSOLE_TOP, xres-2*CONSOLE_MARGIN,
220
                   yres-(CONSOLE_TOP+CONSOLE_MARGIN));
242
                   yres-(CONSOLE_TOP+CONSOLE_MARGIN));
221
    if (console_vp < 0)
243
    if (console_vp < 0)
222
        return;
244
        return;
223
   
245
   
224
    /* Create status buttons */
246
    /* Create status buttons */
225
    for (i=0; i < CONSOLE_COUNT; i++) {
247
    for (i=0; i < CONSOLE_COUNT; i++) {
226
        cstatus_vp[i] = vp_create(STATUS_START+CONSOLE_MARGIN+i*(STATUS_WIDTH+STATUS_SPACE),
248
        cstatus_vp[i] = vp_create(STATUS_START+CONSOLE_MARGIN+i*(STATUS_WIDTH+STATUS_SPACE),
227
                      CONSOLE_MARGIN, STATUS_WIDTH, STATUS_HEIGHT);
249
                      CONSOLE_MARGIN, STATUS_WIDTH, STATUS_HEIGHT);
228
        if (cstatus_vp[i] < 0)
250
        if (cstatus_vp[i] < 0)
229
            return;
251
            return;
230
    }
252
    }
231
   
253
   
232
    use_gcons = 1;
254
    use_gcons = 1;
233
    gcons_redraw_console();
255
    gcons_redraw_console();
234
}
256
}
235
 
257