[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     ! 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