Changeset 8b97256 in mainline


Ignore:
Timestamp:
2008-12-18T12:23:39Z (15 years ago)
Author:
Jiri Svoboda <jirik.svoboda@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
d99b3f2
Parents:
8231246
Message:

Do not duplicate code in serial framebuffer drivers.

Location:
uspace/srv/fb
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • uspace/srv/fb/msim.c

    r8231246 r8b97256  
    3737
    3838#include <async.h>
    39 #include <ipc/fb.h>
    40 #include <ipc/ipc.h>
    4139#include <libc.h>
    42 #include <errno.h>
    43 #include <string.h>
    44 #include <libc.h>
    45 #include <stdio.h>
    46 #include <ipc/fb.h>
    4740#include <sysinfo.h>
    4841#include <as.h>
    49 #include <align.h>
    5042#include <ddi.h>
    5143
     
    5648#define HEIGHT 25
    5749
    58 #define MAX_CONTROL 20
    59 
    60 /* Allow only 1 connection */
    61 static int client_connected = 0;
    62 
    6350static char *virt_addr;
    6451
     
    6653{
    6754        *virt_addr = c;
    68 }
    69 
    70 static void msim_client_connection(ipc_callid_t iid, ipc_call_t *icall)
    71 {
    72         int retval;
    73         ipc_callid_t callid;
    74         ipc_call_t call;
    75         char c;
    76         int lastcol = 0;
    77         int lastrow = 0;
    78         int newcol;
    79         int newrow;
    80         int fgcolor;
    81         int bgcolor;
    82         int i;
    83 
    84         if (client_connected) {
    85                 ipc_answer_0(iid, ELIMIT);
    86                 return;
    87         }
    88        
    89         client_connected = 1;
    90         ipc_answer_0(iid, EOK);
    91        
    92         /* Clear the terminal, set scrolling region
    93            to 0 - 25 lines */
    94         serial_clrscr();
    95         serial_goto(0, 0);
    96         serial_puts("\033[0;25r");
    97        
    98         while (true) {
    99                 callid = async_get_call(&call);
    100                 switch (IPC_GET_METHOD(call)) {
    101                 case IPC_M_PHONE_HUNGUP:
    102                         client_connected = 0;
    103                         ipc_answer_0(callid, EOK);
    104                         return;
    105                 case FB_PUTCHAR:
    106                         c = IPC_GET_ARG1(call);
    107                         newrow = IPC_GET_ARG2(call);
    108                         newcol = IPC_GET_ARG3(call);
    109                         if ((lastcol != newcol) || (lastrow != newrow))
    110                                 serial_goto(newrow, newcol);
    111                         lastcol = newcol + 1;
    112                         lastrow = newrow;
    113                         msim_putc(c);
    114                         retval = 0;
    115                         break;
    116                 case FB_CURSOR_GOTO:
    117                         newrow = IPC_GET_ARG1(call);
    118                         newcol = IPC_GET_ARG2(call);
    119                         serial_goto(newrow, newcol);
    120                         lastrow = newrow;
    121                         lastcol = newcol;
    122                         retval = 0;
    123                         break;
    124                 case FB_GET_CSIZE:
    125                         ipc_answer_2(callid, EOK, HEIGHT, WIDTH);
    126                         continue;
    127                 case FB_CLEAR:
    128                         serial_clrscr();
    129                         retval = 0;
    130                         break;
    131                 case FB_SET_STYLE:
    132                         fgcolor = IPC_GET_ARG1(call);
    133                         bgcolor = IPC_GET_ARG2(call);
    134                         if (fgcolor < bgcolor)
    135                                 serial_set_style(0);
    136                         else
    137                                 serial_set_style(7);
    138                         retval = 0;
    139                         break;
    140                 case FB_SCROLL:
    141                         i = IPC_GET_ARG1(call);
    142                         if ((i > HEIGHT) || (i < -HEIGHT)) {
    143                                 retval = EINVAL;
    144                                 break;
    145                         }
    146                         serial_scroll(i);
    147                         serial_goto(lastrow, lastcol);
    148                         retval = 0;
    149                         break;
    150                 case FB_CURSOR_VISIBILITY:
    151                         if(IPC_GET_ARG1(call))
    152                                 serial_cursor_enable();
    153                         else
    154                                 serial_cursor_disable();
    155                         retval = 0;
    156                         break;
    157                 default:
    158                         retval = ENOENT;
    159                 }
    160                 ipc_answer_0(callid, retval);
    161         }
    16255}
    16356
     
    17164        serial_console_init(msim_putc, WIDTH, HEIGHT);
    17265       
    173         async_set_client_connection(msim_client_connection);
     66        async_set_client_connection(serial_client_connection);
    17467        return 0;
    17568}
  • uspace/srv/fb/serial_console.c

    r8231246 r8b97256  
    3939
    4040#include <stdio.h>
     41#include <ipc/ipc.h>
     42#include <async.h>
     43#include <ipc/fb.h>
     44#include <bool.h>
     45#include <errno.h>
    4146
    4247#include "serial_console.h"
     
    4449#define MAX_CONTROL 20
    4550
    46 static uint32_t width;
    47 static uint32_t height;
     51static int width;
     52static int height;
    4853static putc_function_t putc_function;
     54
     55/* Allow only 1 connection */
     56static int client_connected = 0;
    4957
    5058void serial_puts(char *str)
     
    8997}
    9098
     99/** Set scrolling region. */
     100void serial_set_scroll_region(unsigned last_row)
     101{
     102        char control[MAX_CONTROL];
     103        snprintf(control, MAX_CONTROL, "\033[0;%ur", last_row);
     104        serial_puts(control);
     105}
     106
    91107void serial_cursor_disable(void)
    92108{
     
    106122}
    107123
     124/**
     125 * Main function of the thread serving client connections.
     126 */
     127void serial_client_connection(ipc_callid_t iid, ipc_call_t *icall)
     128{
     129        int retval;
     130        ipc_callid_t callid;
     131        ipc_call_t call;
     132        char c;
     133        int lastcol = 0;
     134        int lastrow = 0;
     135        int newcol;
     136        int newrow;
     137        int fgcolor;
     138        int bgcolor;
     139        int i;
     140       
     141        if (client_connected) {
     142                ipc_answer_0(iid, ELIMIT);
     143                return;
     144        }
     145       
     146        client_connected = 1;
     147        ipc_answer_0(iid, EOK);
     148       
     149        /* Clear the terminal, set scrolling region
     150           to 0 - height rows. */
     151        serial_clrscr();
     152        serial_goto(0, 0);
     153        serial_set_scroll_region(height);
     154       
     155        while (true) {
     156                callid = async_get_call(&call);
     157                switch (IPC_GET_METHOD(call)) {
     158                case IPC_M_PHONE_HUNGUP:
     159                        client_connected = 0;
     160                        ipc_answer_0(callid, EOK);
     161                        return;
     162                case FB_PUTCHAR:
     163                        c = IPC_GET_ARG1(call);
     164                        newrow = IPC_GET_ARG2(call);
     165                        newcol = IPC_GET_ARG3(call);
     166                        if ((lastcol != newcol) || (lastrow != newrow))
     167                                serial_goto(newrow, newcol);
     168                        lastcol = newcol + 1;
     169                        lastrow = newrow;
     170                        (*putc_function)(c);
     171                        retval = 0;
     172                        break;
     173                case FB_CURSOR_GOTO:
     174                        newrow = IPC_GET_ARG1(call);
     175                        newcol = IPC_GET_ARG2(call);
     176                        serial_goto(newrow, newcol);
     177                        lastrow = newrow;
     178                        lastcol = newcol;
     179                        retval = 0;
     180                        break;
     181                case FB_GET_CSIZE:
     182                        ipc_answer_2(callid, EOK, height, width);
     183                        continue;
     184                case FB_CLEAR:
     185                        serial_clrscr();
     186                        retval = 0;
     187                        break;
     188                case FB_SET_STYLE:
     189                        fgcolor = IPC_GET_ARG1(call);
     190                        bgcolor = IPC_GET_ARG2(call);
     191                        if (fgcolor < bgcolor)
     192                                serial_set_style(0);
     193                        else
     194                                serial_set_style(7);
     195                        retval = 0;
     196                        break;
     197                case FB_SCROLL:
     198                        i = IPC_GET_ARG1(call);
     199                        if ((i > height) || (i < -height)) {
     200                                retval = EINVAL;
     201                                break;
     202                        }
     203                        serial_scroll(i);
     204                        serial_goto(lastrow, lastcol);
     205                        retval = 0;
     206                        break;
     207                case FB_CURSOR_VISIBILITY:
     208                        if(IPC_GET_ARG1(call))
     209                                serial_cursor_enable();
     210                        else
     211                                serial_cursor_disable();
     212                        retval = 0;
     213                        break;
     214                default:
     215                        retval = ENOENT;
     216                }
     217                ipc_answer_0(callid, retval);
     218        }
     219}
     220
    108221/**
    109222 * @}
  • uspace/srv/fb/serial_console.h

    r8231246 r8b97256  
    3939#define FB_SERIAL_CONSOLE_H_
    4040
     41#include <ipc/ipc.h>
     42
    4143typedef void (*putc_function_t)(char);
    4244
     
    4850void serial_cursor_disable(void);
    4951void serial_cursor_enable(void);
     52void serial_set_scroll_region(unsigned height);
    5053void serial_console_init(putc_function_t putc_fn, uint32_t w, uint32_t h);
     54void serial_client_connection(ipc_callid_t iid, ipc_call_t *icall);
     55
    5156
    5257#endif
  • uspace/srv/fb/sgcn.c

    r8231246 r8b97256  
    3737
    3838#include <async.h>
    39 #include <ipc/ipc.h>
    40 #include <ipc/fb.h>
    4139#include <sysinfo.h>
    4240#include <as.h>
     
    6058 */
    6159static uintptr_t sram_buffer_offset;
    62 
    63 /* Allow only 1 connection */
    64 static int client_connected = 0;
    6560
    6661/**
     
    123118
    124119/**
    125  * Main function of the thread serving client connections.
    126  */
    127 static void sgcn_client_connection(ipc_callid_t iid, ipc_call_t *icall)
    128 {
    129         int retval;
    130         ipc_callid_t callid;
    131         ipc_call_t call;
    132         char c;
    133         int lastcol = 0;
    134         int lastrow = 0;
    135         int newcol;
    136         int newrow;
    137         int fgcolor;
    138         int bgcolor;
    139         int i;
    140        
    141         if (client_connected) {
    142                 ipc_answer_0(iid, ELIMIT);
    143                 return;
    144         }
    145        
    146         client_connected = 1;
    147         ipc_answer_0(iid, EOK);
    148        
    149         /* Clear the terminal, set scrolling region
    150            to 0 - 24 lines */
    151         serial_clrscr();
    152         serial_goto(0, 0);
    153         serial_puts("\033[0;24r");
    154        
    155         while (true) {
    156                 callid = async_get_call(&call);
    157                 switch (IPC_GET_METHOD(call)) {
    158                 case IPC_M_PHONE_HUNGUP:
    159                         client_connected = 0;
    160                         ipc_answer_0(callid, EOK);
    161                         return;
    162                 case FB_PUTCHAR:
    163                         c = IPC_GET_ARG1(call);
    164                         newrow = IPC_GET_ARG2(call);
    165                         newcol = IPC_GET_ARG3(call);
    166                         if ((lastcol != newcol) || (lastrow != newrow))
    167                                 serial_goto(newrow, newcol);
    168                         lastcol = newcol + 1;
    169                         lastrow = newrow;
    170                         sgcn_putc(c);
    171                         retval = 0;
    172                         break;
    173                 case FB_CURSOR_GOTO:
    174                         newrow = IPC_GET_ARG1(call);
    175                         newcol = IPC_GET_ARG2(call);
    176                         serial_goto(newrow, newcol);
    177                         lastrow = newrow;
    178                         lastcol = newcol;
    179                         retval = 0;
    180                         break;
    181                 case FB_GET_CSIZE:
    182                         ipc_answer_2(callid, EOK, HEIGHT, WIDTH);
    183                         continue;
    184                 case FB_CLEAR:
    185                         serial_clrscr();
    186                         retval = 0;
    187                         break;
    188                 case FB_SET_STYLE:
    189                         fgcolor = IPC_GET_ARG1(call);
    190                         bgcolor = IPC_GET_ARG2(call);
    191                         if (fgcolor < bgcolor)
    192                                 serial_set_style(0);
    193                         else
    194                                 serial_set_style(7);
    195                         retval = 0;
    196                         break;
    197                 case FB_SCROLL:
    198                         i = IPC_GET_ARG1(call);
    199                         if ((i > HEIGHT) || (i < -HEIGHT)) {
    200                                 retval = EINVAL;
    201                                 break;
    202                         }
    203                         serial_scroll(i);
    204                         serial_goto(lastrow, lastcol);
    205                         retval = 0;
    206                         break;
    207                 case FB_CURSOR_VISIBILITY:
    208                         if(IPC_GET_ARG1(call))
    209                                 serial_cursor_enable();
    210                         else
    211                                 serial_cursor_disable();
    212                         retval = 0;
    213                         break;
    214                 default:
    215                         retval = ENOENT;
    216                 }
    217                 ipc_answer_0(callid, retval);
    218         }
    219 }
    220 
    221 /**
    222120 * Initializes the SGCN serial driver.
    223121 */
     
    241139        sram_buffer_offset = sysinfo_value("sram.buffer.offset");
    242140       
    243         async_set_client_connection(sgcn_client_connection);
     141        async_set_client_connection(serial_client_connection);
    244142        return 0;
    245143}
Note: See TracChangeset for help on using the changeset viewer.