[BACK]Return to jfb.c CVS log [TXT][DIR] Up to [local] / sys / arch / jornada / dev

Annotation of sys/arch/jornada/dev/jfb.c, Revision 1.1.1.1

1.1       nbrk        1: /*     $Id$    */
                      2: /*
                      3:  * Jornada framebuffer.
                      4:  * 640x240 @16bpp
                      5:  */
                      6: #include <sys/param.h>
                      7: #include <sys/systm.h>
                      8: #include <sys/device.h>
                      9: #include <sys/proc.h>
                     10: #include <sys/conf.h>
                     11:
                     12: #include <dev/wscons/wsdisplayvar.h>
                     13: #include <dev/rasops/rasops.h>
                     14: #include <dev/wscons/wsconsio.h>
                     15: #include <dev/wsfont/vt220l8x10.h>
                     16:
                     17: #include <machine/bus.h>
                     18:
                     19: #include <arm/sa11x0/sa11x0_reg.h>
                     20: #include <arm/sa11x0/sa11x0_var.h>
                     21: #include <jornada/dev/jfbreg.h>
                     22:
                     23: #include "wsdisplay.h"
                     24:
                     25: #define JFB_DFLTWIDTH  640
                     26: #define JFB_DFLTHEIGHT 240
                     27: #define JFB_DFLTBPP            16
                     28:
                     29: struct jfb_softc {
                     30:        struct device   sc_dev;
                     31:        bus_space_tag_t sc_bust;
                     32:        bus_space_handle_t      sc_bush;
                     33:        uint8_t *sc_bits;
                     34:
                     35:        int     sc_width;
                     36:        int     sc_height;
                     37:        int     sc_depth;
                     38:        int     sc_linebytes;
                     39:
                     40:        int sc_rows;
                     41:        int sc_cols;
                     42:
                     43:        struct rasops_info      sc_ri;
                     44:
                     45:        struct  wsscreen_descr sc_wsd;
                     46:        struct  wsscreen_list sc_wsl;
                     47:        struct  wsscreen_descr *sc_scrlist[1];
                     48: };
                     49:
                     50: int    jfb_match(struct device *parent, void *cf, void *aux);
                     51: void   jfb_attach(struct device *parent, struct device *self, void *aux);
                     52: void   jfbfakecnattach(bus_addr_t addr);
                     53: void   jfb_rasopsinit(struct jfb_softc *sc);
                     54: void   jfb_setcmap(struct rasops_info *ri);
                     55:
                     56: struct jfb_softc jfb_sc;
                     57: int    jfb_initted = 0;
                     58:
                     59: /* autoconf stuff */
                     60: struct cfattach        jfb_ca = {
                     61:        sizeof(struct jfb_softc), jfb_match, jfb_attach, NULL, NULL
                     62: };
                     63:
                     64: struct cfdriver jfb_cd = {
                     65:        NULL, "jfb", DV_DULL
                     66: };
                     67:
                     68:
                     69: int
                     70: jfb_match(struct device *parent, void *cf, void *aux)
                     71: {
                     72:        return(1);
                     73: }
                     74:
                     75: void
                     76: jfb_attach(struct device *parent, struct device *self, void *aux)
                     77: {
                     78:        struct jfb_softc *sc = (void *)self;
                     79:        struct saip_attach_args *saa = aux;
                     80:        struct wsemuldisplaydev_attach_args waa;
                     81:
                     82:        sc->sc_bust = saa->sai_iot;
                     83:
                     84:        /* use bootstrap softc if it is already configured */
                     85: //     if (jfb_initted)
                     86: //             *sc = jfb_sc;
                     87:
                     88:        if (bus_space_map(sc->sc_bust, saa->sai_addr, JFB_SIZE , BUS_SPACE_MAP_LINEAR, &sc->sc_bush)) {
                     89:                printf(": can't map i/o space\n");
                     90:                return;
                     91:        }
                     92:
                     93:        sc->sc_bits = (uint8_t *)sc->sc_bush;
                     94:
                     95:        /* TODO use flags for mode selection */
                     96:        sc->sc_width = JFB_DFLTWIDTH;
                     97:        sc->sc_height = JFB_DFLTHEIGHT;
                     98:        sc->sc_depth = JFB_DFLTBPP;
                     99:        sc->sc_linebytes = sc->sc_width * (sc->sc_depth / 8);
                    100:
                    101:        sc->sc_cols = 80;
                    102:        sc->sc_rows = 24;
                    103:
                    104:        jfb_rasopsinit(sc);
                    105:
                    106:        printf(": Jornada framebuffer (%dx%d @%dbpp)\n", sc->sc_width, sc->sc_height, sc->sc_depth);
                    107:
                    108:        sc->sc_scrlist[0] = &sc->sc_wsd;
                    109:        sc->sc_wsl.nscreens = 1;
                    110:        sc->sc_wsl.screens = (const struct wsscreen_descr **)sc->sc_scrlist;
                    111:
                    112:        waa.scrdata = &sc->sc_wsl;
                    113:        waa.accesscookie = sc;
                    114:        waa.defaultscreens = 0;
                    115:
                    116:        config_found((struct device *)sc, &waa, wsemuldisplaydevprint);
                    117:
                    118:        return;
                    119: }
                    120:
                    121: void
                    122: jfbfakecnattach(bus_addr_t addr)
                    123: {
                    124:        struct jfb_softc        *sc = &jfb_sc;
                    125:
                    126:        sc->sc_bits = (uint8_t *)addr;
                    127:
                    128:        if (jfb_initted == 0) {
                    129:                /*
                    130:                 * First attachment.
                    131:                 * Initialize with defaults.
                    132:                 */
                    133:
                    134:                /* clear the screen */
                    135:                sc->sc_ri.ri_flg = RI_CLEAR | RI_FULLCLEAR;
                    136:
                    137:                sc->sc_width = JFB_DFLTWIDTH;
                    138:                sc->sc_height = JFB_DFLTHEIGHT;
                    139:                sc->sc_depth = JFB_DFLTBPP;
                    140:                sc->sc_linebytes = sc->sc_width * (sc->sc_depth / 8);
                    141:
                    142:                sc->sc_cols = 80;
                    143:                sc->sc_rows = 24;
                    144:
                    145:                /* set up rasops */
                    146:                jfb_rasopsinit(sc);
                    147:
                    148:                jfb_initted = 1;
                    149:
                    150:                wsdisplay_cnattach(&sc->sc_wsd, &sc->sc_ri, 0, 0, 0);
                    151:        } else {
                    152:                /*
                    153:                 * Already attached.
                    154:                 * Tweak some settings and reconfigure rasops.
                    155:                 */
                    156:
                    157:                /* reset ri_bits */
                    158:                sc->sc_ri.ri_flg &= ~RI_CFGDONE;
                    159:                sc->sc_ri.ri_bits = sc->sc_bits;
                    160:                /* do not clear the screen */
                    161:                sc->sc_ri.ri_flg &= ~RI_CLEAR;
                    162:
                    163:                rasops_reconfig(&sc->sc_ri, 160, 160);
                    164:        }
                    165: }
                    166:
                    167: void
                    168: jfb_rasopsinit(struct jfb_softc *sc)
                    169: {
                    170:        struct rasops_info      *ri = &sc->sc_ri;
                    171:        struct wsscreen_descr   *wsd = &sc->sc_wsd;
                    172:        extern struct wsdisplay_font    vt220l8x10;
                    173:
                    174:        ri->ri_hw = sc;
                    175:        ri->ri_bits = sc->sc_bits;
                    176:
                    177:        /* claim minimal colour capabilities */
                    178:        ri->ri_caps = WSSCREEN_WSCOLORS;
                    179:
                    180:        ri->ri_depth = sc->sc_depth;
                    181:        ri->ri_width = sc->sc_width;
                    182:        ri->ri_height = sc->sc_height;
                    183:        ri->ri_stride = sc->sc_linebytes;
                    184:
                    185:        /* FIXME: see how colors are packed in 16bits/pixel ? */
                    186:        ri->ri_rnum = 5;
                    187:        ri->ri_gnum = 6;
                    188:        ri->ri_bnum = 5;
                    189:        ri->ri_rpos = 11;
                    190:        ri->ri_gpos = 5;
                    191:        ri->ri_bpos = 0;
                    192:
                    193:        ri->ri_font = &vt220l8x10;
                    194:
                    195:        /* XXX XXX please tell me why? */
                    196:        /* rasops_init(ri, sc->sc_cols, sc->sc_rows); */
                    197:        rasops_init(ri, 160, 160);
                    198:
                    199:        /* tune colours */
                    200:        jfb_setcmap(ri);
                    201:
                    202:        /* initialize wsscreen_descr */
                    203:        strlcpy(wsd->name, "std", sizeof(wsd->name));
                    204:        wsd->ncols = sc->sc_cols;
                    205:        wsd->nrows = sc->sc_rows;
                    206:        wsd->capabilities = ri->ri_caps;
                    207:        wsd->textops = &ri->ri_ops;
                    208: }
                    209:
                    210: void
                    211: jfb_setcmap(struct rasops_info *ri)
                    212: {
                    213:        /* more intensive white */
                    214:        ri->ri_devcmap[WSCOL_WHITE] = 0xffff;
                    215: }

CVSweb