1e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project/* 2e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 3e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * 4e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * you may not use this file except in compliance with the License. 6e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * You may obtain a copy of the License at 7e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * 8e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * 10e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * See the License for the specific language governing permissions and 14e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project * limitations under the License. 15e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project */ 16e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 17e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdlib.h> 18e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <unistd.h> 19e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 20e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <fcntl.h> 21e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <stdio.h> 22e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 23e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/ioctl.h> 24e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/mman.h> 25e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <sys/types.h> 26e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <time.h> 27e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 28e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <linux/fb.h> 29e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project#include <linux/kd.h> 30e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 31480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinstruct simple_fb { 32480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin void *data; 33480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin int width; 34480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin int height; 35480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin int stride; 36480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin int bpp; 37480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin}; 38480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin 39480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinstatic struct simple_fb gr_fbs[2]; 40e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic unsigned gr_active_fb = 0; 41e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 42e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic int gr_fb_fd = -1; 43e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic int gr_vt_fd = -1; 44e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 45e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic struct fb_var_screeninfo vi; 46e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstruct fb_fix_screeninfo fi; 47e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstruct timespec tv, tv2; 48e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 49e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void dumpinfo(struct fb_fix_screeninfo *fi, 50e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project struct fb_var_screeninfo *vi); 51e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 52480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinstatic int get_framebuffer(struct simple_fb *fb, unsigned bpp) 53e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 54e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int fd; 55e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project void *bits; 56480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin int bytes_per_pixel; 57e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 58e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fd = open("/dev/graphics/fb0", O_RDWR); 59acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin if (fd < 0) { 60acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin printf("cannot open /dev/graphics/fb0, retrying with /dev/fb0\n"); 61acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin if ((fd = open("/dev/fb0", O_RDWR)) < 0) { 62acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin perror("cannot open /dev/fb0"); 63acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin return -1; 64acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin } 65e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 66e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 67480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin if(ioctl(fd, FBIOGET_VSCREENINFO, &vi) < 0) { 68e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project perror("failed to get fb0 info"); 69e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return -1; 70e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 71e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 72480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin if (bpp && vi.bits_per_pixel != bpp) { 73480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin printf("bpp != %d, forcing...\n", bpp); 74480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin vi.bits_per_pixel = bpp; 75480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin if(ioctl(fd, FBIOPUT_VSCREENINFO, &vi) < 0) { 76480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin perror("failed to force bpp"); 77480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin return -1; 78480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin } 79480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin } 80480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin 81480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin if(ioctl(fd, FBIOGET_FSCREENINFO, &fi) < 0) { 82e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project perror("failed to get fb0 info"); 83e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return -1; 84e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 85e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 86e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project dumpinfo(&fi, &vi); 87e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 88e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project bits = mmap(0, fi.smem_len, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0); 89e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if(bits == MAP_FAILED) { 90e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project perror("failed to mmap framebuffer"); 91e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return -1; 92e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 93e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 94480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin bytes_per_pixel = vi.bits_per_pixel >> 3; 95480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin 96e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fb->width = vi.xres; 97e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fb->height = vi.yres; 98480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin fb->stride = fi.line_length / bytes_per_pixel; 99e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fb->data = bits; 100480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin fb->bpp = vi.bits_per_pixel; 101e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 102e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fb++; 103e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 104e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fb->width = vi.xres; 105e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fb->height = vi.yres; 106480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin fb->stride = fi.line_length / bytes_per_pixel; 107480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin fb->data = (void *)((unsigned long)bits + 108480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin vi.yres * vi.xres * bytes_per_pixel); 109480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin fb->bpp = vi.bits_per_pixel; 110e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 111e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return fd; 112e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 113e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 114e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void set_active_framebuffer(unsigned n) 115e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 116e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if(n > 1) return; 117e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project vi.yres_virtual = vi.yres * 2; 118e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project vi.yoffset = n * vi.yres; 119e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if(ioctl(gr_fb_fd, FBIOPUT_VSCREENINFO, &vi) < 0) { 120e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr,"active fb swap failed!\n"); 121365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin } else 122365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin printf("active buffer: %d\n", n); 123e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 124e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 125e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectstatic void dumpinfo(struct fb_fix_screeninfo *fi, struct fb_var_screeninfo *vi) 126e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 127e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr,"vi.xres = %d\n", vi->xres); 128e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr,"vi.yres = %d\n", vi->yres); 129e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr,"vi.xresv = %d\n", vi->xres_virtual); 130e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr,"vi.yresv = %d\n", vi->yres_virtual); 131e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr,"vi.xoff = %d\n", vi->xoffset); 132e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr,"vi.yoff = %d\n", vi->yoffset); 133e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "vi.bits_per_pixel = %d\n", vi->bits_per_pixel); 134e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 135e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project fprintf(stderr, "fi.line_length = %d\n", fi->line_length); 136e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 137e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 138e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 139480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinint gr_init(int bpp, int id) 140e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 141acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin int fd = -1; 142e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 143acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin if (!access("/dev/tty0", F_OK)) { 144acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin fd = open("/dev/tty0", O_RDWR | O_SYNC); 145acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin if(fd < 0) 146acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin return -1; 147e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 148acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin if(ioctl(fd, KDSETMODE, (void*) KD_GRAPHICS)) { 149acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin close(fd); 150acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin return -1; 151acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin } 152e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 153e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 154480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin gr_fb_fd = get_framebuffer(gr_fbs, bpp); 155e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 156e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project if(gr_fb_fd < 0) { 157acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin if (fd >= 0) { 158acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin ioctl(fd, KDSETMODE, (void*) KD_TEXT); 159acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin close(fd); 160acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin } 161e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return -1; 162e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 163e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 164e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project gr_vt_fd = fd; 165e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 166e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project /* start with 0 as front (displayed) and 1 as back (drawing) */ 167480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin gr_active_fb = id; 168480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin set_active_framebuffer(id); 169e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 170e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 171e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 172e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 173e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectvoid gr_exit(void) 174e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 175e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project close(gr_fb_fd); 176e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project gr_fb_fd = -1; 177e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 178acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin if (gr_vt_fd >= 0) { 179acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin ioctl(gr_vt_fd, KDSETMODE, (void*) KD_TEXT); 180acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin close(gr_vt_fd); 181acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin gr_vt_fd = -1; 182acbb5bc99bccf7e625cc73fb1aaa90355bedb733Dima Zavin } 183e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 184e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 185e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint gr_fb_width(void) 186e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 187480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin return gr_fbs[0].width; 188e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 189e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 190e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint gr_fb_height(void) 191e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 192480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin return gr_fbs[0].height; 193e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 194e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 195e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectuint16_t red = 0xf800; 196e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectuint16_t green = 0x07e0; 197e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectuint16_t blue = 0x001f; 198480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinuint16_t white = 0xffff; 199480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinuint16_t black = 0x0; 200480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin 201480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinuint32_t red32 = 0x00ff0000; 202480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinuint32_t green32 = 0x0000ff00; 203480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinuint32_t blue32 = 0x000000ff; 204480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinuint32_t white32 = 0x00ffffff; 205480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinuint32_t black32 = 0x0; 206480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin 207480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinvoid draw_grid(int w, int h, void* _loc) { 208480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin int i, j; 209480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin int v; 210480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin int stride = fi.line_length / (vi.bits_per_pixel >> 3); 211480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin uint16_t *loc = _loc; 212480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin uint32_t *loc32 = _loc; 213480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin 214480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin for (j = 0; j < h/2; j++) { 215480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin for (i = 0; i < w/2; i++) 216480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin if (vi.bits_per_pixel == 16) 217480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin loc[i + j*(stride)] = red; 218480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin else 219480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin loc32[i + j*(stride)] = red32; 220480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin for (; i < w; i++) 221480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin if (vi.bits_per_pixel == 16) 222480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin loc[i + j*(stride)] = green; 223480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin else 224480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin loc32[i + j*(stride)] = green32; 225480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin } 226e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 227480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin for (; j < h; j++) { 228480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin for (i = 0; i < w/2; i++) 229480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin if (vi.bits_per_pixel == 16) 230480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin loc[i + j*(stride)] = blue; 231480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin else 232480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin loc32[i + j*(stride)] = blue32; 233480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin for (; i < w; i++) 234480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin if (vi.bits_per_pixel == 16) 235480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin loc[i + j*(stride)] = white; 236480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin else 237480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin loc32[i + j*(stride)] = white32; 238480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin } 239e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 240e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 241e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 242480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavinvoid clear_screen(int w, int h, void* _loc) 243e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project{ 244e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int i,j; 245e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int stride = fi.line_length / (vi.bits_per_pixel >> 3); 246480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin uint16_t *loc = _loc; 247480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin uint32_t *loc32 = _loc; 248480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin 249480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin for (j = 0; j < h; j++) 250480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin for (i = 0; i < w; i++) 251480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin if (vi.bits_per_pixel == 16) 252480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin loc[i + j*(stride)] = black; 253480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin else 254480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin loc32[i + j*(stride)] = black32; 255e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 256e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 257e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Projectint main(int argc, char **argv) { 258e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int w; 259e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project int h; 260365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin int id = 0; 261480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin int bpp = 0; 262480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin 263480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin if (argc > 1) 264480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin bpp = atoi(argv[1]); 265480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin 266480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin if (argc > 4) 267480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin id = !!atoi(argv[4]); 268480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin 269480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin gr_init(bpp, id); 270480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin 271480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin if (argc > 3) { 272480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin w = atoi(argv[2]); 273480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin h = atoi(argv[3]); 274480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin } else { 275480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin w = vi.xres; 276480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin h = vi.yres; 277e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project } 278e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 279480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin clear_screen(vi.xres, vi.yres, gr_fbs[0].data); 280480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin clear_screen(vi.xres, vi.yres, gr_fbs[1].data); 281480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin 282480a3b1c6d5413e06775a9d53cb1596535fd91aeDima Zavin draw_grid(w, h, gr_fbs[id].data); 283365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin 284365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin set_active_framebuffer(!id); 285365aff4dc3f21d14b03633f3629f69d71b39c74eDima Zavin set_active_framebuffer(id); 286e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project 287e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project return 0; 288e16cb84e2324f05334d18dcf5956f20f44262b62The Android Open Source Project} 289