测试了一下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\n");
scanf("%d",&input);
osd_info.left_x = input;
printf("please input top y coordinate\n");
scanf("%d",&input);
osd_info.top_y = input;
printf("please input ods width\n");
scanf("%d",&input);
osd_info.width = input;
printf("please input osd height\n");
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 1\n"); //reserved
   return -1;
}

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

stat = atoi(argv[1]);
printf("stat is %d\n",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 OSD\n");
printf("2. disable the OSD\n");
printf("3. + OSD alpha\n");
printf("4. - OSD alpha\n");
printf("5. set OSD alpha\n");
printf("6. move up OSD\n");
printf("7. move down OSD\n");
printf("8. move left OSD\n");
printf("9. move right OSD\n");
printf("10. SET OSD INFO\n");
printf("0. exit\n");

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

S3C6410 LCD Overlay Test Program的更多相关文章

  1. S3C6410 LCD驱动分析(转)

    一. 理论分析1. 几个概念:FIMC :    Fully Interactive Mobile Camera (完全交互式移动摄像机)FIMD:     Fully Interactive Mob ...

  2. 第五章——搭建S3C6410开发板的测试环境

    搭建S3C6410开发板的测试环境 通过本章的学习学会了如何在开发板上安装Android.开发板是学习和开发嵌入式技术的主要硬件设备,想要顺利的通过linux驱动访问硬件,是不能在PC板上模拟的,需要 ...

  3. 【转】用Device tree overlay掌控Beaglebone Black的硬件资源

    原文网址:https://techfantastic.wordpress.com/2013/11/15/beaglebone-black-device-tree-overlay/ 经过一晚上的Goog ...

  4. 聊聊Beaglebone Black的cape和device tree overlay和dtc命令【转】

    本文转载自:https://blog.csdn.net/wyt2013/article/details/16846171 本文是我早期写的,语言略混乱.请直接看我最新整理的,适用于初学者的文章< ...

  5. 第五章 搭建S3C6410开发板的测试环境

    在PC上可以开发Linux驱动,重新编译成ARM架构的Linux驱动模块,但最后还是要在开发板上进行测试.目前最流行的是基于三星S3C6410 ARM11架构的开发板,很多厂商在其基础上进行了扩展,开 ...

  6. 使用IOCTL代码实现LCD背光调节

    国内这种代码找不到.于是參考了相关代码后完好例如以下代码,且实现方式通过IOCTL代码实现LCD背光调节的功能. 适合场合为平板电脑或者笔记本.主要还是要靠BIOS支持与否. 编译环境使用:Dev-c ...

  7. msm8610 lcd driver code analysis

    ---恢复内容开始--- 1  lcd probe The probe sequence is determined by compilation sequence: mdss-mdp3-objs = ...

  8. LCD framebuffer驱动设计文档

    内容提要:1. android display相关的名词2. 调试LCD驱动需要注意的步骤3. 关于帧缓冲区及I/O内存---------------------------------------- ...

  9. S3C6410嵌入式应用平台构建(六)——linux-3.14.4移植到OK6410-(Yaffs2文件制作)

    本文主要讲怎用利用yaffs2工具和busybox制作yaffs2文件系统镜像.大多数都是参照网上的,目的在于记录学习,不做任何用途. 一.制作mkyaffs2image工具 进入yaffs2源码目录 ...

随机推荐

  1. awk的总结

    入门总结 Awk简介 awk不仅仅时linux系统中的一个命令,而且是一种编程语言,可以用来处理数据和生成报告.处理的数据可以是一个或多个文件,可以是来自标准输入,也可以通过管道获取标准输入,awk可 ...

  2. Linux系统下python代码运行shell命令的方法

    方法一:os.popen #!/usr/bin/python # -*- coding: UTF-8 -*- import os, sys # 使用 mkdir 命令 a = 'ls' b = os. ...

  3. MySQL导入到SQLServer

    Mysql是在Linux环境服务器,MSSQL在windows服务器上 1.在MSServer中安装VPN 2.为VPN配置Mysql服务器账号 3.账号中的文件 4.在MSSQL服务器上安装mysq ...

  4. 广东工业大学2016校赛决赛-网络赛 1174 Problem F 我是好人4 容斥

    Problem F: 我是好人4 Description 众所周知,我是好人!所以不会出太难的题,题意很简单 给你n个数,问你1000000000(含1e9)以内有多少个正整数不是这n个数任意一个的倍 ...

  5. BZOJ 3160: 万径人踪灭 FFT+快速幂+manacher

    BZOJ 3160: 万径人踪灭 题目传送门 [题目大意] 给定一个长度为n的01串,求有多少个回文子序列? 回文子序列是指从原串中找出任意个,使得构成一个回文串,并且位置也是沿某一对称轴对称. 假如 ...

  6. centos6配置固定ip地址(选择桥接模式)

    1.配置ifcfg-eth0 vim /etc/sysconfig/network-scripts/ifcfg-eth0 首先把BOOTPROTO="dhcp"改成BOOTPROT ...

  7. 杂项-DB:数据挖掘

    ylbtech-杂项-DB:数据挖掘 数据挖掘(Data mining)又译为资料探勘.数据采矿.它是数据库知识发现(英语:Knowledge-Discovery in Databases,简称:KD ...

  8. 运算符 and or ont

    运算符 逻辑运算: and 并且的意思. 左右两端的值必须都是真. 运算结果才是真 or 或者的意思. 左右两端有一个是真的. 结果就是真. 全部是假. 结果才能是假 not 非的意思. 原来是假. ...

  9. javascript在html直接传值

    function getUrlParam(url, name) { var pattern = new RegExp("[?&]" + name + "\=([^ ...

  10. Android实现图片相似度

    Android实现图片相似度 最近公司有一个需求,就是希望能判断用户提交的照片是否是身份证的正面或者反面.可以通过预设一张拍摄清晰的身份证正面或者反面,来对比是否相似,那么问题就转化为如何计算两张图片 ...