Rev 4296 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
Rev 4296 | Rev 4420 | ||
---|---|---|---|
Line 99... | Line 99... | ||
99 | ((type *) (sgcn_buffer_begin + (offset))) |
99 | ((type *) (sgcn_buffer_begin + (offset))) |
100 | 100 | ||
101 | /** Returns a pointer to the console buffer header. */ |
101 | /** Returns a pointer to the console buffer header. */ |
102 | #define SGCN_BUFFER_HEADER (SGCN_BUFFER(sgcn_buffer_header_t, 0)) |
102 | #define SGCN_BUFFER_HEADER (SGCN_BUFFER(sgcn_buffer_header_t, 0)) |
103 | 103 | ||
104 | /** defined in drivers/kbd.c */ |
- | |
105 | extern kbd_type_t kbd_type; |
- | |
106 | - | ||
107 | /** starting address of SRAM, will be set by the init_sram_begin function */ |
104 | /** starting address of SRAM, will be set by the init_sram_begin function */ |
108 | static uintptr_t sram_begin; |
105 | static uintptr_t sram_begin; |
109 | 106 | ||
110 | /** |
107 | /** |
111 | * starting address of the SGCN buffer, will be set by the |
108 | * starting address of the SGCN buffer, will be set by the |
Line 135... | Line 132... | ||
135 | /** SGCN output device operations */ |
132 | /** SGCN output device operations */ |
136 | static outdev_operations_t sgcnout_ops = { |
133 | static outdev_operations_t sgcnout_ops = { |
137 | .write = sgcn_putchar |
134 | .write = sgcn_putchar |
138 | }; |
135 | }; |
139 | 136 | ||
140 | /** SGCN input device operations */ |
- | |
141 | static indev_operations_t sgcnin_ops = { |
- | |
142 | .poll = NULL |
- | |
143 | }; |
- | |
144 | - | ||
145 | static indev_t sgcnin; /**< SGCN input device. */ |
- | |
146 | static outdev_t sgcnout; /**< SGCN output device. */ |
137 | static outdev_t sgcnout; /**< SGCN output device. */ |
147 | 138 | ||
148 | /** |
139 | /** |
149 | * Set some sysinfo values (SRAM address and SRAM size). |
140 | * Set some sysinfo values (SRAM address and SRAM size). |
150 | */ |
141 | */ |
Line 286... | Line 277... | ||
286 | /** |
277 | /** |
287 | * Grabs the input for kernel. |
278 | * Grabs the input for kernel. |
288 | */ |
279 | */ |
289 | void sgcn_grab(void) |
280 | void sgcn_grab(void) |
290 | { |
281 | { |
291 | kbd_disabled = true; |
282 | kbd_disabled = false; |
292 | } |
283 | } |
293 | 284 | ||
294 | /** |
285 | /** |
295 | * Releases the input so that userspace can use it. |
286 | * Releases the input so that userspace can use it. |
296 | */ |
287 | */ |
Line 302... | Line 293... | ||
302 | /** |
293 | /** |
303 | * Function regularly called by the keyboard polling thread. Finds out whether |
294 | * Function regularly called by the keyboard polling thread. Finds out whether |
304 | * there are some unread characters in the input queue. If so, it picks them up |
295 | * there are some unread characters in the input queue. If so, it picks them up |
305 | * and sends them to the upper layers of HelenOS. |
296 | * and sends them to the upper layers of HelenOS. |
306 | */ |
297 | */ |
307 | static void sgcn_poll() |
298 | static void sgcn_poll(sgcn_instance_t *instance) |
308 | { |
299 | { |
309 | uint32_t begin = SGCN_BUFFER_HEADER->in_begin; |
300 | uint32_t begin = SGCN_BUFFER_HEADER->in_begin; |
310 | uint32_t end = SGCN_BUFFER_HEADER->in_end; |
301 | uint32_t end = SGCN_BUFFER_HEADER->in_end; |
311 | uint32_t size = end - begin; |
302 | uint32_t size = end - begin; |
312 | 303 | ||
Line 320... | Line 311... | ||
320 | SGCN_BUFFER(char, SGCN_BUFFER_HEADER->in_rdptr); |
311 | SGCN_BUFFER(char, SGCN_BUFFER_HEADER->in_rdptr); |
321 | volatile uint32_t *in_wrptr_ptr = &(SGCN_BUFFER_HEADER->in_wrptr); |
312 | volatile uint32_t *in_wrptr_ptr = &(SGCN_BUFFER_HEADER->in_wrptr); |
322 | volatile uint32_t *in_rdptr_ptr = &(SGCN_BUFFER_HEADER->in_rdptr); |
313 | volatile uint32_t *in_rdptr_ptr = &(SGCN_BUFFER_HEADER->in_rdptr); |
323 | 314 | ||
324 | while (*in_rdptr_ptr != *in_wrptr_ptr) { |
315 | while (*in_rdptr_ptr != *in_wrptr_ptr) { |
325 | - | ||
326 | buf_ptr = (volatile char *) |
316 | buf_ptr = (volatile char *) |
327 | SGCN_BUFFER(char, SGCN_BUFFER_HEADER->in_rdptr); |
317 | SGCN_BUFFER(char, SGCN_BUFFER_HEADER->in_rdptr); |
328 | char c = *buf_ptr; |
318 | char c = *buf_ptr; |
329 | *in_rdptr_ptr = (((*in_rdptr_ptr) - begin + 1) % size) + begin; |
319 | *in_rdptr_ptr = (((*in_rdptr_ptr) - begin + 1) % size) + begin; |
330 | 320 | ||
331 | indev_push_character(&sgcnin, c); |
321 | indev_push_character(instance->srlnin, c); |
332 | } |
322 | } |
333 | 323 | ||
334 | spinlock_unlock(&sgcn_input_lock); |
324 | spinlock_unlock(&sgcn_input_lock); |
335 | } |
325 | } |
336 | 326 | ||
337 | /** |
327 | /** |
338 | * Polling thread function. |
328 | * Polling thread function. |
339 | */ |
329 | */ |
340 | static void kkbdpoll(void *arg) { |
330 | static void ksgcnpoll(void *instance) { |
341 | while (1) { |
331 | while (1) { |
342 | if (!silent) { |
332 | if (!silent) |
343 | sgcn_poll(); |
333 | sgcn_poll(instance); |
344 | } |
- | |
345 | thread_usleep(POLL_INTERVAL); |
334 | thread_usleep(POLL_INTERVAL); |
346 | } |
335 | } |
347 | } |
336 | } |
348 | 337 | ||
349 | /** |
338 | /** |
350 | * A public function which initializes input from the Serengeti console. |
339 | * A public function which initializes input from the Serengeti console. |
351 | */ |
340 | */ |
352 | indev_t *sgcnin_init(void) |
341 | sgcn_instance_t *sgcnin_init(void) |
353 | { |
342 | { |
354 | sgcn_buffer_begin_init(); |
343 | sgcn_buffer_begin_init(); |
- | 344 | ||
- | 345 | sgcn_instance_t *instance = |
|
- | 346 | malloc(sizeof(sgcn_instance_t), FRAME_ATOMIC); |
|
- | 347 | ||
- | 348 | if (instance) { |
|
- | 349 | instance->srlnin = NULL; |
|
- | 350 | instance->thread = thread_create(ksgcnpoll, instance, TASK, 0, |
|
- | 351 | "ksgcnpoll", true); |
|
- | 352 | ||
- | 353 | if (!instance->thread) { |
|
- | 354 | free(instance); |
|
- | 355 | return NULL; |
|
- | 356 | } |
|
- | 357 | } |
|
- | 358 | ||
- | 359 | return instance; |
|
- | 360 | } |
|
355 | 361 | ||
356 | kbd_type = KBD_SGCN; |
362 | void sgcnin_wire(sgcn_instance_t *instance, indev_t *srlnin) |
357 | 363 | { |
|
358 | sysinfo_set_item_val("kbd", NULL, true); |
364 | ASSERT(instance); |
359 | sysinfo_set_item_val("kbd.type", NULL, KBD_SGCN); |
365 | ASSERT(srlnin); |
360 | 366 | ||
361 | thread_t *t = thread_create(kkbdpoll, NULL, TASK, 0, "kkbdpoll", true); |
- | |
362 | if (!t) |
- | |
363 | panic("Cannot create kkbdpoll."); |
367 | instance->srlnin = srlnin; |
364 | thread_ready(t); |
368 | thread_ready(instance->thread); |
365 | - | ||
366 | indev_initialize("sgcnin", &sgcnin, &sgcnin_ops); |
- | |
367 | 369 | ||
368 | return &sgcnin; |
370 | sysinfo_set_item_val("kbd", NULL, true); |
369 | } |
371 | } |
370 | 372 | ||
371 | /** |
373 | /** |
372 | * A public function which initializes output to the Serengeti console. |
374 | * A public function which initializes output to the Serengeti console. |
373 | */ |
375 | */ |