X-Git-Url: https://hackdaworld.org/gitweb/?a=blobdiff_plain;f=fx2%2Ffx2.c;h=90e40e9d815b0543b78ff702d607c510a39e644e;hb=377aec2d8eaacb1f970ae36154f36a7f2554b7c7;hp=ddea7340199b2e948666bdc886812fc5c5def410;hpb=a202fa20f103558b6e86400c60f9bc33fae2e576;p=my-code%2Ffpga.git diff --git a/fx2/fx2.c b/fx2/fx2.c index ddea734..90e40e9 100644 --- a/fx2/fx2.c +++ b/fx2/fx2.c @@ -3,9 +3,9 @@ * * author: hackbard@hackdaworld.org * - * number of priorities: - * - switch on board power - * - allow high speed usb transfer + * feature list: + * - switch on board power (done) + * - allow high speed bulk usb transfer * - do jtag * */ @@ -21,20 +21,198 @@ typedef unsigned char u8; typedef unsigned short u16; typedef unsigned int u32; -/* fx2 register */ -xdata at 0xb5 volatile u8 OED; -xdata at 0xb0 volatile u8 IOD; +/* + * fx2 register + */ + +/* general configuration */ +xdata at 0xe600 volatile u8 CPUCS; +xdata at 0xe601 volatile u8 IFCONFIG; + +/* endpoint configuration */ +xdata at 0xe604 volatile u8 FIFORESET; +xdata at 0xe60b volatile u8 REVCTL; +xdata at 0xe612 volatile u8 EP2CFG; +xdata at 0xe613 volatile u8 EP4CFG; +xdata at 0xe614 volatile u8 EP6CFG; +xdata at 0xe615 volatile u8 EP8CFG; +xdata at 0xe618 volatile u8 EP2FIFOCFG; +xdata at 0xe619 volatile u8 EP4FIFOCFG; +xdata at 0xe61a volatile u8 EP6FIFOCFG; +xdata at 0xe61b volatile u8 EP8FIFOCFG; +xdata at 0xe620 volatile u8 EP2AUTOINLENH; +xdata at 0xe621 volatile u8 EP2AUTOINLENL; +xdata at 0xe624 volatile u8 EP6AUTOINLENH; +xdata at 0xe625 volatile u8 EP6AUTOINLENL; + +/* special funtion registers */ +sfr at 0xb5 OED; +sfr at 0xb0 IOD; + +/* synchronization delay after writing/reading to registers 0xe600 - 0xe6ff + * and some others (p. 438). + * maximum delay necessary at highest cpu speed: 16 cycles => 17 nops */ +#define SYNCDELAY _asm \ + nop; nop; nop; nop; nop; nop; nop; nop; \ + nop; nop; nop; nop; nop; nop; nop; nop; \ + nop; _endasm -void power_on() { +void power_init() { + /* pin 7 of port d connected to mosfet gate controlling the board power + * + * ref: http://digilentinc.com/Data/Products/NEXYS/Nexys_sch.pdf + */ + + /* configure pin 7 of port d as output */ OED|=(1<<7); - IOD|=(1<<7); + SYNCDELAY; + } -void main() { +void toggle_power() { + + /* toggle high/low state of the mosfet gate */ + + if((IOD&(1<<7))) + IOD&=~(1<<7); + else + IOD|=(1<<7); + + SYNCDELAY; - power_on; } +void cpu_init() { + + /* cpu initialization: (0x10) + * - 48 mhz + * - none inverted signal + * - no clk out + */ + + CPUCS=(1<<4); + SYNCDELAY; + +} + +void slave_fifo_init() { + + /* initialization of the slave fifo, used by external logic (the fpga) + * to do usb communication with the host */ + + /* set bit 0 and 1 - fifo slave config */ + IFCONFIG|=0x03; + SYNCDELAY; + + /* async mode */ + IFCONFIG|=0x04; + SYNCDELAY; + + /* p. 180: must be set to 1 */ + REVCTL|=((1<<0)|(1<<1)); + SYNCDELAY; + + /* 8 bit fifo to all endpoints + * + * ('or' of all these bits define port d functionality) + */ + EP2FIFOCFG&=~(1<<0); + SYNCDELAY; + EP4FIFOCFG&=~(1<<0); + SYNCDELAY; + EP6FIFOCFG&=~(1<<0); + SYNCDELAY; + EP8FIFOCFG&=~(1<<0); + SYNCDELAY; + + /* default indexed flag configuration: + * + * flag a: programmable level + * flag b: full + * flag c: empty + * + * todo: -> fixed configuration + */ + /* endpoint configuration: + * + * ep2: bulk out 4x512 + * ep6: bulk in 4x512 + * + * 0xa0 = 1 0 1 0 0 0 0 0 = bulk out 4x512 + * 0xe0 = 1 1 1 0 0 0 0 0 = bulk in 4x512 + */ + EP2CFG=0xa0; + SYNCDELAY; + EP4CFG&=(~0x80); + SYNCDELAY; + EP6CFG=0xe0; + SYNCDELAY; + EP8CFG&=(~0x80); + SYNCDELAY; + + /* reset the fifo */ + FIFORESET=0x80; /* nak all transfers */ + SYNCDELAY; + FIFORESET=0x02; /* reset ep2 */ + SYNCDELAY; + FIFORESET=0x06; /* reset ep6 */ + SYNCDELAY; + FIFORESET=0x00; /* restore normal operation */ + SYNCDELAY; + + /* auto in/out, no cpu interaction! auto in len = 512 */ + EP2FIFOCFG|=(1<<4); + SYNCDELAY; + EP6FIFOCFG|=(1<<3); + SYNCDELAY; + EP6AUTOINLENH=(1<<1); + SYNCDELAY; + EP6AUTOINLENL=0; + SYNCDELAY; + +} + +void ep1_init() { + + /* initialize endpoint 1 + * + * used for jtag & control + */ + + /* endpoint 1 configuration: + * + * default (valid, bulk) fits! + */ + +} + +void fx2_init() { + + /* cpu init */ + cpu_init(); + + /* power init & power on */ + power_init(); + toggle_power(); + + /* slave fifo init */ + slave_fifo_init(); + + /* ep1 init */ + ep1_init(); +} + +void main() { + + /* initialize the fx2 */ + fx2_init(); + + /* do the job ... */ + while(1) { + } + +} +