01 > ȸҰ

 
작성일 : 15-06-08 13:40
RASPBEERY PI2 GPIO와 FPGA 이용한 Dual Monitor Test
 글쓴이 : 이로직…
조회 : 3,624  
   rasp_bit_bang_addr.c (7.1K) [15] DATE : 2015-06-08 20:44:43
라즈베레리 파이 2와 FPGA 쉴드보드에 HDMI 출력 보드를 이용하여 COLAR BAR를 표시한 동영상입니다.

라즈베리에서 GPIO0 ~ 26를 모두 사용했습니다.
GPIO0 ~ GPIO15 : 데이터
GPIO16 ~ GPIO23 : 어드레스
GPIO24,25,26는 CS, WR,RD를 소프트 에뮬레이션 하여 사용했는데 속도가 상당히 잘 나옵니다.

비디오 해상도 SXGA (1280 X 1024) 75HZ

<라즈베리파이와 FPGA 쉴드 보드 사진>

Color Bar 동영상



테스트 코드
//#define BCM2708_PERI_BASE 0x20000000 //old
#define BCM2708_PERI_BASE 0x3f000000

#define GPIO_BASE (BCM2708_PERI_BASE + 0x200000)

#define GPIO_OUT_PUT 0x001
#define GPIO_IN_PUT 0x000

#define GPIO_ALT_FUNC_REG_0 // GPIO_0 GPIO_9
#define GPIO_ALT_FUNC_REG_1 // GPIO_10 GPIO_19
#define GPIO_ALT_FUNC_REG_2 // GPIO_20 GPIO_29
#define GPIO_ALT_FUNC_REG_3 // GPIO_30 GPIO_39
#define GPIO_ALT_FUNC_REG_4 // GPIO_40 GPIO_49
#define GPIO_ALT_FUNC_REG_5 // GPIO_50 GPIO_59

// bit15 ~ bit 0: data
// bit23 ~ bit 16 : address
// bit24 : cs
// bit25 : wr
// bit26 : rd
#define GPIO_CS_MASK 0x01000000// GPIO_24 GPIO_59
#define GPIO_ADDR_MASK 0x00ff0000// GPIO_23 GPIO_59
#define GPIO_RD_MASK 0x04000000// GPIO_26 GPIO_59
#define GPIO_WR_MASK 0x02000000// GPIO_25 GPIO_59
#define GPIO_DATA_MASK 0x0000FFFF// GPIO_25 GPIO_59
#include
#include
#include
#include
#include
#define PAGE_SIZE (4*1024)
#define BLOCK_SIZE (4*1024)
int mem_fd;
void *gpio_map;
// I/O access
volatile unsigned *gpio; // addr * 4 => addr 0,1,2.....
// GPIO setup macros. Always use INP_GPIO(x) before using OUT_GPIO(x) or SET_GPIO_ALT(x,y)
#define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3))
#define OUT_GPIO(g) *(gpio+((g)/10)) |= (1<<(((g)%10)*3))
#define SET_GPIO_ALT(g,a) *(gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3))
#define GPIO_SET *(gpio+7) // sets bits which are 1 ignores bits which are 0
#define GPIO_CLR *(gpio+10) // clears bits which are 1 ignores bits which are 0
#define GET_GPIO(g) (*(gpio+13)&(1<
#define GPIO_PULL *(gpio+37) // Pull up/pull down
#define GPIO_PULLCLK0 *(gpio+38) // Pull up/pull down clock
void setup_io();
void printButton(int g)
{
if (GET_GPIO(g)) // !=0 <-> bit is 1 <- port is HIGH=3.3V
printf("Button pressed!\n");
else // port is LOW=0V
printf("Button released!\n");
}

//
void address_gpio_init(void)
{
int g=0;
for(g=0;g<28;g++){
OUT_GPIO(g);
}
GPIO_SET = GPIO_RD_MASK |GPIO_WR_MASK |GPIO_CS_MASK ;
GPIO_CLR = GPIO_ADDR_MASK | GPIO_DATA_MASK ; // address clear

}

void delay(int cnt)
{
int i=0;
for(i=0;i
}

void bit_bang_write(int address,int data)
{
GPIO_SET = ((address<<16) & GPIO_ADDR_MASK) |(data & GPIO_DATA_MASK );// address set ,data set
GPIO_CLR = GPIO_CS_MASK ;
GPIO_CLR = GPIO_WR_MASK ;
delay(5);
GPIO_SET = GPIO_WR_MASK ;
GPIO_SET = GPIO_CS_MASK ;
GPIO_CLR = GPIO_ADDR_MASK | GPIO_DATA_MASK ; // address clear
}

void rgb_pixel_write(int startx, int line, int pixel)
{
unsigned char *myData ;
bit_bang_write(0x02,startx);
bit_bang_write(0x03,line);
bit_bang_write(0x04,0x01);// pixel number
bit_bang_write(0x00,pixel);
bit_bang_write(0x01,pixel>>16);
}

void rgb_line_write(int startx, int line, int pixel, int length)
{
unsigned int i=0;
bit_bang_write(0x02,startx);
bit_bang_write(0x03,line);
bit_bang_write(0x04,length); // pixel number
//printf("data length %x......\n",length);
for(i=0;i < length;i++){
bit_bang_write(0x00,pixel);
bit_bang_write(0x01,pixel>>16);
}
}

void box_pattern_drawing(int rgb)
{
int startx = 0;
int line = 0;
int flip = 0;
int rr = 0;
while(1) {
rgb_pixel_write(startx,line,rgb);
if(line < 1024){
if(startx > 1280) {
startx = 0;
line++;
}
else startx++;
}
else {
line = 0;
printf ("\n RGB COLOR 0: %x\n", rgb) ;
break;
}
}
}

void box_drawing(int startx,int line, int colar)
{

int rgb = colar;
while(1) {
rgb_line_write(startx,line++,rgb,1280);
if(line == 1024)break;
}
}

void vertical_colar_bar(void)
{
int i,line,startx;
int rgb;

for(line=0;line<1024;line++){
startx = 0;
while(startx <1280){
rgb_line_write(startx, line, rgb,16);
startx = startx + 16;
// printf("startx.. %x......\n",startx);
if(startx <100)
rgb = 0x000000;
else if(startx >=100 && startx <200)
rgb = 0x0000ff;
else if(startx >=200 && startx <300)
rgb = 0x00ff00;
else if(startx >=300 && startx <400)
rgb = 0x00ffff;
else if(startx >=400 && startx <500)
rgb = 0xff0000;
else if(startx >=500 && startx <600)
rgb = 0xff00ff;
else if(startx >=600 && startx <700)
rgb = 0xffff00;
else if(startx >=700 && startx <800)
rgb = 0xffffff;