zoukankan      html  css  js  c++  java
  • S3C6410 LCD Overlay Test Program

     

    测试了一下S3C6410 LCD控制器提供的Overlay功能,写了一个简单的test,主要用于实现FB0和FB1之间的Overlay操作。
    内核选项的Windows至少要为2。

    具体支持如下操作:
    1 使能OSD
    2 关闭OSD
    3 增加OSD的Alpha值
    4 减少OSD的Alpha值
    5 手动设置Alpha值(0-15)
    6 上移OSD层
    7 下移OSD层
    8 左移OSD层
    9 右移OSD层
    10 设置OSD层

    其中设置OSD层最重要,可以重新设置窗口的大小和起始位置,主要设置完后需要重新填充窗口数据,旧的数据将错乱。
    ///////////////////////////////////////////////////////////////
    s3cfb.h
    ///////////////////////////////////////////////////////////////
    #include <stdint.h>
    #include <sys/types.h>

    typedef struct {
    int bpp;
    int left_x;
    int top_y;
    int width;
    int height;
    } s3c_win_info_t;

    typedef struct{
    __u32 phy_start_addr;
    __u32 xres; 
    __u32 yres;
    __u32 xres_virtual;
    __u32 yres_virtual;
    __u32 xoffset; 
    __u32 yoffset; 
    __u32 lcd_offset_x;
    __u32 lcd_offset_y;
    } s3c_fb_next_info_t;

    #define FBIO_WAITFORVSYNC       _IOW ('F', 32, unsigned int)
    #define S3C_FB_OSD_START        _IO ('F', 201)
    #define S3C_FB_OSD_STOP    _IO('F', 202) 
    #define S3C_FB_OSD_SET_INFO     _IOW ('F', 209, s3c_win_info_t)
    #define S3C_FB_CHANGE_REQ       _IOW ('F', 308, int)
    #define S3C_FB_GET_CURR_FB_INFO _IOR ('F', 321, s3c_fb_next_info_t)

    #define S3C_FB_OSD_ALPHA_UP   _IO ('F', 203)
    #define S3C_FB_OSD_ALPHA_DOWN   _IO ('F', 204)
    #define S3C_FB_OSD_MOVE_LEFT   _IO ('F', 205)
    #define S3C_FB_OSD_MOVE_RIGHT   _IO ('F', 206)
    #define S3C_FB_OSD_MOVE_UP   _IO ('F', 207)
    #define S3C_FB_OSD_MOVE_DOWN   _IO ('F', 208)
    #define S3C_FB_OSD_ALPHA_SET   _IOW ('F', 210, unsigned int)
    #define S3C_FB_OSD_ALPHA0_SET   _IOW ('F', 211, unsigned int)
    #define S3C_FB_OSD_ALPHA_MODE   _IOW ('F', 212, unsigned int)

    ////////////////////////////////////////////////////////////////
    osd.c
    ////////////////////////////////////////////////////////////////
    #include <stdio.h>
    #include <stdlib.h>
    #include <sys/ioctl.h> 
    #include <fcntl.h>

    #include "fb.h"
    #include "s3cfb.h"

    #define DEV_FB0 "/dev/fb0"
    #define DEV_FB1 "/dev/fb1"

    #define FILE1 "/overlay/1.bin"
    #define FILE2 "/overlay/2.bin"

    int stat,err;
    int fb0,fb1;
    s3c_win_info_t osd_info;

    void set_osd_info(){
    int input; 
    osd_info.bpp = 16;
    printf("please input left x coordinate ");
    scanf("%d",&input);
    osd_info.left_x = input;
    printf("please input top y coordinate ");
    scanf("%d",&input);
    osd_info.top_y = input;
    printf("please input ods width ");
    scanf("%d",&input);
    osd_info.width = input;
    printf("please input osd height ");
    scanf("%d",&input);
    osd_info.height = input;
    }

    int main(int argc, char *argv[])
    {
    printf("Begin the OSD test! ");
    if(argc < 2){
       printf("Usage: ./osd 1 "); //reserved
       return -1;
    }

    fb0 = open("/dev/fb0",O_RDWR);
    if(fb0 < 0) {
       printf("open err! fb0 is %d ",fb0);
       return -1;
    }
    fb1 = open("/dev/fb1",O_RDWR);
    if(fb1 < 0) {
       printf("open err! fb1 is %d ",fb1);
       return -1;
    }

    stat = atoi(argv[1]);
    printf("stat is %d ",stat);
    switch(stat){
    case 1:
       sleep(1);
       ioctl(fb1,S3C_FB_OSD_START);
       break; 
    default:
       printf("err argv! ");
    }

    while(1){
    printf("Please choose one option: ");
    printf("1. enable the OSD ");
    printf("2. disable the OSD ");
    printf("3. + OSD alpha ");
    printf("4. - OSD alpha ");
    printf("5. set OSD alpha ");
    printf("6. move up OSD ");
    printf("7. move down OSD ");
    printf("8. move left OSD ");
    printf("9. move right OSD ");
    printf("10. SET OSD INFO ");
    printf("0. exit ");

    scanf("%d",&stat);
    switch(stat){
       case 1:
        err = ioctl(fb1,S3C_FB_OSD_START);
        if(err < 0) printf("ioctl err =%d",err);
        break;
       case 2:
        err = ioctl(fb1,S3C_FB_OSD_STOP);
        if(err < 0) printf("ioctl err =%d",err);
        break;
       case 3:
        err = ioctl(fb1,S3C_FB_OSD_ALPHA_UP);
        if(err < 0) printf("ioctl err =%d",err);
        break;
       case 4:
        err = ioctl(fb1,S3C_FB_OSD_ALPHA_DOWN);
        if(err < 0) printf("ioctl err =%d",err);
        break;
       case 5:
        printf("please input your alpha level[0~15] ");
        scanf("%d",&stat);
        err = ioctl(fb1,S3C_FB_OSD_ALPHA_SET,stat);
        if(err < 0) printf("ioctl err =%d",err);
        break;
       case 6:
        err = ioctl(fb1,S3C_FB_OSD_MOVE_UP);
        if(err < 0) printf("ioctl err =%d",err);
        break;
       case 7:
        err = ioctl(fb1,S3C_FB_OSD_MOVE_DOWN);
        if(err < 0) printf("ioctl err =%d",err);
        break;
       case 8:
        ioctl(fb1,S3C_FB_OSD_MOVE_LEFT);
        break;
       case 9:
        err = ioctl(fb1,S3C_FB_OSD_MOVE_RIGHT);
        if(err < 0) printf("ioctl err =%d",err);
        break;
       case 10:
        set_osd_info();
        err = ioctl(fb1,S3C_FB_OSD_SET_INFO,&osd_info);
        if(err < 0) printf("ioctl err =%d",err);
        break;
       case 0:
        goto exit;
       default:
        printf("please input number 0~10 ");
       }
    } //end of while(1)


    exit:
    sleep(1);
    err = ioctl(fb1,S3C_FB_OSD_STOP);
    if(err < 0) printf("ioctl err =%d",err);

    return 0;
    }

    ///////////////////////////////////////////////////////////////////////
    //偷懒直接用脚本cat的图片数据test.sh
    ///////////////////////////////////////////////////////////////////////

    #!/bin/sh
    cat ./1.bin > /dev/fb0
    cat ./22.bin > /dev/fb1
    #cat ./3.bin > /dev/fb2
    #cat ./4.bin > /dev/fb3
    #cat ./5.bin > /dev/fb4
    ./osd 1

  • 相关阅读:
    前端Javascript
    第十一周双闭环控制
    补第九周手绘图
    第十一周仿真作业
    第九周PLECS仿真
    第五六周读书笔记
    PLECS模拟与设计结构-4
    机电传动控制读书笔记-3
    PLECS仿真报告2
    PLECS仿真报告
  • 原文地址:https://www.cnblogs.com/cainiaoaixuexi/p/3147919.html
Copyright © 2011-2022 走看看