📄 emac.lst
字号:
\ 00000010 8168 LDR R1,[R0, #+0x8]
\ 00000012 4907 LSL R1,R1,#+0x1D
\ 00000014 FCD5 BPL ??read_phy_1
91 *value = (pEmac->EMAC_MAN & 0x0000ffff);
\ 00000016 406B LDR R0,[R0, #+0x34]
\ 00000018 0004 LSL R0,R0,#+0x10 ;; ZeroExt R0,R0,#+0x10,#+0x10
\ 0000001A 000C LSR R0,R0,#+0x10
\ 0000001C 1860 STR R0,[R3, #+0]
92 }
\ 0000001E 7047 BX LR ;; return
\ ??read_phy_0:
\ 00000020 00000260 DC32 0x60020000
93
94 //*----------------------------------------------------------------------------
95 //* \fn AT91F_GetLinkSpeed
96 //* \brief This function configure the link speed
97 //*----------------------------------------------------------------------------
\ In segment CODE, align 4, keep-with-next
98 int AT91F_GetLinkSpeed( AT91PS_EMAC pEmac) // \arg Pointer to AT91PS_EMAC service
99 {
\ AT91F_GetLinkSpeed:
\ 00000000 10B5 PUSH {R4,LR}
\ 00000002 83B0 SUB SP,#+0xC
\ 00000004 041C MOV R4,R0
100 unsigned int bmsr, bmcr, lpa, mac_cfg;
101 unsigned int speed, duplex;
102
103 /* Link status is latched, so read twice to get current value */
104 read_phy(pEmac, AT91C_PHY_ADDR, MII_BMSR, &bmsr);
\ 00000006 01AB ADD R3,SP,#+0x4
\ 00000008 0122 MOV R2,#+0x1
\ 0000000A 1F21 MOV R1,#+0x1F
\ 0000000C 201C MOV R0,R4
\ 0000000E ........ BL read_phy
105 read_phy(pEmac, AT91C_PHY_ADDR, MII_BMSR, &bmsr);
\ 00000012 01AB ADD R3,SP,#+0x4
\ 00000014 0122 MOV R2,#+0x1
\ 00000016 1F21 MOV R1,#+0x1F
\ 00000018 201C MOV R0,R4
\ 0000001A ........ BL read_phy
106 if (!(bmsr & BMSR_LSTATUS))
\ 0000001E 0198 LDR R0,[SP, #+0x4]
\ 00000020 4007 LSL R0,R0,#+0x1D
\ 00000022 02D4 BMI ??AT91F_GetLinkSpeed_0
107 return -1; /* no link */
\ 00000024 0020 MOV R0,#+0
\ 00000026 C043 MVN R0,R0 ;; #-1
\ 00000028 5AE0 B ??AT91F_GetLinkSpeed_1
108
109 read_phy(pEmac, AT91C_PHY_ADDR, MII_BMCR, &bmcr);
\ ??AT91F_GetLinkSpeed_0:
\ 0000002A 6B46 MOV R3,SP
\ 0000002C 0022 MOV R2,#+0
\ 0000002E 1F21 MOV R1,#+0x1F
\ 00000030 201C MOV R0,R4
\ 00000032 ........ BL read_phy
110 if (bmcr & BMCR_ANENABLE) { /* AutoNegotiation is enabled */
\ 00000036 0098 LDR R0,[SP, #+0]
\ 00000038 C004 LSL R0,R0,#+0x13
\ 0000003A 1CD5 BPL ??AT91F_GetLinkSpeed_2
111 if (!(bmsr & BMSR_ANEGCOMPLETE))
\ 0000003C 0198 LDR R0,[SP, #+0x4]
\ 0000003E 8006 LSL R0,R0,#+0x1A
\ 00000040 02D4 BMI ??AT91F_GetLinkSpeed_3
112 return -2; /* auto-negotitation in progress */
\ 00000042 0120 MOV R0,#+0x1
\ 00000044 C043 MVN R0,R0 ;; #-2
\ 00000046 4BE0 B ??AT91F_GetLinkSpeed_1
113
114 read_phy(pEmac, AT91C_PHY_ADDR, MII_LPA, &lpa);
\ ??AT91F_GetLinkSpeed_3:
\ 00000048 02AB ADD R3,SP,#+0x8
\ 0000004A 0522 MOV R2,#+0x5
\ 0000004C 1F21 MOV R1,#+0x1F
\ 0000004E 201C MOV R0,R4
\ 00000050 ........ BL read_phy
115 if ((lpa & LPA_100FULL) || (lpa & LPA_100HALF))
\ 00000054 0298 LDR R0,[SP, #+0x8]
\ 00000056 C021 MOV R1,#+0xC0
\ 00000058 4900 LSL R1,R1,#+0x1 ;; #+0x180
\ 0000005A 0842 TST R0,R1
\ 0000005C 01D0 BEQ ??AT91F_GetLinkSpeed_4
116 speed = SPEED_100;
\ 0000005E 6422 MOV R2,#+0x64
\ 00000060 00E0 B ??AT91F_GetLinkSpeed_5
117 else
118 speed = SPEED_10;
\ ??AT91F_GetLinkSpeed_4:
\ 00000062 0A22 MOV R2,#+0xA
119 if ((lpa & LPA_100FULL) || (lpa & LPA_10FULL))
\ ??AT91F_GetLinkSpeed_5:
\ 00000064 0298 LDR R0,[SP, #+0x8]
\ 00000066 A021 MOV R1,#+0xA0
\ 00000068 4900 LSL R1,R1,#+0x1 ;; #+0x140
\ 0000006A 0140 AND R1,R0
\ 0000006C 081C MOV R0,R1
\ 0000006E 0028 CMP R0,#+0
\ 00000070 00D0 BEQ ??AT91F_GetLinkSpeed_6
\ 00000072 0120 MOV R0,#+0x1
120 duplex = DUPLEX_FULL;
121 else duplex = DUPLEX_HALF;
\ ??AT91F_GetLinkSpeed_6:
\ 00000074 0FE0 B ??AT91F_GetLinkSpeed_7
122 } else {
123 speed = (bmcr & BMCR_SPEED100) ? SPEED_100 : SPEED_10;
\ ??AT91F_GetLinkSpeed_2:
\ 00000076 0098 LDR R0,[SP, #+0]
\ 00000078 8004 LSL R0,R0,#+0x12
\ 0000007A 01D5 BPL ??AT91F_GetLinkSpeed_8
\ 0000007C 6422 MOV R2,#+0x64
\ 0000007E 00E0 B ??AT91F_GetLinkSpeed_9
\ ??AT91F_GetLinkSpeed_8:
\ 00000080 0A22 MOV R2,#+0xA
124 duplex = (bmcr & BMCR_FULLDPLX) ? DUPLEX_FULL : DUPLEX_HALF;
\ ??AT91F_GetLinkSpeed_9:
\ 00000082 0098 LDR R0,[SP, #+0]
\ 00000084 8021 MOV R1,#+0x80
\ 00000086 4900 LSL R1,R1,#+0x1 ;; #+0x100
\ 00000088 0140 AND R1,R0
\ 0000008A 081C MOV R0,R1
\ 0000008C 0028 CMP R0,#+0
\ 0000008E 00D0 BEQ ??AT91F_GetLinkSpeed_10
\ 00000090 0120 MOV R0,#+0x1
\ ??AT91F_GetLinkSpeed_10:
\ 00000092 0006 LSL R0,R0,#+0x18 ;; ZeroExt R0,R0,#+0x18,#+0x18
\ 00000094 000E LSR R0,R0,#+0x18
125 }
126
127 /* Update the MAC */
128 mac_cfg = pEmac->EMAC_NCFGR & ~(AT91C_EMAC_SPD | AT91C_EMAC_FD);
\ ??AT91F_GetLinkSpeed_7:
\ 00000096 6168 LDR R1,[R4, #+0x4]
\ 00000098 0323 MOV R3,#+0x3
\ 0000009A 9943 BIC R1,R3
129 if (speed == SPEED_100) {
\ 0000009C 642A CMP R2,#+0x64
\ 0000009E 09D1 BNE ??AT91F_GetLinkSpeed_11
130 if (duplex == DUPLEX_FULL) /* 100 Full Duplex */
\ 000000A0 0128 CMP R0,#+0x1
\ 000000A2 03D1 BNE ??AT91F_GetLinkSpeed_12
131 pEmac->EMAC_NCFGR = mac_cfg | AT91C_EMAC_SPD | AT91C_EMAC_FD;
\ 000000A4 0323 MOV R3,#+0x3
\ 000000A6 0B43 ORR R3,R1
\ 000000A8 6360 STR R3,[R4, #+0x4]
\ 000000AA 0AE0 B ??AT91F_GetLinkSpeed_13
132 else /* 100 Half Duplex */
133 pEmac->EMAC_NCFGR = mac_cfg | AT91C_EMAC_SPD;
\ ??AT91F_GetLinkSpeed_12:
\ 000000AC 0123 MOV R3,#+0x1
\ 000000AE 0B43 ORR R3,R1
\ 000000B0 6360 STR R3,[R4, #+0x4]
\ 000000B2 06E0 B ??AT91F_GetLinkSpeed_13
134 } else {
135 if (duplex == DUPLEX_FULL) /* 10 Full Duplex */
\ ??AT91F_GetLinkSpeed_11:
\ 000000B4 0128 CMP R0,#+0x1
\ 000000B6 03D1 BNE ??AT91F_GetLinkSpeed_14
136 pEmac->EMAC_NCFGR = mac_cfg | AT91C_EMAC_FD;
\ 000000B8 0223 MOV R3,#+0x2
\ 000000BA 0B43 ORR R3,R1
\ 000000BC 6360 STR R3,[R4, #+0x4]
\ 000000BE 00E0 B ??AT91F_GetLinkSpeed_13
137 else /* 10 Half Duplex */
138 pEmac->EMAC_NCFGR = mac_cfg;
\ ??AT91F_GetLinkSpeed_14:
\ 000000C0 6160 STR R1,[R4, #+0x4]
139 }
140 #if 1
141 if (duplex == DUPLEX_FULL)
\ ??AT91F_GetLinkSpeed_13:
\ 000000C2 0128 CMP R0,#+0x1
\ 000000C4 04D1 BNE ??AT91F_GetLinkSpeed_15
142 sprintf(MsgBuffer, "\n\r EMAC Init : %d Mbit/s FULL DUPLEX", speed);
\ 000000C6 0849 LDR R1,??AT91F_GetLinkSpeed_16 ;; `?<Constant "\\n\\r EMAC Init : %d Mbi...">`
\ 000000C8 0848 LDR R0,??AT91F_GetLinkSpeed_16+0x4 ;; MsgBuffer
\ 000000CA ........ _BLF sprintf,sprintf??rT
\ 000000CE 03E0 B ??AT91F_GetLinkSpeed_17
143 else
144 sprintf(MsgBuffer, "\n\r EMAC Init : %d Mbit/s HALF DUPLEX", speed);
\ ??AT91F_GetLinkSpeed_15:
\ 000000D0 0749 LDR R1,??AT91F_GetLinkSpeed_16+0x8 ;; `?<Constant "\\n\\r EMAC Init : %d Mbi...">_1`
\ 000000D2 0648 LDR R0,??AT91F_GetLinkSpeed_16+0x4 ;; MsgBuffer
\ 000000D4 ........ _BLF sprintf,sprintf??rT
145 AT91F_DBGU_Printk(MsgBuffer);
\ ??AT91F_GetLinkSpeed_17:
\ 000000D8 0448 LDR R0,??AT91F_GetLinkSpeed_16+0x4 ;; MsgBuffer
\ 000000DA ........ _BLF AT91F_DBGU_Printk,AT91F_DBGU_Printk??rT
146 #endif
147 return 0;
\ 000000DE 0020 MOV R0,#+0
\ ??AT91F_GetLinkSpeed_1:
\ 000000E0 03B0 ADD SP,#+0xC
\ 000000E2 10BC POP {R4}
\ 000000E4 02BC POP {R1}
\ 000000E6 0847 BX R1 ;; return
\ ??AT91F_GetLinkSpeed_16:
\ 000000E8 ........ DC32 `?<Constant "\\n\\r EMAC Init : %d Mbi...">`
\ 000000EC ........ DC32 MsgBuffer
\ 000000F0 ........ DC32 `?<Constant "\\n\\r EMAC Init : %d Mbi...">_1`
148 }
149
150 //Detect MAC and PHY and perform initialization
\ In segment CODE, align 4, keep-with-next
151 int AT91F_Ether_Probe(
152 AT91PS_EMAC pEmac) // \arg Pointer to AT91PS_EMAC service
153 {
\ AT91F_Ether_Probe:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 00000002 82B0 SUB SP,#+0x8
\ 00000004 041C MOV R4,R0
154 unsigned int phyid1, phyid2;
155 unsigned int status;
156
157 // Read the PHY ID registers
158 AT91F_Enable_Mdi(pEmac);
\ 00000006 201C MOV R0,R4
\ 00000008 ........ BL AT91F_Enable_Mdi
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -