1. <PLAINTEXT>
########################################################################
#
# Ethernet Testing Program: This program sets up GPU sbc and prepares
# it to transmit and receive packets. It then transmits while
# polling for receives. When a receive occurs, it is buffered
# back to DRAM in continuous list of buffers for external scrutiny.
#
########################################################################
.globl start
#FPGA dram related registers
reg_ad_h .equ 0x4000
dram_ad_0 .equ 0x018c
dram_da_h0 .equ 0xffff
dram_da_l0 .equ 0xfffe
dram_ad_1 .equ 0x018c
dram_da_h1 .equ 0xffff
dram_da_l1 .equ 0xfffd
dram_ad_2 .equ 0x01c8
dram_da_2 .equ 0x0032
dram_ad_3 .equ 0x0008
dram_da_h3 .equ 0xf4ff
dram_da_l3 .equ 0x8fbf
dram_ad_4 .equ 0x0144
4. ether_adr_5 .equ 0x0000
.text
start:
bl init_regs
bl init_mmu
bl init_ram
bl init_sram
bl init_ether
while_loop:
bl transmit
bl delay_loop
bl while_loop
init_regs:
li r0,0x0000
li r1,0x0000
li r2,0x0000
li r3,0x0000
li r4,0x0000
li r5,0x0000
li r6,0x0000
li r7,0x0000
5. li r8,0x0000
li r9,0x0000
li r10,0x0000
li r11,0x0000
li r12,0x0000
li r13,0x0000
li r14,0x0000
li r15,0x0000
lis r24,0x646f
addi r24,r24,0x6e65
blr
init_mmu:
mfspr r4,1008
li r5,0x7fff
addi r5,r5,0x0001
or r4,r5,r4
mtspr 1008,r4
mfmsr r4
li r5,0x2010
or r4,r5,r4
mtmsr r4
10. stw r5,0x0(r4)
lis r4,reg_ad_h
addi r4,r4,dram_ad_6
li r5,dram_da_6
stw r5,0x0(r4)
lis r4,reg_ad_h
addi r4,r4,dram_ad_7
lis r5,dram_da_h7
addi r5,r5,dram_da_l7
stw r5,0x0(r4)
lis r4,reg_ad_h
addi r4,r4,dram_ad_8
li r5,dram_da_8
stw r5,0x0(r4)
lis r26,0x646f
addi r26,r26,0x6e65
blr
init_sram:
li r4,0xa00 # Load the data address
lis r6,0x4004 # Load the sram address base upper
addi r6,r6,0x07fff # Load the sram address base lower
addi r6,r6,0x0001 # Load the sram address base lower
11. lis r7,0x646f # Load in the packet end string
addi r7,r7,0x6e65 # ""
loop_0:
lwz r5,0x0(r4)
lfd f5,0x0(r4) # use pointer to load data
stfd f5,0x0(r6) # Store loaded word to sram
addi r4,r4,0x8 #
addi r6,r6,0x8 #
cmpw r5,r7 #
bne loop_0 #
lis r27,0x646f
addi r27,r27,0x6e65
blr
init_ether:
lis r1,fpga_base
lis r2,fpga_base
lis r3,fpga_base
addi r1,r1,fpga_et_ad
addi r2,r2,fpga_et_op
addi r3,r3,fpga_et_rd
li r10,0x0100 # r10 always holds ptr to next packet
li r15,0x0400
12. li r17,0x0
li r4,ether_cmd
stw r4,0x0(r1)
li r4,ether_reset
stw r4,0x0(r2)
li r4,ether_pstart
stw r4,0x0(r1)
li r4,0x0001
stw r4,0x0(r2)
li r4,ether_pstop
stw r4,0x0(r1)
li r4,0x007f
stw r4,0x0(r2)
li r4,ether_boundry
stw r4,0x0(r1)
li r4,0x0001
stw r4,0x0(r2)
li r4,ether_txpstrt
stw r4,0x0(r1)
li r4,0x0080
13. stw r4,0x0(r2)
li r4,ether_isr
stw r4,0x0(r1)
li r4,0x00ff
stw r4,0x0(r2)
li r4,ether_rcr
stw r4,0x0(r1)
li r4,0x001f
stw r4,0x0(r2)
li r4,ether_tcr
stw r4,0x0(r1)
li r4,0x0000
stw r4,0x0(r2)
li r4,ether_dcr
stw r4,0x0(r1)
li r4,0x004b
stw r4,0x0(r2)
li r4,ether_cmd
stw r4,0x0(r1)
li r4,ether_pg_1
14. stw r4,0x0(r2)
li r4,0x1
stw r4,0x0(r1)
li r4,ether_adr_0
stw r4,0x0(r2)
li r4,0x2
stw r4,0x0(r1)
li r4,ether_adr_1
stw r4,0x0(r2)
li r4,0x3
stw r4,0x0(r1)
li r4,ether_adr_2
stw r4,0x0(r2)
li r4,0x4
stw r4,0x0(r1)
li r4,ether_adr_3
stw r4,0x0(r2)
li r4,0x5
stw r4,0x0(r1)
li r4,ether_adr_4
15. stw r4,0x0(r2)
li r4,0x6
stw r4,0x0(r1)
li r4,ether_adr_5
stw r4,0x0(r2)
li r4,ether_cmd
stw r4,0x0(r1)
li r4,ether_pg_0
stw r4,0x0(r2)
lis r28,0x646f
addi r28,r28,0x6e65
blr
# Code to transmit generic data from data in sram(40048000)
transmit:
li r4,0x0a10 # Load the data address
addi r17,r17,0x0001
stw r17,0x0,(r4)
#
li r4,0x0a00 # Load the data address
li r5,0x0a40 # Load in dram data limit
16. lis r6,0x4004 # Load the sram address base upper
addi r6,r6,0x07ff # Load the sram address base lower
addi r6,r6,0x0001 # Load the sram address base lower
#
loop_3:
lfd f5,0x0(r4) # use pointer to load data
stfd f5,0x0(r6) # Store loaded word to sram
addi r4,r4,0x8 #
addi r6,r6,0x8 #
cmpw r4,r5 #
bne loop_3 #
li r4,ether_cmd
stw r4,0x0(r1)
li r4,ether_pg_0
stw r4,0x0(r2)
li r4,ether_txpstrt
stw r4,0x0(r1)
li r4,0x0080
stw r4,0x0(r2)
li r4,ether_txbytel
stw r4,0x0(r1)
li r4,0x0040
17. stw r4,0x0(r2)
li r4,ether_txbyteh
stw r4,0x0(r1)
li r4,0x0000
stw r4,0x0(r2)
li r4,ether_cmd
stw r4,0x0(r1)
li r4,ether_tx_now
stw r4,0x0(r2)
blr
# Loop to waste time while checking for receptions.
# If a reception is detected it is dma'ed and the chip setup up for
# more receptions. The delay/check loop then continues.
delay_loop:
li r9,0x7fff
li r8,0x0000
loop_1:
addi r8,r8,0x0001
cmpw r8,r9
bnea check_rx
18. blr
check_rx:
li r4,ether_isr
stw r4,0x0(r1)
lwz r4,0x0(r2)
lwz r6,0x0(r3)
li r5,0x0001
and r4,r5,r6
cmpw r5,r4
bnea loop_1
prep_rx_dma:
# Reset the rx interrupt
li r4,ether_isr
stw r4,0x0(r1)
li r4,0x0001
stw r4,0x0(r2)
# Update sram rx dma ptr's to current buffer
lis r11,sram_base
lis r12,sram_base
add r11,r11,r10
add r12,r12,r10
lfd f4,0x0(r11)
19. lfd f4,0x0(r11)
stfd f4,0x0b00(r0)
# Load next buffer ptr and update rx_bdry
li r4,ether_boundry
stw r4,0x0(r1)
lbz r10,0x0b00(r0)
stw r10,0x0(r2)
li r5,0x0008
slw r10,r10,r5
# Load byte count
lbz r4,0x0b03(r0)
slw r4,r4,r5
lbz r6,0x0b02(r0)
add r4,r6,r4
# Get the limit of this buffer read(buf addr + byte count)
add r12,r12,r4
addi r12,r12,0xf # Round up to get all data
lis r13,0xffff
li r13,0xfff8
and r12,r12,r13 # Ditch non 8 byte boundary bits
# Establish the Rx Dram buffer location( 1k to 7k)
20. addi r15,r15,0x0600 # Increment the rx dram buffer ptr
li r16,0x7000
cmpw r15,r16
beq start_rx_dma
li r15,0x1000
start_rx_dma:
stw r15,0x0b08(r0)
lwz r16,0x0b08(r0)
loop_2:
lfd f4,0x0(r11) # Acquire word from sram
lfd f4,0x0(r11) # Ditto
stfd f4,0x0(r16) # Store loaded word to dram
addi r16,r16,0x8 #
addi r11,r11,0x8 #
cmpw r11,r12 #
bne loop_2 #
b loop_1
#blr # Will be replaced with loop_1 in operational
prog.
end: