ARM9/S3C64102011. 4. 1. 11:29

[S3C6410] 카메라 영상 처리 - USB를 이용한 영상 전송 테스트

[S3C6410] 카메라 영상 처리 - USB를 이용한 영상 전송 테스트



S3C6410 보드의 카메라 인터페이스는 J2에 연결되어 있다.



S3C6410의 경우 내부적으로 4개의 카메라 버퍼가 있고 카메라로부터 영상이 들어오면 DMA를 통하여 4개의 버퍼에 차례로 영상이 저장된다. buf[0]->buf[1]->buf[2]->buf[3]->buf[0]->…의 순서로 계속 영상이 저장된다.

영상을 받기 위해서는 Cam_GrabContinuous() 함수를 이용하여 버퍼를 설정하고 카메라를 동작시킨 후, Cam_GrabWait() 함수를 이용하여 영상이 들어올 때까지 기다리면 된다. Cam_GrabWait() 함수에서 리턴된 값은 현재 영상이 들어온 버퍼의 번호이다. (0~3까지의 리턴값) 따라서 Cam_GrabWait() 함수의 리턴값으로 어떤 버퍼에 영상이 들어 왔는지 확인할 수 있다.

 //카메라로 부터 영상을 받아 프레임버퍼에 저장 시작
 Cam_GrabContinuous(Img);
// SetCamPara();

 char data[1024];
 int len, frame;
 
 while(1)
 {
  //영상이 들어올때 까지 대기
  frame = Cam_GrabWait(Img);
  Led1Toggle();

  //영상 처리
 //-----------------------------------------------------------
  int low_limit = 0x50000+Img[0].GetSize()/4;
  len = UsbGetFill();
  if (len < low_limit)
  {
   //USB로 영상 전송
   SendImage(Img[frame]);
  }
 //-----------------------------------------------------------
 }



전송된 이미지데이터
USB에 연결하고 "Connect" 로 영상데이터를 수신할 수 있다.



프레임 버퍼의 영상을 꺼내서 처리할때는 아래와 같이 할 수 있다.
wImage Img[MAX_BUF]; // Image Buffer
  :

  if (Img[0].GetType() == MV_Y8)
  {
   int frame = Cam_GrabWait(Img);
   
   u8 **ptr = (u8 **)Img[frame].GetPtr2D();
   for (int y=0; y<Img[frame].GetHeight(); y++)
    for (int x=0; x<Img[frame].GetWidth(); x++)
     ptr[y][x] = 255 - ptr[y][x];
      :
  }



S3C6410 영상 전송 테스트 동영상




S3C6410 카메라 영상 전송 테스트 소스코드
제공되는 함수를 이용하면 쉽게 영상을 획득 및 처리할 수 있다.
int main(void)
{
 SystemInit();

 DebugPrint("S3C6410 Test - Camera Test...");
 
 //LED초기화
 Led1Init();
 Led1Off();
 
 //Switch초기화
 Sw1Init();
 
 PWPAR pPar = ParAlloc(BUF_PAR);
 ParSetFunc(pPar, CB_Func, NULL);
 
 for (int i=0; i<MAX_BUF; i++)
  Img[i].Alloc(g_width, g_height, g_type);

   //카메라로 부터 영상을 받아 프레임버퍼에 저장 시작
 Cam_GrabContinuous(Img);
// SetCamPara();

 char data[1024];
 int len, frame;
 
 while(1)
 {
  //PC에서 데이터를 요구하면
  len = UsbRead(data, sizeof(data));
  if (len)
  {
   data[len] = NULL;
   DebugPrint("Packet(len=%d) : %s\n", len, data);
   ParInput(pPar, data, len);
  }

  //포멧이 변경되면
  if (g_width!=Img[0].GetWidth() || g_height!=Img[0].GetHeight() || g_type!=Img[0].GetType())
  {
   DebugPrint("change format : %dx%d\n", g_width, g_height);   
   Cam_Halt();

   // realloc
   for (int i=0; i<MAX_BUF; i++)
    Img[i].Alloc(g_width, g_height, g_type);

   //카메라로 부터 영상을 받아 프레임버퍼에 저장 시작
   Cam_GrabContinuous(Img);
   Cam_GrabWait(Img);   // 1프레임은 받아야 한다.
  }

  //영상이 들어올때 까지 대기
  frame = Cam_GrabWait(Img);
  Led1Toggle();
  
  
  //영상처리
  //----------------------------------------------------------
  int low_limit = 0x50000+Img[0].GetSize()/4;
  len = UsbGetFill();
  if (len < low_limit)
  {
   // DebugPrint("send frame = %d\n", frame);
   
   //USB로 영상 전송   
   SendImage(Img[frame]);
  }
  //----------------------------------------------------------
 }
}



좀더 소형으로 제작해 임베디드 영상 처리 쪽으로 사용할 수 있도록 제작한 보드
Posted by nexp

댓글을 달아 주세요

  1. 비밀댓글입니다

    2011.04.04 19:37 [ ADDR : EDIT/ DEL : REPLY ]
  2. 비밀댓글입니다

    2012.08.27 17:37 [ ADDR : EDIT/ DEL : REPLY ]
  3. 비밀댓글입니다

    2012.10.08 04:41 [ ADDR : EDIT/ DEL : REPLY ]
  4. 비밀댓글입니다

    2012.12.14 16:05 [ ADDR : EDIT/ DEL : REPLY ]
  5. 박용은

    관리자의 승인을 기다리고 있는 댓글입니다

    2012.12.14 16:09 [ ADDR : EDIT/ DEL : REPLY ]

ARM9/S3C64102011. 3. 28. 10:00

[S3C6410] GPIO Switch 테스트

[S3C6410] GPIO Switch 테스트


S3C6410 베이스보드에는 두개의 스위차가 GPIO6~7에 연결되어 있다.



S3C6410 스위치 드라이버 함수
//-----------------------------------------------------------------------------
//Switch Driver
#define SW1_BIT      BIT6
#define SW1_PORT     PORTI
#define Sw1Init()     GPIO_SetFunctionEach(SW1_PORT, eGPIO_6, 0)

#define GetSw1()     (!(GPIO_GetDataAll(SW1_PORT)&SW1_BIT))
#define WaitForSw1()    while(GetSw1())
//-----------------------------------------------------------------------------


S3C6410 Swtich 테스트 예제 소스코드
스위치를 누르면 LED제어 하도록 프로그램 작성

int main(void)
{
 SystemInit();

 DebugPrint("S3C6410 Test - Switch Test...");
 
 //LED초기화
 Led1Init();
 Led1Off();
 
 //Switch 초기화 
 Sw1Init();
 
 while(1)
 {
  if(GetSw1())Led1On();
  else Led1Off();
  
  Delay(30);
 }
}
Posted by nexp

댓글을 달아 주세요

ARM9/S3C64102011. 3. 27. 09:59

[S3C6410] Hellow World 개발환경 및 LED테스트 프로그램

[S3C6410] Hellow World 개발환경 및 LED테스트 프로그램
새로운 MCU 다루는데 있어서 LED제어만큼 간단하고 확실한 방법도 없다.

하드웨어 셋업
일단 테스트할 펌웨어를 램에 다운로드 하기위해 USB를 연결하고, 디버깅 시리얼 포트를 위해 USBUART를  U1에 연결한다.
부트 로드를 이용해야 하므로 부트 점퍼도 연결한다.



USB를 연결하면 장치관리자에서 확인할 수 있다.



부트로드가 정상 동작하면 시리얼 포트에서 메세지를 확인할 수 있다.
USB다운로더를 이용하여 bin파일을 램영역 0x50200000 에 다운로드 할수 있다.
새로운 프로그램을 작성하면 리셋을 눌러 부트모드로 가서 다시 다운로드 하면 된다. "Program"버튼은 플래시에 다운로드 한다.



S3C6410 부트모드 커넥터
점퍼가 연결되면 부트모드가 실행된다. 점퍼가 해지되면 Flash에 Program된 코드가 실행된다.



S3C6410 LED제어
테스트 보드에는 3개의 LED가 있고 GPIOI0~2에 연결되어 있다.




LED제어 랩핑함수
기본적으로는 gpio.h 함수를 이용하겠지만 기존 프로그램코드 호환을 위해 랩핑함수를 만들어 코드호환 되도록 했다.
#define PORTI      (*(volatile unsigned*)0x7F008104)

#define Led1Init()     GPIO_SetFunctionEach(PORTI, 0, 1)

#define LED1_BIT        BIT0
#define LED1_PORT    PORTI 

#define Led1On()          Cbi(PORTI, LED1_BIT)     
#define Led1Off()          Sbi(PORTI, LED1_BIT)
#define Led1Toggle()    Tbi(PORTI, LED1_BIT)



S3C6410 LED제어 예제 코드

int main(void)
{
 SystemInit();

 DebugPrint("S3C6410 Hellow Word - LED Test...");
 
 //LED초기화
 Led1Init();
 Led1Off();
 
 Led2Init();
 Led2Off();

 Led3Init();
 Led3Off(); 
 
 while(1)
 {
  Led1Toggle();
  Delay(3000);
  
  Led2Toggle();
  Delay(3000);

  Led3Toggle();
  Delay(3000);
 }
}



Posted by nexp

댓글을 달아 주세요

ARM9/ARM92008. 4. 23. 10:51

[개발일지] Wiggler + OCD 이용 S3C2410 보드 테스트

[개발일지] Wiggler + OCD 이용 S3C2410 보드 테스트

사용자 삽입 이미지

이번에 제작한 S3C2410 보드를 테스트 하기위해 Wiggler를 이용하여 디버깅 및 다운로드(SDRAM)를 테스트 해 보았다.

먼저 Wiggler를 2410보드에 연결을하고 OCD프로그램을 실행하여 connetcion을 한다.



정상적으로 연결되면 MUC관련 정보가 올라온다.
사용자 삽입 이미지



PC 명령으로 현제 PC값을 읽거나 점프할 수 있다.

SDRAM에 다운로드는 Download 명령으로 가능하고



elf파일을 다운로드 가능하다.



간단히 LED테스트 프로그램을 작성하여 toggle테스트를 해 보았다.
Posted by nexp

댓글을 달아 주세요

ARM9/ARM92008. 2. 11. 19:23

[ S3C2410 ] 쇼핑몰에서 판매하는 미니 모듈 1

내가 만들려고 했던건데...
쇼핑몰에서 싸게 팔고 있다.
크기는 작지만 포트가 좀 부족하고 기본 커넥터가 없으며, 2mm피치다.








Features:

  • Dimensions: 58 x 36 mm
  • Temperature: -20 to +70 Celsius
  • Samsung's S3C2410A microcontroller based on a 2.5V Static ARM920T CPU core with MMU
  • 64Mbyte Nand Flash
  • 32Mbyte SDRAM
  • On-chip MPLL generates the 12MHz OSC up to operate MCU at up to 266MHz
  • 32768Hz RTC (Real-time clock)
  • LAN, Audio, AD, SPI, Uart, USB, I2C, RTC and all other hardware interfaces are extended via two 2.0mm space 56-pin biserial dip connectors.
  • Single 3.3V power supply

Description

The Embest Mini2410-II™ processor card is another processor card based on Samsung's S3C2410 processor. It has a super tiny design measuring only 58mm by 36mm. The memory system of the board is mainly including 32M SDRAM and 64M Nand Flash. The processor card extends the basic features of S3C2410. Other peripherals like LAN, Audio, AD, SPI, Uart, USB, I2C, RTC and all hardware interfaces are extended through two 2.0mm space 56-pin biserial dip connectors. A developer's kits with Embest Mini2410-II processor card are able to run on Linux and WindowsCE OS. The tiny board would be an ideal single board computer to be the heart of your embedded design.


[문서]



 

Expansion interface pin explanation

Embest Mini2410-II processor card uses two 2.0mm space 56-pin biserial dip connector to connect to your development system. Detailed pin explanation is as following:







 

Posted by nexp
TAG ARM9, S3C2410

댓글을 달아 주세요