Rev 4311 | Rev 4329 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed
| Rev 4311 | Rev 4313 | ||
|---|---|---|---|
| Line 132... | Line 132... | ||
| 132 | /** SGCN output device operations */ |
132 | /** SGCN output device operations */ |
| 133 | static outdev_operations_t sgcnout_ops = { |
133 | static outdev_operations_t sgcnout_ops = { |
| 134 | .write = sgcn_putchar |
134 | .write = sgcn_putchar |
| 135 | }; |
135 | }; |
| 136 | 136 | ||
| 137 | /** SGCN input device operations */ |
- | |
| 138 | static indev_operations_t sgcnin_ops = { |
- | |
| 139 | .poll = NULL |
- | |
| 140 | }; |
- | |
| 141 | - | ||
| 142 | static indev_t sgcnin; /**< SGCN input device. */ |
- | |
| 143 | static outdev_t sgcnout; /**< SGCN output device. */ |
137 | static outdev_t sgcnout; /**< SGCN output device. */ |
| 144 | 138 | ||
| 145 | /** |
139 | /** |
| 146 | * Set some sysinfo values (SRAM address and SRAM size). |
140 | * Set some sysinfo values (SRAM address and SRAM size). |
| 147 | */ |
141 | */ |
| Line 299... | Line 293... | ||
| 299 | /** |
293 | /** |
| 300 | * Function regularly called by the keyboard polling thread. Finds out whether |
294 | * Function regularly called by the keyboard polling thread. Finds out whether |
| 301 | * 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 |
| 302 | * and sends them to the upper layers of HelenOS. |
296 | * and sends them to the upper layers of HelenOS. |
| 303 | */ |
297 | */ |
| 304 | static void sgcn_poll() |
298 | static void sgcn_poll(sgcn_instance_t *instance) |
| 305 | { |
299 | { |
| 306 | uint32_t begin = SGCN_BUFFER_HEADER->in_begin; |
300 | uint32_t begin = SGCN_BUFFER_HEADER->in_begin; |
| 307 | uint32_t end = SGCN_BUFFER_HEADER->in_end; |
301 | uint32_t end = SGCN_BUFFER_HEADER->in_end; |
| 308 | uint32_t size = end - begin; |
302 | uint32_t size = end - begin; |
| 309 | 303 | ||
| Line 317... | Line 311... | ||
| 317 | SGCN_BUFFER(char, SGCN_BUFFER_HEADER->in_rdptr); |
311 | SGCN_BUFFER(char, SGCN_BUFFER_HEADER->in_rdptr); |
| 318 | volatile uint32_t *in_wrptr_ptr = &(SGCN_BUFFER_HEADER->in_wrptr); |
312 | volatile uint32_t *in_wrptr_ptr = &(SGCN_BUFFER_HEADER->in_wrptr); |
| 319 | volatile uint32_t *in_rdptr_ptr = &(SGCN_BUFFER_HEADER->in_rdptr); |
313 | volatile uint32_t *in_rdptr_ptr = &(SGCN_BUFFER_HEADER->in_rdptr); |
| 320 | 314 | ||
| 321 | while (*in_rdptr_ptr != *in_wrptr_ptr) { |
315 | while (*in_rdptr_ptr != *in_wrptr_ptr) { |
| 322 | - | ||
| 323 | buf_ptr = (volatile char *) |
316 | buf_ptr = (volatile char *) |
| 324 | SGCN_BUFFER(char, SGCN_BUFFER_HEADER->in_rdptr); |
317 | SGCN_BUFFER(char, SGCN_BUFFER_HEADER->in_rdptr); |
| 325 | char c = *buf_ptr; |
318 | char c = *buf_ptr; |
| 326 | *in_rdptr_ptr = (((*in_rdptr_ptr) - begin + 1) % size) + begin; |
319 | *in_rdptr_ptr = (((*in_rdptr_ptr) - begin + 1) % size) + begin; |
| 327 | 320 | ||
| 328 | indev_push_character(&sgcnin, c); |
321 | indev_push_character(instance->srlnin, c); |
| 329 | } |
322 | } |
| 330 | 323 | ||
| 331 | spinlock_unlock(&sgcn_input_lock); |
324 | spinlock_unlock(&sgcn_input_lock); |
| 332 | } |
325 | } |
| 333 | 326 | ||
| 334 | /** |
327 | /** |
| 335 | * Polling thread function. |
328 | * Polling thread function. |
| 336 | */ |
329 | */ |
| 337 | static void kkbdpoll(void *arg) { |
330 | static void ksgcnpoll(void *instance) { |
| 338 | while (1) { |
331 | while (1) { |
| 339 | if (!silent) { |
332 | if (!silent) |
| 340 | sgcn_poll(); |
333 | sgcn_poll(instance); |
| 341 | } |
- | |
| 342 | thread_usleep(POLL_INTERVAL); |
334 | thread_usleep(POLL_INTERVAL); |
| 343 | } |
335 | } |
| 344 | } |
336 | } |
| 345 | 337 | ||
| 346 | /** |
338 | /** |
| 347 | * A public function which initializes input from the Serengeti console. |
339 | * A public function which initializes input from the Serengeti console. |
| 348 | */ |
340 | */ |
| 349 | indev_t *sgcnin_init(void) |
341 | sgcn_instance_t *sgcnin_init(void) |
| 350 | { |
342 | { |
| 351 | sgcn_buffer_begin_init(); |
343 | sgcn_buffer_begin_init(); |
| 352 | 344 | ||
| - | 345 | sgcn_instance_t *instance = |
|
| 353 | sysinfo_set_item_val("kbd", NULL, true); |
346 | malloc(sizeof(sgcn_instance_t), FRAME_ATOMIC); |
| - | 347 | if (!instance) |
|
| - | 348 | return NULL; |
|
| 354 | 349 | ||
| - | 350 | instance->srlnin = NULL; |
|
| 355 | thread_t *t = thread_create(kkbdpoll, NULL, TASK, 0, "kkbdpoll", true); |
351 | instance->thread = thread_create(ksgcnpoll, instance, TASK, 0, |
| - | 352 | "ksgcnpoll", true); |
|
| 356 | if (!t) |
353 | if (!instance->thread) { |
| 357 | panic("Cannot create kkbdpoll."); |
354 | free(instance); |
| 358 | thread_ready(t); |
355 | return NULL; |
| - | 356 | } |
|
| 359 | 357 | ||
| - | 358 | return instance; |
|
| - | 359 | } |
|
| - | 360 | ||
| 360 | indev_initialize("sgcnin", &sgcnin, &sgcnin_ops); |
361 | void sgcnin_wire(sgcn_instance_t *instance, indev_t *srlnin) |
| - | 362 | { |
|
| - | 363 | ASSERT(instance); |
|
| - | 364 | ASSERT(srlnin); |
|
| 361 | 365 | ||
| 362 | return &sgcnin; |
366 | instance->srlnin = srlnin; |
| - | 367 | thread_ready(instance->thread); |
|
| - | 368 | ||
| - | 369 | sysinfo_set_item_val("kbd", NULL, true); |
|
| 363 | } |
370 | } |
| 364 | 371 | ||
| 365 | /** |
372 | /** |
| 366 | * A public function which initializes output to the Serengeti console. |
373 | * A public function which initializes output to the Serengeti console. |
| 367 | */ |
374 | */ |