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; }
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; }