1.png #include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <fcntl.h>

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <string.h>

#include "main.h"

#include "io.h"
#include "hpi_rw.h"

#define debug 1

void HpiEnable(int fd, int cmd);
int GpioCheck(int fd, unsigned int gpio_num);

int main(int argc, char **argv)
{
 volatile unsigned int sdram_read_flag_reg[2];
 volatile unsigned int dsp_rdata;
 volatile unsigned int dsp_wdata;
 unsigned int value;
 int hpi_fd;
 int rtn = -1;
 int k;

 unsigned int din1[18] = {0};
 unsigned int din2[18] = {0};
 unsigned int addr1[4] = {0};
 unsigned int addr2[4] = {0};

 if(argc != 1)
 {
  printf("Usage :./app_name\n");
  exit(0);
 }

 // File open
 hpi_fd = open("/dev/dio", O_RDWR|O_NDELAY);
 if (hpi_fd == -1 )
 {
  // File open failure
  printf("Device Open Fail\n");
  return -1;
 }

 // HPI Enable
 HpiEnable(hpi_fd, 1);

 

 sdram_read_flag_reg[0] = 0x00;   // Register Range : 0x00 ~ 0x08
 sdram_read_flag_reg[1] = 0x3000;  // Write Data Value : 00 0011 0000 0000 0000

 // Data 
 for (k = 17; k > -1; k--)
 {
  din1[17 - k] = shift_func(&sdram_read_flag_reg[1], k, 0);
   din2[17 - k] = shift_func(&sdram_read_flag_reg[1], k, 1);
 }
 
 // Address
 for (k = 3; k > -1; k--)
 {
  addr1[3 - k] = shift_func(&sdram_read_flag_reg[0], k, 0);
   addr2[3 - k] = shift_func(&sdram_read_flag_reg[0], k, 1);
 }

 

 sdram_read_flag_reg[0] = 0xB0000038;
 sdram_read_flag_reg[1] = 0X00000001;
 
 write(hpi_fd, sdram_read_flag_reg, sizeof(8));     //enable = High

 value = read(hpi_fd, sdram_read_flag_reg, sizeof(8));
 value = read(hpi_fd, sdram_read_flag_reg, sizeof(8));
 printf("value = 0x%08X\n", value);

 

 // Value Write Start
 for (k = 17; k > -1; k--)
 {
  sdram_read_flag_reg[1] = din1[k];
  write(hpi_fd, sdram_read_flag_reg, sizeof(8));


  sdram_read_flag_reg[1] = din2[k];
   write(hpi_fd, sdram_read_flag_reg, sizeof(8));
 }

 for (k = 3; k > -1; k--)
 {
  sdram_read_flag_reg[1] = addr1[k];
  write(hpi_fd, sdram_read_flag_reg, sizeof(8));

  sdram_read_flag_reg[1] = addr2[k];
   write(hpi_fd, sdram_read_flag_reg, sizeof(8));
 }
 // Value Write End


 sdram_read_flag_reg[1] = 0X00000000;
   write(hpi_fd, sdram_read_flag_reg, sizeof(8));     //enable = Low

 sdram_read_flag_reg[1] = 0X00000001;
   write(hpi_fd, sdram_read_flag_reg, sizeof(8));     //enable = High 

 

 // HPI Disable
 HpiEnable(hpi_fd, 0);

 close(hpi_fd);

 return 0;
}

void HpiEnable(int fd, int cmd)
{
 int value = 16; // GPIO pin number

 if (cmd == 1)    ioctl(fd, IOCTL_GPIO_LOW, &value);
 else if (cmd == 0)  ioctl(fd, IOCTL_GPIO_HIGH, &value);
}

/***********************************************************
// Function : GpioCheck
// Description : GPIO 핀을 통해서 Interrupt check한다.
***********************************************************/
int GpioCheck(int hpi_fd, unsigned int gpio_num)
{
 unsigned int rtn_val = 1;
 int rtn = 1;


 rtn_val = ioctl(hpi_fd, IOCTL_GPIO_CHECK, &gpio_num);
 rtn = rtn_val & 0x1;

 return rtn;
}

/* ================================================================ */
// 함수: error_handling
// 설명: 에러 메시지 출력과 프로그램을 종료한다.
/* ================================================================ */
void error_handling(char *message)
{
 fputs(message, stderr);
 fputc('\n', stderr);
 exit(1);
}

void DebugRegister(unsigned int taddr, unsigned int rdata)
{
 unsigned int value = 0;

 value = read(hpi_fd, &taddr, &rdata);
 printf("taddr = 0x%08X\t value = 0x%08X\n", taddr, value);
}

unsigned int shift_func(unsigned int val, int cnt, int clk)
{
 unsigned int new_data = 0, data = 0;

 data = ((val >> cnt) & 0x1) << 1;
 new_data = (clk << 2 | data) & 0x7;
#if !debug
 printf("data = %d \t new_data = %d\n", data, new_data);
#endif

 return new_data;
}

 

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

 

ez-x5를 베이스로 제작한 MPU보드위에 DSP 모듈을 추가하고 그위에 IF Demodulator 모듈을 올렸습니다

 

IF 모듈 작동을 위한 레지스터 셋팅을 위해  arm에서 FPGA를 통해 IF 모듈의 SYNTHESIZER 에 SCLK, SEN, SDATA 에

 

해당하는 핀으로 값을 써야합니다. 현재 FPGA에서 커넥터를 통해 IF모듈의 각핀들이 연결되어있습니다.

 

FPGA의  0xB0000038에 데이터를 써야 하는데요 0xB0000038 레지스터의 하위 3비트를 통해

 

 SCLK, SEN, SDATA 를 한비트씩 써야합니다.

 

첨부한 타이밍도 처럼 상위 18비트의 데이터와 하위 4비트의 어드레스를 써야 하는데요

 

시프트함수를 써서 한비트씩 담아서 write 할려고 합니다. 그런데 생각되로 되질 안네요 enable과 clk data를

 

 타이밍 도처럼 써내려 갈려면 어떤 식으로 코딩을 해야할지 질문드립니다. 현재 올려논 코드로는 원하는 값이 써지질 않네요.