From ba36b7b03e8b03600e4342f3fa7ed60dc3d61352 Mon Sep 17 00:00:00 2001 From: the great greene arkleseizure Date: Thu, 10 Oct 2013 10:59:48 +0100 Subject: software-1 --- hardware/pong3.pin | 32 +- software/pong3/.cproject | 378 +++++++++++++ software/pong3/.project | 96 ++++ software/pong3/DM9000A.C | 239 ++++++++ software/pong3/DM9000A.H | 72 +++ software/pong3/Makefile | 1086 ++++++++++++++++++++++++++++++++++++ software/pong3/Nios II/makefile | 58 ++ software/pong3/Nios II/objects.mk | 8 + software/pong3/Nios II/sources.mk | 27 + software/pong3/Nios II/subdir.mk | 41 ++ software/pong3/create-this-app | 114 ++++ software/pong3/hello_led.c | 148 +++++ software/pong3/pong3.c | 151 +++++ software/pong3/readme.txt | 26 + software/pong3_bsp/.cproject | 348 ++++++++++++ software/pong3_bsp/.project | 85 +++ software/pong3_bsp/Makefile | 786 ++++++++++++++++++++++++++ software/pong3_bsp/create-this-bsp | 49 ++ 18 files changed, 3728 insertions(+), 16 deletions(-) create mode 100644 software/pong3/.cproject create mode 100644 software/pong3/.project create mode 100644 software/pong3/DM9000A.C create mode 100644 software/pong3/DM9000A.H create mode 100644 software/pong3/Makefile create mode 100644 software/pong3/Nios II/makefile create mode 100644 software/pong3/Nios II/objects.mk create mode 100644 software/pong3/Nios II/sources.mk create mode 100644 software/pong3/Nios II/subdir.mk create mode 100755 software/pong3/create-this-app create mode 100644 software/pong3/hello_led.c create mode 100644 software/pong3/pong3.c create mode 100644 software/pong3/readme.txt create mode 100644 software/pong3_bsp/.cproject create mode 100644 software/pong3_bsp/.project create mode 100644 software/pong3_bsp/Makefile create mode 100755 software/pong3_bsp/create-this-bsp diff --git a/hardware/pong3.pin b/hardware/pong3.pin index 163704a..f558048 100644 --- a/hardware/pong3.pin +++ b/hardware/pong3.pin @@ -60,15 +60,15 @@ --------------------------------------------------------------------------------- Quartus II 32-bit Version 13.0.1 Build 232 06/12/2013 Service Pack 1 SJ Web Edition -CHIP "dm9000a_nios" ASSIGNED TO AN: EP2C8Q208C8 +CHIP "pong3" ASSIGNED TO AN: EP2C8Q208C8 Pin Name/Usage : Location : Dir. : I/O Standard : Voltage : I/O Bank : User Assignment ------------------------------------------------------------------------------------------------------------- ~ASDO~ / RESERVED_INPUT : 1 : input : 3.3-V LVTTL : : 1 : N ~nCSO~ / RESERVED_INPUT : 2 : input : 3.3-V LVTTL : : 1 : N GND* : 3 : : : : 1 : -GND* : 4 : : : : 1 : -GND* : 5 : : : : 1 : +seven_seg[1] : 4 : output : 3.3-V LVTTL : : 1 : N +seven_seg[6] : 5 : output : 3.3-V LVTTL : : 1 : N GND* : 6 : : : : 1 : VCCIO1 : 7 : power : : 3.3V : 1 : GND* : 8 : : : : 1 : @@ -77,7 +77,7 @@ GND* : 10 : : : GND* : 11 : : : : 1 : GND* : 12 : : : : 1 : GND* : 13 : : : : 1 : -seven_seg[7] : 14 : output : 3.3-V LVTTL : : 1 : N +GND* : 14 : : : : 1 : GND* : 15 : : : : 1 : altera_reserved_tdo : 16 : output : 3.3-V LVTTL : : 1 : N altera_reserved_tms : 17 : input : 3.3-V LVTTL : : 1 : N @@ -93,10 +93,10 @@ nCONFIG : 26 : : : rst_n : 27 : input : 3.3-V LVTTL : : 1 : Y GND+ : 28 : : : : 1 : VCCIO1 : 29 : power : : 3.3V : 1 : -seven_seg[2] : 30 : output : 3.3-V LVTTL : : 1 : N +seven_seg[3] : 30 : output : 3.3-V LVTTL : : 1 : N GND* : 31 : : : : 1 : VCCINT : 32 : power : : 1.2V : : -GND* : 33 : : : : 1 : +seven_seg[5] : 33 : output : 3.3-V LVTTL : : 1 : N GND* : 34 : : : : 1 : GND* : 35 : : : : 1 : GND : 36 : gnd : : : : @@ -106,8 +106,8 @@ GND* : 39 : : : GND* : 40 : : : : 1 : GND* : 41 : : : : 1 : VCCIO1 : 42 : power : : 3.3V : 1 : -seven_seg[0] : 43 : output : 3.3-V LVTTL : : 1 : N -GND* : 44 : : : : 1 : +GND* : 43 : : : : 1 : +seven_seg[4] : 44 : output : 3.3-V LVTTL : : 1 : N sdram_cs_n : 45 : output : 3.3-V LVTTL : : 1 : Y sdram_cke : 46 : output : 3.3-V LVTTL : : 1 : Y sdram_clk : 47 : output : 3.3-V LVTTL : : 1 : Y @@ -170,7 +170,7 @@ sdram_dq[8] : 103 : bidir : 3.3-V LVTTL : sdram_dqm[1] : 104 : output : 3.3-V LVTTL : : 4 : Y GND* : 105 : : : : 3 : GND* : 106 : : : : 3 : -GND* : 107 : : : : 3 : +seven_seg[0] : 107 : output : 3.3-V LVTTL : : 3 : N vga_red[0] : 108 : output : 3.3-V LVTTL : : 3 : Y VCCIO3 : 109 : power : : 3.3V : 3 : GND* : 110 : : : : 3 : @@ -231,7 +231,7 @@ dm9000_rst_n : 164 : output : 3.3-V LVTTL : dm9000_cs_n : 165 : output : 3.3-V LVTTL : : 2 : Y VCCIO2 : 166 : power : : 3.3V : 2 : GND : 167 : gnd : : : : -GND* : 168 : : : : 2 : +seven_seg[7] : 168 : output : 3.3-V LVTTL : : 2 : N GND* : 169 : : : : 2 : GND* : 170 : : : : 2 : GND* : 171 : : : : 2 : @@ -245,24 +245,24 @@ VCCINT : 178 : power : : 1.2V GND* : 179 : : : : 2 : GND* : 180 : : : : 2 : GND* : 181 : : : : 2 : -GND* : 182 : : : : 2 : +seven_seg[2] : 182 : output : 3.3-V LVTTL : : 2 : N VCCIO2 : 183 : power : : 3.3V : 2 : GND : 184 : gnd : : : : GND* : 185 : : : : 2 : GND : 186 : gnd : : : : -seven_seg[5] : 187 : output : 3.3-V LVTTL : : 2 : N +GND* : 187 : : : : 2 : GND* : 188 : : : : 2 : GND* : 189 : : : : 2 : VCCINT : 190 : power : : 1.2V : : GND* : 191 : : : : 2 : GND* : 192 : : : : 2 : -seven_seg[1] : 193 : output : 3.3-V LVTTL : : 2 : N +GND* : 193 : : : : 2 : VCCIO2 : 194 : power : : 3.3V : 2 : -seven_seg[4] : 195 : output : 3.3-V LVTTL : : 2 : N +GND* : 195 : : : : 2 : GND : 196 : gnd : : : : GND* : 197 : : : : 2 : GND* : 198 : : : : 2 : -seven_seg[6] : 199 : output : 3.3-V LVTTL : : 2 : N +GND* : 199 : : : : 2 : GND* : 200 : : : : 2 : GND* : 201 : : : : 2 : VCCIO2 : 202 : power : : 3.3V : 2 : @@ -270,5 +270,5 @@ GND* : 203 : : : GND : 204 : gnd : : : : GND* : 205 : : : : 2 : GND* : 206 : : : : 2 : -seven_seg[3] : 207 : output : 3.3-V LVTTL : : 2 : N +GND* : 207 : : : : 2 : GND* : 208 : : : : 2 : diff --git a/software/pong3/.cproject b/software/pong3/.cproject new file mode 100644 index 0000000..ff66346 --- /dev/null +++ b/software/pong3/.cproject @@ -0,0 +1,378 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + make + + mem_init_install + true + false + false + + + make + + mem_init_generate + true + false + false + + + make + + help + true + false + false + + + + + + + diff --git a/software/pong3/.project b/software/pong3/.project new file mode 100644 index 0000000..7ab77c7 --- /dev/null +++ b/software/pong3/.project @@ -0,0 +1,96 @@ + + + pong3 + + + + + + com.altera.sbtgui.project.makefileBuilder + + + + + com.altera.sbtgui.project.makefileBuilder + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.autoBuildTarget + all + + + org.eclipse.cdt.make.core.buildArguments + + + + org.eclipse.cdt.make.core.buildCommand + make + + + org.eclipse.cdt.make.core.buildLocation + ${workspace_loc://pong3} + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + false + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.fullBuildTarget + all + + + org.eclipse.cdt.make.core.stopOnError + true + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.eclipse.cdt.core.ccnature + com.altera.sbtgui.project.SBTGUINature + com.altera.sbtgui.project.SBTGUIAppNature + com.altera.sbtgui.project.SBTGUIManagedNature + + diff --git a/software/pong3/DM9000A.C b/software/pong3/DM9000A.C new file mode 100644 index 0000000..7380729 --- /dev/null +++ b/software/pong3/DM9000A.C @@ -0,0 +1,239 @@ +#include +#include "DM9000A.H" + +#define msleep(msec) usleep(1000*msec); + + +#if 0 +//------------------------------------------------------------------------- +void iow(unsigned int reg, unsigned int data) +{ + IOWR(DM9000A_0_BASE,IO_addr,reg); + //usleep(STD_DELAY); + IOWR(DM9000A_0_BASE,IO_data,data); +} +//------------------------------------------------------------------------- +unsigned int ior(unsigned int reg) +{ + IOWR(DM9000A_0_BASE,IO_addr,reg); + //usleep(STD_DELAY); + return IORD(DM9000A_0_BASE,IO_data); +} +//------------------------------------------------------------------------- +void phy_write (unsigned int reg, unsigned int value) +{ + /* set PHY register address into EPAR REG. 0CH */ + iow(0x0C, reg | 0x40); /* PHY register address setting, and DM9000_PHY offset = 0x40 */ + + /* fill PHY WRITE data into EPDR REG. 0EH & REG. 0DH */ + iow(0x0E, ((value >> 8) & 0xFF)); /* PHY data high_byte */ + iow(0x0D, value & 0xFF); /* PHY data low_byte */ + + /* issue PHY + WRITE command = 0xa into EPCR REG. 0BH */ + iow(0x0B, 0x8); /* clear PHY command first */ + IOWR(DM9000A_0_BASE, IO_data, 0x0A); /* issue PHY + WRITE command */ + usleep(STD_DELAY); + IOWR(DM9000A_0_BASE, IO_data, 0x08); /* clear PHY command again */ + usleep(50); /* wait 1~30 us (>20 us) for PHY + WRITE completion */ +} +//------------------------------------------------------------------------- +/* DM9000_init I/O routine */ +unsigned int DM9000_init (void) /* initialize DM9000 LAN chip */ +{ + unsigned int i; + + /* set the internal PHY power-on (GPIOs normal settings) */ + iow(0x1E, 0x01); /* GPCR REG. 1EH = 1 selected GPIO0 "output" port for internal PHY */ + iow(0x1F, 0x00); /* GPR REG. 1FH GEPIO0 Bit [0] = 0 to activate internal PHY */ + msleep(5); /* wait > 2 ms for PHY power-up ready */ + + /* software-RESET NIC */ + iow(NCR, 0x03); /* NCR REG. 00 RST Bit [0] = 1 reset on, and LBK Bit [2:1] = 01b MAC loopback on */ + usleep(20); /* wait > 10us for a software-RESET ok */ + iow(NCR, 0x00); /* normalize */ + iow(NCR, 0x03); + usleep(20); + iow(NCR, 0x00); + + /* set GPIO0=1 then GPIO0=0 to turn off and on the internal PHY */ + iow(0x1F, 0x01); /* GPR PHYPD Bit [0] = 1 turn-off PHY */ + iow(0x1F, 0x00); /* PHYPD Bit [0] = 0 activate phyxcer */ + msleep(10); /* wait >4 ms for PHY power-up */ + + /* set PHY operation mode */ + phy_write(0,PHY_reset); /* reset PHY: registers back to the default states */ + usleep(50); /* wait >30 us for PHY software-RESET ok */ + phy_write(16, 0x404); /* turn off PHY reduce-power-down mode only */ + phy_write(4, PHY_txab); /* set PHY TX advertised ability: ALL + Flow_control */ + phy_write(0, 0x1200); /* PHY auto-NEGO re-start enable (RESTART_AUTO_NEGOTIATION + AUTO_NEGOTIATION_ENABLE) to auto sense and recovery PHY registers */ + //phy_write(0, 0x2000); + msleep(5); /* wait >2 ms for PHY auto-sense linking to partner */ + + /* store MAC address into NIC */ + for (i = 0; i < 6; i++) + iow(16 + i, ether_addr[i]); + + /* clear any pending interrupt */ + iow(ISR, 0x3F); /* clear the ISR status: PRS, PTS, ROS, ROOS 4 bits, by RW/C1 */ + iow(NSR, 0x2C); /* clear the TX status: TX1END, TX2END, WAKEUP 3 bits, by RW/C1 */ + + /* program operating registers~ */ + iow(NCR, NCR_set); /* NCR REG. 00 enable the chip functions (and disable this MAC loopback mode back to normal) */ + iow(0x08, BPTR_set); /* BPTR REG.08 (if necessary) RX Back Pressure Threshold in Half duplex moe only: High Water 3KB, 200 us */ + iow(0x09, FCTR_set); /* FCTR REG.09 (if necessary) Flow Control Threshold setting High/ Low Water Overflow 3KB/ 8KB */ + iow(0x0A, RTFCR_set); /* RTFCR REG.0AH (if necessary) RX/TX Flow Control Register enable TXPEN, BKPM (TX_Half), FLCE (RX) */ + iow(0x0F, 0x00); /* Clear the all Event */ + iow(0x2D, 0x80); /* Switch LED to mode 1 */ + iow(OTCR, OTCR_set); /* 100Mhz Internal clock */ + + //dong added + //iow(0x31, 0x01);//checksum generation enable + //iow(0x32, 0x02);//checksum checking enable, package will not be disscard even if CRC error + + /* set other registers depending on applications */ + iow(ETXCSR, ETXCSR_set); /* Early Transmit 12.5% */ + //iow(TCSCR, TCSCR_set); /* UDP and not IP Checksum activ. */ + + /* enable interrupts to activate DM9000 ~on */ + iow(IMR, INTR_set); /* IMR REG. FFH PAR=1 only, or + PTM=1& PRM=1 enable RxTx interrupts */ + + /* enable RX (Broadcast/ ALL_MULTICAST) ~go */ + iow(RCR , RCR_set | RX_ENABLE | PASS_MULTICAST); /* RCR REG. 05 RXEN Bit [0] = 1 to enable the RX machine/ filter */ + + /* RETURN "DEVICE_SUCCESS" back to upper layer */ + return (ior(0x2D)==0x80) ? DMFE_SUCCESS : DMFE_FAIL; +} +//------------------------------------------------------------------------- +/* Transmit one Packet TX I/O routine */ +unsigned int TransmitPacket(unsigned char *data_ptr,unsigned int tx_len) +{ + unsigned int i; + + /* mask NIC interrupts IMR: PAR only */ + iow(IMR, PAR_set); + + /* issue TX packet's length into TXPLH REG. FDH & TXPLL REG. FCH */ + iow(0xFD, (tx_len >> 8) & 0xFF); /* TXPLH High_byte length */ + iow(0xFC, tx_len & 0xFF); /* TXPLL Low_byte length */ + + /* wirte transmit data to chip SRAM */ + IOWR(DM9000A_0_BASE, IO_addr, MWCMD); /* set MWCMD REG. F8H TX I/O port ready */ + for (i = 0; i < tx_len; i += 2) + { + usleep(STD_DELAY); + IOWR(DM9000A_0_BASE, IO_data, (data_ptr[i+1]<<8)|data_ptr[i] ); + } + + usleep(100); + + /* issue TX polling command activated */ + iow(TCR , TCR_set | TX_REQUEST); /* TXCR Bit [0] TXREQ auto clear after TX completed */ + + /* wait TX transmit done */ + char tx_done = 0; + do + { + tx_done = ior(NSR)&0x0C; + } + while(!tx_done); + //usleep(STD_DELAY); + + /* clear the NSR Register */ + //iow(NSR,0x00); + + /* re-enable NIC interrupts */ + iow(IMR, INTR_set); + + /* RETURN "TX_SUCCESS" to upper layer */ + return DMFE_SUCCESS; +} +//------------------------------------------------------------------------- +/* Receive One Packet I/O routine */ +unsigned int ReceivePacket (unsigned char *data_ptr,unsigned int *rx_len) +{ + unsigned char rx_READY,GoodPacket; + unsigned int Tmp, RxStatus, i; + + RxStatus = rx_len[0] = 0; + GoodPacket=FALSE; + + iow(ISR, 0x01); + + /* mask NIC interrupts IMR: PAR only */ + iow(IMR, PAR_set); + + /* dummy read a byte from MRCMDX REG. F0H */ + rx_READY = ior(MRCMDX)&0x03; + + /* got most updated byte: rx_READY */ + rx_READY = IORD(DM9000A_0_BASE,IO_data)&0x03; + usleep(STD_DELAY); + + /* check if (rx_READY == 0x01): Received Packet READY? */ + if (rx_READY == DM9000_PKT_READY) + { + /* got RX_Status & RX_Length from RX SRAM */ + IOWR(DM9000A_0_BASE, IO_addr, MRCMD); /* set MRCMD REG. F2H RX I/O port ready */ + usleep(STD_DELAY); + RxStatus = IORD(DM9000A_0_BASE,IO_data); + usleep(STD_DELAY); + rx_len[0] = IORD(DM9000A_0_BASE,IO_data); + + /* Check this packet_status GOOD or BAD? */ + if ( !(RxStatus & 0xBF00) && (rx_len[0] < MAX_PACKET_SIZE) ) + { + /* read 1 received packet from RX SRAM into RX buffer */ + for (i = 0; i < rx_len[0]; i += 2) + { + usleep(STD_DELAY); + Tmp = IORD(DM9000A_0_BASE, IO_data); + data_ptr[i] = Tmp&0xFF; + data_ptr[i+1] = (Tmp>>8)&0xFF; + } + GoodPacket=TRUE; + } /* end if (GoodPacket) */ + else + { + printf("\nError\n"); + /* this packet is bad, dump it from RX SRAM */ + for (i = 0; i < rx_len[0]; i += 2) + { + usleep(STD_DELAY); + Tmp = IORD(DM9000A_0_BASE, IO_data); + } + rx_len[0] = 0; + } /* end if (!GoodPacket) */ + } /* end if (rx_READY == DM9000_PKT_READY) ok */ + else if(rx_READY) /* status check first byte: rx_READY Bit[1:0] must be "00"b or "01"b */ + { + printf(" RX failure!\n"); + /* software-RESET NIC */ + iow(NCR, 0x03); /* NCR REG. 00 RST Bit [0] = 1 reset on, and LBK Bit [2:1] = 01b MAC loopback on */ + usleep(20); /* wait > 10us for a software-RESET ok */ + iow(NCR, 0x00); /* normalize */ + iow(NCR, 0x03); + usleep(20); + iow(NCR, 0x00); + /* program operating registers~ */ + iow(NCR, NCR_set); /* NCR REG. 00 enable the chip functions (and disable this MAC loopback mode back to normal) */ + iow(0x08, BPTR_set); /* BPTR REG.08 (if necessary) RX Back Pressure Threshold in Half duplex moe only: High Water 3KB, 600 us */ + iow(0x09, FCTR_set); /* FCTR REG.09 (if necessary) Flow Control Threshold setting High/ Low Water Overflow 5KB/ 10KB */ + iow(0x0A, RTFCR_set); /* RTFCR REG.0AH (if necessary) RX/TX Flow Control Register enable TXPEN, BKPM (TX_Half), FLCE (RX) */ + iow(0x0F, 0x00); /* Clear the all Event */ + iow(0x2D, 0x80); /* Switch LED to mode 1 */ + iow(OTCR, OTCR_set); /* 100Mhz Internal clock */ + /* set other registers depending on applications */ + iow(ETXCSR, ETXCSR_set); /* Early Transmit 12.5% */ + /* enable interrupts to activate DM9000 ~on */ + iow(IMR, INTR_set); /* IMR REG. FFH PAR=1 only, or + PTM=1& PRM=1 enable RxTx interrupts */ + /* enable RX (Broadcast/ ALL_MULTICAST) ~go */ + iow(RCR , RCR_set | RX_ENABLE | PASS_MULTICAST); /* RCR REG. 05 RXEN Bit [0] = 1 to enable the RX machine/ filter */ + } /* end NIC H/W system Data-Bus error */ + + /* re-enable NIC interrupts */ + iow(IMR, INTR_set); + + return GoodPacket ? DMFE_SUCCESS : DMFE_FAIL; +} +//------------------------------------------------------------------------- +#endif diff --git a/software/pong3/DM9000A.H b/software/pong3/DM9000A.H new file mode 100644 index 0000000..47401f1 --- /dev/null +++ b/software/pong3/DM9000A.H @@ -0,0 +1,72 @@ +#ifndef __DM9000A_H__ +#define __DM9000A_H__ + +#define IO_addr 0 +#define IO_data 1 + +#define NCR 0x00 /* Network Control Register REG. 00 */ +#define NSR 0x01 /* Network Status Register REG. 01 */ +#define TCR 0x02 /* Transmit Control Register REG. 02 */ +#define RCR 0x05 /* Receive Control Register REG. 05 */ +#define ETXCSR 0x30 /* TX early Control Register REG. 30 */ +#define MRCMDX 0xF0 /* RX FIFO I/O port command READ for dummy read a byte from RX SRAM */ +#define MRCMD 0xF2 /* RX FIFO I/O port command READ from RX SRAM */ +#define MWCMD 0xF8 /* TX FIFO I/O port command WRITE into TX FIFO */ +#define ISR 0xFE /* NIC Interrupt Status Register REG. FEH */ +#define IMR 0xFF /* NIC Interrupt Mask Register REG. FFH */ +#define OTCR 0x2E /* NIC Operation Test Control Register REG. 2EH */ +#define TCSCR 0x31 /* Transmit Check Sum Control Register REG. 31H */ + +#define NCR_set 0x00 +#define TCR_set 0x00 +#define TX_REQUEST 0x01 /* TCR REG. 02 TXREQ Bit [0] = 1 polling Transmit Request command */ +#define TCR_long 0x40 /* packet disable TX Jabber Timer */ +#define RCR_set 0x30 /* skip CRC_packet and skip LONG_packet */ +#define RX_ENABLE 0x01 /* RCR REG. 05 RXEN Bit [0] = 1 to enable RX machine */ +#define RCR_long 0x40 /* packet disable RX Watchdog Timer */ +#define PASS_MULTICAST 0x08 /* RCR REG. 05 PASS_ALL_MULTICAST Bit [3] = 1: RCR_set value ORed 0x08 */ +#define BPTR_set 0x37 /* BPTR REG. 08 RX Back Pressure Threshold: High Water Overflow Threshold setting 3KB and Jam_Pattern_Time = 200 us */ +#define FCTR_set 0x38 /* FCTR REG. 09 High/ Low Water Overflow Threshold setting 3KB/ 8KB */ +#define RTFCR_set 0x29 /* RTFCR REG. 0AH RX/TX Flow Control Register enable TXPEN + BKPM(TX_Half) + FLCE(RX) */ +#define ETXCSR_set 0x80 /* Early Transmit Bit [7] Enable and Threshold 0~3: 12.5%, 25%, 50%, 75% */ +#define INTR_set 0x81 /* IMR REG. FFH: PAR +PRM, or 0x81: PAR + PRM + PTM */ +#define PAR_set 0x80 /* IMR REG. FFH: PAR only, RX/TX FIFO R/W Pointer Auto Return enable */ +#define OTCR_set 0x80 /* System Clock set = 100Mhz */ +#define TCSCR_set 0x00 /* UDP TCP IP auto send check */ + +#define PHY_reset 0x8000 /* PHY reset: some registers back to default value */ +#define PHY_txab 0x05e1 /* set PHY TX advertised ability: Full-capability + Flow-control (if necessary) */ +#define PHY_mode 0x3100 /* set PHY media mode: Auto negotiation (AUTO sense) */ + +#define STD_DELAY 20 /* standard delay 20 us */ + +#define DMFE_SUCCESS 0 +#define DMFE_FAIL 1 + +#define TRUE 1 +#define FALSE 0 + +#define DM9000_PKT_READY 0x01 /* packets ready to receive */ +#define PACKET_MIN_SIZE 0x40 /* Received packet min size */ +#define MAX_PACKET_SIZE 1522 /* RX largest legal size packet with fcs & QoS */ +#define DM9000_PKT_MAX 3072 /* TX 1 packet max size without 4-byte CRC */ +//------------------------------------------------------------------------- +unsigned char ether_addr[6]={ 0x01, 0x60, 0x6E, 0x11, 0x02, 0x0F }; +//------------------------------------------------------------------------- +void iow(unsigned int reg, unsigned int data); +unsigned int ior(unsigned int reg); +void phy_write(unsigned int reg, unsigned int value); +/* DM9000_init I/O routine */ +unsigned int DM9000_init (void); +/* Transmit One Packet TX I/O routine */ +unsigned int TransmitPacket(unsigned char *data_ptr,unsigned int tx_len); +/* Receive One Packet I/O routine */ +unsigned int ReceivePacket (unsigned char *data_ptr,unsigned int *rx_len); +//------------------------------------------------------------------------- + +#endif + + + + + diff --git a/software/pong3/Makefile b/software/pong3/Makefile new file mode 100644 index 0000000..b1e3cee --- /dev/null +++ b/software/pong3/Makefile @@ -0,0 +1,1086 @@ +#------------------------------------------------------------------------------ +# VARIABLES APPENDED TO BY INCLUDED MAKEFILE FRAGMENTS +#------------------------------------------------------------------------------ + +# List of include directories for -I compiler option (-I added when used). +# Includes the BSP. +ALT_INCLUDE_DIRS := + +# List of library directories for -L linker option (-L added when used). +# Includes the BSP. +ALT_LIBRARY_DIRS := + +# List of library names for -l linker option (-l added when used). +# Includes the BSP. +ALT_LIBRARY_NAMES := + +# List of library names for -msys-lib linker option (-msys-lib added when used). +# These are libraries that might be located in the BSP and depend on the BSP +# library, or vice versa +ALT_BSP_DEP_LIBRARY_NAMES := + +# List of dependencies for the linker. This is usually the full pathname +# of each library (*.a) file. +# Includes the BSP. +ALT_LDDEPS := + +# List of root library directories that support running make to build them. +# Includes the BSP and any ALT libraries. +MAKEABLE_LIBRARY_ROOT_DIRS := + +# Generic flags passed to the compiler for different types of input files. +ALT_CFLAGS := +ALT_CXXFLAGS := +ALT_CPPFLAGS := +ALT_ASFLAGS := +ALT_LDFLAGS := + + +#------------------------------------------------------------------------------ +# The adjust-path macro +# +# If COMSPEC/ComSpec is defined, Make is launched from Windows through +# Cygwin. The adjust-path macro converts absolute windows paths into +# unix style paths (Example: c:/dir -> /c/dir). This will ensture +# paths are readable by GNU Make. +# +# If COMSPEC/ComSpec is not defined, Make is launched from linux, and no +# adjustment is necessary +# +#------------------------------------------------------------------------------ + +ifndef COMSPEC +ifdef ComSpec +COMSPEC = $(ComSpec) +endif # ComSpec +endif # COMSPEC + +ifdef COMSPEC # if Windows OS + +ifeq ($(MAKE_VERSION),3.81) +# +# adjust-path/adjust-path-mixed for Mingw Gnu Make on Windows +# +# Example Usage: +# $(call adjust-path,c:/aaa/bbb) => /c/aaa/bbb +# $(call adjust-path-mixed,/c/aaa/bbb) => c:/aaa/bbb +# $(call adjust-path-mixed,/cygdrive/c/aaa/bbb) => c:/aaa/bbb +# + +# +# adjust-path +# - converts back slash characters into forward slashes +# - if input arg ($1) is an empty string then return the empty string +# - if input arg ($1) does not contain the string ":/", then return input arg +# - using sed, convert mixed path [c:/...] into mingw path [/c/...] +define adjust-path +$(strip \ +$(if $1,\ +$(if $(findstring :/,$(subst \,/,$1)),\ +$(shell echo $(subst \,/,$1) | sed -e 's,^\([a-zA-Z]\):/,/\1/,'),\ +$(subst \,/,$1)))) +endef + +# +# adjust-path-mixed +# - converts back slash characters into forward slashes +# - if input arg ($1) is an empty string then return the empty string +# - if input arg ($1) does not begin with a forward slash '/' char, then +# return input arg +# - using sed, convert mingw path [/c/...] or cygwin path [/c/cygdrive/...] +# into a mixed path [c:/...] +define adjust-path-mixed +$(strip \ +$(if $1,\ +$(if $(findstring $(subst \,/,$1),$(patsubst /%,%,$(subst \,/,$1))),\ +$(subst \,/,$1),\ +$(shell echo $(subst \,/,$1) | sed -e 's,^/cygdrive/\([a-zA-Z]\)/,\1:/,' -e 's,^/\([a-zA-Z]\)/,\1:/,')))) +endef + +else # MAKE_VERSION != 3.81 (MAKE_VERSION == 3.80 or MAKE_VERSION == 3.79) +# +# adjust-path for Cygwin Gnu Make +# $(call adjust-path,c:/aaa/bbb) = /cygdrive/c/aaa/bbb +# $(call adjust-path-mixed,/cygdrive/c/aaa/bbb) = c:/aaa/bbb +# +adjust-path = $(if $1,$(shell cygpath -u "$1"),) +adjust-path-mixed = $(if $1,$(shell cygpath -m "$1"),) +endif + +else # !COMSPEC + +adjust-path = $1 +adjust-path-mixed = $1 + +endif # COMSPEC + + +#vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv +# GENERATED SETTINGS START v +#vvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvv + +#START GENERATED +ACTIVE_BUILD_CONFIG := default +BUILD_CONFIGS := default + +# The following TYPE comment allows tools to identify the 'type' of target this +# makefile is associated with. +# TYPE: APP_MAKEFILE + +# This following VERSION comment indicates the version of the tool used to +# generate this makefile. A makefile variable is provided for VERSION as well. +# ACDS_VERSION: 13.0sp1 +ACDS_VERSION := 13.0sp1 + +# This following BUILD_NUMBER comment indicates the build number of the tool +# used to generate this makefile. +# BUILD_NUMBER: 232 + +# Define path to the application ELF. +# It may be used by the makefile fragments so is defined before including them. +# +ELF := pong3.elf + +# Paths to C, C++, and assembly source files. +C_SRCS := hello_world.c +CXX_SRCS := +ASM_SRCS := + + +# Path to root of object file tree. +OBJ_ROOT_DIR := obj + +# Options to control objdump. +CREATE_OBJDUMP := 1 +OBJDUMP_INCLUDE_SOURCE := 1 +OBJDUMP_FULL_CONTENTS := 0 + +# Options to enable/disable optional files. +CREATE_ELF_DERIVED_FILES := 0 +CREATE_LINKER_MAP := 1 + +# Common arguments for ALT_CFLAGSs +APP_CFLAGS_DEFINED_SYMBOLS := +APP_CFLAGS_UNDEFINED_SYMBOLS := +APP_CFLAGS_OPTIMIZATION := -O0 +APP_CFLAGS_DEBUG_LEVEL := -g +APP_CFLAGS_WARNINGS := -Wall +APP_CFLAGS_USER_FLAGS := + +APP_ASFLAGS_USER := +APP_LDFLAGS_USER := + +# Linker options that have default values assigned later if not +# assigned here. +LINKER_SCRIPT := +CRT0 := +SYS_LIB := + +# Define path to the root of the BSP. +BSP_ROOT_DIR := /root/projects/pong3/software/pong3_bsp/ + +# List of application specific include directories, library directories and library names +APP_INCLUDE_DIRS := +APP_LIBRARY_DIRS := +APP_LIBRARY_NAMES := + +# Pre- and post- processor settings. +BUILD_PRE_PROCESS := +BUILD_POST_PROCESS := + +QUARTUS_PROJECT_DIR := /root/projects/pong3/hardware/ + + +#END GENERATED + +#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +# GENERATED SETTINGS END ^ +#^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + + +#------------------------------------------------------------------------------ +# DEFAULT TARGET +#------------------------------------------------------------------------------ + +# Define the variable used to echo output if not already defined. +ifeq ($(ECHO),) +ECHO := echo +endif + +# Put "all" rule before included makefile fragments because they may +# define rules and we don't want one of those to become the default rule. +.PHONY : all + +all: + @$(ECHO) [$(APP_NAME) build complete] + +all : build_pre_process libs app build_post_process + + +#------------------------------------------------------------------------------ +# VARIABLES DEPENDENT ON GENERATED CONTENT +#------------------------------------------------------------------------------ + +# Define object file directory per build configuration +CONFIG_OBJ_DIR := $(OBJ_ROOT_DIR)/$(ACTIVE_BUILD_CONFIG) + +ifeq ($(BSP_ROOT_DIR),) +$(error Edit Makefile and provide a value for BSP_ROOT_DIR) +endif + +ifeq ($(wildcard $(BSP_ROOT_DIR)),) +$(error BSP directory does not exist: $(BSP_ROOT_DIR)) +endif + +# Define absolute path to the root of the BSP. +ABS_BSP_ROOT_DIR := $(call adjust-path-mixed,$(shell cd "$(BSP_ROOT_DIR)"; pwd)) + +# Include makefile fragments. Define variable ALT_LIBRARY_ROOT_DIR before +# including each makefile fragment so that it knows the path to itself. +BSP_INCLUDE_FILE := $(BSP_ROOT_DIR)/public.mk +ALT_LIBRARY_ROOT_DIR := $(BSP_ROOT_DIR) +include $(BSP_INCLUDE_FILE) +# C2H will need this to touch the BSP public.mk and avoid the sopc file +# out-of-date error during a BSP make +ABS_BSP_INCLUDE_FILE := $(ABS_BSP_ROOT_DIR)/public.mk + + +ifneq ($(WARNING.SMALL_STACK_SIZE),) +# This WARNING is here to protect you from unknowingly using a very small stack +# If the warning is set, increase your stack size or enable the BSP small stack +# setting to eliminate the warning +$(warning WARNING: $(WARNING.SMALL_STACK_SIZE)) +endif + + +# If the BSP public.mk indicates that ALT_SIM_OPTIMIZE is set, rename the ELF +# by prefixing it with RUN_ON_HDL_SIMULATOR_ONLY_. +ifneq ($(filter -DALT_SIM_OPTIMIZE,$(ALT_CPPFLAGS)),) +ELF := RUN_ON_HDL_SIMULATOR_ONLY_$(ELF) +endif + +# If the BSP public.mk indicates that ALT_PROVIDE_GMON is set, add option to +# download_elf target +ifneq ($(filter -DALT_PROVIDE_GMON,$(ALT_CPPFLAGS)),) +GMON_OUT_FILENAME := gmon.out +WRITE_GMON_OPTION := --write-gmon $(GMON_OUT_FILENAME) +endif + +# Name of ELF application. +APP_NAME := $(basename $(ELF)) + +# Set to defaults if variables not already defined in settings. +ifeq ($(LINKER_SCRIPT),) +LINKER_SCRIPT := $(BSP_LINKER_SCRIPT) +endif +ifeq ($(CRT0),) +CRT0 := $(BSP_CRT0) +endif +ifeq ($(SYS_LIB),) +SYS_LIB := $(BSP_SYS_LIB) +endif + +OBJDUMP_NAME := $(APP_NAME).objdump +OBJDUMP_FLAGS := --disassemble --syms --all-header +ifeq ($(OBJDUMP_INCLUDE_SOURCE),1) +OBJDUMP_FLAGS += --source +endif +ifeq ($(OBJDUMP_FULL_CONTENTS),1) +OBJDUMP_FLAGS += --full-contents +endif + +# Create list of linker dependencies (*.a files). +APP_LDDEPS := $(ALT_LDDEPS) $(LDDEPS) + +# Take lists and add required prefixes. +APP_INC_DIRS := $(addprefix -I, $(ALT_INCLUDE_DIRS) $(APP_INCLUDE_DIRS) $(INC_DIRS)) +ASM_INC_PREFIX := -Wa,-I +APP_ASM_INC_DIRS := $(addprefix $(ASM_INC_PREFIX), $(ALT_INCLUDE_DIRS) $(APP_INCLUDE_DIRS) $(INC_DIRS)) +APP_LIB_DIRS := $(addprefix -L, $(ALT_LIBRARY_DIRS) $(APP_LIBRARY_DIRS) $(LIB_DIRS)) +APP_LIBS := $(addprefix -l, $(ALT_LIBRARY_NAMES) $(APP_LIBRARY_NAMES) $(LIBS)) + +ifneq ($(AVOID_NIOS2_GCC3_OPTIONS),) + +# +# Avoid Nios II GCC 3.X options. +# + +# Detect if small newlib C library is requested. +# If yes, remove the -msmallc option because it is +# now handled by other means. +ifneq ($(filter -msmallc,$(ALT_LDFLAGS)),) + ALT_LDFLAGS := $(filter-out -msmallc,$(ALT_LDFLAGS)) + ALT_C_LIBRARY := smallc +else + ALT_C_LIBRARY := c +endif + +# Put each BSP dependent library in a group to avoid circular dependencies. +APP_BSP_DEP_LIBS := $(foreach l,$(ALT_BSP_DEP_LIBRARY_NAMES),-Wl,--start-group -l$(ALT_C_LIBRARY) -lgcc -l$(l) -Wl,--end-group) + +else # !AVOID_NIOS2_GCC3_OPTIONS + +# +# Use Nios II GCC 3.X options. +# +APP_BSP_DEP_LIBS := $(addprefix -msys-lib=, $(ALT_BSP_DEP_LIBRARY_NAMES)) + +endif # !AVOID_NIOS2_GCC3_OPTIONS + +# Arguments for the C preprocessor, C/C++ compiler, assembler, and linker. +APP_CFLAGS := $(APP_CFLAGS_DEFINED_SYMBOLS) \ + $(APP_CFLAGS_UNDEFINED_SYMBOLS) \ + $(APP_CFLAGS_OPTIMIZATION) \ + $(APP_CFLAGS_DEBUG_LEVEL) \ + $(APP_CFLAGS_WARNINGS) \ + $(APP_CFLAGS_USER_FLAGS) \ + $(ALT_CFLAGS) \ + $(CFLAGS) + +# Arguments only for the C++ compiler. +APP_CXXFLAGS := $(ALT_CXXFLAGS) $(CXXFLAGS) + +# Arguments only for the C preprocessor. +# Prefix each include directory with -I. +APP_CPPFLAGS := $(APP_INC_DIRS) \ + $(ALT_CPPFLAGS) \ + $(CPPFLAGS) + +# Arguments only for the assembler. +APP_ASFLAGS := $(APP_ASM_INC_DIRS) \ + $(ALT_ASFLAGS) \ + $(APP_ASFLAGS_USER) \ + $(ASFLAGS) + +# Arguments only for the linker. +APP_LDFLAGS := $(APP_LDFLAGS_USER) + +ifneq ($(LINKER_SCRIPT),) +APP_LDFLAGS += -T'$(LINKER_SCRIPT)' +endif + +ifneq ($(AVOID_NIOS2_GCC3_OPTIONS),) + +# Avoid Nios II GCC 3.x options. +ifneq ($(CRT0),) +APP_LDFLAGS += $(CRT0) +endif + +# The equivalent of the -msys-lib option is provided +# by the GROUP() command in the linker script. +# Note this means the SYS_LIB variable is now ignored. + +else # !AVOID_NIOS2_GCC3_OPTIONS + +# Use Nios II GCC 3.x options. +ifneq ($(CRT0),) +APP_LDFLAGS += -msys-crt0='$(CRT0)' +endif +ifneq ($(SYS_LIB),) +APP_LDFLAGS += -msys-lib=$(SYS_LIB) +endif + +endif # !AVOID_NIOS2_GCC3_OPTIONS + +APP_LDFLAGS += \ + $(APP_LIB_DIRS) \ + $(ALT_LDFLAGS) \ + $(LDFLAGS) + +LINKER_MAP_NAME := $(APP_NAME).map +ifeq ($(CREATE_LINKER_MAP), 1) +APP_LDFLAGS += -Wl,-Map=$(LINKER_MAP_NAME) +endif + +# QUARTUS_PROJECT_DIR and SOPC_NAME need to be defined if you want the +# mem_init_install target of the mem_init.mk (located in the associated BSP) +# to know how to copy memory initialization files (e.g. .dat, .hex) into +# directories required for Quartus compilation or RTL simulation. + +# Defining QUARTUS_PROJECT_DIR causes mem_init_install to copy memory +# initialization files into your Quartus project directory. This is required +# to provide the initial memory contents of FPGA memories that can be +# initialized by the programming file (.sof) or Hardcopy ROMs. It is also used +# for VHDL simulation of on-chip memories. + +# Defining SOPC_NAME causes the mem_init_install target to copy memory +# initialization files into your RTL simulation directory. This is required +# to provide the initial memory contents of all memories that can be +# initialized by RTL simulation. This variable should be set to the same name +# as your SOPC Builder system name. For example, if you have a system called +# "foo.sopc", this variable should be set to "foo". + +# If SOPC_NAME is not set and QUARTUS_PROJECT_DIR is set, then derive SOPC_NAME. +ifeq ($(SOPC_NAME),) +ifneq ($(QUARTUS_PROJECT_DIR),) +SOPC_NAME := $(basename $(notdir $(wildcard $(QUARTUS_PROJECT_DIR)/*.sopcinfo))) +endif +endif + +# Defining JDI_FILE is required to specify the JTAG Debug Information File +# path. This file is generated by Quartus, and is needed along with the +# .sopcinfo file to resolve processor instance ID's from names in a multi-CPU +# systems. For multi-CPU systems, the processor instance ID is used to select +# from multiple CPU's during ELF download. + +# Both JDI_FILE and SOPCINFO_FILE are provided by the BSP if they found during +# BSP creation. If JDI_FILE is not set and QUARTUS_PROJECT_DIR is set, then +# derive JDI_FILE. We do not attempt to derive SOPCINFO_FILE since there may be +# multiple .sopcinfo files in a Quartus project. +ifeq ($(JDI_FILE),) +ifneq ($(QUARTUS_PROJECT_DIR),) +JDI_FILE := $(wildcard $(QUARTUS_PROJECT_DIR)/*.jdi) +endif +endif + +# Path to root runtime directory used for hdl simulation +RUNTIME_ROOT_DIR := $(CONFIG_OBJ_DIR)/runtime + + + +#------------------------------------------------------------------------------ +# MAKEFILE INCLUDES DEPENDENT ON GENERATED CONTENT +#------------------------------------------------------------------------------ +# mem_init.mk is a generated makefile fragment. This file defines all targets +# used to generate HDL initialization simulation files and pre-initialized +# onchip memory files. +MEM_INIT_FILE := $(BSP_ROOT_DIR)/mem_init.mk +include $(MEM_INIT_FILE) + +# Create list of object files to be built using the list of source files. +# The source file hierarchy is preserved in the object tree. +# The supported file extensions are: +# +# .c - for C files +# .cxx .cc .cpp - for C++ files +# .S .s - for assembler files +# +# Handle source files specified by --src-dir & --src-rdir differently, to +# save some processing time in calling the adjust-path macro. + +OBJ_LIST_C := $(patsubst %.c,%.o,$(filter %.c,$(C_SRCS))) +OBJ_LIST_CPP := $(patsubst %.cpp,%.o,$(filter %.cpp,$(CXX_SRCS))) +OBJ_LIST_CXX := $(patsubst %.cxx,%.o,$(filter %.cxx,$(CXX_SRCS))) +OBJ_LIST_CC := $(patsubst %.cc,%.o,$(filter %.cc,$(CXX_SRCS))) +OBJ_LIST_S := $(patsubst %.S,%.o,$(filter %.S,$(ASM_SRCS))) +OBJ_LIST_SS := $(patsubst %.s,%.o,$(filter %.s,$(ASM_SRCS))) + +OBJ_LIST := $(sort $(OBJ_LIST_C) $(OBJ_LIST_CPP) $(OBJ_LIST_CXX) \ + $(OBJ_LIST_CC) $(OBJ_LIST_S) $(OBJ_LIST_SS)) + +SDIR_OBJ_LIST_C := $(patsubst %.c,%.o,$(filter %.c,$(SDIR_C_SRCS))) +SDIR_OBJ_LIST_CPP := $(patsubst %.cpp,%.o,$(filter %.cpp,$(SDIR_CXX_SRCS))) +SDIR_OBJ_LIST_CXX := $(patsubst %.cxx,%.o,$(filter %.cxx,$(SDIR_CXX_SRCS))) +SDIR_OBJ_LIST_CC := $(patsubst %.cc,%.o,$(filter %.cc,$(SDIR_CXX_SRCS))) +SDIR_OBJ_LIST_S := $(patsubst %.S,%.o,$(filter %.S,$(SDIR_ASM_SRCS))) +SDIR_OBJ_LIST_SS := $(patsubst %.s,%.o,$(filter %.s,$(SDIR_ASM_SRCS))) + +SDIR_OBJ_LIST := $(sort $(SDIR_OBJ_LIST_C) $(SDIR_OBJ_LIST_CPP) \ + $(SDIR_OBJ_LIST_CXX) $(SDIR_OBJ_LIST_CC) $(SDIR_OBJ_LIST_S) \ + $(SDIR_OBJ_LIST_SS)) + +# Relative-pathed objects that being with "../" are handled differently. +# +# Regular objects are created as +# $(CONFIG_OBJ_DIR)//.o +# where the path structure is maintained under the obj directory. This +# applies for both absolute and relative paths; in the absolute path +# case this means the entire source path will be recreated under the obj +# directory. This is done to allow two source files with the same name +# to be included as part of the project. +# +# Note: On Cygwin, the path recreated under the obj directory will be +# the cygpath -u output path. +# +# Relative-path objects that begin with "../" cause problems under this +# scheme, as $(CONFIG_OBJ_DIR)/..// can potentially put the object +# files anywhere in the system, creating clutter and polluting the source tree. +# As such, their paths are flattened - the object file created will be +# $(CONFIG_OBJ_DIR)/.o. Due to this, two files specified with +# "../" in the beginning cannot have the same name in the project. VPATH +# will be set for these sources to allow make to relocate the source file +# via %.o rules. +# +# The following lines separate the object list into the flatten and regular +# lists, and then handles them as appropriate. + +FLATTEN_OBJ_LIST := $(filter ../%,$(OBJ_LIST)) +FLATTEN_APP_OBJS := $(addprefix $(CONFIG_OBJ_DIR)/,$(notdir $(FLATTEN_OBJ_LIST))) + +REGULAR_OBJ_LIST := $(filter-out $(FLATTEN_OBJ_LIST),$(OBJ_LIST)) +REGULAR_OBJ_LIST_C := $(filter $(OBJ_LIST_C),$(REGULAR_OBJ_LIST)) +REGULAR_OBJ_LIST_CPP := $(filter $(OBJ_LIST_CPP),$(REGULAR_OBJ_LIST)) +REGULAR_OBJ_LIST_CXX := $(filter $(OBJ_LIST_CXX),$(REGULAR_OBJ_LIST)) +REGULAR_OBJ_LIST_CC := $(filter $(OBJ_LIST_CC),$(REGULAR_OBJ_LIST)) +REGULAR_OBJ_LIST_S := $(filter $(OBJ_LIST_S),$(REGULAR_OBJ_LIST)) +REGULAR_OBJ_LIST_SS := $(filter $(OBJ_LIST_SS),$(REGULAR_OBJ_LIST)) + +FLATTEN_SDIR_OBJ_LIST := $(filter ../%,$(SDIR_OBJ_LIST)) +FLATTEN_SDIR_APP_OBJS := $(addprefix $(CONFIG_OBJ_DIR)/,$(notdir $(FLATTEN_SDIR_OBJ_LIST))) + +REGULAR_SDIR_OBJ_LIST := $(filter-out $(FLATTEN_SDIR_OBJ_LIST),$(SDIR_OBJ_LIST)) +REGULAR_SDIR_OBJ_LIST_C := $(filter $(SDIR_OBJ_LIST_C),$(REGULAR_SDIR_OBJ_LIST)) +REGULAR_SDIR_OBJ_LIST_CPP := $(filter $(SDIR_OBJ_LIST_CPP),$(REGULAR_SDIR_OBJ_LIST)) +REGULAR_SDIR_OBJ_LIST_CXX := $(filter $(SDIR_OBJ_LIST_CXX),$(REGULAR_SDIR_OBJ_LIST)) +REGULAR_SDIR_OBJ_LIST_CC := $(filter $(SDIR_OBJ_LIST_CC),$(REGULAR_SDIR_OBJ_LIST)) +REGULAR_SDIR_OBJ_LIST_S := $(filter $(SDIR_OBJ_LIST_S),$(REGULAR_SDIR_OBJ_LIST)) +REGULAR_SDIR_OBJ_LIST_SS := $(filter $(SDIR_OBJ_LIST_SS),$(REGULAR_SDIR_OBJ_LIST)) + +VPATH := $(sort $(dir $(FLATTEN_OBJ_LIST)) $(dir $(FLATTEN_SDIR_OBJ_LIST))) + +APP_OBJS_C := $(addprefix $(CONFIG_OBJ_DIR)/,\ + $(REGULAR_SDIR_OBJ_LIST_C) \ + $(foreach s,$(REGULAR_OBJ_LIST_C),$(call adjust-path,$s))) + +APP_OBJS_CPP := $(addprefix $(CONFIG_OBJ_DIR)/,\ + $(REGULAR_SDIR_OBJ_LIST_CPP) \ + $(foreach s,$(REGULAR_OBJ_LIST_CPP),$(call adjust-path,$s))) + +APP_OBJS_CXX := $(addprefix $(CONFIG_OBJ_DIR)/,\ + $(REGULAR_SDIR_OBJ_LIST_CXX) \ + $(foreach s,$(REGULAR_OBJ_LIST_CXX),$(call adjust-path,$s))) + +APP_OBJS_CC := $(addprefix $(CONFIG_OBJ_DIR)/,\ + $(REGULAR_SDIR_OBJ_LIST_CC) \ + $(foreach s,$(REGULAR_OBJ_LIST_CC),$(call adjust-path,$s))) + +APP_OBJS_S := $(addprefix $(CONFIG_OBJ_DIR)/,\ + $(REGULAR_SDIR_OBJ_LIST_S) \ + $(foreach s,$(REGULAR_OBJ_LIST_S),$(call adjust-path,$s))) + +APP_OBJS_SS := $(addprefix $(CONFIG_OBJ_DIR)/,\ + $(REGULAR_SDIR_OBJ_LIST_SS) \ + $(foreach s,$(REGULAR_OBJ_LIST_SS),$(call adjust-path,$s))) + +APP_OBJS := $(APP_OBJS_C) $(APP_OBJS_CPP) $(APP_OBJS_CXX) $(APP_OBJS_CC) \ + $(APP_OBJS_S) $(APP_OBJS_SS) \ + $(FLATTEN_APP_OBJS) $(FLATTEN_SDIR_APP_OBJS) + +# Add any extra user-provided object files. +APP_OBJS += $(OBJS) + +# Create list of dependancy files for each object file. +APP_DEPS := $(APP_OBJS:.o=.d) + +# Patch the Elf file with system specific information + +# Patch the Elf with the name of the sopc system +ifneq ($(SOPC_NAME),) +ELF_PATCH_FLAG += --sopc_system_name $(SOPC_NAME) +endif + +# Patch the Elf with the absolute path to the Quartus Project Directory +ifneq ($(QUARTUS_PROJECT_DIR),) +ABS_QUARTUS_PROJECT_DIR := $(call adjust-path-mixed,$(shell cd "$(QUARTUS_PROJECT_DIR)"; pwd)) +ELF_PATCH_FLAG += --quartus_project_dir "$(ABS_QUARTUS_PROJECT_DIR)" +endif + +# Patch the Elf and download args with the JDI_FILE if specified +ifneq ($(wildcard $(JDI_FILE)),) +ELF_PATCH_FLAG += --jdi $(JDI_FILE) +DOWNLOAD_JDI_FLAG := --jdi $(JDI_FILE) +endif + +# Patch the Elf with the SOPCINFO_FILE if specified +ifneq ($(wildcard $(SOPCINFO_FILE)),) +ELF_PATCH_FLAG += --sopcinfo $(SOPCINFO_FILE) +endif + +# Use the DOWNLOAD_CABLE variable to specify which JTAG cable to use. +# This is not needed if you only have one cable. +ifneq ($(DOWNLOAD_CABLE),) +DOWNLOAD_CABLE_FLAG := --cable '$(DOWNLOAD_CABLE)' +endif + + +#------------------------------------------------------------------------------ +# BUILD PRE/POST PROCESS +#------------------------------------------------------------------------------ +build_pre_process : + $(BUILD_PRE_PROCESS) + +build_post_process : + $(BUILD_POST_PROCESS) + +.PHONY: build_pre_process build_post_process + + +#------------------------------------------------------------------------------ +# TOOLS +#------------------------------------------------------------------------------ + +# +# Set tool default variables if not already defined. +# If these are defined, they would typically be defined in an +# included makefile fragment. +# +ifeq ($(DEFAULT_CROSS_COMPILE),) +DEFAULT_CROSS_COMPILE := nios2-elf- +endif + +ifeq ($(DEFAULT_STACK_REPORT),) +DEFAULT_STACKREPORT := nios2-stackreport +endif + +ifeq ($(DEFAULT_DOWNLOAD),) +DEFAULT_DOWNLOAD := nios2-download +endif + +ifeq ($(DEFAULT_FLASHPROG),) +DEFAULT_FLASHPROG := nios2-flash-programmer +endif + +ifeq ($(DEFAULT_ELFPATCH),) +DEFAULT_ELFPATCH := nios2-elf-insert +endif + +ifeq ($(DEFAULT_RM),) +DEFAULT_RM := rm -f +endif + +ifeq ($(DEFAULT_CP),) +DEFAULT_CP := cp -f +endif + +ifeq ($(DEFAULT_MKDIR),) +DEFAULT_MKDIR := mkdir -p +endif + +# +# Set tool variables to defaults if not already defined. +# If these are defined, they would typically be defined by a +# setting in the generated portion of this makefile. +# +ifeq ($(CROSS_COMPILE),) +CROSS_COMPILE := $(DEFAULT_CROSS_COMPILE) +endif + +ifeq ($(origin CC),default) +CC := $(CROSS_COMPILE)gcc -xc +endif + +ifeq ($(origin CXX),default) +CXX := $(CROSS_COMPILE)gcc -xc++ +endif + +ifeq ($(origin AS),default) +AS := $(CROSS_COMPILE)gcc +endif + +ifeq ($(origin AR),default) +AR := $(CROSS_COMPILE)ar +endif + +ifeq ($(origin LD),default) +LD := $(CROSS_COMPILE)g++ +endif + +ifeq ($(origin NM),default) +NM := $(CROSS_COMPILE)nm +endif + +ifeq ($(origin RM),default) +RM := $(DEFAULT_RM) +endif + +ifeq ($(origin CP),default) +CP := $(DEFAULT_CP) +endif + +ifeq ($(OBJDUMP),) +OBJDUMP := $(CROSS_COMPILE)objdump +endif + +ifeq ($(OBJCOPY),) +OBJCOPY := $(CROSS_COMPILE)objcopy +endif + +ifeq ($(STACKREPORT),) +ifeq ($(CROSS_COMPILE),nios2-elf-) +STACKREPORT := $(DEFAULT_STACKREPORT) +else +DISABLE_STACKREPORT := 1 +endif +endif + +ifeq ($(DOWNLOAD),) +DOWNLOAD := $(DEFAULT_DOWNLOAD) +endif + +ifeq ($(FLASHPROG),) +FLASHPROG := $(DEFAULT_FLASHPROG) +endif + +ifeq ($(ELFPATCH),) +ELFPATCH := $(DEFAULT_ELFPATCH) +endif + +ifeq ($(MKDIR),) +MKDIR := $(DEFAULT_MKDIR) +endif + +#------------------------------------------------------------------------------ +# PATTERN RULES TO BUILD OBJECTS +#------------------------------------------------------------------------------ + +define compile.c +@$(ECHO) Info: Compiling $< to $@ +@$(MKDIR) $(@D) +$(CC) -MP -MMD -c $(APP_CPPFLAGS) $(APP_CFLAGS) -o $@ $< +$(CC_POST_PROCESS) +endef + +define compile.cpp +@$(ECHO) Info: Compiling $< to $@ +@$(MKDIR) $(@D) +$(CXX) -MP -MMD -c $(APP_CPPFLAGS) $(APP_CXXFLAGS) $(APP_CFLAGS) -o $@ $< +$(CXX_POST_PROCESS) +endef + +# If assembling with the compiler, ensure "-Wa," is prepended to all APP_ASFLAGS +ifeq ($(AS),$(patsubst %as,%,$(AS))) +COMMA := , +APP_ASFLAGS := $(filter-out $(APP_CFLAGS),$(addprefix -Wa$(COMMA),$(patsubst -Wa$(COMMA)%,%,$(APP_ASFLAGS)))) +endif + +define compile.s +@$(ECHO) Info: Assembling $< to $@ +@$(MKDIR) $(@D) +$(AS) -MP -MMD -c $(APP_CPPFLAGS) $(APP_CFLAGS) $(APP_ASFLAGS) -o $@ $< +$(AS_POST_PROCESS) +endef + +ifeq ($(MAKE_VERSION),3.81) +.SECONDEXPANSION: + +$(APP_OBJS_C): $(CONFIG_OBJ_DIR)/%.o: $$(call adjust-path-mixed,%.c) + $(compile.c) + +$(APP_OBJS_CPP): $(CONFIG_OBJ_DIR)/%.o: $$(call adjust-path-mixed,%.cpp) + $(compile.cpp) + +$(APP_OBJS_CC): $(CONFIG_OBJ_DIR)/%.o: $$(call adjust-path-mixed,%.cc) + $(compile.cpp) + +$(APP_OBJS_CXX): $(CONFIG_OBJ_DIR)/%.o: $$(call adjust-path-mixed,%.cxx) + $(compile.cpp) + +$(APP_OBJS_S): $(CONFIG_OBJ_DIR)/%.o: $$(call adjust-path-mixed,%.S) + $(compile.s) + +$(APP_OBJS_SS): $(CONFIG_OBJ_DIR)/%.o: $$(call adjust-path-mixed,%.s) + $(compile.s) + +endif # MAKE_VERSION != 3.81 + +$(CONFIG_OBJ_DIR)/%.o: %.c + $(compile.c) + +$(CONFIG_OBJ_DIR)/%.o: %.cpp + $(compile.cpp) + +$(CONFIG_OBJ_DIR)/%.o: %.cc + $(compile.cpp) + +$(CONFIG_OBJ_DIR)/%.o: %.cxx + $(compile.cpp) + +$(CONFIG_OBJ_DIR)/%.o: %.S + $(compile.s) + +$(CONFIG_OBJ_DIR)/%.o: %.s + $(compile.s) + + +#------------------------------------------------------------------------------ +# PATTERN RULES TO INTERMEDIATE FILES +#------------------------------------------------------------------------------ + +$(CONFIG_OBJ_DIR)/%.s: %.c + @$(ECHO) Info: Compiling $< to $@ + @$(MKDIR) $(@D) + $(CC) -S $(APP_CPPFLAGS) $(APP_CFLAGS) -o $@ $< + +$(CONFIG_OBJ_DIR)/%.s: %.cpp + @$(ECHO) Info: Compiling $< to $@ + @$(MKDIR) $(@D) + $(CXX) -S $(APP_CPPFLAGS) $(APP_CXXFLAGS) $(APP_CFLAGS) -o $@ $< + +$(CONFIG_OBJ_DIR)/%.s: %.cc + @$(ECHO) Info: Compiling $< to $@ + @$(MKDIR) $(@D) + $(CXX) -S $(APP_CPPFLAGS) $(APP_CXXFLAGS) $(APP_CFLAGS) -o $@ $< + +$(CONFIG_OBJ_DIR)/%.s: %.cxx + @$(ECHO) Info: Compiling $< to $@ + @$(MKDIR) $(@D) + $(CXX) -S $(APP_CPPFLAGS) $(APP_CXXFLAGS) $(APP_CFLAGS) -o $@ $< + +$(CONFIG_OBJ_DIR)/%.i: %.c + @$(ECHO) Info: Compiling $< to $@ + @$(MKDIR) $(@D) + $(CC) -E $(APP_CPPFLAGS) $(APP_CFLAGS) -o $@ $< + +$(CONFIG_OBJ_DIR)/%.i: %.cpp + @$(ECHO) Info: Compiling $< to $@ + @$(MKDIR) $(@D) + $(CXX) -E $(APP_CPPFLAGS) $(APP_CXXFLAGS) $(APP_CFLAGS) -o $@ $< + +$(CONFIG_OBJ_DIR)/%.i: %.cc + @$(ECHO) Info: Compiling $< to $@ + @$(MKDIR) $(@D) + $(CXX) -E $(APP_CPPFLAGS) $(APP_CXXFLAGS) $(APP_CFLAGS) -o $@ $< + +$(CONFIG_OBJ_DIR)/%.i: %.cxx + @$(ECHO) Info: Compiling $< to $@ + @$(MKDIR) $(@D) + $(CXX) -E $(APP_CPPFLAGS) $(APP_CXXFLAGS) $(APP_CFLAGS) -o $@ $< + + +#------------------------------------------------------------------------------ +# TARGET RULES +#------------------------------------------------------------------------------ + +.PHONY : help +help : + @$(ECHO) "Summary of Makefile targets" + @$(ECHO) " Build targets:" + @$(ECHO) " all (default) - Application and all libraries (including BSP)" + @$(ECHO) " bsp - Just the BSP" + @$(ECHO) " libs - All libraries (including BSP)" + @$(ECHO) " flash - All flash files" + @$(ECHO) " mem_init_generate - All memory initialization files" +ifeq ($(QSYS),1) + @$(ECHO) " mem_init_install - This target is deprecated for QSys Systems" + @$(ECHO) " --> Use the mem_init_generate target and then" + @$(ECHO) " add the generated meminit.qip file to your" + @$(ECHO) " Quartus II Project." +else # if QSYS != 1 + @$(ECHO) " mem_init_install - Copy memory initialization files to Quartus II project" +endif # QSYS == 1 + @$(ECHO) + @$(ECHO) " Clean targets:" + @$(ECHO) " clean_all - Application and all libraries (including BSP)" + @$(ECHO) " clean - Just the application" + @$(ECHO) " clean_bsp - Just the BSP" + @$(ECHO) " clean_libs - All libraries (including BSP)" + @$(ECHO) + @$(ECHO) " Run targets:" + @$(ECHO) " download-elf - Download and run your elf executable" + @$(ECHO) " program-flash - Program flash contents to the board" + +# Handy rule to skip making libraries and just make application. +.PHONY : app +app : $(ELF) + +ifeq ($(CREATE_OBJDUMP), 1) +app : $(OBJDUMP_NAME) +endif + +ifeq ($(CREATE_ELF_DERIVED_FILES),1) +app : elf_derived_files +endif + +.PHONY: elf_derived_files +elf_derived_files: default_mem_init + +# Handy rule for making just the BSP. +.PHONY : bsp +bsp : + @$(ECHO) Info: Building $(BSP_ROOT_DIR) + @$(MAKE) --no-print-directory -C $(BSP_ROOT_DIR) + + +# Make sure all makeable libraries (including the BSP) are up-to-date. +LIB_TARGETS := $(patsubst %,%-recurs-make-lib,$(MAKEABLE_LIBRARY_ROOT_DIRS)) + +.PHONY : libs +libs : $(LIB_TARGETS) + +ifneq ($(strip $(LIB_TARGETS)),) +$(LIB_TARGETS): %-recurs-make-lib: + @$(ECHO) Info: Building $* + $(MAKE) --no-print-directory -C $* +endif + +ifneq ($(strip $(APP_LDDEPS)),) +$(APP_LDDEPS): libs + @true +endif + +# Rules to force your project to rebuild or relink +# .force_relink file will cause any application that depends on this project to relink +# .force_rebuild file will cause this project to rebuild object files +# .force_rebuild_all file will cause this project and any project that depends on this project to rebuild object files + +FORCE_RELINK_DEP := .force_relink +FORCE_REBUILD_DEP := .force_rebuild +FORCE_REBUILD_ALL_DEP := .force_rebuild_all +FORCE_REBUILD_DEP_LIST := $(CONFIG_OBJ_DIR)/$(FORCE_RELINK_DEP) $(CONFIG_OBJ_DIR)/$(FORCE_REBUILD_DEP) $(FORCE_REBUILD_ALL_DEP) + +$(FORCE_REBUILD_DEP_LIST): + +$(APP_OBJS): $(wildcard $(CONFIG_OBJ_DIR)/$(FORCE_REBUILD_DEP)) $(wildcard $(addsuffix /$(FORCE_REBUILD_ALL_DEP), . $(ALT_LIBRARY_DIRS))) + +$(ELF): $(wildcard $(addsuffix /$(FORCE_RELINK_DEP), $(CONFIG_OBJ_DIR) $(ALT_LIBRARY_DIRS))) + + +# Clean just the application. +.PHONY : clean +ifeq ($(CREATE_ELF_DERIVED_FILES),1) +clean : clean_elf_derived_files +endif + +clean : + @$(RM) -r $(ELF) $(OBJDUMP_NAME) $(LINKER_MAP_NAME) $(OBJ_ROOT_DIR) $(RUNTIME_ROOT_DIR) $(FORCE_REBUILD_DEP_LIST) + @$(ECHO) [$(APP_NAME) clean complete] + +# Clean just the BSP. +.PHONY : clean_bsp +clean_bsp : + @$(ECHO) Info: Cleaning $(BSP_ROOT_DIR) + @$(MAKE) --no-print-directory -C $(BSP_ROOT_DIR) clean + +# Clean all makeable libraries including the BSP. +LIB_CLEAN_TARGETS := $(patsubst %,%-recurs-make-clean-lib,$(MAKEABLE_LIBRARY_ROOT_DIRS)) + +.PHONY : clean_libs +clean_libs : $(LIB_CLEAN_TARGETS) + +ifneq ($(strip $(LIB_CLEAN_TARGETS)),) +$(LIB_CLEAN_TARGETS): %-recurs-make-clean-lib: + @$(ECHO) Info: Cleaning $* + $(MAKE) --no-print-directory -C $* clean +endif + +.PHONY: clean_elf_derived_files +clean_elf_derived_files: mem_init_clean + +# Clean application and all makeable libraries including the BSP. +.PHONY : clean_all +clean_all : clean mem_init_clean clean_libs + +# Include the dependency files unless the make goal is performing a clean +# of the application. +ifneq ($(firstword $(MAKECMDGOALS)),clean) +ifneq ($(firstword $(MAKECMDGOALS)),clean_all) +-include $(APP_DEPS) +endif +endif + +.PHONY : download-elf +download-elf : $(ELF) + @if [ "$(DOWNLOAD)" = "none" ]; \ + then \ + $(ECHO) Downloading $(ELF) not supported; \ + else \ + $(ECHO) Info: Downloading $(ELF); \ + $(DOWNLOAD) --go --cpu_name=$(CPU_NAME) $(DOWNLOAD_CABLE_FLAG) $(SOPC_SYSID_FLAG) $(DOWNLOAD_JDI_FLAG) $(WRITE_GMON_OPTION) $(ELF); \ + fi + +# Delete the target of a rule if it has changed and its commands exit +# with a nonzero exit status. +.DELETE_ON_ERROR: + +# Rules for flash programming commands +PROGRAM_FLASH_SUFFIX := -program +PROGRAM_FLASH_TARGET := $(addsuffix $(PROGRAM_FLASH_SUFFIX), $(FLASH_FILES)) + +.PHONY : program-flash +program-flash : $(PROGRAM_FLASH_TARGET) + +.PHONY : $(PROGRAM_FLASH_TARGET) +$(PROGRAM_FLASH_TARGET) : flash + @if [ "$(FLASHPROG)" = "none" ]; \ + then \ + $(ECHO) Programming flash not supported; \ + else \ + $(ECHO) Info: Programming $(basename $@).flash; \ + if [ -z "$($(basename $@)_EPCS_FLAGS)" ]; \ + then \ + $(ECHO) $(FLASHPROG) $(SOPC_SYSID_FLAG) --base=$($(basename $@)_START) $(basename $@).flash; \ + $(FLASHPROG) $(DOWNLOAD_CABLE_FLAG) $(SOPC_SYSID_FLAG) --base=$($(basename $@)_START) $(basename $@).flash; \ + else \ + $(ECHO) $(FLASHPROG) $(SOPC_SYSID_FLAG) --epcs --base=$($(basename $@)_START) $(basename $@).flash; \ + $(FLASHPROG) $(DOWNLOAD_CABLE_FLAG) $(SOPC_SYSID_FLAG) --epcs --base=$($(basename $@)_START) $(basename $@).flash; \ + fi \ + fi + + +# Rules for simulating with an HDL Simulator [QSYS only] +ifeq ($(QSYS),1) +IP_MAKE_SIMSCRIPT := ip-make-simscript + +ifeq ($(VSIM),) +VSIM_EXE := "$(if $(VSIM_DIR),$(VSIM_DIR)/,)vsim" +ifeq ($(ENABLE_VSIM_GUI),1) +VSIM := $(VSIM_EXE) -gui +else +VSIM := $(VSIM_EXE) -c +endif # ENABLE_VSIM_GUI == 1 +endif # VSIM not set + +ifeq ($(SPD),) +ifneq ($(ABS_QUARTUS_PROJECT_DIR),) +ifneq ($(SOPC_NAME),) +SPD := $(ABS_QUARTUS_PROJECT_DIR)/$(SOPC_NAME)_tb.spd +endif # SOPC_NAME set +endif # ABS_QUARTUS_PROJECT_DIR set +endif # SPD == empty string + +ifeq ($(MSIM_SCRIPT),) +SIM_SCRIPT_DIR := $(RUNTIME_ROOT_DIR)/sim +MSIM_SCRIPT := $(SIM_SCRIPT_DIR)/mentor/msim_setup.tcl +endif # MSIM_SCRIPT == empty string + +ifeq ($(MAKE_VERSION),3.81) +ABS_MEM_INIT_DESCRIPTOR_FILE := $(abspath $(MEM_INIT_DESCRIPTOR_FILE)) +else +ABS_MEM_INIT_DESCRIPTOR_FILE := $(call adjust-path-mixed,$(shell pwd))/$(MEM_INIT_DESCRIPTOR_FILE) +endif + +$(MSIM_SCRIPT): $(SPD) $(MEM_INIT_DESCRIPTOR_FILE) +ifeq ($(SPD),) + $(error No SPD file specified. Ensure QUARTUS_PROJECT_DIR variable is set) +endif + @$(MKDIR) $(SIM_SCRIPT_DIR) + $(IP_MAKE_SIMSCRIPT) --spd=$(SPD) --spd=$(MEM_INIT_DESCRIPTOR_FILE) --output-directory=$(SIM_SCRIPT_DIR) + +VSIM_COMMAND = \ + cd $(dir $(MSIM_SCRIPT)) && \ + $(VSIM) -do "do $(notdir $(MSIM_SCRIPT)); ld; $(if $(VSIM_RUN_TIME),run ${VSIM_RUN_TIME};quit;)" + +.PHONY: sim +sim: $(MSIM_SCRIPT) mem_init_generate +ifeq ($(MSIM_SCRIPT),) + $(error MSIM_SCRIPT not set) +endif + $(VSIM_COMMAND) + +endif # QSYS == 1 + + +#------------------------------------------------------------------------------ +# ELF TARGET RULE +#------------------------------------------------------------------------------ +# Rule for constructing the executable elf file. +$(ELF) : $(APP_OBJS) $(LINKER_SCRIPT) $(APP_LDDEPS) + @$(ECHO) Info: Linking $@ + $(LD) $(APP_LDFLAGS) $(APP_CFLAGS) -o $@ $(filter-out $(CRT0),$(APP_OBJS)) $(APP_LIBS) $(APP_BSP_DEP_LIBS) +ifneq ($(DISABLE_ELFPATCH),1) + $(ELFPATCH) $@ $(ELF_PATCH_FLAG) +endif +ifneq ($(DISABLE_STACKREPORT),1) + @bash -c "$(STACKREPORT) $@" +endif + +$(OBJDUMP_NAME) : $(ELF) + @$(ECHO) Info: Creating $@ + $(OBJDUMP) $(OBJDUMP_FLAGS) $< >$@ + +# Rule for printing the name of the elf file +.PHONY: print-elf-name +print-elf-name: + @$(ECHO) $(ELF) + + diff --git a/software/pong3/Nios II/makefile b/software/pong3/Nios II/makefile new file mode 100644 index 0000000..32daa76 --- /dev/null +++ b/software/pong3/Nios II/makefile @@ -0,0 +1,58 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +-include ../makefile.init + +RM := rm + +# All of the sources participating in the build are defined here +-include sources.mk +-include subdir.mk +-include objects.mk + +ifneq ($(MAKECMDGOALS),clean) +ifneq ($(strip $(C++_DEPS)),) +-include $(C++_DEPS) +endif +ifneq ($(strip $(C_DEPS)),) +-include $(C_DEPS) +endif +ifneq ($(strip $(CC_DEPS)),) +-include $(CC_DEPS) +endif +ifneq ($(strip $(CPP_DEPS)),) +-include $(CPP_DEPS) +endif +ifneq ($(strip $(CXX_DEPS)),) +-include $(CXX_DEPS) +endif +ifneq ($(strip $(C_UPPER_DEPS)),) +-include $(C_UPPER_DEPS) +endif +endif + +-include ../makefile.defs + +# Add inputs and outputs from these tool invocations to the build variables + +# All Target +all: + +# Tool invocations +: $(OBJS) $(USER_OBJS) + @echo 'Building target: $@' + @echo 'Invoking: GCC C++ Linker' + g++ -o $(OBJS) $(USER_OBJS) $(LIBS) + @echo 'Finished building target: $@' + @echo ' ' + +# Other Targets +clean: + -$(RM) $(OBJS)$(C++_DEPS)$(C_DEPS)$(CC_DEPS)$(CPP_DEPS)$(EXECUTABLES)$(CXX_DEPS)$(C_UPPER_DEPS) + -@echo ' ' + +.PHONY: all clean dependents +.SECONDARY: + +-include ../makefile.targets diff --git a/software/pong3/Nios II/objects.mk b/software/pong3/Nios II/objects.mk new file mode 100644 index 0000000..742c2da --- /dev/null +++ b/software/pong3/Nios II/objects.mk @@ -0,0 +1,8 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +USER_OBJS := + +LIBS := + diff --git a/software/pong3/Nios II/sources.mk b/software/pong3/Nios II/sources.mk new file mode 100644 index 0000000..5b37ead --- /dev/null +++ b/software/pong3/Nios II/sources.mk @@ -0,0 +1,27 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +O_SRCS := +CPP_SRCS := +C_UPPER_SRCS := +C_SRCS := +S_UPPER_SRCS := +OBJ_SRCS := +ASM_SRCS := +CXX_SRCS := +C++_SRCS := +CC_SRCS := +OBJS := +C++_DEPS := +C_DEPS := +CC_DEPS := +CPP_DEPS := +EXECUTABLES := +CXX_DEPS := +C_UPPER_DEPS := + +# Every subdirectory with source files must be described here +SUBDIRS := \ +. \ + diff --git a/software/pong3/Nios II/subdir.mk b/software/pong3/Nios II/subdir.mk new file mode 100644 index 0000000..813f2c3 --- /dev/null +++ b/software/pong3/Nios II/subdir.mk @@ -0,0 +1,41 @@ +################################################################################ +# Automatically-generated file. Do not edit! +################################################################################ + +# Add inputs and outputs from these tool invocations to the build variables +C_UPPER_SRCS += \ +../DM9000A.C + +C_SRCS += \ +../hello_led.c \ +../pong3.c + +OBJS += \ +./DM9000A.o \ +./hello_led.o \ +./pong3.o + +C_DEPS += \ +./hello_led.d \ +./pong3.d + +C_UPPER_DEPS += \ +./DM9000A.d + + +# Each subdirectory must supply rules for building sources it contributes +%.o: ../%.C + @echo 'Building file: $<' + @echo 'Invoking: GCC C++ Compiler' + g++ -U__FLT_EVAL_METHOD__ -U__FLT_EPSILON__ -U__DEC64_MANT_DIG__ -U__FLT_MAX_EXP__ -U__DBL_MIN__ -U__LDBL_EPSILON__ -U__DEC64_MIN__ -U__SCHAR_MAX__ -U__DEC128_MANT_DIG__ -U__DBL_MIN_10_EXP__ -U__unix__ -U__DBL_DENORM_MIN__ -U__REGISTER_PREFIX__ -U__SHRT_MAX__ -U__DBL_HAS_DENORM__ -U__SIZEOF_WCHAR_T__ -U__SIZEOF_PTRDIFF_T__ -U__DEC32_MAX__ -U__linux__ -U__SIZEOF_DOUBLE__ -U__LDBL_HAS_QUIET_NAN__ -U__FLT_MIN_EXP__ -U__LDBL_MANT_DIG__ -U__DEC32_EPSILON__ -U__FLT_DENORM_MIN__ -U__CHAR32_TYPE__ -U__LDBL_DIG__ -U__ELF__ -U__DEC128_MAX__ -U__DEC32_MIN_EXP__ -U__LDBL_DENORM_MIN__ -U__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 -Ui386 -U_GNU_SOURCE -U__FLT_MIN_10_EXP__ -U__WCHAR_MAX__ -U__LDBL_HAS_DENORM__ -U__GNUC_PATCHLEVEL__ -U__DEC32_SUBNORMAL_MIN__ -U__GXX_ABI_VERSION -U__SIZEOF_POINTER__ -U__DBL_MIN_EXP__ -U__FLT_MAX_10_EXP__ -U__GNUC_RH_RELEASE__ -U__LDBL_HAS_INFINITY__ -U__DEC64_MIN_EXP__ -U__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 -U__SIZEOF_LONG_DOUBLE__ -U__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 -U__DEC32_MIN__ -U__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 -U__EXCEPTIONS -U__LDBL_MIN_10_EXP__ -U__i386 -U__SIZEOF_LONG_LONG__ -U__DEPRECATED -U__DEC64_MAX_EXP__ -U__FLT_MIN__ -U__DBL_EPSILON__ -U__GXX_RTTI -U__LDBL_MAX_EXP__ -U__DEC128_MAX_EXP__ -U__SIZEOF_SIZE_T__ -U__DBL_DIG__ -U__FLT_MANT_DIG__ -U__FLT_RADIX__ -U__GNUC_MINOR__ -U__DEC64_MAX__ -U__BIGGEST_ALIGNMENT__ -U__gnu_linux__ -U__INTMAX_TYPE__ -U__FLT_DIG__ -U__LDBL_MIN_EXP__ -U__DECIMAL_BID_FORMAT__ -U__pentiumpro__ -U__i686 -U__INT_MAX__ -U__DEC64_EPSILON__ -U__LONG_LONG_MAX__ -U__DBL_HAS_INFINITY__ -U__FLT_HAS_QUIET_NAN__ -U__DBL_MAX_10_EXP__ -U__FLT_HAS_DENORM__ -U__STDC__ -U__LDBL_MIN__ -U__NO_INLINE__ -U__DEC128_EPSILON__ -U__GNUC__ -U__SIZEOF_FLOAT__ -U__INTMAX_MAX__ -U__DEC32_MAX_EXP__ -U__unix -U__VERSION__ -U__DEC128_MIN_EXP__ -U__SIZEOF_WINT_T__ -U__SIZEOF_INT__ -U__USER_LABEL_PREFIX__ -U__LONG_MAX__ -U__pentiumpro -U__PTRDIFF_TYPE__ -U__CHAR_BIT__ -U__i386__ -U__DEC128_SUBNORMAL_MIN__ -U__DBL_HAS_QUIET_NAN__ -U__SIZEOF_SHORT__ -U__DBL_MAX_EXP__ -U__WINT_TYPE__ -U__DEC_EVAL_METHOD__ -U__DEC64_SUBNORMAL_MIN__ -U__DBL_MANT_DIG__ -U__FLT_MAX__ -U__linux -U__GNUC_GNU_INLINE__ -U__DEC128_MIN__ -U__SIZE_TYPE__ -U__FLT_HAS_INFINITY__ -U__DEC32_MANT_DIG__ -U__GCC_HAVE_DWARF2_CFI_ASM -U__STDC_HOSTED__ -Ulinux -U__DECIMAL_DIG__ -U__LDBL_MAX_10_EXP__ -U__GXX_WEAK__ -U__DBL_MAX__ -U__i686__ -U__SIZEOF_LONG__ -U__UINTMAX_TYPE__ -U__LDBL_MAX__ -U__FINITE_MATH_ONLY__ -U__WCHAR_TYPE__ -U__GNUG__ -Uunix -U__CHAR16_TYPE__ -U__cplusplus -O2 -g -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<" + @echo 'Finished building: $<' + @echo ' ' + +%.o: ../%.c + @echo 'Building file: $<' + @echo 'Invoking: GCC C Compiler' + gcc -U__FLT_EVAL_METHOD__ -U__FLT_EPSILON__ -U__DEC64_MANT_DIG__ -U__FLT_MAX_EXP__ -U__DBL_MIN__ -U__LDBL_EPSILON__ -U__DEC64_MIN__ -U__SCHAR_MAX__ -U__DEC128_MANT_DIG__ -U__DBL_MIN_10_EXP__ -U__unix__ -U__DBL_DENORM_MIN__ -U__REGISTER_PREFIX__ -U__SHRT_MAX__ -U__DBL_HAS_DENORM__ -U__SIZEOF_WCHAR_T__ -U__SIZEOF_PTRDIFF_T__ -U__DEC32_MAX__ -U__linux__ -U__SIZEOF_DOUBLE__ -U__LDBL_HAS_QUIET_NAN__ -U__FLT_MIN_EXP__ -U__LDBL_MANT_DIG__ -U__DEC32_EPSILON__ -U__FLT_DENORM_MIN__ -U__CHAR32_TYPE__ -U__LDBL_DIG__ -U__ELF__ -U__DEC32_MIN_EXP__ -U__DEC128_MAX__ -U__LDBL_DENORM_MIN__ -U__GCC_HAVE_SYNC_COMPARE_AND_SWAP_8 -Ui386 -U__FLT_MIN_10_EXP__ -U__WCHAR_MAX__ -U__LDBL_HAS_DENORM__ -U__GNUC_PATCHLEVEL__ -U__DEC32_SUBNORMAL_MIN__ -U__GXX_ABI_VERSION -U__SIZEOF_POINTER__ -U__DBL_MIN_EXP__ -U__LDBL_HAS_INFINITY__ -U__GNUC_RH_RELEASE__ -U__FLT_MAX_10_EXP__ -U__DEC64_MIN_EXP__ -U__GCC_HAVE_SYNC_COMPARE_AND_SWAP_4 -U__GCC_HAVE_SYNC_COMPARE_AND_SWAP_1 -U__SIZEOF_LONG_DOUBLE__ -U__DEC32_MIN__ -U__GCC_HAVE_SYNC_COMPARE_AND_SWAP_2 -U__LDBL_MIN_10_EXP__ -U__i386 -U__SIZEOF_LONG_LONG__ -U__DEC64_MAX_EXP__ -U__FLT_MIN__ -U__DBL_EPSILON__ -U__LDBL_MAX_EXP__ -U__DEC128_MAX_EXP__ -U__SIZEOF_SIZE_T__ -U__DBL_DIG__ -U__FLT_MANT_DIG__ -U__GNUC_MINOR__ -U__FLT_RADIX__ -U__DEC64_MAX__ -U__BIGGEST_ALIGNMENT__ -U__gnu_linux__ -U__INTMAX_TYPE__ -U__FLT_DIG__ -U__LDBL_MIN_EXP__ -U__DECIMAL_BID_FORMAT__ -U__pentiumpro__ -U__i686 -U__INT_MAX__ -U__DEC64_EPSILON__ -U__LONG_LONG_MAX__ -U__DBL_HAS_INFINITY__ -U__FLT_HAS_QUIET_NAN__ -U__DBL_MAX_10_EXP__ -U__STDC__ -U__FLT_HAS_DENORM__ -U__LDBL_MIN__ -U__NO_INLINE__ -U__DEC128_EPSILON__ -U__GNUC__ -U__SIZEOF_FLOAT__ -U__INTMAX_MAX__ -U__DEC32_MAX_EXP__ -U__unix -U__VERSION__ -U__DEC128_MIN_EXP__ -U__SIZEOF_WINT_T__ -U__USER_LABEL_PREFIX__ -U__SIZEOF_INT__ -U__LONG_MAX__ -U__pentiumpro -U__PTRDIFF_TYPE__ -U__i386__ -U__CHAR_BIT__ -U__DEC128_SUBNORMAL_MIN__ -U__DBL_HAS_QUIET_NAN__ -U__SIZEOF_SHORT__ -U__DBL_MAX_EXP__ -U__WINT_TYPE__ -U__DEC_EVAL_METHOD__ -U__DEC64_SUBNORMAL_MIN__ -U__DBL_MANT_DIG__ -U__FLT_MAX__ -U__linux -U__GNUC_GNU_INLINE__ -U__DEC128_MIN__ -U__SIZE_TYPE__ -U__FLT_HAS_INFINITY__ -U__DEC32_MANT_DIG__ -U__STDC_HOSTED__ -Ulinux -U__DECIMAL_DIG__ -U__LDBL_MAX_10_EXP__ -U__DBL_MAX__ -U__i686__ -U__SIZEOF_LONG__ -U__UINTMAX_TYPE__ -U__LDBL_MAX__ -U__FINITE_MATH_ONLY__ -U__WCHAR_TYPE__ -Uunix -U__CHAR16_TYPE__ -O2 -g -Wall -c -fmessage-length=0 -MMD -MP -MF"$(@:%.o=%.d)" -MT"$(@:%.o=%.d)" -o "$@" "$<" + @echo 'Finished building: $<' + @echo ' ' + + diff --git a/software/pong3/create-this-app b/software/pong3/create-this-app new file mode 100755 index 0000000..99ab8a0 --- /dev/null +++ b/software/pong3/create-this-app @@ -0,0 +1,114 @@ +#!/bin/bash +# +# This script creates the hello_world application in this directory. + + +BSP_DIR=/root/projects/pong3/software/pong3_bsp/ +QUARTUS_PROJECT_DIR=/root/projects/pong3/hardware/ +NIOS2_APP_GEN_ARGS="--elf-name pong3.elf --set OBJDUMP_INCLUDE_SOURCE 1 --src-files hello_world.c" + + +# First, check to see if $SOPC_KIT_NIOS2 environmental variable is set. +# This variable is required for the command line tools to execute correctly. +if [ -z "${SOPC_KIT_NIOS2}" ] +then + echo Required \$SOPC_KIT_NIOS2 Environmental Variable is not set! + exit 1 +fi + + +# Also make sure that the APP has not been created already. Check for +# existence of Makefile in the app directory +if [ -f ./Makefile ] +then + echo Application has already been created! Delete Makefile if you want to create a new application makefile + exit 1 +fi + + +# We are selecting hal_default bsp because it supports this application. +# Check to see if the hal_default has already been generated by checking for +# existence of the public.mk file. If not, we need to run +# create-this-bsp file to generate the bsp. +if [ ! -f ${BSP_DIR}/public.mk ]; then + # Since BSP doesn't exist, create the BSP + # Pass any command line arguments passed to this script to the BSP. + pushd ${BSP_DIR} >> /dev/null + ./create-this-bsp "$@" || { + echo "create-this-bsp failed" + exit 1 + } + popd >> /dev/null +fi + + +# Don't run make if create-this-app script is called with --no-make arg +SKIP_MAKE= +while [ $# -gt 0 ] +do + case "$1" in + --no-make) + SKIP_MAKE=1 + ;; + esac + shift +done + + +# Now we also need to go copy the sources for this application to the +# local directory. +find "${SOPC_KIT_NIOS2}/examples/software/hello_world/" -name '*.c' -or -name '*.h' -or -name 'hostfs*' | xargs -i cp -L {} ./ || { + echo "failed during copying example source files" + exit 1 +} + +find "${SOPC_KIT_NIOS2}/examples/software/hello_world/" -name 'readme.txt' -or -name 'Readme.txt' | xargs -i cp -L {} ./ || { + echo "failed copying readme file" +} + +if [ -d "${SOPC_KIT_NIOS2}/examples/software/hello_world/system" ] +then + cp -RL "${SOPC_KIT_NIOS2}/examples/software/hello_world/system" . || { + echo "failed during copying project support files" + exit 1 + } +fi + +chmod -R +w . || { + echo "failed during changing file permissions" + exit 1 +} + +cmd="nios2-app-generate-makefile --bsp-dir ${BSP_DIR} --set QUARTUS_PROJECT_DIR=${QUARTUS_PROJECT_DIR} ${NIOS2_APP_GEN_ARGS}" + +echo "create-this-app: Running \"${cmd}\"" +$cmd || { + echo "nios2-app-generate-makefile failed" + exit 1 +} + +if [ -z "$SKIP_MAKE" ]; then + cmd="make" + + echo "create-this-app: Running \"$cmd\"" + $cmd || { + echo "make failed" + exit 1 + } + + echo + echo "To download and run the application:" + echo " 1. Make sure the board is connected to the system." + echo " 2. Run 'nios2-configure-sof ' to configure the FPGA with the hardware design." + echo " 3. If you have a stdio device, run 'nios2-terminal' in a different shell." + echo " 4. Run 'make download-elf' from the application directory." + echo + echo "To debug the application:" + echo " Import the project into Nios II Software Build Tools for Eclipse." + echo " Refer to Nios II Software Build Tools for Eclipse Documentation for more information." + echo + echo -e "" +fi + + +exit 0 diff --git a/software/pong3/hello_led.c b/software/pong3/hello_led.c new file mode 100644 index 0000000..9f472d7 --- /dev/null +++ b/software/pong3/hello_led.c @@ -0,0 +1,148 @@ +/* + * + * + * + * + */ +#include +#include +#include +#include +#include +#include "system.h" +#include "DM9000A.H" +#include "DM9000A.C" +//#include "sys/alt_irq.h" +#include <../src/alt_irq_register.c> + +#if 0 +unsigned int rx_len,i,packet_num,rx_cnt,tx_cnt; + + +#define data_lenght 1468 // Maximun Data lenght 1468 bytes +#define flenght (data_lenght+0x2E) //Total packet lenght + + unsigned char SND[flenght]; // Payload buffer + + unsigned char RX_DATA[flenght]; // Payload buffer + +//------------------------------------------------------------------------- +/* DM9000_init I/O routine */ + +//------------------------------------------------------------------------- +//------------------------------------------------------------------------- +//------------------------------------------------------------------------- + +void UDP_Init(void) + { + unsigned int IPsource_1,IPsource_2,IPsource_3,IPsource_4; + unsigned int IPdestination_1,IPdestination_2,IPdestination_3,IPdestination_4; + unsigned int IPchecksum1,IPchecksum2,IPchecksum3,IPchecksum4,IPchecksum5; + unsigned int Mac_source1, Mac_source2, Mac_source3, Mac_source4, Mac_source5, Mac_source6; + unsigned int Mac_dest1, Mac_dest2, Mac_dest3, Mac_dest4, Mac_dest5, Mac_dest6; + unsigned int lenght_h, lenght_l; + unsigned int IPlenght_h, IPlenght_l, IPlenght; + + IPsource_1 = 192; // Assign ie: 192.168.0.44 IP for the CD0 + IPsource_2 = 168; + IPsource_3 = 0; + IPsource_4 = 44; + + IPdestination_1 = 192; // Insert your IP data here + IPdestination_2 = 168; + IPdestination_3 = 0; + IPdestination_4 = 55; + + Mac_dest1 = 0xF4; // Insert your MAC address data here + Mac_dest2 = 0x6D; + Mac_dest3 = 0x04; + Mac_dest4 = 0x20; + Mac_dest5 = 0x9F; + Mac_dest6 = 0xF1; +// Mac_dest1 = 0XFF; // Insert your MAC address data here +// Mac_dest2 = 0xFF; +// Mac_dest3 = 0xFF; +// Mac_dest4 = 0xFF; +// Mac_dest5 = 0xFF; +// Mac_dest6 = 0xFF; + Mac_source1 = 0x01; // Assign an MAC address for DE2 + Mac_source2 = 0x60; + Mac_source3 = 0x6E; + Mac_source4 = 0x11; + Mac_source5 = 0x02; + Mac_source6 = 0x0F; + + lenght_h = ((data_lenght+8) & 0xFF00)>>8; // Convert in H byte and L byte + lenght_l = ((data_lenght+8) & 0x00FF); + + IPlenght = data_lenght + 8 + 20; // IP Lenght for IP header + IPlenght_h = (IPlenght & 0xFF00)>>8; // Convert in H byte and L byte + IPlenght_l = (IPlenght & 0x00FF); + // Calculating the IP checksum + IPchecksum1 = 0x0000C511 + (IPsource_1<<8)+IPsource_2+(IPsource_3<<8)+IPsource_4+ + (IPdestination_1<<8)+IPdestination_2+(IPdestination_3<<8)+(IPdestination_4)+ + (IPlenght_h<<8) + IPlenght_l; + IPchecksum2 = ((IPchecksum1&0x0000FFFF)+(IPchecksum1>>16)); + IPchecksum3 = 0x0000FFFF - IPchecksum2; + IPchecksum4 = (IPchecksum3 & 0xFF00)>>8; + IPchecksum5 = (IPchecksum3 & 0x00FF); + + unsigned char TXT[flenght] = { Mac_dest1, Mac_dest2, Mac_dest3, Mac_dest4 ,Mac_dest5, Mac_dest6, + Mac_source1, Mac_source2, Mac_source3, Mac_source4, Mac_source5, Mac_source6, + 0x08, 0x00, 0x45, 0x00, IPlenght_h, IPlenght_l, + 0x00, 0x00, 0x00, 0x00, 0x80, 0x11, + IPchecksum4, IPchecksum5, IPsource_1, IPsource_2, IPsource_3, IPsource_4, + IPdestination_1, IPdestination_2, IPdestination_3, IPdestination_4, 0x04, 0x00, + 0x04, 0x00, lenght_h, lenght_l, 0x00, 0x00}; + + for (i = 0; i < 42; i++) // Load the TXT[] in the SND (ethernet packet). + SND[i] = TXT[i]; + + for (i = 42; i < flenght-4; i++) // generating the data to send. + SND[i] = i-42; + + SND[i++] = 0x35; // This checksum is not correct... but also the net recieve the packets correctly. + SND[i++] = 0x15; // To do, calculate checksum. + SND[i++] = 0xF0; + SND[i++] = 0x13; + + + } + +void ethernet_interrupts(void) +{ + + ReceivePacket(RX_DATA,&rx_len); + rx_cnt++; + int j; + for(j=0;j +#include +#include +#include +#include +#include "system.h" + +#define msleep(msec) usleep(1000*msec); + +static void +gpu_write (unsigned int reg, unsigned int data) +{ + IOWR (GPU_0_BASE, reg << 2, data); +} + +static int +find_intersection (int x, int y, int xd, int yd, int t) +{ + + // super lazy - we should use the power of MATHS + + while (x != t) + { + x += xd; + y += yd; + + if (y < 0) + y = 0; + if (y > 479) + y = 479; + if ((y == 479) || (y == 0)) + yd = -yd; + + if ((x == 639) || (x == 0)) + xd = -xd; + } + + return y; +} + +static int +dir (int a, int b) +{ + if (a > b) + return 1; + if (a < b) + return -1; + return 0; +} + +static void +move_bat (int *b, int db) +{ + + *b += dir (db, *b); + if (*b < 20) + *b = 20; + if (*b > 459) + *b = 459; + +} + +static void +load_sprite (void) +{ + // RRR GGG BBB + // set the sprite color 111 010 000 - orange + gpu_write (4, 0x01D0); + + // squirt the bromium logo into the sprite + gpu_write (0x10, 0x00C0); + gpu_write (0x11, 0x03E0); + gpu_write (0x12, 0x0FF8); + gpu_write (0x13, 0x1FFE); + gpu_write (0x14, 0x3FC7); + gpu_write (0x15, 0x3F83); + gpu_write (0x16, 0x3933); + gpu_write (0x17, 0x3987); + gpu_write (0x18, 0x3D37); + gpu_write (0x19, 0x3D37); + gpu_write (0x1a, 0x3D87); + gpu_write (0x1b, 0x3FFF); + gpu_write (0x1c, 0x1FFE); + gpu_write (0x1d, 0x07F8); + gpu_write (0x1e, 0x01E0); + gpu_write (0x1f, 0x00C0); +} + +int +main (void) +{ + int x, y, xd, yd; + int bat0, dbat0; + int bat1, dbat1; + int missed = 0; + + printf ("Working...\n"); + msleep (500); + srand (12392184); + + bat0 = 100; + bat1 = 200; + + load_sprite (); + + while (1) + { + x = 1; + y = 1; + xd = 1; + yd = 1; + + dbat0 = find_intersection (x + xd, y + yd, xd, yd, 0); + dbat1 = find_intersection (x + xd, y + yd, xd, yd, 639); + + while (!missed) + { + x += xd; + y += yd; + if (y < 0) + y = 0; + if (y > 479) + y = 479; + if ((y == 479) || (y == 0)) + yd = -yd; + + if ((x == 639) || (x == 0)) + { + xd = -xd; + yd = rand () % 7; + yd -= 3; + dbat0 = find_intersection (x + xd, y + yd, xd, yd, 0); + dbat1 = find_intersection (x + xd, y + yd, xd, yd, 639); + } + + move_bat (&bat0, dbat0); + move_bat (&bat1, dbat1); + + + gpu_write (0, x); + gpu_write (1, y); + + gpu_write (2, bat0); + gpu_write (3, bat1); + + msleep (2); + } + } +} + +//------------------------------------------------------------------------- diff --git a/software/pong3/readme.txt b/software/pong3/readme.txt new file mode 100644 index 0000000..7d0742f --- /dev/null +++ b/software/pong3/readme.txt @@ -0,0 +1,26 @@ +Readme - Hello World Software Example + +DESCRIPTION: +Simple program that prints "Hello from Nios II" + +The memory footprint of this hosted application is intended to be small (under 100 kbytes) by default +using a standard reference deisgn. + +For an even smaller, reduced footprint version of this template, and an explanation of how +to reduce the memory footprint for a given application, see the +"small_hello_world" template. + + +PERIPHERALS USED: +This example exercises the following peripherals: +- STDOUT device (UART or JTAG UART) + +SOFTWARE SOURCE FILES: +This example includes the following software source files: +- hello_world.c: Everyone needs a Hello World program, right? + +BOARD/HOST REQUIREMENTS: +This example requires only a JTAG connection with a Nios Development board. If +the host communication settings are changed from JTAG UART (default) to use a +conventional UART, a serial cable between board DB-9 connector and the host is +required. diff --git a/software/pong3_bsp/.cproject b/software/pong3_bsp/.cproject new file mode 100644 index 0000000..7143698 --- /dev/null +++ b/software/pong3_bsp/.cproject @@ -0,0 +1,348 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/software/pong3_bsp/.project b/software/pong3_bsp/.project new file mode 100644 index 0000000..16e64e8 --- /dev/null +++ b/software/pong3_bsp/.project @@ -0,0 +1,85 @@ + + + pong3_bsp + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + ?name? + + + + org.eclipse.cdt.make.core.append_environment + true + + + org.eclipse.cdt.make.core.autoBuildTarget + all + + + org.eclipse.cdt.make.core.buildArguments + + + + org.eclipse.cdt.make.core.buildCommand + make + + + org.eclipse.cdt.make.core.buildLocation + ${workspace_loc://pong3_bsp} + + + org.eclipse.cdt.make.core.cleanBuildTarget + clean + + + org.eclipse.cdt.make.core.contents + org.eclipse.cdt.make.core.activeConfigSettings + + + org.eclipse.cdt.make.core.enableAutoBuild + false + + + org.eclipse.cdt.make.core.enableCleanBuild + true + + + org.eclipse.cdt.make.core.enableFullBuild + true + + + org.eclipse.cdt.make.core.fullBuildTarget + all + + + org.eclipse.cdt.make.core.stopOnError + true + + + org.eclipse.cdt.make.core.useDefaultBuildCmd + true + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + org.eclipse.cdt.core.ccnature + com.altera.sbtgui.project.SBTGUINature + com.altera.sbtgui.project.SBTGUIBspNature + + diff --git a/software/pong3_bsp/Makefile b/software/pong3_bsp/Makefile new file mode 100644 index 0000000..dd9ec2d --- /dev/null +++ b/software/pong3_bsp/Makefile @@ -0,0 +1,786 @@ +#------------------------------------------------------------------------------ +# BSP MAKEFILE +# +# This makefile was automatically generated by the nios2-bsp-generate-files +# command. Its purpose is to build a custom Board Support Package (BSP) +# targeting a specific Nios II processor in an SOPC Builder-based design. +# +# To create an application or library Makefile which uses this BSP, try the +# nios2-app-generate-makefile or nios2-lib-generate-makefile commands. +#------------------------------------------------------------------------------ + +#------------------------------------------------------------------------------ +# TOOLS +#------------------------------------------------------------------------------ + +MKDIR := mkdir -p +ECHO := echo +SPACE := $(empty) $(empty) + +#------------------------------------------------------------------------------ +# The adjust-path macro +# +# If COMSPEC is defined, Make is launched from Windows through +# Cygwin. This adjust-path macro will call 'cygpath -u' on all +# paths to ensure they are readable by Make. +# +# If COMSPEC is not defined, Make is launched from *nix, and no adjustment +# is necessary +#------------------------------------------------------------------------------ + +ifndef COMSPEC +ifdef ComSpec +COMSPEC = $(ComSpec) +endif # ComSpec +endif # !COMSPEC + +ifdef COMSPEC + adjust-path = $(subst $(SPACE),\$(SPACE),$(shell cygpath -u "$1")) + adjust-path-mixed = $(subst $(SPACE),\$(SPACE),$(shell cygpath -m "$1")) +else + adjust-path = $(subst $(SPACE),\$(SPACE),$1) + adjust-path-mixed = $(subst $(SPACE),\$(SPACE),$1) +endif + +#------------------------------------------------------------------------------ +# DEFAULT TARGET +# +# The default target, "all", must appear before any other target in the +# Makefile. Note that extra prerequisites are added to the "all" rule later. +#------------------------------------------------------------------------------ +.PHONY: all +all: + @$(ECHO) [BSP build complete] + + +#------------------------------------------------------------------------------ +# PATHS & DIRECTORY NAMES +# +# Explicitly locate absolute path of the BSP root +#------------------------------------------------------------------------------ + +BSP_ROOT_DIR := . + +# Define absolute path to the root of the BSP. +ABS_BSP_ROOT := $(call adjust-path-mixed,$(shell pwd)) + +# Stash all BSP object files here +OBJ_DIR := ./obj + +NEWLIB_DIR = $(BSP_ROOT_DIR)/newlib + + +#------------------------------------------------------------------------------ +# MANAGED CONTENT +# +# All content between the lines "START MANAGED" and "END MANAGED" below is +# generated based on variables in the BSP settings file when the +# nios2-bsp-generate-files command is invoked. If you wish to persist any +# information pertaining to the build process, it is recomended that you +# utilize the BSP settings mechanism to do so. +# +# Note that most variable assignments in this section have a corresponding BSP +# setting that can be changed by using the nios2-bsp-create-settings or +# nios2-bsp-update-settings command before nios2-bsp-generate-files; if you +# want any variable set to a specific value when this Makefile is re-generated +# (to prevent hand-edits from being over-written), use the BSP settings +# facilities above. +#------------------------------------------------------------------------------ + +#START MANAGED + +# The following TYPE comment allows tools to identify the 'type' of target this +# makefile is associated with. +# TYPE: BSP_PRIVATE_MAKEFILE + +# This following VERSION comment indicates the version of the tool used to +# generate this makefile. A makefile variable is provided for VERSION as well. +# ACDS_VERSION: 13.0sp1 +ACDS_VERSION := 13.0sp1 + +# This following BUILD_NUMBER comment indicates the build number of the tool +# used to generate this makefile. +# BUILD_NUMBER: 232 + +SETTINGS_FILE := settings.bsp +SOPC_FILE := /root/projects/pong3/hardware/my_sys.sopcinfo + +#------------------------------------------------------------------------------- +# TOOL & COMMAND DEFINITIONS +# +# The base command for each build operation are expressed here. Additional +# switches may be expressed here. They will run for all instances of the +# utility. +#------------------------------------------------------------------------------- + +# Archiver command. Creates library files. +AR = nios2-elf-ar + +# Assembler command. Note that CC is used for .S files. +AS = nios2-elf-gcc + +# Custom flags only passed to the archiver. This content of this variable is +# directly passed to the archiver rather than the more standard "ARFLAGS". The +# reason for this is that GNU Make assumes some default content in ARFLAGS. +# This setting defines the value of BSP_ARFLAGS in Makefile. +BSP_ARFLAGS = -src + +# Custom flags only passed to the assembler. This setting defines the value of +# BSP_ASFLAGS in Makefile. +BSP_ASFLAGS = -Wa,-gdwarf2 + +# C/C++ compiler debug level. '-g' provides the default set of debug symbols +# typically required to debug a typical application. Omitting '-g' removes +# debug symbols from the ELF. This setting defines the value of +# BSP_CFLAGS_DEBUG in Makefile. +BSP_CFLAGS_DEBUG = -g + +# C/C++ compiler optimization level. "-O0" = no optimization,"-O2" = "normal" +# optimization, etc. "-O0" is recommended for code that you want to debug since +# compiler optimization can remove variables and produce non-sequential +# execution of code while debugging. This setting defines the value of +# BSP_CFLAGS_OPTIMIZATION in Makefile. +BSP_CFLAGS_OPTIMIZATION = -O0 + +# C/C++ compiler warning level. "-Wall" is commonly used.This setting defines +# the value of BSP_CFLAGS_WARNINGS in Makefile. +BSP_CFLAGS_WARNINGS = -Wall + +# C compiler command. +CC = nios2-elf-gcc -xc + +# C++ compiler command. +CXX = nios2-elf-gcc -xc++ + +# Command used to remove files during 'clean' target. +RM = rm -f + + +#------------------------------------------------------------------------------- +# BUILD PRE & POST PROCESS COMMANDS +# +# The following variables are treated as shell commands in the rule +# definitions for each file-type associated with the BSP build, as well as +# commands run at the beginning and end of the entire BSP build operation. +# Pre-process commands are executed before the relevant command (for example, +# a command defined in the "CC_PRE_PROCESS" variable executes before the C +# compiler for building .c files), while post-process commands are executed +# immediately afterwards. +# +# You can view each pre/post-process command in the "Build Rules: All & +# Clean", "Pattern Rules to Build Objects", and "Library Rules" sections of +# this Makefile. +#------------------------------------------------------------------------------- + + +#------------------------------------------------------------------------------- +# BSP SOURCE BUILD SETTINGS (FLAG GENERATION) +# +# Software build settings such as compiler optimization, debug level, warning +# flags, etc., may be defined in the following variables. The variables below +# are concatenated together in the 'Flags' section of this Makefile to form +# final variables of flags passed to the build tools. +# +# These settings are considered private to the BSP and apply to all library & +# driver files in it; they do NOT automatically propagate to, for example, the +# build settings for an application. +# # For additional detail and syntax requirements, please refer to GCC help +# (example: "nios2-elf-gcc --help --verbose"). +# +# Unless indicated otherwise, multiple entries in each variable should be +# space-separated. +#------------------------------------------------------------------------------- + +# Altera HAL alt_sys_init.c generated source file +GENERATED_C_FILES := $(ABS_BSP_ROOT)/alt_sys_init.c +GENERATED_C_LIB_SRCS += alt_sys_init.c + + +#------------------------------------------------------------------------------- +# BSP SOURCE FILE LISTING +# +# All source files that comprise the BSP are listed here, along with path +# information to each file expressed relative to the BSP root. The precise +# list and location of each file is derived from the driver, operating system, +# or software package source file declarations. +# +# Following specification of the source files for each component, driver, etc., +# each source file type (C, assembly, etc.) is concatenated together and used +# to construct a list of objects. Pattern rules to build each object are then +# used to build each file. +#------------------------------------------------------------------------------- + +# altera_avalon_epcs_flash_controller_driver sources root +altera_avalon_epcs_flash_controller_driver_SRCS_ROOT := drivers + +# altera_avalon_epcs_flash_controller_driver sources +altera_avalon_epcs_flash_controller_driver_C_LIB_SRCS := \ + $(altera_avalon_epcs_flash_controller_driver_SRCS_ROOT)/src/altera_avalon_epcs_flash_controller.c \ + $(altera_avalon_epcs_flash_controller_driver_SRCS_ROOT)/src/epcs_commands.c \ + $(altera_avalon_epcs_flash_controller_driver_SRCS_ROOT)/src/altera_avalon_spi.c + +# altera_avalon_jtag_uart_driver sources root +altera_avalon_jtag_uart_driver_SRCS_ROOT := drivers + +# altera_avalon_jtag_uart_driver sources +altera_avalon_jtag_uart_driver_C_LIB_SRCS := \ + $(altera_avalon_jtag_uart_driver_SRCS_ROOT)/src/altera_avalon_jtag_uart_init.c \ + $(altera_avalon_jtag_uart_driver_SRCS_ROOT)/src/altera_avalon_jtag_uart_read.c \ + $(altera_avalon_jtag_uart_driver_SRCS_ROOT)/src/altera_avalon_jtag_uart_write.c \ + $(altera_avalon_jtag_uart_driver_SRCS_ROOT)/src/altera_avalon_jtag_uart_ioctl.c \ + $(altera_avalon_jtag_uart_driver_SRCS_ROOT)/src/altera_avalon_jtag_uart_fd.c + +# altera_avalon_pio_driver sources root +altera_avalon_pio_driver_SRCS_ROOT := drivers + +# altera_avalon_pio_driver sources +# altera_avalon_timer_driver sources root +altera_avalon_timer_driver_SRCS_ROOT := drivers + +# altera_avalon_timer_driver sources +altera_avalon_timer_driver_C_LIB_SRCS := \ + $(altera_avalon_timer_driver_SRCS_ROOT)/src/altera_avalon_timer_sc.c \ + $(altera_avalon_timer_driver_SRCS_ROOT)/src/altera_avalon_timer_ts.c \ + $(altera_avalon_timer_driver_SRCS_ROOT)/src/altera_avalon_timer_vars.c + +# altera_nios2_qsys_hal_driver sources root +altera_nios2_qsys_hal_driver_SRCS_ROOT := HAL + +# altera_nios2_qsys_hal_driver sources +altera_nios2_qsys_hal_driver_C_LIB_SRCS := \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/altera_nios2_qsys_irq.c \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_usleep.c \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_busy_sleep.c \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_irq_vars.c \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_icache_flush.c \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_icache_flush_all.c \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_dcache_flush.c \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_dcache_flush_all.c \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_dcache_flush_no_writeback.c \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_instruction_exception_entry.c \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_irq_register.c \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_iic.c \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_remap_cached.c \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_remap_uncached.c \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_uncached_free.c \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_uncached_malloc.c \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_do_ctors.c \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_do_dtors.c \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_gmon.c + +altera_nios2_qsys_hal_driver_ASM_LIB_SRCS := \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_exception_entry.S \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_exception_trap.S \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_exception_muldiv.S \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_irq_entry.S \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_software_exception.S \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_mcount.S \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/alt_log_macro.S \ + $(altera_nios2_qsys_hal_driver_SRCS_ROOT)/src/crt0.S + +# hal sources root +hal_SRCS_ROOT := HAL + +# hal sources +hal_C_LIB_SRCS := \ + $(hal_SRCS_ROOT)/src/alt_alarm_start.c \ + $(hal_SRCS_ROOT)/src/alt_close.c \ + $(hal_SRCS_ROOT)/src/alt_dev.c \ + $(hal_SRCS_ROOT)/src/alt_dev_llist_insert.c \ + $(hal_SRCS_ROOT)/src/alt_dma_rxchan_open.c \ + $(hal_SRCS_ROOT)/src/alt_dma_txchan_open.c \ + $(hal_SRCS_ROOT)/src/alt_environ.c \ + $(hal_SRCS_ROOT)/src/alt_env_lock.c \ + $(hal_SRCS_ROOT)/src/alt_errno.c \ + $(hal_SRCS_ROOT)/src/alt_execve.c \ + $(hal_SRCS_ROOT)/src/alt_exit.c \ + $(hal_SRCS_ROOT)/src/alt_fcntl.c \ + $(hal_SRCS_ROOT)/src/alt_fd_lock.c \ + $(hal_SRCS_ROOT)/src/alt_fd_unlock.c \ + $(hal_SRCS_ROOT)/src/alt_find_dev.c \ + $(hal_SRCS_ROOT)/src/alt_find_file.c \ + $(hal_SRCS_ROOT)/src/alt_flash_dev.c \ + $(hal_SRCS_ROOT)/src/alt_fork.c \ + $(hal_SRCS_ROOT)/src/alt_fs_reg.c \ + $(hal_SRCS_ROOT)/src/alt_fstat.c \ + $(hal_SRCS_ROOT)/src/alt_get_fd.c \ + $(hal_SRCS_ROOT)/src/alt_getchar.c \ + $(hal_SRCS_ROOT)/src/alt_getpid.c \ + $(hal_SRCS_ROOT)/src/alt_gettod.c \ + $(hal_SRCS_ROOT)/src/alt_iic_isr_register.c \ + $(hal_SRCS_ROOT)/src/alt_instruction_exception_register.c \ + $(hal_SRCS_ROOT)/src/alt_ioctl.c \ + $(hal_SRCS_ROOT)/src/alt_io_redirect.c \ + $(hal_SRCS_ROOT)/src/alt_irq_handler.c \ + $(hal_SRCS_ROOT)/src/alt_isatty.c \ + $(hal_SRCS_ROOT)/src/alt_kill.c \ + $(hal_SRCS_ROOT)/src/alt_link.c \ + $(hal_SRCS_ROOT)/src/alt_load.c \ + $(hal_SRCS_ROOT)/src/alt_log_printf.c \ + $(hal_SRCS_ROOT)/src/alt_lseek.c \ + $(hal_SRCS_ROOT)/src/alt_main.c \ + $(hal_SRCS_ROOT)/src/alt_malloc_lock.c \ + $(hal_SRCS_ROOT)/src/alt_open.c \ + $(hal_SRCS_ROOT)/src/alt_printf.c \ + $(hal_SRCS_ROOT)/src/alt_putchar.c \ + $(hal_SRCS_ROOT)/src/alt_putstr.c \ + $(hal_SRCS_ROOT)/src/alt_read.c \ + $(hal_SRCS_ROOT)/src/alt_release_fd.c \ + $(hal_SRCS_ROOT)/src/alt_rename.c \ + $(hal_SRCS_ROOT)/src/alt_sbrk.c \ + $(hal_SRCS_ROOT)/src/alt_settod.c \ + $(hal_SRCS_ROOT)/src/alt_stat.c \ + $(hal_SRCS_ROOT)/src/alt_tick.c \ + $(hal_SRCS_ROOT)/src/alt_times.c \ + $(hal_SRCS_ROOT)/src/alt_unlink.c \ + $(hal_SRCS_ROOT)/src/alt_wait.c \ + $(hal_SRCS_ROOT)/src/alt_write.c + + +# Assemble all component C source files +COMPONENT_C_LIB_SRCS += \ + $(altera_avalon_epcs_flash_controller_driver_C_LIB_SRCS) \ + $(altera_avalon_jtag_uart_driver_C_LIB_SRCS) \ + $(altera_avalon_timer_driver_C_LIB_SRCS) \ + $(altera_nios2_qsys_hal_driver_C_LIB_SRCS) \ + $(hal_C_LIB_SRCS) + +# Assemble all component assembly source files +COMPONENT_ASM_LIB_SRCS += \ + $(altera_nios2_qsys_hal_driver_ASM_LIB_SRCS) + +# Assemble all component C++ source files +COMPONENT_CPP_LIB_SRCS += \ + +#END MANAGED + +#------------------------------------------------------------------------------ +# PUBLIC.MK +# +# The generated public.mk file contains BSP information that is shared with +# other external makefiles, such as a Nios II application makefile. System- +# dependent information such as hardware-specific compiler flags and +# simulation file generation are stored here. +# +# In addition, public.mk contains include paths that various software, +# such as a device driver, may need for the C compiler. These paths are +# written to public.mk with respect to the BSP root. In public.mk, each +# path is prefixed with a special variable, $(ALT_LIBRARY_ROOT_DIR). The +# purpose of this variable is to allow an external Makefile to append on +# path information to precisely locate paths expressed in public.mk +# Since this is the BSP Makefile, we set ALT_LIBRARY_ROOT_DIR to point right +# here ("."), at the BSP root. +# +# ALT_LIBRARY_ROOT_DIR must always be set before public.mk is included. +#------------------------------------------------------------------------------ +ALT_LIBRARY_ROOT_DIR := . +include public.mk + + +#------------------------------------------------------------------------------ +# FLAGS +# +# Include paths for BSP files are written into the public.mk file and must +# be added to the existing list of pre-processor flags. In addition, "hooks" +# for standard flags left intentionally empty (CFLAGS, CPPFLAGS, ASFLAGS, +# and CXXFLAGS) are provided for conveniently adding to the relevant flags +# on the command-line or via script that calls make. +#------------------------------------------------------------------------------ +# Assemble final list of compiler flags from generated content +BSP_CFLAGS += \ + $(BSP_CFLAGS_DEFINED_SYMBOLS) \ + $(BSP_CFLAGS_UNDEFINED_SYMBOLS) \ + $(BSP_CFLAGS_OPTIMIZATION) \ + $(BSP_CFLAGS_DEBUG) \ + $(BSP_CFLAGS_WARNINGS) \ + $(BSP_CFLAGS_USER_FLAGS) \ + $(ALT_CFLAGS) \ + $(CFLAGS) + +# Make ready the final list of include directories and other C pre-processor +# flags. Each include path is made ready by prefixing it with "-I". +BSP_CPPFLAGS += \ + $(addprefix -I, $(BSP_INC_DIRS)) \ + $(addprefix -I, $(ALT_INCLUDE_DIRS)) \ + $(ALT_CPPFLAGS) \ + $(CPPFLAGS) + +# Finish off assembler flags with any user-provided flags +BSP_ASFLAGS += $(ASFLAGS) + +# Finish off C++ flags with any user-provided flags +BSP_CXXFLAGS += $(CXXFLAGS) + +# And finally, the ordered list +C_SRCS += $(GENERATED_C_LIB_SRCS) \ + $(COMPONENT_C_LIB_SRCS) + +CXX_SRCS += $(GENERATED_CPP_LIB_SRCS) \ + $(COMPONENT_CPP_LIB_SRCS) + +ASM_SRCS += $(GENERATED_ASM_LIB_SRCS) \ + $(COMPONENT_ASM_LIB_SRCS) + + +#------------------------------------------------------------------------------ +# LIST OF GENERATED FILES +# +# A Nios II BSP relies on the generation of several source files used +# by both the BSP and any applications referencing the BSP. +#------------------------------------------------------------------------------ + + +GENERATED_H_FILES := $(ABS_BSP_ROOT)/system.h + +GENERATED_LINKER_SCRIPT := $(ABS_BSP_ROOT)/linker.x + +GENERATED_FILES += $(GENERATED_H_FILES) \ + $(GENERATED_LINKER_SCRIPT) + + +#------------------------------------------------------------------------------ +# SETUP TO BUILD OBJECTS +# +# List of object files which are to be built. This is constructed from the input +# list of C source files (C_SRCS), C++ source files (CXX_SRCS), and assembler +# source file (ASM_SRCS). The permitted file extensions are: +# +# .c .C - for C files +# .cxx .cc .cpp .CXX .CC .CPP - for C++ files +# .S .s - for assembly files +# +# Extended description: The list of objects is a sorted list (duplicates +# removed) of all possible objects, placed beneath the ./obj directory, +# including any path information stored in the "*_SRCS" variable. The +# "patsubst" commands are used to concatenate together multiple file suffix +# types for common files (i.e. c++ as .cxx, .cc, .cpp). +# +# File extensions are case-insensitive in build rules with the exception of +# assembly sources. Nios II assembly sources with the ".S" extension are first +# run through the C preprocessor. Sources with the ".s" extension are not. +#------------------------------------------------------------------------------ +OBJS = $(sort $(addprefix $(OBJ_DIR)/, \ + $(patsubst %.c, %.o, $(patsubst %.C, %.o, $(C_SRCS))) \ + $(patsubst %.cxx, %.o, $(patsubst %.CXX, %.o, \ + $(patsubst %.cc, %.o, $(patsubst %.CC, %.o, \ + $(patsubst %.cpp, %.o, $(patsubst %.CPP, %.o, \ + $(CXX_SRCS) )))))) \ + $(patsubst %.S, %.o, $(patsubst %.s, %.o, $(ASM_SRCS))) )) + +# List of dependancy files for each object file. +DEPS = $(OBJS:.o=.d) + + +# Rules to force your project to rebuild or relink +# .force_relink file will cause any application that depends on this project to relink +# .force_rebuild file will cause this project to rebuild object files +# .force_rebuild_all file will cause this project and any project that depends on this project to rebuild object files + +FORCE_RELINK_DEP := .force_relink +FORCE_REBUILD_DEP := .force_rebuild +FORCE_REBUILD_ALL_DEP := .force_rebuild_all +FORCE_REBUILD_DEP_LIST := $(FORCE_RELINK_DEP) $(FORCE_REBUILD_DEP) $(FORCE_REBUILD_ALL_DEP) + +$(FORCE_REBUILD_DEP_LIST): + +$(OBJS): $(wildcard $(FORCE_REBUILD_DEP)) $(wildcard $(FORCE_REBUILD_ALL_DEP)) + + +#------------------------------------------------------------------------------ +# BUILD RULES: ALL & CLEAN +#------------------------------------------------------------------------------ +.DELETE_ON_ERROR: + +.PHONY: all +all: build_pre_process +all: Makefile $(GENERATED_FILES) $(BSP_LIB) $(NEWLIB_DIR) +all: build_post_process + + +# clean: remove .o/.a/.d +.PHONY: clean +clean: + @$(RM) -r $(BSP_LIB) $(OBJ_DIR) $(FORCE_REBUILD_DEP_LIST) +ifneq ($(wildcard $(NEWLIB_DIR)),) + @$(RM) -r $(NEWLIB_DIR) +endif + @$(ECHO) [BSP clean complete] + + +#------------------------------------------------------------------------------ +# BUILD PRE/POST PROCESS +#------------------------------------------------------------------------------ +build_pre_process : + $(BUILD_PRE_PROCESS) + +build_post_process : + $(BUILD_POST_PROCESS) + +.PHONY: build_pre_process build_post_process + + + +#------------------------------------------------------------------------------ +# MAKEFILE UP TO DATE? +# +# Is this very Makefile up to date? Someone may have changed the BSP settings +# file or the associated target hardware. +#------------------------------------------------------------------------------ +# Skip this check when clean is the only target +ifneq ($(MAKECMDGOALS),clean) + +ifneq ($(wildcard $(SETTINGS_FILE)),$(SETTINGS_FILE)) +$(warning Warning: BSP Settings File $(SETTINGS_FILE) could not be found.) +endif + +Makefile: $(wildcard $(SETTINGS_FILE)) + @$(ECHO) Makefile not up to date. + @$(ECHO) $(SETTINGS_FILE) has been modified since the BSP Makefile was generated. + @$(ECHO) + @$(ECHO) Generate the BSP to update the Makefile, and then build again. + @$(ECHO) + @$(ECHO) To generate from Eclipse: + @$(ECHO) " 1. Right-click the BSP project." + @$(ECHO) " 2. In the Nios II Menu, click Generate BSP." + @$(ECHO) + @$(ECHO) To generate from the command line: + @$(ECHO) " nios2-bsp-generate-files --settings= --bsp-dir=" + @$(ECHO) + @exit 1 + +ifneq ($(wildcard $(SOPC_FILE)),$(SOPC_FILE)) +$(warning Warning: SOPC File $(SOPC_FILE) could not be found.) +endif + +public.mk: $(wildcard $(SOPC_FILE)) + @$(ECHO) Makefile not up to date. + @$(ECHO) $(SOPC_FILE) has been modified since the BSP was generated. + @$(ECHO) + @$(ECHO) Generate the BSP to update the Makefile, and then build again. + @$(ECHO) + @$(ECHO) To generate from Eclipse: + @$(ECHO) " 1. Right-click the BSP project." + @$(ECHO) " 2. In the Nios II Menu, click Generate BSP." + @$(ECHO) + @$(ECHO) To generate from the command line: + @$(ECHO) " nios2-bsp-generate-files --settings= --bsp-dir=" + @$(ECHO) + @exit 1 + +endif # $(MAKECMDGOALS) != clean + +#------------------------------------------------------------------------------ +# PATTERN RULES TO BUILD OBJECTS +#------------------------------------------------------------------------------ +$(OBJ_DIR)/%.o: %.c + @$(ECHO) Compiling $(