logo
한국어 Select Language
FF 포럼
포럼지기에게 한 마디
공지사항
뉴스 EZ보드 통합 메뉴얼
FA-VUS 개발환경 !강추! 타켓보드 부팅-HyperTerminal 타켓보드 부팅-Tutty 타켓보드 부팅-minicom Windows환경-타겟 Linux 구동 Linux환경-타겟 Linux 구동 개발 시스템 구축 유형 페도라 설치 CentOS 설치 크로스 컴파일러 설치 TFTP 환경 구축 NFS 파일 시스템 구축 삼바 서버 구축 부트로더 부트로더 쓰기 커널 이미지 제작 및 설치 램디스크 이미지 제작 및 설치
임베디드 제품 사용기 오늘의 영어 휴게실 Appliance
강좌 & 팁
강좌 & 팁 EZ-보드 그래픽 & 멀티미디어 네트워크 프로그래밍 디바이스 드라이버 ImJa 솔루션 임베디드 FLEX 안드로이드 iOS 개발 FAIDE 하드웨어 C/C++ go언어 GNU C 레퍼런스 메뉴얼 ARM 루아 응용 프로젝트 이클립스 지그비 개발자 노트 권장도서 FPGA
VIVADO DSP HSIO Logic Zynq
함수설명
C 라이브러리 함수 커널 API 그래픽 라이브러리 - gxLib
자료실
자료실 FALINUX SDK ARM PC-V210 S3C6410
G100-S3C6410 S100-S3C6410 C221-S3C6410 N200-S3C6410 EZ-S3C6410
S5PV210
G100-S5PV210 S100-S5PV210 N200-S5PV210 C221-S5PV210
EZ-S3C2440 EZ-PXA270 EZ-X5 EZ-S2410 Auto Package
도와주세요
FAQ 도와주세요

  • 회원가입
  • ID/PW 찾기
 
  1. FAQ

  2. 도와주세요


최근 글

  • [특판][성Y인Y용Y품][...
  • 요즘 잘 나가는,,,
  • 요즘은 vmware 말고 ...
  • [docker] buildx 를 ...
  • buildroot 사용 관련
  • GPIO 제어 방법 문의 [1]
  • 임베디드 리눅스 개발...
  • make wandboard_quad ...
  • LCD 초기화 코드 좀 ... [1]
  • 임베디드 리눅스 커널...

최근 댓글

  • 오래 전에 해결법을 터득해서 ...
  • 비트 코인으로 작업하는 것은 ...
  • 10년차 임베 엔지니어 입니다. ...
  • 임베디드쪽이라면 SOC 쪽 displ...
  • 그렇군요 제가 질문이 잘못됬었...
  • 취준생으로서 포트폴리오를 만...
  • 제가 현재 취업준비생입니다. ...
  • 에프에이리눅스 보드는 아래 링...
  • 전체
  • 일반
  • X5
  • S2410
  • ESP-NS
  • S3C2440
  • EP9312
  • 구매
  • 기타

X5 V4L 그리고 프레임버퍼 질문입니다.

2007.11.21 03:07

조금산 조회 수:8375

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <math.h>
#include <string.h>
#include <fcntl.h>
#include <termios.h>
#include <unistd.h>
#include <getopt.h>
#include <sys/ioctl.h>
                                                                                
#include <semaphore.h>
#include <pthread.h>
#include <stdlib.h>
#include <getopt.h>

#include <linux/types.h>
#include <linux/fb.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include <sys/mman.h>
#include <linux/videodev.h>

#define SERVO_LEFT        1
#define SERVO_RIGHT        2
#define SERVO_MIDDLE        3

#define Dev_Name        "dev/Cam_Stream_Module"

static int Timer = 0;
static int Servo = 0;
static int frames2 = 0;
static int frame_number = 0;

//extern int frame_number2;

struct picbuf
{
        char *data;
};

typedef struct camera
{
        int dev;
        int x;
        int y;
        int dither;
        int contrast, brightness, colour, hug;
        struct video_capability         vid_cap;
        struct video_picture                vid_pic;
        struct video_channel                vid_chnl;
        struct video_window                vid_win;
        struct video_mbuf                vid_buf;
        struct video_mmap                vid_map[2];
        char video_dev[256];
        char *pic;
        char *image;
        char *ppmfile;
        struct picbuf pic_buf[2];
}cam;

struct bgrpixel
{
        unsigned char b, g , r;
};

typedef struct lcd_frmae_buffer
{
        int dev;
        char lcd_dev[256];
        struct fb_var_screeninfo        fbvar;
        struct bgrpixel                 pixel;
        int x;
        int y;
        int bp;
        int byte_total;
        unsigned short *vbase;
}lcd;

int video_open(lcd *lcd)
{
        if(ioctl(lcd->dev, FBIOGET_VSCREENINFO, &lcd->fbvar) < 0)
        {
                printf("fbvar open failn");
                return 0;
        }
        if(lcd -> fbvar.bits_per_pixel != 16)
        {
                printf("bpp is not 16n");
                exit(0);
        }
        lcd -> x = lcd -> fbvar.xres;
        lcd -> y = lcd -> fbvar.yres;
        lcd -> bp = lcd -> fbvar.bits_per_pixel;
        lcd -> byte_total = (lcd->x * lcd->y * (lcd->bp/8));
        lcd -> vbase = (unsigned short *) mmap(0, lcd->byte_total, PROT_READ | PROT_WRITE, MAP_SHARED, lcd->dev, 0);
        if((unsigned)lcd->vbase == (unsigned)-1)
        {
                printf("Lcd MMAP FAILn");
                exit(0);
        }

        return 0;
}

static unsigned short makepixel(lcd *lcd, unsigned char r, unsigned char g, unsigned char b)
{
        unsigned short rnew, gnew, bnew;
        
        rnew = r >> (8 - (lcd->fbvar.red.length));
        gnew = g >> (8 - (lcd->fbvar.green.length));
        bnew = b >> (8 - (lcd->fbvar.blue.length));
        
        return (unsigned short) ((rnew << lcd->fbvar.red.offset)
                | (gnew << lcd->fbvar.green.offset)
                | (bnew << lcd->fbvar.blue.offset));
}

void screen(lcd *lcd,cam *cam)
{
        int x, y;
        
        for(x = 0; x <= cam->x ; x ++)
        {
                for(y = 0; y <= cam->y ; y++)
                {
                        lcd->pixel.r = 10;
                        lcd->pixel.g = 10;
                        lcd->pixel.b = 10;
                        *(lcd->vbase + x *lcd->fbvar.xres+y) = makepixel(&lcd->fbvar, lcd->pixel.r, lcd->pixel.g, lcd->pixel.b);
                }
        }
}

void draw(int x, int y, unsigned short color,lcd *lcd)
{
        unsigned short *ptr;
        ptr = lcd->vbase + ((y * lcd->x) + x);
        *ptr = color;
}

int ppm_save(cam *cam)
{
        FILE *fp;
        int fc;
        
        printf("Capturing...n");
        fp = fopen(cam->ppmfile, "w");
        if(fp == NULL)
        {
                printf("OPEN FAIL FOR WIRTING...n");
                return -1;
        }
        fprintf(fp, "P6n%d %dn%dn",cam->x,cam->y,255);
        fc = fwrite(cam->pic_buf[frame_number].data, 1, cam->vid_buf.size, fp);
        fclose(fp);
        return 0;
}        

void camera_cap(cam *cam)
{
        if(ioctl(cam->dev, VIDIOCGCAP, &cam->vid_cap) == -1)
        {
                printf("Camera Capabilities OPEN FAIL, EXIT...n");
                exit(0);
        }
        if(cam -> vid_cap.maxwidth < cam -> x)
        {
                cam->x = cam->vid_cap.maxwidth;
        }
        if(cam -> vid_cap.minwidth > cam -> x)
        {
                cam->x = cam->vid_cap.minwidth;
        }
        if(cam -> vid_cap.maxheight < cam -> y)
        {
                cam->y = cam->vid_cap.maxheight;
        }
        if(cam -> vid_cap.minheight > cam -> y)
        {
                cam->y = cam->vid_cap.minheight;
        }
}

void set_pic_info(cam *cam)
{
        if(ioctl(cam->dev, VIDIOCSPICT, &cam->vid_pic) == -1)
        {
                printf("VIDEO PICTURE OPEN FILE EXIT.....n");
                exit(0);        
        }
}

void get_pic_info(cam *cam)
{
        if(ioctl(cam->dev, VIDIOCSPICT, &cam->vid_pic) == -1)
        {
                printf("VIDEO GET PICTURE OPEN FAIL EXIT.....n");
                exit(0);
        }
}

void get_win_info(cam *cam)
{
        if(ioctl(cam->dev, VIDIOCSWIN, &cam->vid_win) == -1)
        {
                printf("VIDEO GET WINDOW OPEN FAIL EXIT.....n");
                exit(0);
        }
}

void set_win_info(cam *cam)
{
        if(ioctl(cam->dev, VIDIOCSWIN, &cam->vid_win) == -1)
        {
                printf("VIDEO SET WINDOW OPEN FAIL EXIT.....n");
                exit(0);
        }
}

void set_buffer(cam *cam)
{
        if(ioctl(cam->dev, VIDIOCGMBUF, &cam->vid_buf) == -1)
        {
                printf("BUFFER SET FAIL EXIT.....n");
                exit(0);
        }
}


void dev_open(void)
{
        Servo = open(Dev_Name, O_RDWR | O_NOCTTY);        
        Timer = open("dev_timer", O_RDWR | O_NOCTTY);
        
        if(Servo < 0)
        {
                printf("%s OPEN FAIL.....n",Dev_Name);
                exit(0);
        }
        printf("Servo OPEN SUCCESS.....n");
        if(Timer < 0)
        {
                printf("Timer OPEN Fail [dev/timer]nn");
                exit(1);
        }
        printf("Timer OPENn");
}

void init_cam(cam *cam)
{
        cam->pic = mmap(0,cam->vid_buf.size,PROT_READ | PROT_WRITE,MAP_SHARED, cam->dev,0);
        cam->vid_map[0].height = cam->y;
        cam->vid_map[0].width = cam->x;
        cam->vid_map[0].frame = 0;
        cam->vid_map[0].format = cam->vid_pic.palette;
        cam->pic_buf[0].data = cam->pic;
        cam->vid_map[1].height = cam->y;
        cam->vid_map[1].width = cam->x;
        cam->vid_map[1].frame = 1;
        cam->vid_map[1].format = cam->vid_pic.palette;
        cam->pic_buf[1].data = cam->pic + cam->vid_buf.offsets[1];
        
        if((unsigned char*) -1 == (unsigned char *) cam->pic)
        {
                printf("MMAP FAILEDn");
                exit(-1);
        }
        if(ioctl(cam->dev, VIDIOCMCAPTURE, cam->vid_map) == -1)
        {
                printf("100n");
        }
        if(ioctl(cam->dev, VIDIOCSYNC, cam->vid_map) == -1)
        {
                printf("1000n");
        }
}

void frameloop(cam *cam)
{
        int ctl = 0;
        ctl = ioctl(cam->dev, VIDIOCMCAPTURE, cam->vid_map + frame_number);

        if(ctl == -1)
        {
                printf("CAPTURE FROM DEVICE OPEN FAIL.....n");
                exit(-1);
        }
        frames2++;
        ctl = ioctl(cam->dev, VIDIOCSYNC, cam->vid_map + frame_number);

        if(ctl == -1)
        {
                printf("VIDIOCSYNC FAILED.....n");
                munmap(cam->vid_map, cam->vid_buf.size);
                exit(-1);
        }
}

int main(int argc,char **argv)
{
        //int one = 1;
        //int done = 0;
        
        cam cam;
        lcd lcd;
        
        cam.x = 320;
        cam.y = 240;

        strcpy(lcd.lcd_dev, "/dev/fb0");
        strcpy(cam.video_dev, "/dev/video0");

        cam.dither = 128;
        
        lcd.dev = open(lcd.lcd_dev, O_RDWR);
        cam.dev = open(cam.video_dev, O_RDWR);
        
        cam.image = malloc(cam.x * cam.y * 3);
//        cam.vid_buf.size = cam.x * cam.y * 3;

        video_open(&lcd);
        camera_cap(&cam);

        if(ioctl(cam.dev, VIDIOCSCHAN, cam.vid_chnl) == -1);

        cam.vid_pic.palette = VIDEO_PALETTE_RGB24;
        cam.vid_win.x = 0;
        cam.vid_win.y = 0;
        cam.vid_win.width = cam.x;
        cam.vid_win.height = cam.y;

        cam.ppmfile = "file.bmp";
                
        set_pic_info(&cam);

        cam.contrast = cam.vid_pic.contrast * 256;
        cam.brightness = cam.vid_pic.brightness * 256;
        cam.colour = cam.vid_pic.colour * 256;
        cam.hug = cam.vid_pic.hue * 256;

        set_win_info(&cam);
        
        set_buffer(&cam);
        init_cam(&cam);
        //dev_open();

        while(1)
        {
                frameloop(&cam);
                ppm_save(&cam);
        }
        return 0;
}


이게 재가 짠 소스입니다.
그런데 사진이 이상하게 나오네요-_-;;;
camstream으로 받아들였을때는 정상적으로 캠이 동작을 합니다.
그런데 제가 만든 프로그램으로 돌리면 이상하게 그림이 나오네요

그리고 혹시라도 그림을 프레임버퍼로 나오게 하는 방법좀 알려주세요..-_ㅠ
이 게시물을
  • Twitter
  • Facebook
  • Delicious
목록

댓글 0

목록
번호 제목 글쓴이 날짜 조회 수
공지 포럼의 메뉴가 보이지 않아요! 장길석 2014.02.06 957631
공지 [중요 공지]제품 사용 및 기술 문의는 전화 상담을 받지 않습니다. 장길석 2012.11.09 1408526
공지 답글에 대한 공지 사항. falinux 2006.11.20 2424020
2499 EZ-X5 보드 2대 판매합니다. file 환이 2015.02.12 16140
2498 스텝핑 모타 문의합니다. 어거스틴 2015.01.21 16661
2497 EZ-X5 자료실에 toolchain 과 2.6.21 커널 소스가 다운이 안되는데 저만 그런가요? [1] chuck 2014.12.11 16851
2496 JTAG으로 보드에 부트로더를 다운로드하려고 하는데 - 스샷첨부 [1] file 0xEZ 2014.05.17 17706
2495 부팅이 안됩니다 ㅜㅜ 도와주세요 Freeing init memory 124k chuck 2014.02.14 22182
2494 ez-x5 구합니다. 쿨한넘 2013.11.11 18850
2493 디버깅 정보 담은 zImage 부팅시 문제입니다. [1] 허스타드 2013.09.30 21088
2492 질문있습니다. [1] 만두다 2013.06.10 18780
2491 안녕하세요!,부트로더 관련질문입니다.ㅠㅠ [1] 만두다 2013.06.09 19904
2490 12v 전원 어댑터 구매 문의 [1] 죠타로 2012.12.25 24930
2489 디바이스 드라이버에서 DIO 를 사용 하여 16/32 비트 데이터 출력 [5] 블랙홀 2012.11.30 39833
2488 EZ-X5 보드에 디바이스 추가 시 회로에 질문이 있습니다. [4] 초심자 2012.11.14 22108
2487 ezflash로 부트로더 올릴려고 하는데 잘 되지 않네요... [1] file bigEngin 2012.11.06 21522
2486 dma를 통한 tcp 통신이 가능한가요? [1] MorninGlory 2012.10.16 24053
2485 커널에 드라이버 추가하는 방법 질문이요. [3] MorninGlory 2012.10.05 26183
2484 커널 컴파일 에러요. [2] file MorninGlory 2012.10.05 21915
2483 이더넷 연결이 안되요. [4] file MorninGlory 2012.10.04 24767
2482 장길석님의 카메라 영상 전송 2 EZ-ETIO namhun17 2012.07.04 20627
2481 커널 버전 질문 [1] 이지보드매니악 2012.04.24 21450
2480 보드 점검을 받고 싶습니다. 가능한지와 수리비용은 얼마나 되는지요 [3] 우스븐 2012.04.08 17355
첫 페이지 1 2 3 4 5 6 7 8 9 10 끝 페이지
쓰기
태그
부탁드립니다. ^^
  • 글을 작성하시려면 회원으로 가입하시고 로그인 하셔야 합니다.
  • 회원 가입은 주민등록번호가 필요 없으며, 메일 주소만 있으면 간단하게 가입하실 수 있습니다.
  • 본 포럼에 등록된 모든 글의 저작권은 작성하신 분께 있으며, 저작자의 허락 없이 다른 곳에 펌이나 도용하시면 안 됩니다.
  • 또한, 전자우편 수집 프로그램이나 그 밖의 기술적 장치를 이용하여 무단으로 이메일 주소 및 자료 수집되는 것을 거부하며,
  • 이를 위반 시 정보통신망 법에 의해 형사 처벌됨을 유념하시기 바랍니다.
  • FF 포럼
  • 강좌 & 팁
  • 함수설명
  • 자료실
  • 도와주세요