//****************************************************************************** 目标板架构
: FPGA + DSP (BF561)
* 目 标 : BF561接收 1024 个数据,并将接收到的数据打印出来
* 数 据 源 : FPGA 产生1 MHz 分频时钟,并在该时钟下做计数,把计数结果(为
*
16bits)作为输出,此外产生一个帧同步信号。
* 即从数据源得到 PPI_CLK, PPI_FS1,
data[15:0]
* DSP
: CCLK==125 MHZ SCLK==50 MHZ
* 编译uClinux版本:
2011R1-RC3
//*****************************************************************************
摸索了很久一直没有实现这个功能,请求高手指点。
问题1:在2011R1-RC3版本中,对PPI_PORT_ENABLE、PPI_PORT_DIRECTION,并没有定义,在对PPI口读取 数据时(应用程序),是否
用 fd=open(“dev/ppi0”,O_RDWR),即可使能ppi口,即实现了对PPI0_CONTROL寄存器的EN位写“1”使能?
问题2: 我期望实现的机制是 在应用程序中,开辟一个数组,open设备后,读取数据,再用 printf() 打印出数组中从PPI口读到的数据。手册上说PPI必须与DMA一起使用。我找的这个参考程序里面并没有体现对DMA的设置,是不是在驱动层实现了呢?
参考程序的设计构想是否成立?
Bfin_ppi.h------------------------------2011R1-RC3------------------------------------
没有对PPI_PORT_ENABLE、PPI_PORT_DIRECTION,做定义
Bfin_ppi.c------------------------------2011R1-RC3------------------------------------
#elif defined(EPPI0_CONTROL) || defined(EPPI1_CONTROL) /* EPPI */
#define PORT_EN EPPI_EN
#define PORT_DIR EPPI_DIR
Ppi_read
/*
configure PPI registers to match DMA registers */
dev->regs->ppi_control
&= ~PORT_DIR;
dev->regs->ppi_count
= conf->line_len - PPI_COUNT_CORR_OFFSET;
dev->regs->ppi_frame
= conf->num_lines;
dev->regs->ppi_delay
= conf->delay;
if
(conf->timers)
disable_timer_output(dev);
enable_dma(dma);
/* enable ppi */
dev->regs->ppi_control
|= PORT_EN;
SSYNC();
Ppi_write
/*
configure PPI registers to match DMA registers */
dev->regs->ppi_control
|= PORT_DIR;
dev->regs->ppi_count
= conf->line_len - PPI_COUNT_CORR_OFFSET;
dev->regs->ppi_frame
= conf->num_lines;
dev->regs->ppi_delay
= conf->delay;
enable_dma(dma);
/*
enable ppi */
dev->regs->ppi_control
|= PORT_EN;
SSYNC();
在2008BEV bfin_ppi.h中------------------------------------------------------------------------------------
/*
** ioctl commands
*/
#define CMD_PPI_PORT_ENABLE 1
#define CMD_PPI_PORT_DIRECTION 2
在2008BEV bfin_ppi.c中--------------------------------------------------------------------------------------
switch (cmd) {
case CMD_PPI_PORT_ENABLE:
{
DPRINTK("ppi_ioctl: CMD_PPI_PORT_ENABLE\n");
regdata = bfin_read_PPI0_CONTROL();
pdev->portenable = (unsigned short)arg;
if (arg)
regdata |= PORT_EN;
else
regdata &= ~PORT_EN;
pdev->ppi_control = regdata;
bfin_write_PPI0_CONTROL(pdev->ppi_control);
break;
}
case CMD_PPI_PORT_DIRECTION:
{
DPRINTK("ppi_ioctl:
CMD_PPI_PORT_DIRECTION\n");
regdata = bfin_read_PPI0_CONTROL();
if (arg)
regdata |= PORT_DIR;
else
regdata &= ~PORT_DIR;
pdev->ppi_control = regdata;
bfin_write_PPI0_CONTROL(pdev->ppi_control);
break;
}
问题2: 我期望实现的机制是 在应用程序中,开辟一个数组,open设备后,读取数据,再用 printf() 打印出数组中从PPI口读到的数据。程序如下:
//version1: change the buffer_size from 128 to
1024 -----2014.5.7
//version2: add the printf() for making sure the programming running location
//PPI接收程序测试
#include <stdio.h>
#include <fcntl.h>
#include
<sys/ioctl.h>
#include
<unistd.h>
#include <errno.h>
#include
<string.h>
#include
<stdlib.h>
#include
<sys/time.h>
#include
"ppi.h"
typedef unsigned short UINT16;
UINT16 buf[1024];
int main( int argc,
char** argv )
{
int i;
int fd;
for(i=0;i<1024;i++)
{
buf[i] = 0;
}
fd = open("/dev/ppi0", O_RDWR);
if (fd==-1)
{
printf(" error opening device. fd=-1\n");
exit(1);
}
else
{
printf("\nPPI0 open success\n");
//print the ==============fd
printf("\n%d\n",fd);
}
//配置PPI操作寄存器,满足外部帧同步及接收模式
//////////////return
ioctl///then printf ///the return 、、value;;;;;///////////////5.11
int rt[20]; //
返回 值
rt[0]=ioctl(fd,
CMD_PPI_LINELEN, 1024);
rt[1]=ioctl(fd, CMD_PPI_NUMLINES, 1);
rt[2]=ioctl(fd, CMD_PPI_PORT_DIRECTION, CFG_PPI_PORT_DIR_RX); //返回负值 -1
rt[3]=ioctl(fd, CMD_PPI_XFR_TYPE,
CFG_PPI_XFR_TYPE_NON646);
//ioctl(fd, CMD_PPI_FIELD_SELECT,
CFG_PPI_FIELD_SELECT_1); rt[4]=ioctl(fd,
CMD_PPI_PORT_CFG, CFG_PPI_PORT_CFG_XSYNC1);
rt[5]=ioctl(fd, CMD_PPI_SKIPPING,
CFG_PPI_SKIP_DISABLE);
rt[6]=ioctl(fd, CMD_PPI_PACKING,
CFG_PPI_PACK_DISABLE);
//ioctl(fd, CMD_PPI_SKIP_ODDEVEN,
CFG_PPI_SKIP_ODD);
rt[7]=ioctl(fd, CMD_PPI_DATALEN,
CFG_PPI_DATALEN_16);
rt[8]=ioctl(fd, CMD_PPI_CLK_EDGE,
CFG_PPI_CLK_EDGE_RISE);
rt[9]=ioctl(fd, CMD_PPI_TRIG_EDGE,
CFG_PPI_TRIG_EDGE_RISE);
printf("\nrunning
location------------------- 1\n");
/////////5.8/
rt[10]=ioctl(fd, CMD_PPI_SET_DIMS,
CFG_PPI_DIMS_1D);
//ioctl(fd, CMD_PPI_SETGPIO, 1); //意义不明确 ////version 4
rt[11]=ioctl(fd, CMD_PPI_DELAY, 0);
printf("\nrunning
location---------finishi ioctl ---------- 2\n");////////////5.8//
rt[12]=ioctl(fd,
CMD_PPI_PORT_ENABLE, 1); //返回负值 -1
//----------------------------------------------------------------------------------------------------------------------
int m;
for(m=0;m<=14;m++)
{
printf("\nioctl %d return value %d\n",m,rt[m]);
}
//----------------------------------------------------------------------------------------------------------------------
rt[13]=read(fd,buf,1024*sizeof(UINT16));
rt[14]=close(fd);
printf("\nrunning
location------------------- 3\n");
////////////5.8//
for(i=0;i<1024;i++)
{
printf("%d\n",buf[i]);
}
printf("\nEnd of data");
return 0;
}