static int do_mmap(struct ggi_visual *vis) { ggi_lcd823_priv *priv = LCD823_PRIV(vis); ggi_graphtype gt = LIBGGI_GT(vis); int xres_in_bytes = XRES; int i; /* Clear framebuffer */ memset(priv->fb_ptr, 0, priv->fb_size); /* Set up pixel format */ memset(LIBGGI_PIXFMT(vis), 0, sizeof(ggi_pixelformat)); LIBGGI_PIXFMT(vis)->size = GT_SIZE(gt); LIBGGI_PIXFMT(vis)->depth = GT_DEPTH(gt); LIBGGI_PIXFMT(vis)->clut_mask = (1 << GT_DEPTH(gt)) - 1; _ggi_build_pixfmt(LIBGGI_PIXFMT(vis)); /* Set up DirectBuffers */ for (i=0; i < LIBGGI_MODE(vis)->frames; i++) { ggi_directbuffer *buf; _ggi_db_add_buffer(LIBGGI_APPLIST(vis), _ggi_db_get_new()); buf = LIBGGI_APPBUFS(vis)[i]; buf->frame = i; buf->type = GGI_DB_NORMAL; buf->read = (uint8_t *) priv->fb_ptr + i * priv->frame_size; buf->write = buf->read; buf->type |= GGI_DB_SIMPLE_PLB; buf->layout = blPixelLinearBuffer; buf->buffer.plb.stride = xres_in_bytes; buf->buffer.plb.pixelformat = LIBGGI_PIXFMT(vis); } return 0; }
static int do_cleanup(ggi_visual *vis) { ggi_lcd823_priv *priv = LCD823_PRIV(vis); /* We may be called more than once due to the LibGG cleanup stuff */ if (priv == NULL) return 0; DPRINT("display-lcd823: do_cleanup start.\n"); _GGI_lcd823_free_dbs(vis); if (LIBGGI_FD(vis) >= 0) { if (priv->fb_ptr) { munmap(priv->fb_ptr, priv->fb_size); } ioctl(LIBGGI_FD(vis), 2); /* Disable LCD */ close(LIBGGI_FD(vis)); LIBGGI_FD(vis) = -1; } if (vis->input != NULL) { giiClose(vis->input); vis->input = NULL; } free(priv); LIBGGI_PRIVATE(vis) = NULL; if (LIBGGI_GC(vis)) { free(LIBGGI_GC(vis)); } ggUnregisterCleanup((ggcleanup_func *)do_cleanup, vis); DPRINT("display-lcd823: do_cleanup done.\n"); return 0; }