Subversion Repositories HelenOS-historic

Rev

Rev 1501 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (C) 2006 Ondrej Palkovsky
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  * - Redistributions of source code must retain the above copyright
  10.  *   notice, this list of conditions and the following disclaimer.
  11.  * - Redistributions in binary form must reproduce the above copyright
  12.  *   notice, this list of conditions and the following disclaimer in the
  13.  *   documentation and/or other materials provided with the distribution.
  14.  * - The name of the author may not be used to endorse or promote products
  15.  *   derived from this software without specific prior written permission.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  */
  28.  
  29. #include <align.h>
  30. #include <async.h>
  31. #include <ipc/ipc.h>
  32. #include <errno.h>
  33. #include <stdio.h>
  34. #include <ddi.h>
  35. #include <sysinfo.h>
  36. #include <as.h>
  37. #include <ipc/fb.h>
  38. #include <ipc/ipc.h>
  39. #include <ipc/ns.h>
  40. #include <ipc/services.h>
  41.  
  42. #include "ega.h"
  43.  
  44. /* Allow only 1 connection */
  45. static int client_connected = 0;
  46.  
  47. static unsigned int scr_width;
  48. static unsigned int scr_height;
  49. static char *scr_addr;
  50.  
  51. static void clrscr(void)
  52. {
  53.     int i;
  54.    
  55.     for (i=0; i < scr_width*scr_height; i++)
  56.         scr_addr[i*2] = ' ';
  57. }
  58.  
  59. static void printchar(char c, unsigned int row, unsigned int col)
  60. {
  61.     scr_addr[(row*scr_width + col)*2] = c;
  62. }
  63.  
  64. static void ega_client_connection(ipc_callid_t iid, ipc_call_t *icall)
  65. {
  66.     int retval;
  67.     ipc_callid_t callid;
  68.     ipc_call_t call;
  69.     char c;
  70.     unsigned int row, col;
  71.  
  72.     if (client_connected) {
  73.         ipc_answer_fast(iid, ELIMIT, 0,0);
  74.         return;
  75.     }
  76.     client_connected = 1;
  77.     ipc_answer_fast(iid, 0, 0, 0); /* Accept connection */
  78.  
  79.     while (1) {
  80.         callid = async_get_call(&call);
  81.         switch (IPC_GET_METHOD(call)) {
  82.         case IPC_M_PHONE_HUNGUP:
  83.             client_connected = 0;
  84.             ipc_answer_fast(callid,0,0,0);
  85.             return; /* Exit thread */
  86.         case FB_GET_CSIZE:
  87.             ipc_answer_fast(callid, 0, scr_width, scr_height);
  88.             continue;
  89.         case FB_CLEAR:
  90.             clrscr();
  91.             retval = 0;
  92.             break;
  93.         case FB_PUTCHAR:
  94.             c = IPC_GET_ARG1(call);
  95.             row = IPC_GET_ARG2(call);
  96.             col = IPC_GET_ARG3(call);
  97.             if (row >= scr_width || col >= scr_height) {
  98.                 retval = EINVAL;
  99.                 break;
  100.             }
  101.             printchar(c,row,col);
  102.             retval = 0;
  103.             break;
  104.         default:
  105.             retval = ENOENT;
  106.         }
  107.         ipc_answer_fast(callid,retval,0,0);
  108.     }
  109. }
  110.  
  111. int ega_init(void)
  112. {
  113.     void *ega_ph_addr;
  114.  
  115.  
  116.     ega_ph_addr=(void *)sysinfo_value("fb.address.physical");
  117.     scr_width=sysinfo_value("fb.width");
  118.     scr_height=sysinfo_value("fb.height");
  119.  
  120.     scr_addr=(void *)ALIGN_UP(((__address)set_maxheapsize(USER_ADDRESS_SPACE_SIZE_ARCH>>1)),PAGE_SIZE);
  121.  
  122.     if (ega_ph_addr != ALIGN_DOWN((unsigned long)ega_ph_addr, PAGE_SIZE))
  123.         return -1;
  124.    
  125.     map_physmem(ega_ph_addr, scr_addr, (scr_width*scr_height+PAGE_SIZE-1)>>PAGE_WIDTH,
  126.             AS_AREA_READ | AS_AREA_WRITE);
  127.  
  128.  
  129.     async_set_client_connection(ega_client_connection);
  130.  
  131.     clrscr();
  132.  
  133.     return 0;
  134. }
  135.