#ifndef _LINUX_FB_H
#define _LINUX_FB_H

/* Definitions of frame buffers                                         */

#ifdef __KERNEL__
#include <linux/fs.h>
#endif

/* ioctls
   0x46 is 'F'                                                          */
#define FBIOGET_VSCREENINFO     (0x4600)
#define FBIOPUT_VSCREENINFO     (0x4601)
#define FBIOGET_FSCREENINFO     (0x4602)
#define FBIOGETCMAP             (0x4604)
#define FBIOPUTCMAP             (0x4605)
#define FBIOPAN_DISPLAY         (0x4606)


#define FB_TYPE_PACKED_PIXELS          (0)      /* Packed Pixels        */
#define FB_TYPE_PLANES                 (1)      /* Non interleaved planes */
#define FB_TYPE_INTERLEAVED_PLANES     (2)      /* Interleaved planes   */

#define FB_VISUAL_MONO01               (0)      /* Monochr. 1=Black 0=White */
#define FB_VISUAL_MONO10               (1)      /* Monochr. 1=White 0=Black */
#define FB_VISUAL_TRUECOLOR            (2)      /* True color           */
#define FB_VISUAL_PSEUDOCOLOR          (3)      /* Pseudo color (like atari) */
#define FB_VISUAL_DIRECTCOLOR          (4)      /* Direct color         */
#define FB_VISUAL_STATIC_PSEUDOCOLOR   (5)      /* Pseudo color readonly */
#define FB_VISUAL_STATIC_DIRECTCOLOR   (6)      /* Direct color readonly */

struct fb_fix_screeninfo {
        char id[16];                    /* identification string eg "TT Builtin" */
        unsigned long smem_start;       /* Start of frame buffer mem    */
        unsigned long smem_len;         /* Length of frame buffer mem   */        
        int type;                       /* see FB_TYPE_*                */
        int type_aux;                   /* Interleave for interleaved Planes */
        int visual;                     /* see FB_VISUAL_*              */ 
        u_short xpanstep;               /* zero if no hardware panning  */
        u_short ypanstep;               /* zero if no hardware panning  */
        u_short ywrapstep;              /* zero if no hardware ywrap    */
        u_long line_length;             /* length of a line in bytes    */
        short reserved[9];              /* Reserved for future compatibility */
};

struct fb_bitfield {
        int offset;                     /* beginning of bitfield        */
        int length;                     /* length of bitfield           */
        int msb_right;                  /* != 0 : Most significant bit is */ 
                                        /* right */ 
};

#define FB_NONSTD_HAM          (1)      /* Hold-And-Modify (HAM)        */

#define FB_ACTIVATE_NOW        (0)      /* set values immediately (or vbl)*/
#define FB_ACTIVATE_NXTOPEN    (1)      /* activate on next open        */
#define FB_ACTIVATE_TEST       (2)      /* don't set, round up impossible */
#define FB_ACTIVATE_MASK      (15)
                                        /* values                       */
#define FB_ACTIVATE_VBL       (16)      /* activate values on next vbl  */
#define FB_CHANGE_CMAP_VBL    (32)      /* change colormap on vbl       */

#define FB_ACCEL_NONE          (0)      /* no hardware accelerator      */
#define FB_ACCEL_ATARIBLITT    (1)      /* Atari Blitter                */
#define FB_ACCEL_AMIGABLITT    (2)      /* Amiga Blitter                */
#define FB_ACCEL_CYBERVISION   (3)      /* Cybervision64 (S3 Trio64)    */

#define FB_SYNC_HOR_HIGH_ACT   (1)      /* horizontal sync high active  */
#define FB_SYNC_VERT_HIGH_ACT  (2)      /* vertical sync high active    */
#define FB_SYNC_EXT            (4)      /* external sync                */
#define FB_SYNC_COMP_HIGH_ACT  (8)      /* composite sync high active   */
#define FB_SYNC_BROADCAST     (16)      /* broadcast video timings      */
                                        /* vtotal = 144d/288n/576i => PAL  */
                                        /* vtotal = 121d/242n/484i => NTSC */

#define FB_VMODE_NONINTERLACED (0)      /* non interlaced */
#define FB_VMODE_INTERLACED    (1)      /* interlaced   */
#define FB_VMODE_DOUBLE        (2)      /* double scan */
#define FB_VMODE_MASK        (255)

#define FB_VMODE_YWRAP       (256)      /* ywrap instead of panning     */
#define FB_VMODE_SMOOTH_XPAN (512)      /* smooth xpan possible (internally used) */
#define FB_VMODE_CONUPDATE   (512)      /* don't update x/yoffset       */

struct fb_var_screeninfo {
        int xres;                       /* visible resolution           */
        int yres;
        int xres_virtual;               /* virtual resolution           */
        int yres_virtual;
        int xoffset;                    /* offset from virtual to visible */
        int yoffset;                    /* resolution                   */

        int bits_per_pixel;             /* guess what                   */
        int grayscale;                  /* != 0 Graylevels instead of colors */

        struct fb_bitfield red;         /* bitfield in fb mem if true color, */
        struct fb_bitfield green;       /* else only length is significant */
        struct fb_bitfield blue;
        struct fb_bitfield transp;      /* transparency                 */      

        int nonstd;                     /* != 0 Non standard pixel format */

        int activate;                   /* see FB_ACTIVATE_*            */

        int height;                     /* height of picture in mm      */
        int width;                      /* width of picture in mm       */

        int accel;                      /* see FB_ACCEL_*               */

        /* Timing: All values in pixclocks, except pixclock (of course) */
        unsigned long pixclock;         /* pixel clock in ps (pico seconds) */
        unsigned long left_margin;      /* time from sync to picture    */
        unsigned long right_margin;     /* time from picture to sync    */
        unsigned long upper_margin;     /* time from sync to picture    */
        unsigned long lower_margin;
        unsigned long hsync_len;        /* length of horizontal sync    */
        unsigned long vsync_len;        /* length of vertical sync      */
        int sync;                       /* see FB_SYNC_*                */
        int vmode;                      /* see FB_VMODE_*               */
        int reserved[6];                /* Reserved for future compatibility */
};

struct fb_cmap {
        int start;                      /* First entry                  */
        int len;                        /* Number of entries            */
        unsigned short *red;            /* Red values                   */
        unsigned short *green;
        unsigned short *blue;
        unsigned short *transp;         /* transparency, can be NULL    */
};


#ifdef __KERNEL__

struct fb_ops {
        /* get non setable parameters   */
        int (*fb_get_fix) (struct fb_fix_screeninfo *, int); 
        /* get setable parameters       */
        int (*fb_get_var) (struct fb_var_screeninfo *, int);            
        /* set setable parameters       */
        int (*fb_set_var) (struct fb_var_screeninfo *, int);            
        /* get colormap                 */
        int (*fb_get_cmap) (struct fb_cmap *, int, int);
        /* set colormap                 */
        int (*fb_set_cmap) (struct fb_cmap *, int, int);
        /* pan display                   */
        int (*fb_pan_display) (struct fb_var_screeninfo *, int);
        /* perform fb specific ioctl    */
        int (*fb_ioctl)(struct inode *, struct file *, unsigned int,
                        unsigned long, int);
};

int register_framebuffer(char *, int *, struct fb_ops *, int, 
                         struct fb_var_screeninfo *);
int unregister_framebuffer(int);


   /*
    *    This is the interface between the low-level console driver and the
    *    low-level frame buffer device
    */

struct display {
   /* Filled in by the frame buffer device */

   struct fb_var_screeninfo var;    /* variable infos. yoffset and vmode */
                                    /* are updated by fbcon.c */
   struct fb_cmap cmap;             /* colormap */
   u_char *screen_base;             /* pointer to top of virtual screen */    
   int visual;
   int type;                        /* see FB_TYPE_* */
   int type_aux;                    /* Interleave for interleaved Planes */
   u_short ypanstep;                /* zero if no hardware ypan */
   u_short ywrapstep;               /* zero if no hardware ywrap */
   u_long line_length;              /* length of a line in bytes */
   u_short can_soft_blank;          /* zero if no hardware blanking */
   u_short inverse;                 /* != 0 text black on white as default */

#if 0
   struct fb_fix_cursorinfo fcrsr;
   struct fb_var_cursorinfo *vcrsr;
   struct fb_cursorstate crsrstate;
#endif

   /* Filled in by the low-level console driver */

   struct vc_data *conp;            /* pointer to console data */
   int vrows;                       /* number of virtual rows */
   int cursor_x;                    /* current cursor position */
   int cursor_y;
   int fgcol;                       /* text colors */
   int bgcol;
   u_long next_line;                /* offset to one line below */
   u_long next_plane;               /* offset to next plane */
   u_char *fontdata;                /* Font associated to this display */
   int fontheight;
   int fontwidth;
   int userfont;                    /* != 0 if fontdata kmalloc()ed */
   struct display_switch *dispsw;   /* low level operations */
   u_short scrollmode;              /* Scroll Method */
   short yscroll;                   /* Hardware scrolling */
}; 


struct fb_info {
   char modename[40];               /* at boottime detected video mode */
   struct display *disp;            /* pointer to display variables */
   char fontname[40];               /* default font name */
   int (*changevar)(int);           /* tell console var has changed */
   int (*switch_con)(int);          /* tell fb to switch consoles */
   int (*updatevar)(int);           /* tell fb to update the vars */
   void (*blank)(int);              /* tell fb to (un)blank the screen */
};

#endif /* __KERNEL__ */


#if 1

#define FBCMD_GET_CURRENTPAR        (0xDEAD0005)
#define FBCMD_SET_CURRENTPAR        (0xDEAD8005)

#endif


#if 1 /* Preliminary */

   /*
    *    Hardware Cursor
    */

#define FBIOGET_FCURSORINFO     (0x4607)
#define FBIOGET_VCURSORINFO     (0x4608)
#define FBIOPUT_VCURSORINFO     (0x4609)
#define FBIOGET_CURSORSTATE     (0x460A)
#define FBIOPUT_CURSORSTATE     (0x460B)


struct fb_fix_cursorinfo {
        u_short crsr_width;             /* width and height of the cursor in */
        u_short crsr_height;            /* pixels (zero if no cursor)   */
        u_short crsr_xsize;             /* cursor size in display pixels */
        u_short crsr_ysize;
        u_short crsr_color1;            /* colormap entry for cursor color1 */
        u_short crsr_color2;            /* colormap entry for cursor color2 */
};

struct fb_var_cursorinfo {
        u_short width;
        u_short height;
        u_short xspot;
        u_short yspot;
        u_char data[0];                 /* field with [height][width]        */
};

struct fb_cursorstate {
        short xoffset;
        short yoffset;
        u_short mode;
};

#define FB_CURSOR_OFF           (0)
#define FB_CURSOR_ON            (1)
#define FB_CURSOR_FLASH         (2)

#define FBCMD_DRAWLINE          (0x4621)
#define FBCMD_MOVE              (0x4622)

#define FB_LINE_XOR (1)
#define FB_LINE_BOX (2)
#define FB_LINE_FILLED (4)

struct fb_line {
        int start_x;
        int start_y;
        int end_x;
        int end_y;
        int color;
        int option;
};

struct fb_move {
        int src_x;
        int src_y;
        int dest_x;
        int dest_y;
        int height;
        int width;
};

#endif /* Preliminary */


#endif /* _LINUX_FB_H */
