⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dm6430-dual-dma.c

📁 rt 6430 采集卡 linux下驱动源代码
💻 C
字号:
/*	FILE NAME: dm6430-dual-dma.c	FILE DESCRIPTION: Dual DMA sample program		This program transfers data using both DMA channels on a board.		When the first DMA buffer is full, the board will automatically		switch to the second DMA buffer and continue acquiring data.		The program then writes the first buffer to a file.  When the		second buffer is full, the board switches back to the first and		the program writes the second buffer to the file.  Since the		DMA controller is programmed for autoinitialize, the data		acquisition continues with no gaps.	PROJECT NAME: Linux DM6430 Driver, Library, and Example Programs	PROJECT VERSION: (Defined in README.TXT)	Copyright 2004 RTD Embedded Technologies, Inc.  All Rights Reserved.*/#include <errno.h>#include <fcntl.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#include <sys/poll.h>#include <unistd.h>#include <dm6430lib.h>char *program_name_p;static voidusage(void) {    fprintf(	stderr,	"\n"        "Usage: %s MINOR_NUMBER"        "\n",	program_name_p    );    exit(EXIT_FAILURE);}static voidverify_success(int status, const char *message_p) {    if (status == -1) {	perror(message_p);	exit(EXIT_FAILURE);    }}static intisstdindata(int timeout) {    struct pollfd	in = {0, POLLIN | POLLERR | POLLPRI, 0};    int			num_fds;    while (((num_fds = poll(&in, 1, timeout)) == -1) && (errno == EINTR))	;    return ((num_fds == 1) && (in.revents & (POLLIN | POLLPRI)));}#define DMA_BUF_SIZE10	0x2000		// The size of the DMA buffer.#define ADCHANNEL10	DM6430HR_AIN1	// A/D channel#define RATE10		10000		// Sampling rate#define IRQCHANNEL10	DM6430HR_INT1	// interrupt channelvolatile int new_samples = 0;unsigned long transfers_0, transfers_1;int logfile;int descriptor;char dmabuf1[DMA_BUF_SIZE10];char dmabuf2[DMA_BUF_SIZE10];static voiddual_dma_isr(void) {    int	done_flag;    int	status;    status = IsADDMADone6430(descriptor, &done_flag);    verify_success(status, "IsADDMADone6430() FAILED");    if (done_flag) {	int	first_done;	size_t	transfer_size;	status = ClearADDMADone6430(descriptor);	verify_success(status, "ClearADDMADone6430() FAILED");	status = IsFirstADDMADone6430(descriptor, &first_done);	verify_success(status, "IsFirstADDMADone6430() FAILED");	if (!first_done) {	    status = StopDMA6430(descriptor, DM6430HR_DMA1);	    verify_success(status, "StopDMA6430() FAILED");	    status = GetDmaData6430(		descriptor,		dmabuf1,		DM6430HR_DMA1,		sizeof(dmabuf1),		0,		&transfer_size	    );	    verify_success(status, "GetDmaData6430() FAILED");	    write(logfile, dmabuf1, sizeof(dmabuf1));	    transfers_0++;		    status = StartDMA6430(descriptor, DM6430HR_DMA1, sizeof(dmabuf1));	    verify_success(status, "StartDMA6430() FAILED");	} else {	    status = StopDMA6430(descriptor, DM6430HR_DMA2);	    verify_success(status, "StopDMA6430() FAILED");	    status = GetDmaData6430(		descriptor,		dmabuf2,		DM6430HR_DMA2,		sizeof(dmabuf2),		0,		&transfer_size	    );	    verify_success(status, "GetDmaData6430() FAILED");	    	    write(logfile, dmabuf2, sizeof(dmabuf2));	    transfers_1++;	    status = StartDMA6430(descriptor, DM6430HR_DMA2, sizeof(dmabuf2));	    verify_success(status, "StartDMA6430() FAILED");	}	new_samples = 1;    }}intmain(int argument_count, char **arguments_p_p) {    double		dummy;    int			status;    unsigned int	minor_number;    program_name_p = arguments_p_p[0];    if (argument_count != 2) {	fprintf(stderr, "Invalid number of options given.\n");	usage();    }    if (sscanf(arguments_p_p[1], "%u", &minor_number) == 0) {	fprintf(stderr, "Invalid device minor number.\n");	usage();    }    logfile = open("dual_dma.dat", O_WRONLY | O_CREAT | O_TRUNC, 0640);    verify_success(logfile, "open(dual_dma.dat) FAILED");    descriptor = OpenBoard6430(minor_number);    verify_success(descriptor, "OpenBoard6430() FAILED");    status = InstallDMA6430(descriptor, DM6430HR_DMA1);    verify_success(status, "InstallDMA6430(DMA channel 0) FAILED");    status = InstallDMA6430(descriptor, DM6430HR_DMA2);    verify_success(status, "InstallDMA6430(DMA channel 1) FAILED");    status = InitBoard6430(descriptor);    verify_success(status, "InitBoard6430() FAILED");    status = SetPacerClock6430(descriptor, RATE10, &dummy);    verify_success(status, "SetPacerClock6430() FAILED");    status = SetChannelGain6430(	descriptor,	ADCHANNEL10,	DM6430HR_GAINx1,	DM6430HR_SE_SE    );    verify_success(status, "SetChannelGain6430() FAILED");    status = SetTriggerRepeat6430(descriptor, DM6430HR_REPEAT_SINGLE);    verify_success(status, "SetTriggerRepeat6430() FAILED");    status = SetStartTrigger6430(descriptor, DM6430HR_START_TRIG_SOFTWARE);    verify_success(status, "SetStartTrigger6430() FAILED");    status = SetStopTrigger6430(descriptor, DM6430HR_STOP_TRIG_SOFTWARE);    verify_success(status, "SetStopTrigger6430() FAILED");    status = SetConversionSelect6430(descriptor, DM6430HR_CONV_PACER_CLOCK);    verify_success(status, "SetConversionSelect6430() FAILED");    status = SetIRQ0Source6430(descriptor, IRQS_AD_DMA_DONE_6430);    verify_success(status, "SetIRQ0Source6430() FAILED");    status = ClearIRQ06430(descriptor);    verify_success(status, "ClearIRQ06430() FAILED");    status = InstallCallbackIRQHandler6430(	descriptor, dual_dma_isr, IRQCHANNEL10    );    verify_success(status, "InstallCallbackIRQHandler6430() FAILED");    status = ClearADFIFO6430(descriptor);    verify_success(status, "ClearADFIFO6430() FAILED");    status = EnableIRQ6430(descriptor, IRQCHANNEL10);    verify_success(status, "EnableIRQ6430() FAILED");    status = StartDMA6430(descriptor, DM6430HR_DMA1, sizeof(dmabuf1));    verify_success(status, "StartDMA6430(channel 0) FAILED");    status = StartDMA6430(descriptor, DM6430HR_DMA2, sizeof(dmabuf2));    verify_success(status, "StartDMA6430(channel 1) FAILED");    fprintf(	stdout,	"Channel %d sampled at %d Hz.\nThe DMA buffer size is %d bytes\n"	"Press Enter to stop\nSee dual_dma.dat file for data\n",	ADCHANNEL10 + 1,	RATE10,	DMA_BUF_SIZE10 * 2    );    status = StartConversion6430(descriptor);    verify_success(status, "StartConversion6430() FAILED");    while (!isstdindata(100))	if (new_samples) {	    new_samples = 0;	    fprintf(		stdout,		"DMA1tr %ld, DMA2tr %ld\n",		transfers_0,		transfers_1	    );	}        status = StopDMA6430(descriptor, DM6430HR_DMA1);    verify_success(status, "StopDMA6430(channel 0) FAILED");    status = StopDMA6430(descriptor, DM6430HR_DMA2);    verify_success(status, "StopDMA6430(channel 1) FAILED");    status = DisableIRQ6430(descriptor, IRQCHANNEL10);    verify_success(status, "DisableIRQ6430() FAILED");    status = RemoveIRQHandler6430(descriptor, IRQCHANNEL10);    verify_success(status, "RemoveIRQHandler6430() FAILED");    status = DeInstallDMA6430(descriptor, DM6430HR_DMA1);    verify_success(status, "DeInstallDMA6430(channel 0) FAILED");    status = DeInstallDMA6430(descriptor, DM6430HR_DMA2);    verify_success(status, "DeInstallDMA6430(channel 1) FAILED");    close(logfile);    exit(EXIT_SUCCESS);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -