Exemple #1
0
static inline void setup_transfer(struct floppy_state *fs)
{
	int n;
	struct swim3 __iomem *sw = fs->swim3;
	struct dbdma_cmd *cp = fs->dma_cmd;
	struct dbdma_regs __iomem *dr = fs->dma;
	struct request *req = fs->cur_req;

	if (blk_rq_cur_sectors(req) <= 0) {
		swim3_warn("%s", "Transfer 0 sectors ?\n");
		return;
	}
	if (rq_data_dir(req) == WRITE)
		n = 1;
	else {
		n = fs->secpertrack - fs->req_sector + 1;
		if (n > blk_rq_cur_sectors(req))
			n = blk_rq_cur_sectors(req);
	}

	swim3_dbg("  setup xfer at sect %d (of %d) head %d for %d\n",
		  fs->req_sector, fs->secpertrack, fs->head, n);

	fs->scount = n;
	swim3_select(fs, fs->head? READ_DATA_1: READ_DATA_0);
	out_8(&sw->sector, fs->req_sector);
	out_8(&sw->nsect, n);
	out_8(&sw->gap3, 0);
	out_le32(&dr->cmdptr, virt_to_bus(cp));
	if (rq_data_dir(req) == WRITE) {
		/* Set up 3 dma commands: write preamble, data, postamble */
		init_dma(cp, OUTPUT_MORE, write_preamble, sizeof(write_preamble));
		++cp;
		init_dma(cp, OUTPUT_MORE, bio_data(req->bio), 512);
		++cp;
		init_dma(cp, OUTPUT_LAST, write_postamble, sizeof(write_postamble));
	} else {
		init_dma(cp, INPUT_LAST, bio_data(req->bio), n * 512);
	}
	++cp;
	out_le16(&cp->command, DBDMA_STOP);
	out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS);
	in_8(&sw->error);
	out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS);
	if (rq_data_dir(req) == WRITE)
		out_8(&sw->control_bis, WRITE_SECTORS);
	in_8(&sw->intr);
	out_le32(&dr->control, (RUN << 16) | RUN);
	/* enable intr when transfer complete */
	out_8(&sw->intr_enable, TRANSFER_DONE);
	out_8(&sw->control_bis, DO_ACTION);
	set_timeout(fs, 2*HZ, xfer_timeout);	/* enable timeout */
}
static inline void setup_transfer(struct floppy_state *fs)
{
	int n;
	struct swim3 __iomem *sw = fs->swim3;
	struct dbdma_cmd *cp = fs->dma_cmd;
	struct dbdma_regs __iomem *dr = fs->dma;

	if (fd_req->current_nr_sectors <= 0) {
		printk(KERN_ERR "swim3: transfer 0 sectors?\n");
		return;
	}
	if (rq_data_dir(fd_req) == WRITE)
		n = 1;
	else {
		n = fs->secpertrack - fs->req_sector + 1;
		if (n > fd_req->current_nr_sectors)
			n = fd_req->current_nr_sectors;
	}
	fs->scount = n;
	swim3_select(fs, fs->head? READ_DATA_1: READ_DATA_0);
	out_8(&sw->sector, fs->req_sector);
	out_8(&sw->nsect, n);
	out_8(&sw->gap3, 0);
	out_le32(&dr->cmdptr, virt_to_bus(cp));
	if (rq_data_dir(fd_req) == WRITE) {
		/* Set up 3 dma commands: write preamble, data, postamble */
		init_dma(cp, OUTPUT_MORE, write_preamble, sizeof(write_preamble));
		++cp;
		init_dma(cp, OUTPUT_MORE, fd_req->buffer, 512);
		++cp;
		init_dma(cp, OUTPUT_LAST, write_postamble, sizeof(write_postamble));
	} else {
		init_dma(cp, INPUT_LAST, fd_req->buffer, n * 512);
	}
	++cp;
	out_le16(&cp->command, DBDMA_STOP);
	out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS);
	in_8(&sw->error);
	out_8(&sw->control_bic, DO_ACTION | WRITE_SECTORS);
	if (rq_data_dir(fd_req) == WRITE)
		out_8(&sw->control_bis, WRITE_SECTORS);
	in_8(&sw->intr);
	out_le32(&dr->control, (RUN << 16) | RUN);
	/* enable intr when transfer complete */
	out_8(&sw->intr_enable, TRANSFER_DONE);
	out_8(&sw->control_bis, DO_ACTION);
	set_timeout(fs, 2*HZ, xfer_timeout);	/* enable timeout */
}
Exemple #3
0
/*
 * Finds a free channel, and binds the requested device to it.
 * Returns the allocated channel number, or negative on error.
 * Requests the DMA done IRQ if irqhandler != NULL.
 */
int request_au1000_dma(int dev_id, const char *dev_str,
		       irqreturn_t (*irqhandler)(int, void *, struct pt_regs *),
		       unsigned long irqflags,
		       void *irq_dev_id)
{
	struct dma_chan *chan;
	const struct dma_dev *dev;
	int i, ret;

#if defined(CONFIG_SOC_AU1100)
	if (dev_id < 0 || dev_id >= (DMA_NUM_DEV + DMA_NUM_DEV_BANK2))
		return -EINVAL;
#else
 	if (dev_id < 0 || dev_id >= DMA_NUM_DEV)
 		return -EINVAL;
#endif

	for (i = 0; i < NUM_AU1000_DMA_CHANNELS; i++) {
		if (au1000_dma_table[i].dev_id < 0)
			break;
	}
	if (i == NUM_AU1000_DMA_CHANNELS)
		return -ENODEV;

	chan = &au1000_dma_table[i];

	if (dev_id >= DMA_NUM_DEV) {
		dev_id -= DMA_NUM_DEV;
		dev = &dma_dev_table_bank2[dev_id];
	} else {
		dev = &dma_dev_table[dev_id];
	}

	if (irqhandler) {
		chan->irq = AU1000_DMA_INT_BASE + i;
		chan->irq_dev = irq_dev_id;
		if ((ret = request_irq(chan->irq, irqhandler, irqflags,
				       dev_str, chan->irq_dev))) {
			chan->irq = 0;
			chan->irq_dev = NULL;
			return ret;
		}
	} else {
		chan->irq = 0;
		chan->irq_dev = NULL;
	}

	// fill it in
	chan->io = DMA_CHANNEL_BASE + i * DMA_CHANNEL_LEN;
	chan->dev_id = dev_id;
	chan->dev_str = dev_str;
	chan->fifo_addr = dev->fifo_addr;
	chan->mode = dev->dma_mode;

	/* initialize the channel before returning */
	init_dma(i);

	return i;
}
/** Initialize the analog subsystem.

  Initialize the ADC and start hardware scan for all sensors.
*/
void analog_init() {

  if (NUM_TEMP_SENSORS) {                       // At least one channel in use.
    init_dma();
    init_analog();
  }

}
Exemple #5
0
static	int	init(int channel)
{
	char 		temp[64];
	pci_bus_cookie	*current_cookie = kmalloc(sizeof(pci_bus_cookie));
	current_cookie->channel = channel;
	pci_init(current_cookie);
	//return -1;
	bus_cookies[channel] = current_cookie;
	current_cookie->dma_supported = true;
	sprintf(temp, "pci_ide_sem%d", channel);
	current_cookie->bus_semaphore =  sem_create(1, temp);

    	if(current_cookie->bus_semaphore < 0)
      	{
		kfree(current_cookie);
		return -1;
      	}
	TRACE(("trying to discover devices on channel %d\n",channel));
	if(channel==0)
	{
		current_cookie->base_reg = 0x1f0;
		current_cookie->status_reg = 0x3f0;
	}
	else
	{
		current_cookie->base_reg = 0x170;
		current_cookie->status_reg = 0x370;
	}
	if(ide_raw_init(current_cookie)==0)
	{
		int	current_drive;
		init_dma(current_cookie);
		for(current_drive=0;current_drive<2;current_drive++)
		{
			int		i = 0;
			current_cookie->drives[current_drive] = NULL;
			TRACE(("trying to discover device %d/%d\n",channel,current_drive));
			while(ide_drives[i]!=NULL)
			{
				void	*drive_cookie = ide_drives[i]->init_drive(&pci_bus,current_cookie,channel,current_drive);
				if(drive_cookie!=NULL)
				{
					TRACE(("trying to discover device %d/%d is a %s\n",channel,current_drive,ide_drives[i]->device_name));
					current_cookie->drives[current_drive] = ide_drives[i];
					current_cookie->drive_cookie[current_drive] = drive_cookie;
					init_ide_struct(channel,current_drive,-1);
      					TRACE(("done discovering device\n"));
    					TRACE(("Cookie for interrupt is %p\n",current_cookie));
					int_set_io_interrupt_handler(14,&ide_interrupt_handler, current_cookie);
					break;
				}
				i++;
			}
		}
		return 0;
	}
	return -1;
}
Exemple #6
0
int main(int argc, const char **argv)
{
	char hostname[32];
	
	//Getting my ID
	if (argc >= 3) {
		strncpy(hostname, argv[1], 32);
		myid = atoi(argv[1]);
	} else {
		gethostname(hostname, 32);
		if ( strstr(hostname, "nohost") != NULL ) {
			myid = atoi(hostname+strlen("nohost"));
		} else if( strstr(hostname, "bdbm") != NULL ) {
			myid = atoi(hostname+strlen("bdbm"));
		} else {
			myid = 1;
		}
	}

	fprintf(stderr, "Main: hostname=%s myid=%d\n", hostname, myid);

	init_dma();


	long actualFrequency=0;
	long requestedFrequency=1e9/MainClockPeriod;
	int status = setClockFrequency(0, requestedFrequency, &actualFrequency);
	fprintf(stderr, "Requested Freq: %5.2f, Actual Freq: %5.2f, status=%d\n"
			,(double)requestedFrequency*1.0e-6
			,(double)actualFrequency*1.0e-6,status);

	//Start ext aurora
	auroraifc_start(myid);

	device->start(0);
	device->setDebugVals(0,0); //flag, delay

	device->debugDumpReq(0);
	sleep(1);
	device->debugDumpReq(0);
	sleep(1);

	//void local_test(bool check, int read_repeat, int debug_lvl )
//	local_test(true, 1, 5);
//	LOG(0, "Press any key to continue..\n");
	//gets(str);

	//void one_to_many_test(bool check, int read_repeat, int debug_lvl, int accessNode)
	one_to_many_test(true, 1, 5, 1);
	LOG(0, "Press any key to continue..\n");
//	gets(str);
	
	//void many_to_many_test(bool check, int test_repeat, int read_repeat, int debug_lvl)
//	many_to_many_test(true, 1, 10, 5);


}
Exemple #7
0
static void mainproc(void *arg)
{
    Dynamic    *dynamicp;
    Gfx        *glistp;
    Control    cont;

    init_dma();
    init_task();
    init_framebuffer();

    read_rom( _staticSegmentStart,
              _staticSegmentRomStart, _staticSegmentRomEnd  );
    read_rom( _dkSegmentStart, _dkSegmentRomStart, _dkSegmentRomEnd  );
    read_rom( _dk7SegmentStart, _dk7SegmentRomStart, _dk7SegmentRomEnd  );
    read_rom( _roadSegmentStart, _roadSegmentRomStart,
              _roadSegmentRomEnd  );
    read_rom( _l2_tvSegmentStart, _l2_tvSegmentRomStart,
              _l2_tvSegmentRomEnd  );

    init_controlers( &cont );

    game_init();

    while (1)
    {
        read_controler( &cont );

        dynamicp = &dynamic;

        guOrtho( &dynamicp->projection,
                 -(float) SCREEN_WD / 2.0F, (float) SCREEN_WD / 2.0F,
                 -(float) SCREEN_HT / 2.0F, (float) SCREEN_HT / 2.0F,
                 1.0F, 10.0F, 1.0F );
        guRotate( &dynamicp->modeling, 0.0F, 0.0F, 0.0F, 1.0F );

        glistp = dynamicp->glist;

        /* rcp rdp & color frame buffer initialize */
        glistp = init_rcprdp( glistp, (char *)_staticSegmentStart, draw_buffer );
        glistp = clear_cfb( glistp );

        /* game main */
        glistp = game_main( glistp, &cont );

        gDPFullSync(glistp++);
        gSPEndDisplayList(glistp++);

        assert((glistp - dynamicp->glist) < GLIST_LEN);

        start_task( glistp, dynamicp );

        swap_framebuffer( draw_buffer );
        draw_buffer ^= 1;
    }
}
Exemple #8
0
int main(int argc, const char **argv)
{

	//Getting my ID
	char hostname[32];
	gethostname(hostname,32);

	char* userhostid = getenv("BDBM_ID");
	if ( userhostid != NULL ) {
		myid = atoi(userhostid);
	} else {
		myid = atoi(hostname+strlen("bdbm"));
		if ( strstr(hostname, "bdbm") == NULL ) {
			myid = 1;
		}
	}

	fprintf(stderr, "Main: myid=%d\n", myid);

	init_dma();


	//Start ext aurora
	auroraifc_start(myid);

	device->start(0);
	device->setDebugVals(0,0); //flag, delay

	device->debugDumpReq(0);
	sleep(1);
	device->debugDumpReq(0);
	sleep(1);

	char str[10];

	//void local_test(bool check, int read_repeat, int debug_lvl )
	local_test(true, 1, 5);
	LOG(0, "Press any key to continue..\n");
	gets(str);

	/*
	//void one_to_many_test(bool check, int read_repeat, int debug_lvl, int accessNode)
	one_to_many_test(true, 1, 5, 1);
	LOG(0, "Press any key to continue..\n");
	gets(str);
	*/

	
	//void many_to_many_test(bool check, int test_repeat, int read_repeat, int debug_lvl)
	many_to_many_test(true, 1, 10, 5);


}
Exemple #9
0
static void au1000_dma_start(struct audio_stream *stream)
{
	if (!stream->buffer)
		return;

	init_dma(stream->dma);
	if (get_dma_active_buffer(stream->dma) == 0) {
		clear_dma_done0(stream->dma);
		set_dma_addr0(stream->dma, stream->buffer->start);
		set_dma_count0(stream->dma, stream->period_size >> 1);
		set_dma_addr1(stream->dma, stream->buffer->next->start);
		set_dma_count1(stream->dma, stream->period_size >> 1);
	} else {
/*
 * bcm6352_init_dev: initialize Ethernet Switch device,
 * allocate Tx/Rx buffer descriptors pool, Tx control block pool.
 */
static int bcm6352_init_dev(bcm6352enet_softc *softc)
{
    unsigned long i, j;
    unsigned char *p = NULL;

    /* make sure emac clock is on */
    INTC->blkEnables |= (ESWITCH_CLK_EN | EPHY_CLK_EN);

    /* setup buffer/pointer relationships here */
    softc->nrRxBds = NR_RX_BDS;
    softc->rxBufLen = ENET_MAX_MTU_SIZE;

    /* init rx/tx dma channels */
    softc->dmaChannels = (DmaChannel *)(DMA_BASE);
    softc->rxDma = &softc->dmaChannels[EMAC_RX_CHAN];
    softc->txDma = &softc->dmaChannels[EMAC_TX_CHAN];

    p = (unsigned char *) (((uint32_t) softc->txBuf + 0x10) & ~0x0f);
    softc->txBufPtr = (unsigned char *)K0_TO_K1((uint32_t) p);

    p = (unsigned char *) (((uint32_t) softc->rxMem + 0x10) & ~0x0f);
    softc->rxBds = (DmaDesc *)K0_TO_K1((uint32_t) p);
    p += softc->nrRxBds * sizeof(DmaDesc);
    softc->rxBuffers = (unsigned char *) K0_TO_PHYS((uint32_t) p);

    /* initialize rx ring pointer variables. */
    softc->rxBdAssignPtr = softc->rxBdReadPtr = softc->rxBds;
    softc->rxFirstBdPtr = softc->rxBds;
    softc->rxLastBdPtr = softc->rxFirstBdPtr + softc->nrRxBds - 1;

    /* init the receive buffer descriptor ring */
    for (i = 0, j = (unsigned long) softc->rxBuffers; i < softc->nrRxBds;
        i++, j += softc->rxBufLen)
    {
        (softc->rxFirstBdPtr + i)->length = softc->rxBufLen;
        (softc->rxFirstBdPtr + i)->address = j;
        (softc->rxFirstBdPtr + i)->status = DMA_OWN;
    }
    softc->rxLastBdPtr->status = DMA_OWN | DMA_WRAP;

    /* init dma registers */
    init_dma(softc);

    /* init switch control registers */
    init_mii(softc);

    softc->rxDma->cfg |= DMA_ENABLE;

    /* if we reach this point, we've init'ed successfully */
    return 0;
}
Exemple #11
0
void main(void)
{
    uint32_t i;
    RCC->AHBENR |= RCC_AHBENR_GPIOBEN;
    GPIOB->MODER = 0x00005555;
    GPIOB->ODR = 0x0000;
    NVIC_EnableIRQ(15);
    init_dac();
    init_dma();
    init_tim2();
    for(;;) {
        GPIOB->ODR = DMA1->ISR;
    }
}
Exemple #12
0
/**
 * \brief Run WM8731 module unit tests.
 */
int main(void)
{
	const usart_serial_options_t uart_serial_options = {
		.baudrate = CONF_TEST_BAUDRATE,
		.paritytype = CONF_TEST_PARITY
	};

	/* Initialize the system. */
	sysclk_init();
	board_init();
#ifdef BOARD_AT24C_TWI_INSTANCE
	/* reset EEPROM state to release TWI */
	at24cxx_reset();
#endif

	/* Configure console UART. */
	sysclk_enable_peripheral_clock(CONSOLE_UART_ID);
	stdio_serial_init(CONF_TEST_UART, &uart_serial_options);

	/* Initial the WM8731 to DAC */
	init_dac();

	/* Initial the ssc interface */
	init_ssc();

	/* Configure DMA */
	init_dma();

	/* Define all the test cases */
	DEFINE_TEST_CASE(wm8731_transfer_test, NULL, run_wm8731_transfer_test,
			NULL, "WM8731 transfer test.");

	/* Put test case addresses in an array */
	DEFINE_TEST_ARRAY(wm8731_tests) = {
		&wm8731_transfer_test,
	};

	/* Define the test suite */
	DEFINE_TEST_SUITE(wm8731_suite, wm8731_tests,
			"SAM WM8731 module test suite");

	/* Run all tests in the test suite */
	test_suite_run(&wm8731_suite);

	while (1) {
		/* Busy-wait forever */
	}
}
Exemple #13
0
static void
au1000_dma_start(audio_stream_t *stream)
{
	snd_pcm_substream_t *substream = stream->substream;
	snd_pcm_runtime_t *runtime = substream->runtime;

	unsigned long flags, dma_start;
	int i;
	au1000_period_t * pointer;

	if (stream->buffer == NULL) {
		dma_start = virt_to_phys(runtime->dma_area);

		stream->period_size = frames_to_bytes(runtime,
			runtime->period_size);
		stream->buffer = kmalloc(sizeof(au1000_period_t), GFP_KERNEL);
		pointer = stream->buffer;
		for (i = 0 ; i < runtime->periods ; i++) {
			pointer->start = (u32)(dma_start +
				(i * stream->period_size));
			pointer->relative_end = (u32)
				(((i+1) * stream->period_size) - 0x1);
			if ( i < runtime->periods - 1) {
				pointer->next = kmalloc(sizeof(au1000_period_t)
					, GFP_KERNEL);
				pointer = pointer->next;
			}
		}
		pointer->next = stream->buffer;

		spin_lock_irqsave(&stream->dma_lock, flags);
		init_dma(stream->dma);
		if (get_dma_active_buffer(stream->dma) == 0) {
			clear_dma_done0(stream->dma);
			set_dma_addr0(stream->dma, stream->buffer->start);
			set_dma_count0(stream->dma, stream->period_size >> 1);
			set_dma_addr1(stream->dma, stream->buffer->next->start);
			set_dma_count1(stream->dma, stream->period_size >> 1);
		} else {
Exemple #14
0
// Entry point for Power On Self Test (POST) - the BIOS initilization
// phase.  This function makes the memory at 0xc0000-0xfffff
// read/writable and then calls dopost().
void VISIBLE32FLAT
handle_post(void)
{
    debug_serial_setup();
    dprintf(1, "Start bios (version %s)\n", VERSION);

    // Enable CPU caching
    setcr0(getcr0() & ~(CR0_CD|CR0_NW));

    // Clear CMOS reboot flag.
    outb_cmos(0, CMOS_RESET_CODE);

    // Make sure legacy DMA isn't running.
    init_dma();

    // Check if we are running under Xen.
    xen_probe();

    // Allow writes to modify bios area (0xf0000)
    make_bios_writable();

    // Now that memory is read/writable - start post process.
    dopost();
}
Exemple #15
0
int main()
{
	int status;
	int temp,i,j;
	//static int Result1[SIZE];
    init_platform();

    //  Initialize DMA
    init_dma();
    //get data from the PL block to DDR RAM
    status = XAxiDma_SimpleTransfer(&AxiDma, 0xa000000, 1023,XAXIDMA_DEVICE_TO_DMA);
    /* Wait for transfer to be done */
    while(XAxiDma_Busy(&AxiDma, XAXIDMA_DEVICE_TO_DMA));
    j=0;
    // read data from DDR ram to UART
	for(i=0;i<=1023;i+=1)
	{
		temp = Xil_In32(0xa000000+j);
		xil_printf("DDR address 0x%x",0xa0000000+i);
		xil_printf(" contains %d\n\r",temp);
		j+=4;
	}
    return 0;
}
Exemple #16
0
int main(void) {
	volatile int16_t* samples;
	unsigned int i;
	DISABLE_GLOBAL_INT();
	/* stop watchdog timer */
	WDTCTL = WDTPW +WDTHOLD;
	/* SET CPU to 5MHz */
	/* max DCO
	   MCLK = DCOCLK
	   SMCLK = DCOCLK
	   ACLK = 8KHz
	*/
	DCOCTL = DCO0 + DCO1 + DCO2;
	BCSCTL1 = RSEL0 + RSEL1 + RSEL2 + XT2OFF;
	BCSCTL2 = 0x00;

	delay_us(10000);

	/* activate Active Mode */
	__bic_SR_register(LPM4_bits);

	/* set LEDs when loaded */
	P5SEL = 0x00;
	P5DIR = 0x70;
	LED_RED_ON();
	LED_GREEN_OFF();
	LED_BLUE_OFF();

	check_for_clock();
	init_usb_serial();
#ifdef USE_DMA
	init_dma(&g_sample_flag);
#endif

#ifdef TX
	init_adc(&g_sample_flag);
#else
	init_dac();
#endif
	init_rf(RF_CHANNEL, PAN_ID, NODE_ADDR, &g_sample_flag);

	debug_print("Successfully booted.\n");
	/* set LEDS to signalize finished initilizing */
	LED_RED_OFF();
	ENABLE_GLOBAL_INT();

#ifdef TX
	/* TX */
	while(1) {
		if(g_sample_flag == 1) {
			g_sample_flag = 0;
#ifdef USE_DMA
			/* get samples */
			samples = get_samples_dma();
#else
			/* get samples */
			samples = get_samples();
#endif
			/* send oder radio, 2*num_words */
			send_rf_data(RF_RX_ADDR, (uint8_t*) samples, NUM_SAMPLES*2);
		}
		/* reset WDT */
		WDTCTL = WDTPW + WDTCNTCL;

	}
#else
	/* RX */
	while(1) {
		if(g_sample_flag == 1) {
			g_sample_flag = 0;
			samples = get_samples_rf();
#if 0
			uint8_t err = 0;
			for(i = 0; i < NUM_SAMPLES; ++i) {
				//samples[i] = 4095-7*i;
				usb_printf("%d\n", samples[i]);
				//if( ((uint16_t) samples[i]) > 4095) {
				//	usb_printf("i=%u\n", i);
				//	++err;
				//}
			}
			usb_printf("#error: %u\n", err);
			usb_printf("\n\n");
#endif			
			set_dma_data(samples, NUM_SAMPLES);
		}
		/* reset WDT */
		WDTCTL = WDTPW + WDTCNTCL;
	}
#endif
	return 0;
}
Exemple #17
0
static int internal_open(bcmenet_softc * softc)
{
    int i;
    void *p;

    /* make sure emac clock is on */
    PERF->blkEnables |= EMAC_CLK_EN;

    /* init rx/tx dma channels */
    softc->dmaCtrl = (DmaRegs *)(EMAC_DMA_BASE);
    softc->rxDma = &softc->dmaCtrl->chcfg[EMAC_RX_CHAN];
    softc->txDma = &softc->dmaCtrl->chcfg[EMAC_TX_CHAN];

    p = KMALLOC( NR_TX_BDS * sizeof(DmaDesc), CACHE_ALIGN );
    if( p == NULL ) {
        xprintf( "BCM6348 : Failed to allocate txBds memory.\n" );
        return -1;
    }
    INVAL_RANGE(p, NR_TX_BDS * sizeof(DmaDesc));
    softc->txBds = (DmaDesc *)K0_TO_K1((uint32) p);

    p = KMALLOC( NR_RX_BDS * sizeof(DmaDesc), CACHE_ALIGN );
    if( p== NULL ) {
        xprintf( "BCM6348 : Failed to allocate rxBds memory.\n" );
        KFREE( (void *)(softc->txBds) );
        softc->txBds = NULL;
        return -1;
    }
    INVAL_RANGE(p, NR_RX_BDS * sizeof(DmaDesc));
    softc->rxBds = (DmaDesc *)K0_TO_K1((uint32) p);

    softc->rxBuffers = (uint32_t)KMALLOC( NR_RX_BDS * ENET_BUF_SIZE, CACHE_ALIGN );
    if( softc->rxBuffers == NULL ) {
        xprintf( "BCM6348 : Failed to allocate RxBuffer memory.\n" );
        KFREE( (void *)(softc->txBds) );
        softc->txBds = NULL;
        KFREE( (void *)(softc->rxBds) );
        softc->rxBds = NULL;
        return -1;
    }
    INVAL_RANGE(softc->rxBuffers, NR_RX_BDS * ENET_BUF_SIZE);

    softc->txBuffers = (uint32_t)KMALLOC( NR_TX_BDS * ENET_BUF_SIZE, CACHE_ALIGN );
    if( softc->txBuffers == NULL ) {
        xprintf( "BCM6348 : Failed to allocate txBuffer memory.\n" );
        KFREE( (void *)(softc->rxBuffers) );
        softc->rxBuffers = NULL;
        KFREE( (void *)(softc->txBds) );
        softc->txBds     = NULL;
        KFREE( (void *)(softc->rxBds) );
        softc->rxBds     = NULL;
        return -1;
    }
    INVAL_RANGE(softc->txBuffers, NR_TX_BDS * ENET_BUF_SIZE);

    /* Init the Receive Buffer Descriptor Ring. */
    softc->rxFirstBdPtr = softc->rxBdReadPtr = softc->rxBds;     
    softc->rxLastBdPtr = softc->rxBds + NR_RX_BDS - 1;

    for(i = 0; i < NR_RX_BDS; i++) {
        (softc->rxBds + i)->status  = DMA_OWN;
        (softc->rxBds + i)->length  = ENET_BUF_SIZE;
        (softc->rxBds + i)->address = softc->rxBuffers + i * ENET_BUF_SIZE;
        (softc->rxBds + i)->address = K1_TO_PHYS( (softc->rxBds + i)->address );
        softc->dmaCtrl->flowctl_ch1_alloc = 1;
    }
    softc->rxLastBdPtr->status |= DMA_WRAP;

    /* Init Transmit Buffer Descriptor Ring. */
    softc->txFirstBdPtr = softc->txNextBdPtr =  softc->txBds;
    softc->txLastBdPtr = softc->txBds + NR_TX_BDS - 1;

    for(i = 0; i < NR_TX_BDS; i++) {
        (softc->txBds + i)->status  = 0;
        (softc->txBds + i)->length  = 0;
        (softc->txBds + i)->address = softc->txBuffers + i * ENET_BUF_SIZE;
        (softc->txBds + i)->address = K1_TO_PHYS( (softc->txBds + i)->address );
    }
    softc->txLastBdPtr->status = DMA_WRAP;

    /* init dma registers */
    init_dma(softc);

    /* init enet control registers */
    if (init_emac(softc))
        return -1;

    getMacAddress(softc->hwaddr);

    bcm6348_write_mac_address( softc, softc->hwaddr);

    softc->rxDma->cfg |= DMA_ENABLE;

    return 0;
}
Exemple #18
0
int main(void)
{
	int i, spi_timeout;
	unsigned long counter;

	/* Disable JTAG port so we get our I/O pins back */
	DDPCONbits.JTAGEN = 0;
	/* Enable optimal performance */
	SYSTEMConfigPerformance(GetSystemClock());
	/* Use 1:1 CPU Core:Peripheral clocks */
	OSCSetPBDIV(OSC_PB_DIV_1);

	/* configure the core timer roll-over rate */
	OpenCoreTimer(CORE_TICK_RATE);

	/* set up the core timer interrupt */
	mConfigIntCoreTimer((CT_INT_ON | CT_INT_PRIOR_6 | CT_INT_SUB_PRIOR_0));

	/* enable multi vector interrupts */
	INTConfigureSystem(INT_SYSTEM_CONFIG_MULT_VECTOR);
	INTEnableInterrupts();

	map_peripherals();
	init_io_ports();
	configure_pwm();
	init_spi();
	init_dma();

	/* wait until tx buffer is filled up */
	while (!SPI2STATbits.SPITBF);

	reset_board();
	spi_data_ready = 0;
	spi_timeout = 0;
	counter = 0;

	/* enable watchdog */
	WDTCONSET = 0x8000;

	/* main loop */
	while (1) {
		if (spi_data_ready) {
			spi_data_ready = 0;

			/* the first element received is a command string */
			switch (rxBuf[0]) {
			case 0x5453523E:	/* >RST */
				reset_board();
				break;
			case 0x314D433E:	/* >CM1 */
				stepgen_update_input((const void *)&rxBuf[1]);
				stepgen_get_position((void *)&txBuf[1]);
				break;
			case 0x324D433E:	/* >CM2 */
				update_outputs(rxBuf[1]);
				update_pwm_duty((uint32_t *)&rxBuf[2]);
				txBuf[1] = read_inputs();
				break;
			case 0x4746433E:	/* >CFG */
				stepgen_update_stepwidth(rxBuf[1]);
				update_pwm_period(rxBuf[2]);
				stepgen_reset();
				break;
			case 0x5453543E:	/* >TST */
				for (i=0; i<BUFSIZE; i++)
					txBuf[i] = rxBuf[i] ^ ~0;
				break;
			}
		}

		/* if rx buffer is half-full, update the integrity check.
		   There isn't enough time if we wait for complete transfer */
		if (DCH0INTbits.CHDHIF) {
			DCH0INTCLR = 1<<4;		/* clear flag */
			txBuf[0] = rxBuf[0] ^ ~0;
		}

		/* if rx buffer is full, data from spi bus is ready */
		if (DCH0INTbits.CHBCIF) {
			DCH0INTCLR = 1<<3;		/* clear flag */
			spi_data_ready = 1;
			spi_timeout = SPI_TIMEOUT;
		}

		/* reset the board if there is no SPI activity */
		if (spi_timeout)
			spi_timeout--;

		if (spi_timeout == 1) {				
			DCH0ECONSET=BIT_6;	/* abort DMA transfers */
			DCH1ECONSET=BIT_6;
		
			init_spi();
			init_dma();
			reset_board();

			/* wait until tx buffer is filled up */
			while (!SPI2STATbits.SPITBF);
		}

		/* blink onboard led */
		if (!(counter++ % (spi_timeout ? 0x10000 : 0x40000))) {
			LED_TOGGLE;
		}

		/* keep alive */
		WDTCONSET = 0x01;
	}
	return 0;
}
Exemple #19
0
// Program entry point
int main()
{
	init_platform();

	int status;

   	//Initialize uart port
   	status = init_uart(uart);
   	if(status == XST_FAILURE){
	   	printf("ERROR INITIALIZING UART PORT...EXITING...\n");
	   	exit(-1);
   	}
	
	// Initialize the (simple) DMA engine
   	status = init_dma(&axiDma);
   	if (status != XST_SUCCESS) {
	  	exit(-1);
   	}

	//Disabling the cache
	Xil_DCacheDisable();
	Xil_ICacheDisable();


	int i=0;
   	int j = 0;
	//always available when started
	float* in = malloc(conv_channel * conv_in_x * conv_in_y * sizeof(float));
	float* result = malloc(output_size * sizeof(float));

	//receiving result from PL
			//status = XAxiDma_SimpleTransfer(&axiDma,(u32)result,sizeof(float) * output_size,
				//	XAXIDMA_DEVICE_TO_DMA);

	for(i=0;i<10;i++){
			//	result[i]= i;
		   		printf("%f\n",(float)result[i]);
		   	}

   	while(j++<5){


    	/*for(i=0;i<10;i++){
			printf("%f\n",(float)result[i]);
		}*/

    	for(i=0;i<256;i++){
			in[i] = (float)/*i/100;*/((i*j)+2+i)/1000;
    	}

	   	//receiving input
	   	//uart_receive(in,(conv_channel*conv_in_x*conv_in_y)*sizeof(float));

   		//printf("test is %c\n",test);

	   	printf("*** ATTEMPT NUMBER %d ***\n",j);

		//flushing the relative cache range
	   	//Xil_DCacheFlushRange((unsigned)in,(conv_channel*conv_in_x*conv_in_y) * sizeof(float));

	   	//Handling the DMA to PL input transfer
		status = XAxiDma_SimpleTransfer(&axiDma,(u32)in,sizeof(float) * (conv_channel*conv_in_x*conv_in_y),
					XAXIDMA_DMA_TO_DEVICE);


		usleep(3000000);

	    /*printf("BEFORE\n");
	    for(i=0;i<10;i++){
	    	   		printf("%f\n",(float)result[i]);
		}*/


	    //receiving result from PL
		status = XAxiDma_SimpleTransfer(&axiDma,(u32)result,sizeof(float) * output_size,
				XAXIDMA_DEVICE_TO_DMA);

		//invalidating the relative cache range in order to receive again
	    //Xil_DCacheInvalidateRange((unsigned)result,output_size * sizeof(float));

		//printing results on screen
		//printf("AFTER\n");
	   	for(i=0;i<10;i++){
		//	result[i]= i;
	   		printf("%f\n",(float)result[i]);
	   	}

		//sending the results to the UART port
	   	//uart_send(result,sizeof(float)*output_size);
		//XUartPs_Send(&uart,(u8)result,sizeof(float) * output_size);


	    //resetting the DMA because SDK sucks
	   	XAxiDma_Reset(&axiDma);
   }

	   	free(in);
	   	free(result);
   return 0;
}
int do_dma_cp ( cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
{
	ulong	addr, dest, count , tempaddr;
	int	size;
	unsigned int ChannelNo;
	


	struct dma_device_cfg configuration = {
		MEMORY_DMA_REQ,
		(DMA_WRAP_1|DMA_BURST_8|DMA_SIZE_32|DMA_SG_MODE|DMA_SW_REQ),
		Source1,
		Destination1,
	} ;

	
	if (argc != 4) {
		printf ("Usage:\n%s\n", cmdtp->usage);
		return 1;
	}

	/* Check for size specification.
	*/
	if ((size = cmd_get_data_size(argv[0], 4)) < 0)
		return 1;

	addr = simple_strtoul(argv[1], NULL, 16);
	addr += base_address;

	dest = simple_strtoul(argv[2], NULL, 16);
	dest += base_address;

	count = simple_strtoul(argv[3], NULL, 16);

	if (count == 0) {
		puts ("Zero length ???\n");
		return 1;
	}

	count *= size;
	
#ifndef CFG_NO_FLASH
	/* check if we are copying to Flash */
	if ( (addr2info(dest) != NULL)
#ifdef CONFIG_HAS_DATAFLASH
	   && (!addr_dataflash(addr))
#endif
	   ) {
		int rc;

		puts ("Copy to Flash... ");

		rc = flash_write ((char *)addr, dest, count);
		if (rc != 0) {
			flash_perror (rc);
			return (1);
		}
		puts ("done\n");
		return 0;
	}
#endif

	init_dma();
	if(addr >= 0xFE000000){
	    *(volatile unsigned int *)(0xD8330000) = 0x33013301;
    	*(volatile unsigned int *)(0xD8330008) = 0x10004;
	    *(volatile unsigned int *)(0xD8330010) = 0x10004;
    	*(volatile unsigned int *)(0xD8330020) = 0x809;
	    *(volatile unsigned int *)(0xD8330028) = 0x809;	
	    request_dma(&ChannelNo, "dmacp", I2S_TX_DMA_REQ);
	}
	else
    	request_dma(&ChannelNo, "dmacp", MEMORY_DMA_REQ);
    if(addr >= 0xFE000000){
        configuration.DeviceReqType = I2S_TX_DMA_REQ;
		configuration.DefaultCCR = (DMA_WRAP_1|DMA_BURST_8|DMA_SIZE_32|DMA_SG_MODE|DMA_UP_MEMREG_EN|DEVICE_TO_MEM);
		tempaddr = addr;
		addr = dest;
		dest = tempaddr;
    }
    init_descriptstack(ChannelNo);
	setup_dma(ChannelNo, configuration);
	
	//printf("ISR ch%d = %x\n", ChannelNo, pDma_Reg->DMA_ISR);
	//printf("IER ch%d = %x\n", ChannelNo, pDma_Reg->DMA_IER);
	//printf("CCR ch%d = %x\n", ChannelNo, pDma_Reg->DMA_CCR_CH[ChannelNo]);

	//{
	//    start_dma(ChannelNo, (unsigned long)addr, (unsigned long)dest, count);
    //    printf("DMA%d : handle irq begin\n", ChannelNo);
    //    handle_dma_irq(ChannelNo);
    //    printf("DMA%d : handle irq OK\n", ChannelNo);
    /*******************************************
	* wait for dma transfer complete and terminal count
	********************************************/
	//    while (1) {
	//	    if (dma_busy(ChannelNo) != 1)
	//		    break;
    //	}
	//    printf("DMA%d : no busy\n", ChannelNo);
    //	while (1) {
	//    	if (dma_complete(ChannelNo) == 0)
	//	    	break;
    //	}
	//}
    handle_transfer(ChannelNo, (unsigned long)addr, (unsigned long)dest, count);
    reset_descriptstack(ChannelNo);
    printf("DMA%d : transfer OK\n", ChannelNo);
	return 0;
}