This shows you the differences between two versions of the page.
Both sides previous revision Previous revision Next revision | Previous revision | ||
test_application [2017/08/13 01:10] 1.241.172.144 |
test_application [2017/09/12 21:23] (current) 1.241.172.144 |
||
---|---|---|---|
Line 2: | Line 2: | ||
===== LCD Test Application ===== | ===== LCD Test Application ===== | ||
- | Souce Code는 다음과 같다. | + | [[DirectFB App]] |
- | #include <stdio.h> | + | [[SDL App]] |
- | #include <string.h> /* for memset */ | + | |
- | #include <unistd.h> /* for open/close .. */ | + | |
- | #include <fcntl.h> /* for O_RDWR */ | + | |
- | #include <sys/ioctl.h> /* for ioctl */ | + | |
- | #include <sys/mman.h> /* for mmap */ | + | |
- | #include <linux/fb.h> /* for fb_var_screeninfo, FBIOGET_VSCREENINFO */ | + | |
- | + | ||
- | + | ||
- | #define DEFAULT_FRAME_BUFFER_FILE "/dev/fb0" | + | |
- | + | ||
- | typedef struct | + | |
- | { | + | |
- | int Device; | + | |
- | void * pFrameBuffer; | + | |
- | struct fb_var_screeninfo var; | + | |
- | struct fb_fix_screeninfo fix; | + | |
- | } FrameBufferContext_t; | + | |
- | + | ||
- | + | ||
- | void draw_pixel( FrameBufferContext_t *pFrameBufferContext, | + | |
- | unsigned long X, | + | |
- | unsigned long Y, | + | |
- | unsigned long Color) | + | |
- | { | + | |
- | void * pFrameBuffer; | + | |
- | + | ||
- | pFrameBuffer = pFrameBufferContext->pFrameBuffer; | + | |
- | if (pFrameBufferContext->var.bits_per_pixel == 8) | + | |
- | { | + | |
- | unsigned char * p; | + | |
- | + | ||
- | pFrameBuffer += pFrameBufferContext->fix.line_length * Y; | + | |
- | p = pFrameBuffer; | + | |
- | p += X; | + | |
- | + | ||
- | *p = (unsigned char)Color; | + | |
- | } | + | |
- | else if (pFrameBufferContext->var.bits_per_pixel == 16) | + | |
- | { | + | |
- | unsigned short * p; | + | |
- | + | ||
- | pFrameBuffer += pFrameBufferContext->fix.line_length * Y; | + | |
- | p = pFrameBuffer; | + | |
- | p += X; | + | |
- | + | ||
- | *p = (unsigned short)(((((Color >> 16) & 0xff) * 32 / 256) << 11) | ((((Color >> 8) & 0xff) * 64 / 256) << 5) | ((((Color >> 0) & 0xff) * 32 / 256) << 0)); | + | |
- | } | + | |
- | else if (pFrameBufferContext->var.bits_per_pixel == 24) | + | |
- | { | + | |
- | unsigned char * p; | + | |
- | + | ||
- | p = (unsigned char *)pFrameBuffer + pFrameBufferContext->fix.line_length * Y + 3 * X; | + | |
- | + | ||
- | *p++ = (unsigned char)Color; | + | |
- | *p++ = (unsigned char)(Color >> 8); | + | |
- | *p = (unsigned char)(Color >> 16); | + | |
- | } | + | |
- | else | + | |
- | { | + | |
- | unsigned long * p; | + | |
- | + | ||
- | pFrameBuffer += pFrameBufferContext->fix.line_length * Y; | + | |
- | p = pFrameBuffer; | + | |
- | p += X; | + | |
- | + | ||
- | *p = Color; | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | + | ||
- | void fill_screen(FrameBufferContext_t *pFrameBufferContext) | + | |
- | { | + | |
- | unsigned long x; | + | |
- | unsigned long y; | + | |
- | unsigned long h; | + | |
- | unsigned long w; | + | |
- | + | ||
- | h = pFrameBufferContext->var.yres; | + | |
- | w = pFrameBufferContext->var.xres; | + | |
- | for (y = 0; y < h; y++) | + | |
- | { | + | |
- | for (x = 0; x < w; x++) | + | |
- | { | + | |
- | if (x < 20 && y < 20) | + | |
- | { | + | |
- | draw_pixel(pFrameBufferContext, x, y, 0xffffff); | + | |
- | } | + | |
- | else if (x < 20 && (y > 20 && y < h - 20)) | + | |
- | { | + | |
- | draw_pixel(pFrameBufferContext, x, y, 0xff); | + | |
- | } | + | |
- | else if (y < 20 && (x > 20 && x < w - 20)) | + | |
- | { | + | |
- | draw_pixel(pFrameBufferContext, x, y, 0xff00); | + | |
- | } | + | |
- | else if (x > w - 20 && (y > 20 && y < h - 20)) | + | |
- | { | + | |
- | draw_pixel(pFrameBufferContext, x, y, 0xff0000); | + | |
- | } | + | |
- | else if (y > h - 20 && (x > 20 && x < w - 20)) | + | |
- | { | + | |
- | draw_pixel(pFrameBufferContext, x, y, 0xffff00); | + | |
- | } | + | |
- | else if (x == 20 || x == w - 20 || | + | |
- | y == 20 || y == h - 20) | + | |
- | { | + | |
- | draw_pixel(pFrameBufferContext, x, y, 0xffffff); | + | |
- | } | + | |
- | else if (x == y || w - x == h - y) | + | |
- | { | + | |
- | draw_pixel(pFrameBufferContext, x, y, 0xff00ff); | + | |
- | } | + | |
- | else if (w - x == y || x == h - y) | + | |
- | { | + | |
- | draw_pixel(pFrameBufferContext, x, y, 0x00ffff); | + | |
- | } | + | |
- | + | ||
- | else if (x > 20 && y > 20 && x < w - 20 && y < h - 20) | + | |
- | { | + | |
- | int t = x * 3 / w; | + | |
- | unsigned r = 0, g = 0, b = 0; | + | |
- | unsigned c; | + | |
- | if (pFrameBufferContext->var.bits_per_pixel == 16) | + | |
- | { | + | |
- | if (t == 0) | + | |
- | { | + | |
- | b = (y % 32) * 256 / 32; | + | |
- | } | + | |
- | else if (t == 1) | + | |
- | { | + | |
- | g = (y % 64) * 256 / 64; | + | |
- | } | + | |
- | else if (t == 2) | + | |
- | { | + | |
- | r = (y % 32) * 256 / 32; | + | |
- | } | + | |
- | } | + | |
- | else | + | |
- | { | + | |
- | if (t == 0) | + | |
- | { | + | |
- | b = (y % 256); | + | |
- | } | + | |
- | else if (t == 1) | + | |
- | { | + | |
- | g = (y % 256); | + | |
- | } | + | |
- | else if (t == 2) | + | |
- | { | + | |
- | r = (y % 256); | + | |
- | } | + | |
- | } | + | |
- | c = (b << 16) | (g << 8) | (r << 0); | + | |
- | draw_pixel(pFrameBufferContext, x, y, c); | + | |
- | } | + | |
- | else | + | |
- | { | + | |
- | draw_pixel(pFrameBufferContext, x, y, 0); | + | |
- | } | + | |
- | } | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | void clear_area( FrameBufferContext_t *pFrameBufferContext, | + | |
- | unsigned long X, | + | |
- | unsigned long Y, | + | |
- | unsigned long W, | + | |
- | unsigned long H) | + | |
- | { | + | |
- | unsigned long AddressOffsetForH; | + | |
- | unsigned long CountForH; | + | |
- | unsigned char * pFrameBuffer; | + | |
- | + | ||
- | pFrameBuffer = (unsigned char *)pFrameBufferContext->pFrameBuffer; | + | |
- | + | ||
- | for (CountForH = 0; CountForH < H; CountForH++) | + | |
- | { | + | |
- | AddressOffsetForH = (X + pFrameBufferContext->var.xoffset) * (pFrameBufferContext->var.bits_per_pixel / 8) + (Y + CountForH + pFrameBufferContext->var.yoffset) * pFrameBufferContext->fix.line_length; | + | |
- | + | ||
- | memset(pFrameBuffer + AddressOffsetForH, 0, W * pFrameBufferContext->var.bits_per_pixel / 8); | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | + | ||
- | int device_open_mode(FrameBufferContext_t *pFrameBufferContext, int BitPerPixel) | + | |
- | { | + | |
- | pFrameBufferContext->Device = open(DEFAULT_FRAME_BUFFER_FILE, O_RDWR); | + | |
- | if(pFrameBufferContext->Device < 0) | + | |
- | { | + | |
- | printf("Faile to open : %s \n", DEFAULT_FRAME_BUFFER_FILE); | + | |
- | return -1; | + | |
- | } | + | |
- | + | ||
- | if(ioctl(pFrameBufferContext->Device, FBIOGET_VSCREENINFO, &pFrameBufferContext->var) < 0) | + | |
- | { | + | |
- | printf("fbdev ioctl(VSCREENINFO)\n"); | + | |
- | close(pFrameBufferContext->Device); | + | |
- | return -1; | + | |
- | } | + | |
- | + | ||
- | if(ioctl(pFrameBufferContext->Device, FBIOGET_FSCREENINFO, &pFrameBufferContext->fix) < 0) | + | |
- | { | + | |
- | printf("fbdev ioctl(FSCREENINFO)\n"); | + | |
- | close(pFrameBufferContext->Device); | + | |
- | return -1; | + | |
- | } | + | |
- | + | ||
- | if(pFrameBufferContext->var.bits_per_pixel != BitPerPixel) | + | |
- | { | + | |
- | pFrameBufferContext->var.bits_per_pixel = BitPerPixel; | + | |
- | if(ioctl(pFrameBufferContext->Device, FBIOPUT_VSCREENINFO, &pFrameBufferContext->var) < 0) | + | |
- | { | + | |
- | printf("fbdev ioctl(PUT)\n"); | + | |
- | close(pFrameBufferContext->Device); | + | |
- | return -1; | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | return 0; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | int device_open(FrameBufferContext_t *pFrameBufferContext) | + | |
- | { | + | |
- | if(device_open_mode(pFrameBufferContext, 8) != 0) | + | |
- | { | + | |
- | printf("Faile to open with 8bit: %s \n", DEFAULT_FRAME_BUFFER_FILE); | + | |
- | return -1; | + | |
- | } | + | |
- | close(pFrameBufferContext->Device); | + | |
- | + | ||
- | if(device_open_mode(pFrameBufferContext, 24) != 0) | + | |
- | { | + | |
- | printf("Faile to open with 24bit: %s \n", DEFAULT_FRAME_BUFFER_FILE); | + | |
- | return -1; | + | |
- | } | + | |
- | + | ||
- | printf("x-resolution : %d\n", pFrameBufferContext->var.xres); | + | |
- | printf("y-resolution : %d\n", pFrameBufferContext->var.yres); | + | |
- | printf("x-resolution(virtual) : %d\n", pFrameBufferContext->var.xres_virtual); | + | |
- | printf("y-resolution(virtual) : %d\n", pFrameBufferContext->var.yres_virtual); | + | |
- | printf("bpp : %d\n", pFrameBufferContext->var.bits_per_pixel); | + | |
- | printf("length of frame buffer memory : %d\n", pFrameBufferContext->fix.smem_len); | + | |
- | + | ||
- | return 0; | + | |
- | } | + | |
- | + | ||
- | + | ||
- | int main() | + | |
- | { | + | |
- | FrameBufferContext_t FrameBufferContext; | + | |
- | int Error; | + | |
- | + | ||
- | printf("Opening frame buffer device `%s'\n", DEFAULT_FRAME_BUFFER_FILE); | + | |
- | + | ||
- | if(device_open(&FrameBufferContext) != 0) | + | |
- | { | + | |
- | printf("Fail to Device Open\n"); | + | |
- | return 0; | + | |
- | } | + | |
- | + | ||
- | FrameBufferContext.pFrameBuffer = mmap(0, | + | |
- | FrameBufferContext.var.yres_virtual * FrameBufferContext.fix.line_length, | + | |
- | PROT_WRITE | PROT_READ, | + | |
- | MAP_SHARED, | + | |
- | FrameBufferContext.Device, | + | |
- | 0); | + | |
- | + | ||
- | if(FrameBufferContext.pFrameBuffer == MAP_FAILED) | + | |
- | { | + | |
- | printf("Frame buffer MAP fail !\n"); | + | |
- | close(FrameBufferContext.Device); | + | |
- | return 0; | + | |
- | } | + | |
- | + | ||
- | /* Display pattern to screen */ | + | |
- | fill_screen(&FrameBufferContext); | + | |
- | + | ||
- | /* End of... */ | + | |
- | munmap( FrameBufferContext.pFrameBuffer, | + | |
- | FrameBufferContext.var.yres_virtual * FrameBufferContext.fix.line_length); | + | |
- | + | ||
- | + | ||
- | close(FrameBufferContext.Device); | + | |
- | return 0; | + | |
- | } | + | |
- | | + | |
- | {{wiki:atmel_sama5d42:test_app:test_app_002.zip}} | + | [[DRM or Simple FB App]] |
- | + | ||
- | 아래와 같이 컴파일 한다. | + | |
- | + | ||
- | stephanos@stephanos-VirtualBox:~/VI/App$ /home/stephanos/VI/gcc-linaro-6.2.1-2016.11-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc -o test test.c | + | |
- | + | ||
- | {{wiki:atmel_sama5d42:test_app:test_app_000.jpg}} | + | |
- | + | ||
- | NFS에 위에서 만들어진 test를 복사한다. | + | |
- | Target Board를 NFS로 부팅한다. | + | |
- | + | ||
- | 로그인 후 아래와 같이 실행한다. | + | |
- | + | ||
- | {{wiki:atmel_sama5d42:test_app:test_app_001.jpg}}\\ | + | |
- | {{wiki:atmel_sama5d42:test_app:test_app_003.jpg}} | + | |
+ | {{wiki:atmel_sama5d42:test_app:TestApp.tar}} | ||
+ | {{wiki:atmel_sama5d42:test_app:rootfs-2017-09-01.tar}} | ||
+ | [[MSR Test]] | ||