用QT210 LDD平台运行《Linux设备驱动开发详解》实例

QT210 LDD开发平台采用Samsung S5PV210,基于CortexTM-A8,运行主频1GHz,内置PowerVR SGX540高性能图形引擎,最高可支持1080p@30fps硬件解码视频流畅播放,格式可为MPEG4, H.263, H.264等。

用QT210 LDD平台运行《Linux设备驱动开发详解》实例

 

用QT210 LDD平台运行《Linux设备驱动开发详解》实例

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;   }  

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wydgzs.html