示例#1
0
int do_init(void) {

	int status;				// status from Xilinx Lib calls
	
	// initialize the Nexys4IO and Pmod544IO hardware and drivers
	// rotary encoder is set to increment from 0 by DUTY_CYCLE_CHANGE 
	
	status = NX4IO_initialize(NX4IO_BASEADDR);

	if (status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	
	status = PMDIO_initialize(PMDIO_BASEADDR);

	if (status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	
	// successful initialization.  Set the rotary encoder
	// to increment from 0 by DUTY_CYCLE_CHANGE counts per rotation

	PMDIO_ROT_init(DUTY_CYCLE_CHANGE, true);
	PMDIO_ROT_clear();
	
	
	// initialize the GPIO instances

	status = XGpio_Initialize(&GPIOInst0, GPIO_0_DEVICE_ID);
	
	if (status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	status = XGpio_Initialize(&GPIOInst1, GPIO_1_DEVICE_ID);
	
	if (status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	// GPIO_0 channel 1 is an 8-bit input port.  bit[7:1] = reserved, bit[0] = PWM output (for duty cycle calculation)
	// GPIO_0 channel 2 is an 8-bit output port.  bit[7:1] = reserved, bit[0] = FIT clock

	XGpio_SetDataDirection(&GPIOInst0, GPIO_0_INPUT_CHANNEL, 0xFF);
	XGpio_SetDataDirection(&GPIOInst0, GPIO_0_OUTPUT_CHANNEL, 0xFE);

	// GPIO_1 channel 1 is a 32-bit input port - used to pass hw_detect 'high' count to application
	// GPIO_1 channel 2 is an 8-bit output port - used to pass hw_detect 'low' count to application
	
	XGpio_SetDataDirection(&GPIOInst1, GPIO_1_HIGH_COUNT, 0xFFFFFFFF);
	XGpio_SetDataDirection(&GPIOInst1, GPIO_1_LOW_COUNT, 0xFFFFFFFF);

	// initialize the PWM timer/counter instance but do not start it
	// do not enable PWM interrupts.  Clock frequency is the AXI clock frequency
	
	status = PWM_Initialize(&PWMTimerInst, PWM_TIMER_DEVICE_ID, false, AXI_CLOCK_FREQ_HZ);
	
	if (status != XST_SUCCESS) {
		return XST_FAILURE;
	}
	
	// initialize the interrupt controller
	
	status = XIntc_Initialize(&IntrptCtlrInst, INTC_DEVICE_ID);
	
	if (status != XST_SUCCESS) {
	   return XST_FAILURE;
	}

	// connect the fixed interval timer (FIT) handler to the interrupt
	
	status = XIntc_Connect(&IntrptCtlrInst, FIT_INTERRUPT_ID, (XInterruptHandler)FIT_Handler, (void *)0);

	if (status != XST_SUCCESS) {
		return XST_FAILURE;
	}
 
	// start the interrupt controller such that interrupts are enabled for
	// all devices that cause interrupts

	status = XIntc_Start(&IntrptCtlrInst, XIN_REAL_MODE);
	
	if (status != XST_SUCCESS) {
		return XST_FAILURE;
	}

	// enable the FIT interrupt

	XIntc_Enable(&IntrptCtlrInst, FIT_INTERRUPT_ID);

	// set the duty cycles for RGB1.  The channels will be enabled/disabled
	// in the FIT interrupt handler.  Red and Blue make purple

	NX4IO_RGBLED_setDutyCycle(RGB1, 64, 0, 64);
	NX4IO_RGBLED_setChnlEn(RGB1, false, false, false);

	return XST_SUCCESS;
}
示例#2
0
文件: proj2.c 项目: hngryhllw/proj2
XStatus init_axi_devices(void) {
   int status;
   
   // INITIALIZE : Nexys4IO
   status = NX4IO_initialize(XPAR_NEXYS4IO_0_S00_AXI_BASEADDR);
   if (status != XST_SUCCESS) return XST_FAILURE;
   NX4IO_setLEDs(0x0000FFFF);

   // INITIALIZE : PMOD544IO
   status = PMDIO_initialize(XPAR_PMOD544IOR2_0_S00_AXI_BASEADDR);
   if (status != XST_SUCCESS) return XST_FAILURE;
   // SET : Encoder val = 0, increment val = DUTY_CYCLE_CHANGE
   NX4IO_setLEDs(0x0000FFFE);
   PMDIO_ROT_init(DUTY_CYCLE_INCREMENTS, true);
   PMDIO_ROT_clear();
   NX4IO_setLEDs(0x0000FFFD);
   
   // This is currently crashing the program =/
   // No GPIO for now
   // INITIALIZE : Degug signal GPIO (1X 4-bit)
   
   /*status = XGpio_Initialize(&instGPIODebug,  XPAR_AXI_GPIO_0_BASEADDR);*/
   /*if (status != XST_SUCCESS) return XST_FAILURE;*/
   /*NX4IO_setLEDs(0x0000FFFC);*/
   /*// SET : Direction of output ports */
   /*XGpio_SetDataDirection(&instGPIODebug, 0, 0xFFFFFFF0);*/
   /*NX4IO_setLEDs(0x0000FFFB);*/

   // INITIALIZE : PWM timer/counter
   status = PWM_Initialize(&instPWMTimer, XPAR_AXI_TIMER_0_DEVICE_ID, false, XPAR_CPU_CORE_CLOCK_FREQ_HZ);
   if (status != XST_SUCCESS) return XST_FAILURE;
   NX4IO_setLEDs(0x0000FFFA);
   
   // INITIALIZE : Interrupt controller
   status = XIntc_Initialize(&instIntrCtrl, XPAR_MICROBLAZE_0_AXI_INTC_DEVICE_ID);
   if (status != XST_SUCCESS) return XST_FAILURE;
   NX4IO_setLEDs(0x0000FFF9);

   // SET : GPIO handler to interrupt vector
   status = XIntc_Connect(&instIntrCtrl, XPAR_MICROBLAZE_0_AXI_INTC_FIT_TIMER_0_INTERRUPT_INTR,
                         (XInterruptHandler)FIT_Handler,
                         (void *)0);
   if (status != XST_SUCCESS) return XST_FAILURE;
   NX4IO_setLEDs(0x0000FFF8);
 
   // SET : Interrupt controller enabled for all devices
   status = XIntc_Start(&instIntrCtrl, XIN_REAL_MODE);
   if (status != XST_SUCCESS) return XST_FAILURE;
   NX4IO_setLEDs(0x0000FFF7);

   // SET : Interrupts enabled
   XIntc_Enable(&instIntrCtrl, XPAR_MICROBLAZE_0_AXI_INTC_FIT_TIMER_0_INTERRUPT_INTR);
   NX4IO_setLEDs(0x0000FFF6);

   // SET : RGB LED duty cycles and disable output
   NX4IO_RGBLED_setDutyCycle(RGB1, 64, 0, 64);
   NX4IO_RGBLED_setChnlEn(RGB1, false, false, false);
   NX4IO_setLEDs(0x0000FFF5);

   return XST_SUCCESS;
}