S3C6410 LCD Overlay Test Program

发布时间:2024-07-26  

测试了一下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
#include

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
#include
#include  
#include

#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 coordinaten");
scanf("%d",&input);
osd_info.left_x = input;
printf("please input top y coordinaten");
scanf("%d",&input);
osd_info.top_y = input;
printf("please input ods widthn");
scanf("%d",&input);
osd_info.width = input;
printf("please input osd heightn");
scanf("%d",&input);
osd_info.height = input;
}

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

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

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

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

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]n");
    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~10n");
   }
} //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

 


文章来源于:电子工程世界    原文链接
本站所有转载文章系出于传递更多信息之目的,且明确注明来源,不希望被转载的媒体或个人可与我们联系,我们将立即进行删除处理。

我们与500+贴片厂合作,完美满足客户的定制需求。为品牌提供定制化的推广方案、专属产品特色页,多渠道推广,SEM/SEO精准营销以及与公众号的联合推广...详细>>

利用葫芦芯平台的卓越技术服务和新产品推广能力,原厂代理能轻松打入消费物联网(IOT)、信息与通信(ICT)、汽车及新能源汽车、工业自动化及工业物联网、装备及功率电子...详细>>

充分利用其强大的电子元器件采购流量,创新性地为这些物料提供了一个全新的窗口。我们的高效数字营销技术,不仅可以助你轻松识别与连接到需求方,更能够极大地提高“闲置物料”的处理能力,通过葫芦芯平台...详细>>

我们的目标很明确:构建一个全方位的半导体产业生态系统。成为一家全球领先的半导体互联网生态公司。目前,我们已成功打造了智能汽车、智能家居、大健康医疗、机器人和材料等五大生态领域。更为重要的是...详细>>

我们深知加工与定制类服务商的价值和重要性,因此,我们倾力为您提供最顶尖的营销资源。在我们的平台上,您可以直接接触到100万的研发工程师和采购工程师,以及10万的活跃客户群体...详细>>

凭借我们强大的专业流量和尖端的互联网数字营销技术,我们承诺为原厂提供免费的产品资料推广服务。无论是最新的资讯、技术动态还是创新产品,都可以通过我们的平台迅速传达给目标客户...详细>>

我们不止于将线索转化为潜在客户。葫芦芯平台致力于形成业务闭环,从引流、宣传到最终销售,全程跟进,确保每一个potential lead都得到妥善处理,从而大幅提高转化率。不仅如此...详细>>