Changeset 65fb232 in mainline for arch/sparc64/src/console.c


Ignore:
Timestamp:
2005-12-30T22:38:23Z (20 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
6ccb238
Parents:
80bff342
Message:

sparc64 work.
kconsole support.
Add non-blocking ofw_getchar().

File:
1 edited

Legend:

Unmodified
Added
Removed
  • arch/sparc64/src/console.c

    r80bff342 r65fb232  
    3333#include <arch/asm.h>
    3434#include <arch/register.h>
     35#include <arch/types.h>
     36#include <typedefs.h>
     37#include <proc/thread.h>
     38#include <synch/mutex.h>
    3539
    3640static void ofw_sparc64_putchar(chardev_t *d, const char ch);
     41static char ofw_sparc64_getchar(chardev_t *d);
     42static void ofw_sparc64_suspend(chardev_t *d);
     43static void ofw_sparc64_resume(chardev_t *d);
     44
     45mutex_t canwork;
    3746
    3847static chardev_t ofw_sparc64_console;
    3948static chardev_operations_t ofw_sparc64_console_ops = {
    40         .write = ofw_sparc64_putchar
     49        .write = ofw_sparc64_putchar,
     50        .read = ofw_sparc64_getchar,
     51        .resume = ofw_sparc64_resume,
     52        .suspend = ofw_sparc64_suspend
    4153};
    4254
     
    4456{
    4557        chardev_initialize("ofw_sparc64_console", &ofw_sparc64_console, &ofw_sparc64_console_ops);
     58        stdin = &ofw_sparc64_console;
    4659        stdout = &ofw_sparc64_console;
     60        mutex_initialize(&canwork);
    4761}
    4862
    49 /** Print one character.
     63/** Write one character.
    5064 *
    51  * @param ch Character to be printed.
     65 * @param d Character device (ignored).
     66 * @param ch Character to be written.
    5267 */
    5368void ofw_sparc64_putchar(chardev_t *d, const char ch)
     
    6984        pstate_write(pstate.value);
    7085}
     86
     87/** Read one character.
     88 *
     89 * The call is non-blocking.
     90 *
     91 * @param d Character device (ignored).
     92 * @return Character read or zero if no character was read.
     93 */
     94char ofw_sparc64_getchar(chardev_t *d)
     95{
     96        char ch;
     97        pstate_reg_t pstate;
     98
     99        /*
     100         * 32-bit OpenFirmware depends on PSTATE.AM bit set.
     101         */     
     102        pstate.value = pstate_read();
     103        pstate.am = true;
     104        pstate_write(pstate.value);
     105
     106        ch = ofw_getchar();
     107       
     108        pstate.am = false;
     109        pstate_write(pstate.value);
     110       
     111        return ch;
     112}
     113
     114void ofw_sparc64_suspend(chardev_t *d)
     115{
     116        mutex_lock(&canwork);
     117}
     118
     119void ofw_sparc64_resume(chardev_t *d)
     120{
     121        mutex_unlock(&canwork);
     122}
     123
     124/** Kernel thread for pushing characters read from OFW to input buffer.
     125 *
     126 * @param arg Ignored.
     127 */
     128void kofwinput(void *arg)
     129{
     130
     131        while (1) {
     132                char ch = 0;
     133               
     134                mutex_lock(&canwork);
     135                mutex_unlock(&canwork);
     136               
     137                ch = ofw_sparc64_getchar(NULL);
     138                if (ch) {
     139                        if (ch == '\r')
     140                                ch = '\n';
     141                        chardev_push_character(&ofw_sparc64_console, ch);
     142                }
     143                thread_usleep(25000);
     144        }
     145}
Note: See TracChangeset for help on using the changeset viewer.