Lines Matching refs:fb
57 fb_dispmode(struct fb *fb, int dispmode) in fb_dispmode() argument
60 if (fb->dispmode != dispmode) { in fb_dispmode()
61 if (ioctl(fb->fd, WSDISPLAYIO_SMODE, &dispmode) < 0) in fb_dispmode()
63 fb->dispmode = dispmode; in fb_dispmode()
70 fb_init(struct fb *fb, int fd) in fb_init() argument
77 fb->fd = fd; in fb_init()
78 fb->linecache_y = INVALID_CACHE; in fb_init()
79 fb->conf.hf_conf_index = HPCFB_CURRENT_CONFIG; in fb_init()
80 if (ioctl(fb->fd, WSDISPLAYIO_GMODE, &fb->dispmode) < 0) in fb_init()
82 if (ioctl(fb->fd, HPCFBIO_GCONF, &fb->conf) < 0) { in fb_init()
83 if (ioctl(fb->fd, WSDISPLAYIO_GINFO, &fbinfo) < 0 || in fb_init()
84 ioctl(fb->fd, WSDISPLAYIO_LINEBYTES, &linebytes) < 0) in fb_init()
86 memset(&fb->conf, 0, sizeof(fb->conf)); in fb_init()
87 fb->conf.hf_width = fbinfo.width; in fb_init()
88 fb->conf.hf_height = fbinfo.height; in fb_init()
89 fb->conf.hf_bytes_per_line = linebytes; in fb_init()
90 fb->conf.hf_nplanes = 1; in fb_init()
91 fb->conf.hf_bytes_per_plane = fbinfo.height * linebytes; in fb_init()
92 fb->conf.hf_pack_width = fbinfo.depth; in fb_init()
93 fb->conf.hf_pixels_per_pack = 1; in fb_init()
94 fb->conf.hf_pixel_width = 1; in fb_init()
95 fb->conf.hf_access_flags = HPCFB_ACCESS_STATIC | in fb_init()
99 if (fb_dispmode(fb, WSDISPLAYIO_MODE_MAPPED) < 0) in fb_init()
102 size = (size_t)fb->conf.hf_bytes_per_line * fb->conf.hf_height; in fb_init()
103 size += fb->conf.hf_offset; in fb_init()
105 fb->baseaddr = mmap(0, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd,0); in fb_init()
106 if (fb->baseaddr == MAP_FAILED) in fb_init()
108 fb->baseaddr += fb->conf.hf_offset; in fb_init()
110 size = ALIGN(fb->conf.hf_bytes_per_line, 16); in fb_init()
111 fb->linecache = (fb_pixel_t*)malloc(size); in fb_init()
112 if (fb->linecache == NULL) in fb_init()
114 fb->workbuf = (fb_pixel_t*)malloc(size); in fb_init()
115 if (fb->workbuf == NULL) in fb_init()
118 if (fb->conf.hf_access_flags & HPCFB_ACCESS_REVERSE) { in fb_init()
119 fb->white = 0; in fb_init()
120 fb->black = ~0; in fb_init()
122 fb->white = ~0; in fb_init()
123 fb->black = 0; in fb_init()
129 for (y = 0; y < fb->conf.hf_height; y++) { in fb_init()
130 fb_getline(fb, y); in fb_init()
131 memset(fb->linecache, fb->black, in fb_init()
132 ALIGN(fb->conf.hf_bytes_per_line, 16)); in fb_init()
133 fb_putline(fb, y); in fb_init()
140 __fb_swap_workbuf(struct fb *fb) in __fb_swap_workbuf() argument
144 n = ALIGN(fb->conf.hf_bytes_per_line, 16) / sizeof(fb_pixel_t); in __fb_swap_workbuf()
145 if (fb->conf.hf_order_flags & HPCFB_REVORDER_BYTE) { in __fb_swap_workbuf()
147 fb->workbuf[i] = in __fb_swap_workbuf()
148 ((fb->workbuf[i] << 8) & 0xff00ff00) | in __fb_swap_workbuf()
149 ((fb->workbuf[i] >> 8) & 0x00ff00ff); in __fb_swap_workbuf()
151 if (fb->conf.hf_order_flags & HPCFB_REVORDER_WORD) { in __fb_swap_workbuf()
153 fb->workbuf[i] = in __fb_swap_workbuf()
154 ((fb->workbuf[i] << 16) & 0xffff0000) | in __fb_swap_workbuf()
155 ((fb->workbuf[i] >> 16) & 0x0000ffff); in __fb_swap_workbuf()
157 if (fb->conf.hf_order_flags & HPCFB_REVORDER_DWORD) { in __fb_swap_workbuf()
160 tmp = fb->workbuf[i]; in __fb_swap_workbuf()
161 fb->workbuf[i] = fb->workbuf[i + 1]; in __fb_swap_workbuf()
162 fb->workbuf[i + 1] = tmp; in __fb_swap_workbuf()
165 if (fb->conf.hf_order_flags & HPCFB_REVORDER_QWORD) { in __fb_swap_workbuf()
168 tmp = fb->workbuf[i + 0]; in __fb_swap_workbuf()
169 fb->workbuf[i + 0] = fb->workbuf[i + 2]; in __fb_swap_workbuf()
170 fb->workbuf[i + 2] = tmp; in __fb_swap_workbuf()
171 tmp = fb->workbuf[i + 1]; in __fb_swap_workbuf()
172 fb->workbuf[i + 1] = fb->workbuf[i + 3]; in __fb_swap_workbuf()
173 fb->workbuf[i + 3] = tmp; in __fb_swap_workbuf()
179 __fb_put_pixel(struct fb *fb, fb_pixel_t pixel, int width, int x) in __fb_put_pixel() argument
187 fb->linecache[0] = (fb->linecache[0]&~mask) | (pixel&~mask); in __fb_put_pixel()
189 fb_pixel_t *dst = &fb->linecache[x / bitsizeof(fb_pixel_t)]; in __fb_put_pixel()
201 fb_getline(struct fb *fb, int y) in fb_getline() argument
207 src = fb->baseaddr + fb->conf.hf_bytes_per_line * y; in fb_getline()
208 dst = fb->workbuf; in fb_getline()
209 n = ALIGN(fb->conf.hf_bytes_per_line, 16) / sizeof(fb_pixel_t); in fb_getline()
218 __fb_swap_workbuf(fb); in fb_getline()
219 memcpy(fb->linecache, fb->workbuf, n * sizeof(fb_pixel_t)); in fb_getline()
223 fb_putline(struct fb *fb, int y) in fb_putline() argument
229 src = fb->workbuf; in fb_putline()
230 dst = fb->baseaddr + fb->conf.hf_bytes_per_line * y; in fb_putline()
231 n = ALIGN(fb->conf.hf_bytes_per_line, 16) / sizeof(fb_pixel_t); in fb_putline()
232 memcpy(fb->workbuf, fb->linecache, n * sizeof(fb_pixel_t)); in fb_putline()
233 __fb_swap_workbuf(fb); in fb_putline()
244 fb_fetchline(struct fb *fb, int y) in fb_fetchline() argument
246 if (fb->linecache_y == y) in fb_fetchline()
248 fb_getline(fb, y); in fb_fetchline()
249 fb->linecache_y = y; in fb_fetchline()
253 fb_flush(struct fb *fb) in fb_flush() argument
255 if (fb->linecache_y != INVALID_CACHE) in fb_flush()
256 fb_putline(fb, fb->linecache_y); in fb_flush()
260 fb_drawpixel(struct fb *fb, int x, int y, fb_pixel_t pixel) in fb_drawpixel() argument
264 if (fb->conf.hf_access_flags & HPCFB_ACCESS_Y_TO_X) in fb_drawpixel()
266 if (fb->conf.hf_access_flags & HPCFB_ACCESS_R_TO_L) in fb_drawpixel()
267 x = fb->conf.hf_width - x - 1; in fb_drawpixel()
268 if (fb->conf.hf_access_flags & HPCFB_ACCESS_B_TO_T) in fb_drawpixel()
269 y = fb->conf.hf_height - y - 1; in fb_drawpixel()
271 if (x < 0 || y < 0 || fb->conf.hf_width <= x || fb->conf.hf_height < y) in fb_drawpixel()
274 pack = x / fb->conf.hf_pixels_per_pack; in fb_drawpixel()
275 x %= fb->conf.hf_pixels_per_pack; in fb_drawpixel()
276 if (fb->conf.hf_access_flags & HPCFB_ACCESS_LSB_TO_MSB) in fb_drawpixel()
277 x = fb->conf.hf_pixels_per_pack - x - 1; in fb_drawpixel()
278 x *= fb->conf.hf_pixel_width; in fb_drawpixel()
279 if (fb->conf.hf_access_flags & HPCFB_ACCESS_PACK_BLANK) in fb_drawpixel()
280 x += (fb->conf.hf_pack_width - in fb_drawpixel()
281 fb->conf.hf_pixel_width * fb->conf.hf_pixels_per_pack); in fb_drawpixel()
282 x += pack * fb->conf.hf_pack_width; in fb_drawpixel()
284 if (fb->linecache_y != y) { in fb_drawpixel()
285 fb_flush(fb); in fb_drawpixel()
286 fb_fetchline(fb, y); in fb_drawpixel()
289 __fb_put_pixel(fb, pixel, fb->conf.hf_pixel_width, x); in fb_drawpixel()
293 fb_drawline(struct fb *fb, int x0, int y0, int x1, int y1, fb_pixel_t pixel) in fb_drawline() argument
312 fb_drawpixel(fb, x0, i, pixel); in fb_drawline()
332 fb_drawpixel(fb, i, y0, pixel); in fb_drawline()