Changeset 481c520 in mainline for arch/sparc64/src/console.c


Ignore:
Timestamp:
2006-02-27T12:30:11Z (19 years ago)
Author:
Jakub Jermar <jakub@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
02f441c0
Parents:
4a2b52f
Message:

sparc64 work.
Revive OFW console code and use it before the kernel switches to standalone console.

ia32 + ia64 cosmetic changes.

File:
1 edited

Legend:

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

    r4a2b52f r481c520  
    3232#include <genarch/fb/fb.h>
    3333#include <arch/drivers/fb.h>
     34#include <genarch/ofw/ofw.h>
     35#include <console/chardev.h>
     36#include <console/console.h>
     37#include <arch/asm.h>
     38#include <arch/register.h>
     39#include <proc/thread.h>
     40#include <synch/mutex.h>
    3441
    35 void fb_sparc64_console_init(void)
     42static void ofw_sparc64_putchar(chardev_t *d, const char ch);
     43static char ofw_sparc64_getchar(chardev_t *d);
     44static void ofw_sparc64_suspend(chardev_t *d);
     45static void ofw_sparc64_resume(chardev_t *d);
     46
     47mutex_t canwork;
     48
     49static volatile int ofw_console_active;
     50
     51static chardev_t ofw_sparc64_console;
     52static chardev_operations_t ofw_sparc64_console_ops = {
     53        .write = ofw_sparc64_putchar,
     54        .read = ofw_sparc64_getchar,
     55        .resume = ofw_sparc64_resume,
     56        .suspend = ofw_sparc64_suspend
     57};
     58
     59/** Initialize kernel console to use OpenFirmware services. */
     60void ofw_sparc64_console_init(void)
    3661{
     62        chardev_initialize("ofw_sparc64_console", &ofw_sparc64_console, &ofw_sparc64_console_ops);
     63        stdin = &ofw_sparc64_console;
     64        stdout = &ofw_sparc64_console;
     65        mutex_initialize(&canwork);
     66        ofw_console_active = 1;
     67}
     68
     69/** Initialize kernel console to use framebuffer and keyboard directly. */
     70void standalone_sparc64_console_init(void)
     71{
     72        ofw_console_active = 0;
     73        stdin = NULL;
    3774        fb_init(FB_VIRT_ADDRESS, FB_X_RES, FB_Y_RES, FB_COLOR_DEPTH/8);
    3875}
     76
     77/** Write one character using OpenFirmware.
     78 *
     79 * @param d Character device (ignored).
     80 * @param ch Character to be written.
     81 */
     82void ofw_sparc64_putchar(chardev_t *d, const char ch)
     83{
     84        pstate_reg_t pstate;
     85
     86        /*
     87         * 32-bit OpenFirmware depends on PSTATE.AM bit set.
     88         */     
     89        pstate.value = pstate_read();
     90        pstate.am = true;
     91        pstate_write(pstate.value);
     92
     93        if (ch == '\n')
     94                ofw_putchar('\r');
     95        ofw_putchar(ch);
     96       
     97        pstate.am = false;
     98        pstate_write(pstate.value);
     99}
     100
     101/** Read one character using OpenFirmware.
     102 *
     103 * The call is non-blocking.
     104 *
     105 * @param d Character device (ignored).
     106 * @return Character read or zero if no character was read.
     107 */
     108char ofw_sparc64_getchar(chardev_t *d)
     109{
     110        char ch;
     111        pstate_reg_t pstate;
     112
     113        /*
     114         * 32-bit OpenFirmware depends on PSTATE.AM bit set.
     115         */     
     116        pstate.value = pstate_read();
     117        pstate.am = true;
     118        pstate_write(pstate.value);
     119
     120        ch = ofw_getchar();
     121       
     122        pstate.am = false;
     123        pstate_write(pstate.value);
     124       
     125        return ch;
     126}
     127
     128void ofw_sparc64_suspend(chardev_t *d)
     129{
     130        mutex_lock(&canwork);
     131}
     132
     133void ofw_sparc64_resume(chardev_t *d)
     134{
     135        mutex_unlock(&canwork);
     136}
     137
     138/** Kernel thread for pushing characters read from OFW to input buffer.
     139 *
     140 * @param arg Ignored.
     141 */
     142void kofwinput(void *arg)
     143{
     144
     145        while (ofw_console_active) {
     146                char ch = 0;
     147               
     148                mutex_lock(&canwork);
     149                mutex_unlock(&canwork);
     150               
     151                ch = ofw_sparc64_getchar(NULL);
     152                if (ch) {
     153                        if (ch == '\r')
     154                                ch = '\n';
     155                        chardev_push_character(&ofw_sparc64_console, ch);
     156                }
     157                thread_usleep(25000);
     158        }
     159}
Note: See TracChangeset for help on using the changeset viewer.