lpc23_emac.txt
来自「工厂环境污染控制数据采集器」· 文本 代码 · 共 796 行 · 第 1/3 页
TXT
796 行
000434 3afffff6 BCC |L1.1044|
|L1.1080|
000438 e1a00000 MOV r0,r0
;;;148 }
;;;149 }
;;;150
;;;151 /* Configure Full/Half Duplex mode. */
;;;152 if (regv & 0x0004) {
00043c e3140004 TST r4,#4
000440 0a00000b BEQ |L1.1140|
;;;153 /* Full duplex is enabled. */
;;;154 MAC_MAC2 |= MAC2_FULL_DUP;
000444 e59f01a4 LDR r0,|L1.1520|
000448 e5900004 LDR r0,[r0,#4]
00044c e3800001 ORR r0,r0,#1
000450 e59f1198 LDR r1,|L1.1520|
000454 e5810004 STR r0,[r1,#4]
;;;155 MAC_COMMAND |= CR_FULL_DUP;
000458 e1a00001 MOV r0,r1
00045c e5900100 LDR r0,[r0,#0x100]
000460 e3800b01 ORR r0,r0,#0x400
000464 e5810100 STR r0,[r1,#0x100]
;;;156 MAC_IPGT = IPGT_FULL_DUP;
000468 e3a00015 MOV r0,#0x15
00046c e5810008 STR r0,[r1,#8]
000470 ea000002 B |L1.1152|
|L1.1140|
;;;157 }
;;;158 else {
;;;159 /* Half duplex mode. */
;;;160 MAC_IPGT = IPGT_HALF_DUP;
000474 e3a00012 MOV r0,#0x12
000478 e59f1170 LDR r1,|L1.1520|
00047c e5810008 STR r0,[r1,#8]
|L1.1152|
;;;161 }
;;;162
;;;163 /* Configure 100MBit/10MBit mode. */
;;;164 if (regv & 0x0002) {
000480 e3140002 TST r4,#2
000484 0a000003 BEQ |L1.1176|
;;;165 /* 10MBit mode. */
;;;166 MAC_SUPP = 0;
000488 e3a00000 MOV r0,#0
00048c e2401602 SUB r1,r0,#0x200000
000490 e5810018 STR r0,[r1,#0x18]
000494 ea000002 B |L1.1188|
|L1.1176|
;;;167 }
;;;168 else {
;;;169 /* 100MBit mode. */
;;;170 MAC_SUPP = SUPP_SPEED;
000498 e3a00c01 MOV r0,#0x100
00049c e59f114c LDR r1,|L1.1520|
0004a0 e5810018 STR r0,[r1,#0x18]
|L1.1188|
;;;171 }
;;;172
;;;173 /* Set the Ethernet MAC Address registers */
;;;174 MAC_SA0 = ((U32)own_hw_adr[5] << 8) | (U32)own_hw_adr[4];
0004a4 e59f0188 LDR r0,|L1.1588|
0004a8 e5d00004 LDRB r0,[r0,#4] ; own_hw_adr
0004ac e59f1180 LDR r1,|L1.1588|
0004b0 e5d11005 LDRB r1,[r1,#5] ; own_hw_adr
0004b4 e1800401 ORR r0,r0,r1,LSL #8
0004b8 e59f1130 LDR r1,|L1.1520|
0004bc e5810040 STR r0,[r1,#0x40]
;;;175 MAC_SA1 = ((U32)own_hw_adr[3] << 8) | (U32)own_hw_adr[2];
0004c0 e59f016c LDR r0,|L1.1588|
0004c4 e5d00002 LDRB r0,[r0,#2] ; own_hw_adr
0004c8 e59f1164 LDR r1,|L1.1588|
0004cc e5d11003 LDRB r1,[r1,#3] ; own_hw_adr
0004d0 e1800401 ORR r0,r0,r1,LSL #8
0004d4 e59f1114 LDR r1,|L1.1520|
0004d8 e5810044 STR r0,[r1,#0x44]
;;;176 MAC_SA2 = ((U32)own_hw_adr[1] << 8) | (U32)own_hw_adr[0];
0004dc e59f0150 LDR r0,|L1.1588|
0004e0 e5d00000 LDRB r0,[r0,#0] ; own_hw_adr
0004e4 e59f1148 LDR r1,|L1.1588|
0004e8 e5d11001 LDRB r1,[r1,#1] ; own_hw_adr
0004ec e1800401 ORR r0,r0,r1,LSL #8
0004f0 e59f10f8 LDR r1,|L1.1520|
0004f4 e5810048 STR r0,[r1,#0x48]
;;;177
;;;178 /* Initialize Tx and Rx DMA Descriptors */
;;;179 rx_descr_init ();
0004f8 ebfffffe BL rx_descr_init
;;;180 tx_descr_init ();
0004fc ebfffffe BL tx_descr_init
;;;181
;;;182 /* Receive Broadcast, Multicast and Perfect Match Packets */
;;;183 MAC_RXFILTERCTRL = RFC_MCAST_EN | RFC_BCAST_EN | RFC_PERFECT_EN;
000500 e3a00026 MOV r0,#0x26
000504 e59f10e4 LDR r1,|L1.1520|
000508 e5810200 STR r0,[r1,#0x200]
;;;184
;;;185 /* Enable EMAC interrupts. */
;;;186 MAC_INTENABLE = INT_RX_DONE | INT_TX_DONE;
00050c e3a00088 MOV r0,#0x88
000510 e5810fe4 STR r0,[r1,#0xfe4]
;;;187
;;;188 /* Reset all interrupts */
;;;189 MAC_INTCLEAR = 0xFFFF;
000514 e1e002c1 MVN r0,r1,ASR #5
000518 e5810fe8 STR r0,[r1,#0xfe8]
;;;190
;;;191 /* Enable receive and transmit mode of MAC Ethernet core */
;;;192 MAC_COMMAND |= (CR_RX_EN | CR_TX_EN);
00051c e1a00a80 LSL r0,r0,#21
000520 e5900100 LDR r0,[r0,#0x100]
000524 e3800003 ORR r0,r0,#3
000528 e5810100 STR r0,[r1,#0x100]
;;;193 MAC_MAC1 |= MAC1_REC_EN;
00052c e1a00001 MOV r0,r1
000530 e5900000 LDR r0,[r0,#0]
000534 e3800001 ORR r0,r0,#1
000538 e5810000 STR r0,[r1,#0]
;;;194
;;;195 /* Configure VIC for EMAC interrupt. */
;;;196 VICVectAddr21 = (U32)interrupt_ethernet;
00053c e59f00f4 LDR r0,|L1.1592|
000540 e3a01000 MOV r1,#0
000544 e5010eac STR r0,[r1,#-0xeac]
;;;197 }
000548 e8bd40f0 POP {r4-r7,lr}
00054c e12fff1e BX lr
;;;198
ENDP
int_enable_eth PROC
;;;203 /* Ethernet Interrupt Enable function. */
;;;204 VICIntEnable |= 1 << 21;
000550 e3a00000 MOV r0,#0
000554 e5100ff0 LDR r0,[r0,#-0xff0]
000558 e3800602 ORR r0,r0,#0x200000
00055c e3a01000 MOV r1,#0
000560 e5010ff0 STR r0,[r1,#-0xff0]
;;;205 }
000564 e12fff1e BX lr
;;;206
ENDP
int_disable_eth PROC
;;;211 /* Ethernet Interrupt Disable function. */
;;;212 VICIntEnClr = 1 << 21;
000568 e3a00602 MOV r0,#0x200000
00056c e3a01000 MOV r1,#0
000570 e5010fec STR r0,[r1,#-0xfec]
;;;213 }
000574 e12fff1e BX lr
;;;214
ENDP
send_frame PROC
;;;217
;;;218 void send_frame (OS_FRAME *frame) {
000578 e92d4010 PUSH {r4,lr}
;;;219 /* Send frame to EMAC ethernet controller */
;;;220 U32 idx,len;
;;;221 U32 *sp,*dp;
;;;222
;;;223 idx = MAC_TXPRODUCEINDEX;
00057c e59fe06c LDR lr,|L1.1520|
000580 e59e1128 LDR r1,[lr,#0x128]
;;;224 sp = (U32 *)&frame->data[0];
000584 e2803004 ADD r3,r0,#4
;;;225 dp = (U32 *)Tx_Desc[idx].Packet;
000588 e59fe078 LDR lr,|L1.1544|
00058c e79ec181 LDR r12,[lr,r1,LSL #3]
;;;226
;;;227 /* Copy frame data to EMAC packet buffers. */
;;;228 for (len = (frame->length + 3) >> 2; len; len--) {
000590 e1d0e0b0 LDRH lr,[r0,#0]
000594 e28ee003 ADD lr,lr,#3
000598 e1a0214e ASR r2,lr,#2
00059c ea000002 B |L1.1452|
|L1.1440|
;;;229 *dp++ = *sp++;
0005a0 e493e004 LDR lr,[r3],#4
0005a4 e48ce004 STR lr,[r12],#4
0005a8 e2422001 SUB r2,r2,#1 ;228
|L1.1452|
0005ac e3520000 CMP r2,#0 ;228
0005b0 1afffffa BNE |L1.1440|
;;;230 }
;;;231 Tx_Desc[idx].Ctrl = (frame->length-1) | (TCTRL_INT | TCTRL_LAST);
0005b4 e1d0e0b0 LDRH lr,[r0,#0]
0005b8 e24ee001 SUB lr,lr,#1
0005bc e38ee103 ORR lr,lr,#0xc0000000
0005c0 e59f4040 LDR r4,|L1.1544|
0005c4 e0844181 ADD r4,r4,r1,LSL #3
0005c8 e584e004 STR lr,[r4,#4]
;;;232
;;;233 /* Start frame transmission. */
;;;234 if (++idx == NUM_TX_FRAG) idx = 0;
0005cc e281e001 ADD lr,r1,#1
0005d0 e1a0100e MOV r1,lr
0005d4 e35e0003 CMP lr,#3
0005d8 1a000000 BNE |L1.1504|
0005dc e3a01000 MOV r1,#0
|L1.1504|
;;;235 MAC_TXPRODUCEINDEX = idx;
0005e0 e59fe008 LDR lr,|L1.1520|
0005e4 e58e1128 STR r1,[lr,#0x128]
;;;236 }
0005e8 e8bd4010 POP {r4,lr}
0005ec e12fff1e BX lr
;;;237
ENDP
|L1.1520|
0005f0 ffe00000 DCD 0xffe00000
|L1.1524|
0005f4 00000020 DCD ||.bss||+0x20
|L1.1528|
0005f8 000005ea DCD 0x000005ea
|L1.1532|
0005fc 1b900000 DCD 0x1b900000
|L1.1536|
000600 00000000 DCD ||.bss||
|L1.1540|
000604 00001864 DCD ||.bss||+0x1864
|L1.1544|
000608 00000040 DCD ||.bss||+0x40
|L1.1548|
00060c 00000058 DCD ||.bss||+0x58
|L1.1552|
000610 00000064 DCD ||.bss||+0x64
|L1.1556|
000614 800005ff DCD 0x800005ff
|L1.1560|
000618 e01fc000 DCD 0xe01fc000
|L1.1564|
00061c 50151105 DCD 0x50151105
|L1.1568|
000620 e002c000 DCD 0xe002c000
|L1.1572|
000624 50150105 DCD 0x50150105
|L1.1576|
000628 0000370f DCD 0x0000370f
|L1.1580|
00062c 0000fff0 DCD 0x0000fff0
|L1.1584|
000630 20005c90 DCD 0x20005c90
|L1.1588|
000634 00000000 DCD own_hw_adr
|L1.1592|
000638 00000000 DCD interrupt_ethernet
AREA ||.bss||, DATA, NOINIT, ALIGN=3
Rx_Desc
% 32
Rx_Stat
% 32
Tx_Desc
% 24
Tx_Stat
% 12
rx_buf
% 6144
tx_buf
% 4608
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?