Subversion Repositories HelenOS

Rev

Rev 4071 | Rev 4202 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 4071 Rev 4111
Line 128... Line 128...
128
 */
128
 */
129
SPINLOCK_INITIALIZE(sgcn_input_lock);
129
SPINLOCK_INITIALIZE(sgcn_input_lock);
130
 
130
 
131
 
131
 
132
/* functions referenced from definitions of I/O operations structures */
132
/* functions referenced from definitions of I/O operations structures */
133
static void sgcn_noop(chardev_t *);
-
 
134
static void sgcn_putchar(chardev_t *, const char, bool);
133
static void sgcn_putchar(outdev_t *, const char, bool);
135
static char sgcn_key_read(chardev_t *);
-
 
136
 
134
 
137
/** character device operations */
135
/** SGCN output device operations */
138
static chardev_operations_t sgcn_ops = {
136
static outdev_operations_t sgcnout_ops = {
139
    .suspend = sgcn_noop,
-
 
140
    .resume = sgcn_noop,
-
 
141
    .read = sgcn_key_read,
-
 
142
    .write = sgcn_putchar
137
    .write = sgcn_putchar
143
};
138
};
144
 
139
 
145
/** SGCN character device */
140
/** SGCN input device operations */
146
chardev_t sgcn_io;
141
static indev_operations_t sgcnin_ops = {
-
 
142
    .poll = NULL
-
 
143
};
147
 
144
 
148
/** Address of the chardev, which is connected to SGCN. */
145
static indev_t sgcnin;      /**< SGCN input device. */
149
static chardev_t *sgcnout;
146
static outdev_t sgcnout;    /**< SGCN output device. */
150
 
147
 
151
/**
148
/**
152
 * Set some sysinfo values (SRAM address and SRAM size).
149
 * Set some sysinfo values (SRAM address and SRAM size).
153
 */
150
 */
154
static void register_sram(uintptr_t sram_begin_physical)
151
static void register_sram(uintptr_t sram_begin_physical)
Line 201... Line 198...
201
 * This function also writes the offset of the SGCN buffer within SRAM
198
 * This function also writes the offset of the SGCN buffer within SRAM
202
 * under the sram.buffer.offset sysinfo key.
199
 * under the sram.buffer.offset sysinfo key.
203
 */
200
 */
204
static void sgcn_buffer_begin_init(void)
201
static void sgcn_buffer_begin_init(void)
205
{
202
{
-
 
203
    static bool initialized;
-
 
204
   
-
 
205
    if (initialized)
-
 
206
        return;
-
 
207
 
206
    init_sram_begin();
208
    init_sram_begin();
207
       
209
       
208
    ASSERT(strcmp(SRAM_TOC->magic, SRAM_TOC_MAGIC) == 0);
210
    ASSERT(strcmp(SRAM_TOC->magic, SRAM_TOC_MAGIC) == 0);
209
   
211
   
210
    /* lookup TOC entry with the correct key */
212
    /* lookup TOC entry with the correct key */
Line 217... Line 219...
217
   
219
   
218
    sgcn_buffer_begin = sram_begin + SRAM_TOC->keys[i].offset;
220
    sgcn_buffer_begin = sram_begin + SRAM_TOC->keys[i].offset;
219
   
221
   
220
    sysinfo_set_item_val("sram.buffer.offset", NULL,
222
    sysinfo_set_item_val("sram.buffer.offset", NULL,
221
        SRAM_TOC->keys[i].offset);
223
        SRAM_TOC->keys[i].offset);
222
}
224
   
223
 
-
 
224
/**
-
 
225
 * Default suspend/resume operation for the input device.
-
 
226
 */
-
 
227
static void sgcn_noop(chardev_t *d)
225
    initialized = true;
228
{
-
 
229
}
226
}
230
 
227
 
231
/**
228
/**
232
 * Writes a single character to the SGCN (circular) output buffer
229
 * Writes a single character to the SGCN (circular) output buffer
233
 * and updates the output write pointer so that SGCN gets to know
230
 * and updates the output write pointer so that SGCN gets to know
Line 269... Line 266...
269
/**
266
/**
270
 * SGCN output operation. Prints a single character to the SGCN. If the line
267
 * SGCN output operation. Prints a single character to the SGCN. If the line
271
 * feed character is written ('\n'), the carriage return character ('\r') is
268
 * feed character is written ('\n'), the carriage return character ('\r') is
272
 * written straight away.
269
 * written straight away.
273
 */
270
 */
274
static void sgcn_putchar(struct chardev * cd, const char c, bool silent)
271
static void sgcn_putchar(outdev_t *od, const char c, bool silent)
275
{
272
{
276
    if (!silent) {
273
    if (!silent) {
277
        spinlock_lock(&sgcn_output_lock);
274
        spinlock_lock(&sgcn_output_lock);
278
       
275
       
279
        sgcn_do_putchar(c);
276
        sgcn_do_putchar(c);
Line 283... Line 280...
283
        spinlock_unlock(&sgcn_output_lock);
280
        spinlock_unlock(&sgcn_output_lock);
284
    }
281
    }
285
}
282
}
286
 
283
 
287
/**
284
/**
288
 * Called when actively reading the character. Not implemented yet.
-
 
289
 */
-
 
290
static char sgcn_key_read(chardev_t *d)
-
 
291
{
-
 
292
    return (char) 0;
-
 
293
}
-
 
294
 
-
 
295
/**
-
 
296
 * Grabs the input for kernel.
285
 * Grabs the input for kernel.
297
 */
286
 */
298
void sgcn_grab(void)
287
void sgcn_grab(void)
299
{
288
{
300
    kbd_disabled = true;
289
    kbd_disabled = true;
Line 335... Line 324...
335
        buf_ptr = (volatile char *)
324
        buf_ptr = (volatile char *)
336
            SGCN_BUFFER(char, SGCN_BUFFER_HEADER->in_rdptr);
325
            SGCN_BUFFER(char, SGCN_BUFFER_HEADER->in_rdptr);
337
        char c = *buf_ptr;
326
        char c = *buf_ptr;
338
        *in_rdptr_ptr = (((*in_rdptr_ptr) - begin + 1) % size) + begin;
327
        *in_rdptr_ptr = (((*in_rdptr_ptr) - begin + 1) % size) + begin;
339
           
328
           
340
        if (sgcnout)
-
 
341
            chardev_push_character(sgcnout, c);
329
        indev_push_character(&sgcnin, c);  
342
    }  
330
    }  
343
 
331
 
344
    spinlock_unlock(&sgcn_input_lock);
332
    spinlock_unlock(&sgcn_input_lock);
345
}
333
}
346
 
334
 
Line 355... Line 343...
355
        thread_usleep(POLL_INTERVAL);
343
        thread_usleep(POLL_INTERVAL);
356
    }
344
    }
357
}
345
}
358
 
346
 
359
/**
347
/**
360
 * A public function which initializes I/O from/to Serengeti console
348
 * A public function which initializes input from the Serengeti console.
361
 * and sets it as a default input/output.
-
 
362
 */
349
 */
363
void sgcn_init(chardev_t *devout)
350
indev_t *sgcnin_init(void)
364
{
351
{
365
    sgcn_buffer_begin_init();
352
    sgcn_buffer_begin_init();
366
 
353
 
367
    kbd_type = KBD_SGCN;
354
    kbd_type = KBD_SGCN;
368
 
355
 
369
    sysinfo_set_item_val("kbd", NULL, true);
356
    sysinfo_set_item_val("kbd", NULL, true);
370
    sysinfo_set_item_val("kbd.type", NULL, KBD_SGCN);
357
    sysinfo_set_item_val("kbd.type", NULL, KBD_SGCN);
371
    sysinfo_set_item_val("fb.kind", NULL, 4);
-
 
372
 
358
 
373
    thread_t *t = thread_create(kkbdpoll, NULL, TASK, 0, "kkbdpoll", true);
359
    thread_t *t = thread_create(kkbdpoll, NULL, TASK, 0, "kkbdpoll", true);
374
    if (!t)
360
    if (!t)
375
        panic("Cannot create kkbdpoll.");
361
        panic("Cannot create kkbdpoll.");
376
    thread_ready(t);
362
    thread_ready(t);
377
   
363
   
378
    chardev_initialize("sgcn_io", &sgcn_io, &sgcn_ops);
364
    indev_initialize("sgcnin", &sgcnin, &sgcnin_ops);
-
 
365
 
379
    stdout = &sgcn_io;
366
    return &sgcnin;
-
 
367
}
-
 
368
 
-
 
369
/**
-
 
370
 * A public function which initializes output to the Serengeti console.
-
 
371
 */
-
 
372
void sgcnout_init(void)
-
 
373
{
-
 
374
    sgcn_buffer_begin_init();
-
 
375
 
-
 
376
    sysinfo_set_item_val("fb.kind", NULL, 4);
380
 
377
 
-
 
378
    outdev_initialize("sgcnout", &sgcnout, &sgcnout_ops);  
381
    sgcnout = devout;
379
    stdout = &sgcnout;
382
}
380
}
383
 
381
 
384
/** @}
382
/** @}
385
 */
383
 */