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設備驅動開發詳解》的實例(http://www.linuxidc.com/Linux/2011-07/38211.htm)。
1. framebuffer測試程序
該測試程序在lcd上繪制r,g,b3個逐漸變化的彩帶,程序源代碼如下:
- /*
- * LDD6410 framebuffer test programs
- * Copyright 2011 www.linuxidc.com
- */
- #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;
- }