硬件环境:ZYNQ7000
软件环境:petalinux2018.2
xilinx_vivado_sdk2018.2
学习例程:
1、DMA初始化
1)定义变量
//定义ioctrl的命令
#define AXI_ADC_IOCTL_BASE 'W'
#define AXI_ADC_SET_SAMPLE_NUM _IO(AXI_ADC_IOCTL_BASE, 0)
#define AXI_ADC_SET_DMA_LEN_BYTES _IO(AXI_ADC_IOCTL_BASE, 1)
#define AXI_ADC_DMA_INIT _IO(AXI_ADC_IOCTL_BASE, 2)
#define AXI_ADC_DMA_START _IO(AXI_ADC_IOCTL_BASE, 3)
#define AXI_ADC_DMA_DEINIT _IO(AXI_ADC_IOCTL_BASE, 4)
#define ADC_CAPTURELEN 1920 //数据长度
short CH0DmaRxBuffer[ADC_CAPTURELEN]; //数据存放空间
int fd0; //设备文件描述符
2)adc初始化
//操作函数
adc_capture_init(&fd0,"/dev/adc0",ADC_CAPTURELEN,ADC_CAPTURELEN*2);
//函数原型
int adc_capture_init(int *fd,char *adc_dev,int adc_sample_num,int dma_len_bytes)
{
//打开adc设备"/dev/adc0"
*fd = open(adc_dev, O_RDONLY);
if (*fd < 0) {
return -1;
}
//设置数据长度
if (ioctl(*fd, AXI_ADC_SET_SAMPLE_NUM, adc_sample_num)) {
printf("ADC DMA AXI_ADC_SET_SAMPLE_NUM failed: %s\n", strerror(errno));
return -2;
}
//设置字节长度
if (ioctl(*fd, AXI_ADC_SET_DMA_LEN_BYTES, dma_len_bytes)) {
printf("ADC DMA AXI_ADC_SET_DMA_LEN_BYTES failed: %s\n", strerror(errno));
return -2;
}
//初始化DMA
if (ioctl(*fd, AXI_ADC_DMA_INIT)) {
printf("ADC DMA INIT failed: %s\n", strerror(errno));
return -2;
}
return 0;
}
DMA定义类型为short,长度为1920,因此字节长度为1920*2
3)adc数据捕获
//操作函数
adc_capture(fd1,ADC_CAPTURELEN,(unsigned char *)CH1DmaRxBuffer);
//函数原型
int adc_capture(int fd, int samples_num, unsigned char *buf)
{
//开始DMA传输
if (ioctl(fd, AXI_ADC_DMA_START) == 0)
{
//读取samples_num * 2字节的DMA数据
read(fd, buf, samples_num * 2);
}
else
{
printf("XADC DMA START failed: %s\n", strerror(errno));
return -1;
}
return 0;
}