/*
* TQ2440 camera test program
*
* preview : 320x240 overlay on 320x240 16bpp LCD
*
* TFT LCD size : 320x240
*/
#include <sys/time.h>
#include <sys/types.h>
#include <asm/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <errno.h>
#include <linux/fs.h>
#include <linux/kernel.h>
#include "videodev.h"
#include "videodev2.h"
#include <linux/fb.h>
#define PIXFMT_NUM 5
#define INPUT_NUM 5
#define CTRL_NUM 100
#define V4L2_DEV_NODE "/dev/camera"
#define FB_DEV_NODE "/dev/fb0"
#define DATA "/home/sky/photo.bmp"
#define WIDTH 320
#define HEIGHT 240
//typedef struct v4l2_input V_INPUT;
//typedef struct v4l2_format V_FORMAT;
//typedef struct v4l2_fmtdesc V_FMTDESC;
//typedef struct v4l2_queryctrl V_QRYCTRL;
typedef struct fb_var_screeninfo F_VINFO;
//文件头
struct tagBITMAPFILEHEADER{
unsigned long bfSize;
unsigned long bfLeft;
unsigned long bfOffBits;
};
/*bmp图像的位图信息头*/
struct tagBITMAPINFOHEADER{
unsigned long biSize;
unsigned long bmpWidth;
unsigned long bmpHeight;
unsigned short biPlanes;
unsigned short bicolors;
unsigned long isCompressed;
unsigned long biMapSize;
unsigned long biHorizontal;
unsigned long biVertical;
unsigned long biusedcolors;
unsigned long biimportcolors;
};
unsigned int x_lcd_size, y_lcd_size;
unsigned char preview_buf[WIDTH*HEIGHT*2];
static void writebmp(int data_fd){
int i,j,size;
int ret;
unsigned short buf[WIDTH*HEIGHT];
memcpy(buf, &preview_buf, 240*320*2);
unsigned short bmp[WIDTH*HEIGHT];
struct tagBITMAPFILEHEADER bfhead;
struct tagBITMAPINFOHEADER binfohead;
size=HEIGHT*WIDTH;
bfhead.bfSize=0x36+size*2;
bfhead.bfLeft=0;
bfhead.bfOffBits=0x36;
binfohead.biSize=0x28;
binfohead.bmpWidth=WIDTH;
binfohead.bmpHeight=HEIGHT;
binfohead.biPlanes=1;
binfohead.bicolors=0x10;
binfohead.isCompressed=0;
binfohead.biMapSize=size*2;
binfohead.biHorizontal=0x0b13;
binfohead.biVertical=0x0b13;
binfohead.biusedcolors=0;
binfohead.biimportcolors=0;
for(i=0;i<HEIGHT;i++)
for(j=0;j<WIDTH;j++)
{
*(bmp+i*WIDTH+j)=((buf[i*WIDTH+j]&0xf800)>>1)|((buf[i*WIDTH+j]&0x07c0)>>1)|((buf[i*WIDTH+j]&0x1f));
//printf("%x\t",*(bmp+i*WIDTH+j));
}
write(data_fd,"BM",2);
i=write(data_fd,&bfhead,sizeof(struct tagBITMAPFILEHEADER));
printf("Write filehead %dbytes\n",i);
i=write(data_fd,&binfohead,sizeof(struct tagBITMAPINFOHEADER));
printf("Write infohead %dbytes\n",i);
i=write(data_fd,bmp,size*2);
printf("Write bitmap %dbytes\n",i);
lseek(data_fd,SEEK_SET,4);
}
static void v4l2_show_on_fb(int fd, char *fbmem, int frames)
{
int i;
int ret;
//while(1)
for(i=0;i<10;i++)
{
if ((ret = read (fd, &preview_buf, WIDTH*HEIGHT*2)) < 0) {
perror("read");
return;
}
#if 1 //for 320*240,640*480,800*480
{
//printf("test");
int y;
for (y = 0; y < 240; y++)
memcpy(fbmem + x_lcd_size*2*y, preview_buf + 320*2*y, 320*2);
//memcpy(fbmem + x_lcd_size*2*y, preview_buf + 320*y, 320*2);
}
#else //for 240*320
memcpy(fbmem, &preview_buf, 240*320*2);
#endif
fflush(stdout);
}
printf("\n");
}
static unsigned int fb_grab(int fd, char **fbmem)
{
F_VINFO modeinfo;
unsigned int length;
if (ioctl(fd, FBIOGET_VSCREENINFO, &modeinfo) < 0) {
perror("FBIOGET_VSCREENINFO");
exit (EXIT_FAILURE);
}
length = modeinfo.xres * modeinfo.yres * (modeinfo.bits_per_pixel >> 3);
x_lcd_size=modeinfo.xres; //width of tft lcd
y_lcd_size=modeinfo.yres; //height of tft lcd
printf("fb memory info=xres (%d) x yres (%d), %d bpp\n",
modeinfo.xres, modeinfo.yres, modeinfo.bits_per_pixel);
*fbmem = mmap(0, length, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
if (*fbmem < 0) {
perror("mmap()");
length = 0;
}
return length;
}
static void fb_ungrab(char **fbmem, unsigned int length)
{
if (*fbmem)
munmap(*fbmem, length);
}
int main(int argc, char *argv[])
{
int v4l2_fd = -1;
int fb_fd = -1;
int data_fd=-1;
char *fbmem = NULL;
unsigned int fb_length = 0;
int preview_frames = 180;
int tmp;
printf("TQ2440 Camera Test Program, Start !\n");
if (argc > 1) {
if (sscanf(argv[1], "%d", &tmp) == 1)
preview_frames = tmp;
}
v4l2_fd = open(V4L2_DEV_NODE, O_RDWR);
if (v4l2_fd < 0) {
perror(V4L2_DEV_NODE);
goto out;
}
fb_fd = open(FB_DEV_NODE, O_RDWR);
if (fb_fd < 0) {
perror(FB_DEV_NODE);
goto out;
}
data_fd=open(DATA,O_CREAT|O_RDWR,0777);
if(data_fd<0){
perror(DATA);
goto out;
}
fflush(stdout);
if ((fb_length = fb_grab(fb_fd, &fbmem)) == 0)
goto out;
memset(fbmem, 0, fb_length);
printf("Press Ctrl+C to stop !\n");
fflush(stdout);
v4l2_show_on_fb(v4l2_fd, fbmem, preview_frames);
writebmp(data_fd);
printf("\n");
out:
if (v4l2_fd > 0)
close(v4l2_fd);
if(data_fd>0)
close(data_fd);
fb_ungrab(&fbmem, fb_length);
return 0;
}
ov9650摄像头(好好用的摄像头测试程序)
3星 · 超过75%的资源 需积分: 9 198 浏览量
2011-05-10
15:57:37
上传
评论 1
收藏 88KB RAR 举报
zhangzilong412750168
- 粉丝: 0
- 资源: 11
最新资源
- 在matlab中通过yalmip平台调用cplex求解器,可用于求解MILP问题,适合于综合能源系统优化求解(注释完全,可直接运
- MT8852B labview 驱动,MT8852B labview 代码,蓝牙测试仪MT8852B代码,蓝牙低功耗测试
- 导照片2.0(只适合索尼微单)
- KMP算法python代码实现与使用场景.docx
- 基于MATLABCPLEX 的机组最优组合,成功求解表格化,图示化的机组组合结果(注释完全,可直接运行)(文档加Matlab源码
- postgresql-9.5.3-1-windows-x64
- 基于大数据和产业互联网的企业数字化转型.rar
- MySQL5与PHP5开发的相册系统源码.zip
- 支持linux CentOS安装 jdk1.8的jenkins
- Clover四叶草引导中文版
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页