Changeset 80649a91 in mainline for fb


Ignore:
Timestamp:
2006-05-21T19:28:37Z (20 years ago)
Author:
Ondrej Palkovsky <ondrap@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
a410beb
Parents:
1ee11f4
Message:

Merged libadt into libc.
Made lot of psthread and thread stuff thread-safe.
Added new driver framework for easy C connection programming.
Changed FB code to use new API.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • fb/fb.c

    r1ee11f4 r80649a91  
    4545
    4646#include <kernel/errno.h>
    47 
     47#include <async.h>
    4848
    4949#include "fb.h"
    50 
    51 
    52 
    53 #define pl /*printf("FB:L:%d\n",(int)__LINE__);*/
    5450
    5551#define EFB (-1)
     
    8076
    8177
    82 
    83 
    84 int main(int argc, char *argv[])
    85 {
    86        
     78static int init_fb(void)
     79{
    8780        __address fb_ph_addr;
    8881        unsigned int fb_width;
     
    9285        __address fb_addr;
    9386        int a=0;
    94 
    95 
    96         if(!sysinfo_value("fb")) return -1;
    97        
     87        int i,j,k;
     88        int w;
     89        char text[]="HelenOS Framebuffer driver\non Virtual Framebuffer\nVFB ";
     90
    9891        fb_ph_addr=sysinfo_value("fb.address.physical");
    9992        fb_width=sysinfo_value("fb.width");
     
    10598
    10699
    107 
     100       
    108101        map_physmem(task_get_id(),(void *)((__address)fb_ph_addr),(void *)fb_addr,
    109                 (fb_scanline*fb_height+PAGE_SIZE-1)>>PAGE_WIDTH,1);
     102                    (fb_scanline*fb_height+PAGE_SIZE-1)>>PAGE_WIDTH,1);
    110103       
    111104        fb_init(0,fb_addr, fb_width, fb_height, fb_bpp, fb_scanline,
     
    115108        fb_putchar(0,' ');
    116109
    117 
    118         {
    119                 int i,j;
    120 
    121                 for(i=0;i<H_NO_VFBS;i++)
    122                         for(j=0;j<V_NO_VFBS;j++)
    123                         {
    124        
    125                                 int w=create_window(0,(fb_width/H_NO_VFBS)*i+SPACING,
    126                                         (fb_height/V_NO_VFBS)*j+SPACING,(fb_width/H_NO_VFBS)-2*SPACING ,
    127                                                 (fb_height/V_NO_VFBS)-2*SPACING,mod_col(DEFAULT_BGCOLOR,/*i+j*H_NO_VFBS*/0),
    128                                                         mod_col(DEFAULT_FGCOLOR,/*i+j*H_NO_VFBS*/0),
    129                                                                 mod_col(DEFAULT_LOGOCOLOR,/*i+j*H_NO_VFBS)*/0));
    130 
    131                                 if(w==EFB) return -1;
    132 
    133                                 {
    134                                         char text[]="Hello, World from\nHelenOS Framebuffer driver\non Virtual Framebuffer\nVFB ";
    135                                         int i;
    136                                         for(i=0;text[i];i++) fb_putchar(w,text[i]);
    137                                         fb_putchar(w,w+'0');
    138                                         fb_putchar(w,'\n');
    139                                 }
    140                         }
     110        for(i=0;i<H_NO_VFBS;i++)
     111                for(j=0;j<V_NO_VFBS;j++) {
     112                        w = create_window(0,(fb_width/H_NO_VFBS)*i+SPACING,
     113                                          (fb_height/V_NO_VFBS)*j+SPACING,(fb_width/H_NO_VFBS)-2*SPACING ,
     114                                          (fb_height/V_NO_VFBS)-2*SPACING,mod_col(DEFAULT_BGCOLOR,/*i+j*H_NO_VFBS*/0),
     115                                          mod_col(DEFAULT_FGCOLOR,/*i+j*H_NO_VFBS*/0),
     116                                          mod_col(DEFAULT_LOGOCOLOR,/*i+j*H_NO_VFBS)*/0));
     117                       
     118                        if( w== EFB)
     119                                return -1;
     120                       
     121                        for(k=0;text[k];k++)
     122                                fb_putchar(w,text[k]);
     123                        fb_putchar(w,w+'0');
     124                        fb_putchar(w,'\n');
     125                }
     126        return 0;
     127}
     128
     129int vfb_no = 1;
     130void client_connection(ipc_callid_t iid, ipc_call_t *icall)
     131{
     132        ipc_callid_t callid;
     133        ipc_call_t call;
     134        int vfb = vfb_no++;
     135
     136        if (vfb > 9) {
     137                ipc_answer_fast(iid, ELIMIT, 0,0);
     138                return;
    141139        }
    142 
    143 
     140        ipc_answer_fast(iid, 0, 0, 0);
     141
     142        while (1) {
     143                callid = async_get_call(&call);
     144                switch (IPC_GET_METHOD(call)) {
     145                case IPC_M_PHONE_HUNGUP:
     146                        ipc_answer_fast(callid,0,0,0);
     147                        return; /* Exit thread */
     148
     149                case FB_PUTCHAR:
     150                        ipc_answer_fast(callid,0,0,0);
     151                        fb_putchar(vfb,IPC_GET_ARG2(call));
     152                        break;
     153                default:
     154                        ipc_answer_fast(callid,ENOENT,0,0);
     155                }
     156        }
     157}
     158
     159int main(int argc, char *argv[])
     160{
    144161        ipc_call_t call;
    145162        ipc_callid_t callid;
     
    151168        ipcarg_t retval, arg1, arg2;
    152169
     170        if(!sysinfo_value("fb")) return -1;
    153171
    154172
    155173        if ((res = ipc_connect_to_me(PHONE_NS, SERVICE_VIDEO, 0, &phonead)) != 0)
    156         {
    157174                return -1;
    158         };
    159 
    160                
    161         while (1) {
    162                 static int vfb_no=1;
    163 
    164                 callid = ipc_wait_for_call(&call);
    165         //      printf("%s:Call phone=%lX..", NAME, call.in_phone_hash);
    166                 switch (IPC_GET_METHOD(call)&((1<<METHOD_WIDTH)-1)) {
    167                         case IPC_M_PHONE_HUNGUP:
    168 //                              fb_putchar(4,((a++)&15)+'A');
    169                                
    170                                 retval = 0;
    171                                 break;
    172                         case IPC_M_CONNECT_ME_TO:
    173                                         retval = 0;
    174 //                              fb_putchar(1,((a++)&15)+'A');
    175                                 break;
    176                         case FB_GET_VFB:
    177                                 retval = 0;
    178                                 arg1 = vfb_no++;       
    179 //                              fb_putchar(2,((a++)&15)+'A');
    180                                
    181                                 break;
    182 
    183                         case FB_PUTCHAR:
    184                                 retval = 0;
    185                                 fb_putchar(IPC_GET_ARG1(call),IPC_GET_ARG2(call));
    186 //                              fb_putchar(2,((a++)&15)+'A');
    187                                 break;
    188 
    189                         default:
    190                                 retval = ENOENT;
    191 //                              fb_putchar(3,((a++)&15)+'A');
    192                                 break;
    193                 }
    194 
    195                 if (! (callid & IPC_CALLID_NOTIFICATION)) {
    196                         ipc_answer_fast(callid, retval, arg1, arg2);
    197                 }
    198         }
    199 
     175       
     176        init_fb();
     177
     178        async_manager();
     179        /* Never reached */
    200180        return 0;
    201181}
     
    310290        FB(item,fbaddress)[startbyte + 0] = BLUE(color, 8);
    311291#endif
    312                                                                                                                                                                                                
    313292
    314293}
     
    372351        for (y = 0; y < FB(item,yres); y++)
    373352        {
    374                 clear_line(item,y); pl
     353                clear_line(item,y);
    375354        }       
    376355}
     
    554533
    555534               
    556         FB(item,fbaddress) = (unsigned char *) addr; pl
    557         FB(item,xres) = x; pl
    558         FB(item,yres) = y; pl
    559         FB(item,scanline) = scan; pl
    560        
    561        
    562         FB(item,rows) = y / FONT_SCANLINES; pl
    563         FB(item,columns) = x / COL_WIDTH; pl
     535        FB(item,fbaddress) = (unsigned char *) addr;
     536        FB(item,xres) = x;
     537        FB(item,yres) = y;
     538        FB(item,scanline) = scan;
     539       
     540       
     541        FB(item,rows) = y / FONT_SCANLINES;
     542        FB(item,columns) = x / COL_WIDTH;
    564543
    565544        FB(item,BGCOLOR)=BGCOLOR;
     
    568547
    569548
    570         clear_screen(item); pl
    571         draw_logo(item,FB(item,xres) - helenos_width, 0); pl
    572         invert_cursor(item); pl
     549        clear_screen(item);
     550        draw_logo(item,FB(item,xres) - helenos_width, 0);
     551        invert_cursor(item);
    573552
    574553}
Note: See TracChangeset for help on using the changeset viewer.