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 + -
显示快捷键?