用QT210 LDD平台运行《Linux设备驱动开发详解》实例
用QT210 LDD平台运行《Linux设备驱动开发详解》实例
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 www.bkjia.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;
- }
|
评论暂时关闭