void printcaps(mddi_client_caps *c) { if((c->length != 0x4a) || (c->type != 0x42)) { dprintf("bad caps header received, so hardcoding\n"); memset(c, 0, sizeof(*c)); mddi_set_caps(c); } dprintf("mddi: bm: %d,%d win %d,%d rgb %x\n", c->bitmap_width, c->bitmap_height, c->display_window_width, c->display_window_height, c->rgb_cap); dprintf("mddi: vend %x prod %x\n", c->manufacturer_name, c->product_code); fb_width = c->bitmap_width; fb_height = c->bitmap_height; panel_init(c); }
struct fbcon_config *mddi_init(void) { unsigned n; struct mddi_client_caps client_caps; dprintf(INFO, "mddi_init()\n"); rev_pkt_buf = memalign(32, MDDI_REV_PKT_BUF_SIZE); mlist_remote_write = memalign(32, sizeof(struct mddi_llentry)); n = mddi_init_regs(); dprintf(INFO, "mddi version: 0x%08x\n", n); //mddi_get_caps(&client_caps); //if(!(client_caps.length == 0x4a && client_caps.type == 0x42)) { mddi_set_caps(&client_caps); } fb_cfg.width = client_caps.bitmap_width; fb_cfg.stride = fb_cfg.width; fb_cfg.height = client_caps.bitmap_height; panel_init(&client_caps); panel_backlight(0); panel_poweron(); /* v > 8? v > 8 && < 0x19 ? */ writel(2, MDDI_TEST); dprintf(INFO, "panel is %d x %d\n", fb_cfg.width, fb_cfg.height); fb_cfg.base = memalign(4096, fb_cfg.width * fb_cfg.height * (fb_cfg.bpp / 8)); mlist = memalign(32, sizeof(mddi_llentry) * (fb_cfg.height / 8)); dprintf(INFO, "FB @ %p mlist @ %x\n", fb_cfg.base, (unsigned)mlist); for (n = 0; n < (fb_cfg.height / 8); n++) { unsigned y = n * 8; unsigned pixels = fb_cfg.width * 8; mddi_video_stream *vs = &(mlist[n].u.v); vs->length = sizeof(mddi_video_stream) - 2 + (pixels * 2); vs->type = TYPE_VIDEO_STREAM; vs->client_id = 0; vs->format = 0x5565; // FORMAT_16BPP; vs->pixattr = PIXATTR_BOTH_EYES | PIXATTR_TO_ALL; vs->left = 0; vs->right = fb_cfg.width - 1; vs->top = y; vs->bottom = y + 7; vs->start_x = 0; vs->start_y = y; vs->pixels = pixels; vs->crc = 0; vs->reserved = 0; mlist[n].header_count = sizeof(mddi_video_stream) - 2; mlist[n].data_count = pixels * 2; mlist[n].reserved = 0; mlist[n].data = fb_cfg.base + (y * fb_cfg.width * 2); mlist[n].next = &mlist[n + 1]; mlist[n].flags = 0; } mlist[n - 1].flags = 1; mlist[n - 1].next = 0; mddi_set_auto_hibernate(1); mddi_do_cmd(CMD_LINK_ACTIVE); panel_backlight(1); return &fb_cfg; }