112
									
								
								fpga.c
									
									
									
									
									
								
							
							
						
						
									
										112
									
								
								fpga.c
									
									
									
									
									
								
							@@ -11,11 +11,11 @@
 | 
				
			|||||||
#include "fpga.h"
 | 
					#include "fpga.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct ff_fpga {
 | 
					struct ff_fpga {
 | 
				
			||||||
	struct {
 | 
					    struct {
 | 
				
			||||||
		int reset;
 | 
					        int reset;
 | 
				
			||||||
		int done;
 | 
					        int done;
 | 
				
			||||||
		int cs;
 | 
					        int cs;
 | 
				
			||||||
	} pins;
 | 
					    } pins;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int fpgaDone(struct ff_fpga *fpga) {
 | 
					int fpgaDone(struct ff_fpga *fpga) {
 | 
				
			||||||
@@ -23,90 +23,90 @@ int fpgaDone(struct ff_fpga *fpga) {
 | 
				
			|||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int fpgaResetSlave(struct ff_fpga *fpga) {
 | 
					int fpgaResetSlave(struct ff_fpga *fpga) {
 | 
				
			||||||
        // Put the FPGA into reset
 | 
					    // Put the FPGA into reset
 | 
				
			||||||
        gpioSetMode(fpga->pins.reset, PI_OUTPUT);
 | 
					    gpioSetMode(fpga->pins.reset, PI_OUTPUT);
 | 
				
			||||||
        gpioWrite(fpga->pins.reset, 0);
 | 
					    gpioWrite(fpga->pins.reset, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Set the CS pin to a GPIO, which will let us control it
 | 
					    // Set the CS pin to a GPIO, which will let us control it
 | 
				
			||||||
        gpioSetMode(fpga->pins.cs, PI_OUTPUT);
 | 
					    gpioSetMode(fpga->pins.cs, PI_OUTPUT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Set CS to 0, which will put the FPGA into slave mode
 | 
					    // Set CS to 0, which will put the FPGA into slave mode
 | 
				
			||||||
        gpioWrite(fpga->pins.cs, 0);
 | 
					    gpioWrite(fpga->pins.cs, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        usleep(10000); // XXX figure out correct sleep length here
 | 
					    usleep(10000); // XXX figure out correct sleep length here
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Bring the FPGA out of reset
 | 
					    // Bring the FPGA out of reset
 | 
				
			||||||
        gpioWrite(fpga->pins.reset, 1);
 | 
					    gpioWrite(fpga->pins.reset, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        usleep(1200); // 13.2.SPI Slave Configuration Process
 | 
					    usleep(1200); // 13.2.SPI Slave Configuration Process
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Release the CS pin
 | 
					    // Release the CS pin
 | 
				
			||||||
        gpioWrite(fpga->pins.cs, 1);
 | 
					    gpioWrite(fpga->pins.cs, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int fpgaResetMaster(struct ff_fpga *fpga) {
 | 
					int fpgaResetMaster(struct ff_fpga *fpga) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Put the FPGA into reset
 | 
					    // Put the FPGA into reset
 | 
				
			||||||
        gpioSetMode(fpga->pins.reset, PI_OUTPUT);
 | 
					    gpioSetMode(fpga->pins.reset, PI_OUTPUT);
 | 
				
			||||||
        gpioWrite(fpga->pins.reset, 0);
 | 
					    gpioWrite(fpga->pins.reset, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Set the CS pin to a GPIO, which will let us control it
 | 
					    // Set the CS pin to a GPIO, which will let us control it
 | 
				
			||||||
        gpioSetMode(fpga->pins.cs, PI_OUTPUT);
 | 
					    gpioSetMode(fpga->pins.cs, PI_OUTPUT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Set CS to 1, which will put the FPGA into "self boot" mode
 | 
					    // Set CS to 1, which will put the FPGA into "self boot" mode
 | 
				
			||||||
        gpioWrite(fpga->pins.cs, 1);
 | 
					    gpioWrite(fpga->pins.cs, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        usleep(10000); // XXX figure out correct sleep length here
 | 
					    usleep(10000); // XXX figure out correct sleep length here
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Bring the FPGA out of reset
 | 
					    // Bring the FPGA out of reset
 | 
				
			||||||
        gpioWrite(fpga->pins.reset, 1);
 | 
					    gpioWrite(fpga->pins.reset, 1);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        usleep(1200); // 13.2.SPI Slave Configuration Process
 | 
					    usleep(1200); // 13.2.SPI Slave Configuration Process
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int fpgaReset(struct ff_fpga *fpga) {
 | 
					int fpgaReset(struct ff_fpga *fpga) {
 | 
				
			||||||
        // Put the FPGA into reset
 | 
					    // Put the FPGA into reset
 | 
				
			||||||
        gpioSetMode(fpga->pins.reset, PI_OUTPUT);
 | 
					    gpioSetMode(fpga->pins.reset, PI_OUTPUT);
 | 
				
			||||||
        gpioWrite(fpga->pins.reset, 0);
 | 
					    gpioWrite(fpga->pins.reset, 0);
 | 
				
			||||||
	return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int fpgaInit(struct ff_fpga *fpga) {
 | 
					int fpgaInit(struct ff_fpga *fpga) {
 | 
				
			||||||
        // Put the FPGA into reset
 | 
					    // Put the FPGA into reset
 | 
				
			||||||
        gpioSetMode(fpga->pins.reset, PI_OUTPUT);
 | 
					    gpioSetMode(fpga->pins.reset, PI_OUTPUT);
 | 
				
			||||||
        gpioWrite(fpga->pins.reset, 0);
 | 
					    gpioWrite(fpga->pins.reset, 0);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Also monitor the C_DONE pin
 | 
					    // Also monitor the C_DONE pin
 | 
				
			||||||
        gpioSetMode(fpga->pins.done, PI_INPUT);
 | 
					    gpioSetMode(fpga->pins.done, PI_INPUT);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct ff_fpga *fpgaAlloc(void) {
 | 
					struct ff_fpga *fpgaAlloc(void) {
 | 
				
			||||||
	struct ff_fpga *fpga = (struct ff_fpga *)malloc(sizeof(struct ff_fpga));
 | 
					    struct ff_fpga *fpga = (struct ff_fpga *)malloc(sizeof(struct ff_fpga));
 | 
				
			||||||
	memset(fpga, 0, sizeof(*fpga));
 | 
					    memset(fpga, 0, sizeof(*fpga));
 | 
				
			||||||
	return fpga;
 | 
					    return fpga;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void fpgaSetPin(struct ff_fpga *fpga, enum fpga_pin pin, int val) {
 | 
					void fpgaSetPin(struct ff_fpga *fpga, enum fpga_pin pin, int val) {
 | 
				
			||||||
	switch (pin) {
 | 
					    switch (pin) {
 | 
				
			||||||
	case FP_RESET: fpga->pins.reset = val; break;
 | 
					    case FP_RESET: fpga->pins.reset = val; break;
 | 
				
			||||||
        case FP_DONE: fpga->pins.done = val; break;
 | 
					    case FP_DONE: fpga->pins.done = val; break;
 | 
				
			||||||
        case FP_CS: fpga->pins.cs = val; break;
 | 
					    case FP_CS: fpga->pins.cs = val; break;
 | 
				
			||||||
	default: fprintf(stderr, "unrecognized pin: %d\n", pin); break;
 | 
					    default: fprintf(stderr, "unrecognized pin: %d\n", pin); break;
 | 
				
			||||||
	}
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void fpgaFree(struct ff_fpga **fpga) {
 | 
					void fpgaFree(struct ff_fpga **fpga) {
 | 
				
			||||||
	if (!fpga)
 | 
					    if (!fpga)
 | 
				
			||||||
		return;
 | 
					        return;
 | 
				
			||||||
	if (!*fpga)
 | 
					    if (!*fpga)
 | 
				
			||||||
		return;
 | 
					        return;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	free(*fpga);
 | 
					    free(*fpga);
 | 
				
			||||||
	*fpga = NULL;
 | 
					    *fpga = NULL;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user