📄 emac.lst
字号:
\ 0000001C 6407 LSLS R4,R4,#+29
\ 0000001E FCD5 BPL ??read_phy_1
90 *value = (pEmac->EMAC_MAN & 0x0000ffff);
\ 00000020 446B LDR R4,[R0, #+52]
\ 00000022 2404 LSLS R4,R4,#+16 ;; ZeroExtS R4,R4,#+16,#+16
\ 00000024 240C LSRS R4,R4,#+16
\ 00000026 1C60 STR R4,[R3, #+0]
91 }
\ 00000028 30BC POP {R4,R5}
\ 0000002A 01BC POP {R0}
\ 0000002C 0047 BX R0 ;; return
\ 0000002E C046 Nop
\ ??read_phy_0:
\ 00000030 00000260 DC32 0x60020000
92
93 //*----------------------------------------------------------------------------
94 //* \fn AT91F_GetLinkSpeed
95 //* \brief This function configure the link speed
96 //*----------------------------------------------------------------------------
\ In segment CODE, align 4, keep-with-next
97 int AT91F_GetLinkSpeed( AT91PS_EMAC pEmac) // \arg Pointer to AT91PS_EMAC service
98 {
\ AT91F_GetLinkSpeed:
\ 00000000 F0B5 PUSH {R4-R7,LR}
\ 00000002 83B0 SUB SP,SP,#+12
\ 00000004 0400 MOVS R4,R0
99 unsigned int bmsr, bmcr, lpa, mac_cfg;
100 unsigned int speed, duplex;
101
102 /* Link status is latched, so read twice to get current value */
103 read_phy(pEmac, AT91C_PHY_ADDR, MII_BMSR, &bmsr);
\ 00000006 01AB ADD R3,SP,#+4
\ 00000008 0122 MOVS R2,#+1
\ 0000000A 1F21 MOVS R1,#+31
\ 0000000C 2000 MOVS R0,R4
\ 0000000E ........ BL read_phy
104 read_phy(pEmac, AT91C_PHY_ADDR, MII_BMSR, &bmsr);
\ 00000012 01AB ADD R3,SP,#+4
\ 00000014 0122 MOVS R2,#+1
\ 00000016 1F21 MOVS R1,#+31
\ 00000018 2000 MOVS R0,R4
\ 0000001A ........ BL read_phy
105 if (!(bmsr & BMSR_LSTATUS))
\ 0000001E 0198 LDR R0,[SP, #+4]
\ 00000020 4007 LSLS R0,R0,#+29
\ 00000022 02D4 BMI ??AT91F_GetLinkSpeed_0
106 return -1; /* no link */
\ 00000024 0020 MOVS R0,#+0
\ 00000026 C043 MVNS R0,R0 ;; #-1
\ 00000028 5FE0 B ??AT91F_GetLinkSpeed_1
107
108 read_phy(pEmac, AT91C_PHY_ADDR, MII_BMCR, &bmcr);
\ ??AT91F_GetLinkSpeed_0:
\ 0000002A 6B46 MOV R3,SP
\ 0000002C 0022 MOVS R2,#+0
\ 0000002E 1F21 MOVS R1,#+31
\ 00000030 2000 MOVS R0,R4
\ 00000032 ........ BL read_phy
109 if (bmcr & BMCR_ANENABLE) { /* AutoNegotiation is enabled */
\ 00000036 0098 LDR R0,[SP, #+0]
\ 00000038 C004 LSLS R0,R0,#+19
\ 0000003A 22D5 BPL ??AT91F_GetLinkSpeed_2
110 if (!(bmsr & BMSR_ANEGCOMPLETE))
\ 0000003C 0198 LDR R0,[SP, #+4]
\ 0000003E 8006 LSLS R0,R0,#+26
\ 00000040 02D4 BMI ??AT91F_GetLinkSpeed_3
111 return -2; /* auto-negotitation in progress */
\ 00000042 0120 MOVS R0,#+1
\ 00000044 C043 MVNS R0,R0 ;; #-2
\ 00000046 50E0 B ??AT91F_GetLinkSpeed_1
112
113 read_phy(pEmac, AT91C_PHY_ADDR, MII_LPA, &lpa);
\ ??AT91F_GetLinkSpeed_3:
\ 00000048 02AB ADD R3,SP,#+8
\ 0000004A 0522 MOVS R2,#+5
\ 0000004C 1F21 MOVS R1,#+31
\ 0000004E 2000 MOVS R0,R4
\ 00000050 ........ BL read_phy
114 if ((lpa & LPA_100FULL) || (lpa & LPA_100HALF))
\ 00000054 0298 LDR R0,[SP, #+8]
\ 00000056 C021 MOVS R1,#+192
\ 00000058 4900 LSLS R1,R1,#+1 ;; #+384
\ 0000005A 0140 ANDS R1,R1,R0
\ 0000005C 0029 CMP R1,#+0
\ 0000005E 02D0 BEQ ??AT91F_GetLinkSpeed_4
115 speed = SPEED_100;
\ 00000060 6420 MOVS R0,#+100
\ 00000062 0600 MOVS R6,R0
\ 00000064 01E0 B ??AT91F_GetLinkSpeed_5
116 else
117 speed = SPEED_10;
\ ??AT91F_GetLinkSpeed_4:
\ 00000066 0A20 MOVS R0,#+10
\ 00000068 0600 MOVS R6,R0
118 if ((lpa & LPA_100FULL) || (lpa & LPA_10FULL))
\ ??AT91F_GetLinkSpeed_5:
\ 0000006A 0298 LDR R0,[SP, #+8]
\ 0000006C A021 MOVS R1,#+160
\ 0000006E 4900 LSLS R1,R1,#+1 ;; #+320
\ 00000070 0140 ANDS R1,R1,R0
\ 00000072 0029 CMP R1,#+0
\ 00000074 02D0 BEQ ??AT91F_GetLinkSpeed_6
119 duplex = DUPLEX_FULL;
\ 00000076 0120 MOVS R0,#+1
\ 00000078 0700 MOVS R7,R0
\ 0000007A 0EE0 B ??AT91F_GetLinkSpeed_7
120 else duplex = DUPLEX_HALF;
\ ??AT91F_GetLinkSpeed_6:
\ 0000007C 0020 MOVS R0,#+0
\ 0000007E 0700 MOVS R7,R0
\ 00000080 0BE0 B ??AT91F_GetLinkSpeed_7
121 } else {
122 speed = (bmcr & BMCR_SPEED100) ? SPEED_100 : SPEED_10;
\ ??AT91F_GetLinkSpeed_2:
\ 00000082 0098 LDR R0,[SP, #+0]
\ 00000084 8004 LSLS R0,R0,#+18
\ 00000086 01D5 BPL ??AT91F_GetLinkSpeed_8
\ 00000088 6426 MOVS R6,#+100
\ 0000008A 00E0 B ??AT91F_GetLinkSpeed_9
\ ??AT91F_GetLinkSpeed_8:
\ 0000008C 0A26 MOVS R6,#+10
123 duplex = (bmcr & BMCR_FULLDPLX) ? DUPLEX_FULL : DUPLEX_HALF;
\ ??AT91F_GetLinkSpeed_9:
\ 0000008E 0098 LDR R0,[SP, #+0]
\ 00000090 C005 LSLS R0,R0,#+23
\ 00000092 01D5 BPL ??AT91F_GetLinkSpeed_10
\ 00000094 0127 MOVS R7,#+1
\ 00000096 00E0 B ??AT91F_GetLinkSpeed_11
\ ??AT91F_GetLinkSpeed_10:
\ 00000098 0027 MOVS R7,#+0
124 }
125
126 /* Update the MAC */
127 mac_cfg = pEmac->EMAC_NCFGR & ~(AT91C_EMAC_SPD | AT91C_EMAC_FD);
\ ??AT91F_GetLinkSpeed_11:
\ ??AT91F_GetLinkSpeed_7:
\ 0000009A 6068 LDR R0,[R4, #+4]
\ 0000009C 0321 MOVS R1,#+3
\ 0000009E 8843 BICS R0,R0,R1
\ 000000A0 0500 MOVS R5,R0
128 if (speed == SPEED_100) {
\ 000000A2 642E CMP R6,#+100
\ 000000A4 09D1 BNE ??AT91F_GetLinkSpeed_12
129 if (duplex == DUPLEX_FULL) /* 100 Full Duplex */
\ 000000A6 012F CMP R7,#+1
\ 000000A8 03D1 BNE ??AT91F_GetLinkSpeed_13
130 pEmac->EMAC_NCFGR = mac_cfg | AT91C_EMAC_SPD | AT91C_EMAC_FD;
\ 000000AA 0320 MOVS R0,#+3
\ 000000AC 2843 ORRS R0,R0,R5
\ 000000AE 6060 STR R0,[R4, #+4]
\ 000000B0 0AE0 B ??AT91F_GetLinkSpeed_14
131 else /* 100 Half Duplex */
132 pEmac->EMAC_NCFGR = mac_cfg | AT91C_EMAC_SPD;
\ ??AT91F_GetLinkSpeed_13:
\ 000000B2 0120 MOVS R0,#+1
\ 000000B4 2843 ORRS R0,R0,R5
\ 000000B6 6060 STR R0,[R4, #+4]
\ 000000B8 06E0 B ??AT91F_GetLinkSpeed_14
133 } else {
134 if (duplex == DUPLEX_FULL) /* 10 Full Duplex */
\ ??AT91F_GetLinkSpeed_12:
\ 000000BA 012F CMP R7,#+1
\ 000000BC 03D1 BNE ??AT91F_GetLinkSpeed_15
135 pEmac->EMAC_NCFGR = mac_cfg | AT91C_EMAC_FD;
\ 000000BE 0220 MOVS R0,#+2
\ 000000C0 2843 ORRS R0,R0,R5
\ 000000C2 6060 STR R0,[R4, #+4]
\ 000000C4 00E0 B ??AT91F_GetLinkSpeed_14
136 else /* 10 Half Duplex */
137 pEmac->EMAC_NCFGR = mac_cfg;
\ ??AT91F_GetLinkSpeed_15:
\ 000000C6 6560 STR R5,[R4, #+4]
138 }
139 #if 1
140 if (duplex == DUPLEX_FULL)
\ ??AT91F_GetLinkSpeed_14:
\ 000000C8 012F CMP R7,#+1
\ 000000CA 05D1 BNE ??AT91F_GetLinkSpeed_16
141 sprintf(MsgBuffer, "\n\r EMAC Init : %d Mbit/s FULL DUPLEX", speed);
\ 000000CC 3200 MOVS R2,R6
\ 000000CE 0949 LDR R1,??AT91F_GetLinkSpeed_17 ;; `?<Constant "\\n\\r EMAC Init : %d Mbi...">`
\ 000000D0 0948 LDR R0,??AT91F_GetLinkSpeed_17+0x4 ;; MsgBuffer
\ 000000D2 ........ _BLF sprintf,??sprintf??rT
\ 000000D6 04E0 B ??AT91F_GetLinkSpeed_18
142 else
143 sprintf(MsgBuffer, "\n\r EMAC Init : %d Mbit/s HALF DUPLEX", speed);
\ ??AT91F_GetLinkSpeed_16:
\ 000000D8 3200 MOVS R2,R6
\ 000000DA 0849 LDR R1,??AT91F_GetLinkSpeed_17+0x8 ;; `?<Constant "\\n\\r EMAC Init : %d Mbi...">_1`
\ 000000DC 0648 LDR R0,??AT91F_GetLinkSpeed_17+0x4 ;; MsgBuffer
\ 000000DE ........ _BLF sprintf,??sprintf??rT
144 AT91F_DBGU_Printk(MsgBuffer);
\ ??AT91F_GetLinkSpeed_18:
\ 000000E2 0548 LDR R0,??AT91F_GetLinkSpeed_17+0x4 ;; MsgBuffer
\ 000000E4 ........ _BLF AT91F_DBGU_Printk,??AT91F_DBGU_Printk??rT
145 #endif
146 return 0;
\ 000000E8 0020 MOVS R0,#+0
\ ??AT91F_GetLinkSpeed_1:
\ 000000EA 03B0 ADD SP,SP,#+12
\ 000000EC F0BC POP {R4-R7}
\ 000000EE 02BC POP {R1}
\ 000000F0 0847 BX R1 ;; return
\ 000000F2 C046 Nop
\ ??AT91F_GetLinkSpeed_17:
\ 000000F4 ........ DC32 `?<Constant "\\n\\r EMAC Init : %d Mbi...">`
\ 000000F8 ........ DC32 MsgBuffer
\ 000000FC ........ DC32 `?<Constant "\\n\\r EMAC Init : %d Mbi...">_1`
147 }
148
149 //Detect MAC and PHY and perform initialization
\ In segment CODE, align 4, keep-with-next
150 int AT91F_Ether_Probe(
151 AT91PS_EMAC pEmac) // \arg Pointer to AT91PS_EMAC service
152 {
\ AT91F_Ether_Probe:
\ 00000000 30B5 PUSH {R4,R5,LR}
\ 00000002 82B0 SUB SP,SP,#+8
\ 00000004 0400 MOVS R4,R0
153 unsigned int phyid1, phyid2;
154 unsigned int status;
155
156 // Read the PHY ID registers
157 AT91F_Enable_Mdi(pEmac);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -