QT210 LDD开发平台采用Samsung S5PV210,基于CortexTM-A8,运行主频1GHz,内置PowerVR SGX540高性能图形引擎,最高可支持1080p@30fps硬件解码视频流畅播放,格式可为MPEG4, H.263, H.264等。
QT210默认运行Android 2.3,是LDD6410硬件软件的全面升级。下面我们以3个case为例看看如何以QT210 LDD平台运行《Linux设备驱动开发详解》的实例()。
1. framebuffer测试程序
该测试程序在lcd上绘制r,g,b3个逐渐变化的彩带,程序源代码如下:
/* * LDD6410 framebuffer test programs * Copyright 2011 */ #include <unistd.h> #include <stdlib.h> #include <stdio.h> #include <fcntl.h> #include <linux/fb.h> #include <sys/mman.h> int main() { int fbfd = 0; struct fb_var_screeninfo vinfo; unsigned long screensize = 0; char *fbp = 0; int x = 0, y = 0; int i = 0; // Open the file for reading and writing fbfd = open("/dev/graphics/fb0", O_RDWR); if (!fbfd) { printf("Error: cannot open framebuffer device.\n"); exit(1); } printf("The framebuffer device was opened successfully.\n"); // Get variable screen information if (ioctl(fbfd, FBIOGET_VSCREENINFO, &vinfo)) { printf("Error reading variable information.\n"); exit(1); } printf("%dx%d, %dbpp\n", vinfo.xres, vinfo.yres, vinfo.bits_per_pixel); if (vinfo.bits_per_pixel != 16 && vinfo.bits_per_pixel != 32) { printf("Error: not supported bits_per_pixel, it only supports 16/32 bit color\n"); } // Figure out the size of the screen in bytes screensize = vinfo.xres * vinfo.yres * (vinfo.bits_per_pixel / 8); // Map the device to memory fbp = (char *)mmap(0, screensize, PROT_READ | PROT_WRITE, MAP_SHARED, fbfd, 0); if ((int)fbp == -1) { printf("Error: failed to map framebuffer device to memory.\n"); exit(4); } printf("The framebuffer device was mapped to memory successfully.\n"); // Draw 3 rect with graduated RED/GREEN/BLUE for (i = 0; i < 3; i++) { for (y = i * (vinfo.yres / 3); y < (i + 1) * (vinfo.yres / 3); y++) { for (x = 0; x < vinfo.xres; x++) { long location = x * 2 + y * vinfo.xres * 2; int r = 0, g = 0, b = 0; if (vinfo.bits_per_pixel == 16) { unsigned short rgb; if (i == 0) r = ((x * 1.0) / vinfo.xres) * 32; if (i == 1) g = ((x * 1.0) / vinfo.xres) * 64; if (i == 2) b = ((x * 1.0) / vinfo.xres) * 32; rgb = (r << 11) | (g << 5) | b; *((unsigned short*)(fbp + location)) = rgb; } else { location = location * 2; unsigned int rgb; if (i == 0) r = ((x * 1.0) / vinfo.xres) * 256; if (i == 1) g = ((x * 1.0) / vinfo.xres) * 256; if (i == 2) b = ((x * 1.0) / vinfo.xres) * 256; rgb = (r << 16) | (g << 8) | b; *((unsigned int*)(fbp + location)) = rgb; } } } } munmap(fbp, screensize); close(fbfd); return 0; }