eth_stm32f4xx.txt
60 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292
1293
1294
1295
1296
1297
1298
1299
1300
1301
1302
1303
1304
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
1339
1340
1341
1342
1343
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364
1365
1366
1367
1368
1369
1370
1371
1372
1373
1374
1375
1376
1377
1378
1379
1380
1381
1382
1383
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
1429
1430
1431
1432
1433
1434
1435
1436
1437
1438
1439
1440
1441
1442
1443
1444
1445
; generated by Component: ARM Compiler 5.06 update 6 (build 750) Tool: ArmCC [4d3637]
; commandline ArmCC [--c99 --list --split_sections --debug -c --asm --interleave -o.\flash\obj\eth_stm32f4xx.o --asm_dir=.\Flash\List\ --list_dir=.\Flash\List\ --depend=.\flash\obj\eth_stm32f4xx.d --cpu=Cortex-M4.fp --apcs=interwork -O0 --diag_suppress=9931,870 -I..\..\Libraries\CMSIS\Include -I..\..\Libraries\CMSIS\Device\ST\STM32F4xx\Include -I..\..\Libraries\STM32F4xx_StdPeriph_Driver\inc -I..\..\uCOS-III\uC-CPU -I..\..\uCOS-III\uC-LIB -I..\..\uCOS-III\uCOS-III\Ports -I..\..\uCOS-III\uCOS-III\Source -I..\..\uCOS-III\uC-CPU\ARM-Cortex-M4\RealView -I..\..\uCOS-III\uC-LIB\Ports\ARM-Cortex-M4\RealView -I..\..\uCOS-III\uCOS-III\Ports\ARM-Cortex-M4\Generic\RealView -I..\..\User -I..\..\User\bsp -I..\..\User\bsp\inc -I..\..\User\libapp -I..\..\RL-ARM\Config -I..\..\RL-ARM\Driver -I..\..\RL-ARM\RL-RTX\inc -I..\..\User\bsp\BSP -I..\..\RL-ARM\RL-CAN -I..\..\Libraries\DSP_LIB\Include -I..\..\MODBUS\modbus\rtu -I..\..\MODBUS\BARE\port -I..\..\MODBUS\modbus\include -I..\..\User\bsp\BSP -I..\..\PLC -I..\..\Avoid -I.\RTE\_Flash -IC:\Users\49520\AppData\Local\Arm\Packs\ARM\CMSIS\5.5.1\CMSIS\Core\Include -IC:\Users\49520\AppData\Local\Arm\Packs\Keil\STM32F4xx_DFP\2.13.0\Drivers\CMSIS\Device\ST\STM32F4xx\Include -D__UVISION_VERSION=527 -D_RTE_ -DSTM32F407xx -DUSE_STDPERIPH_DRIVER -DSTM32F40_41xxx -D__RTX -D__FPU_USED=1 --omf_browse=.\flash\obj\eth_stm32f4xx.crf ..\..\RL-ARM\Driver\ETH_STM32F4xx.c]
THUMB
AREA ||i.ETH_IRQHandler||, CODE, READONLY, ALIGN=2
ETH_IRQHandler PROC
;;;468 */
;;;469 void ETH_IRQHandler (void)
000000 e92d47f0 PUSH {r4-r10,lr}
;;;470 {
;;;471 OS_FRAME *frame;
;;;472 U32 i, RxLen;
;;;473 U32 *sp,*dp;
;;;474
;;;475 #if uCOS_EN == 1
;;;476 CPU_SR_ALLOC();
000004 f04f0900 MOV r9,#0
;;;477
;;;478 CPU_CRITICAL_ENTER();
000008 bf00 NOP
00000a bf00 NOP
00000c f7fffffe BL CPU_SR_Save
000010 4681 MOV r9,r0
000012 bf00 NOP
000014 bf00 NOP
;;;479 OSIntEnter();
000016 f7fffffe BL OSIntEnter
;;;480 CPU_CRITICAL_EXIT();
00001a bf00 NOP
00001c bf00 NOP
00001e 4648 MOV r0,r9
000020 f7fffffe BL CPU_SR_Restore
000024 bf00 NOP
000026 bf00 NOP
;;;481 #endif
;;;482
;;;483 i = RxBufIndex;
000028 4831 LDR r0,|L1.240|
00002a 7804 LDRB r4,[r0,#0] ; RxBufIndex
;;;484
;;;485 /* 循环所有接受描述符列表,遇到未接收到数据的退出循环 */
;;;486 do
00002c bf00 NOP
|L1.46|
;;;487 {
;;;488 /*
;;;489 #define DMA_RX_ERROR_MASK (DMA_RX_ES | DMA_RX_LE | DMA_RX_RWT | \
;;;490 DMA_RX_RE | DMA_RX_CE)
;;;491
;;;492 有错误,放弃此帧数据,错误类型包含如下:
;;;493 位15 DMA_RX_ES:错误汇总(Error summary),即CRC错误,接收错误,看门狗超时,延迟冲突等。
;;;494 位12 DMA_RX_LE:长度错误(Length error)
;;;495 该位置1时,指示接收帧的实际长度与长度/类型字段的值不符。该字段仅在帧类
;;;496 型位(RDES0[5])复位后有效。
;;;497 位4 DMA_RX_RWT:接收看门狗超时 (Receive watchdog timeout)
;;;498 该位置1时,表示接收看门狗计时器在接收当前帧时超时,且当前帧在看门狗超
;;;499 时后被截断了
;;;500 位3 DMA_RX_RE: 接收错误 (Receive error)
;;;501 该位置1时,表示在帧接收期间,当发出RX_DV信号时,会发出RX_ERR信号。
;;;502 位1 DMA_RX_CE: CRC 错误(CRC error)
;;;503 该位置1时,表示接收的帧发生循环冗余校验(CRC)错误。只有最后一个描述符
;;;504 (RDES0[8])置1时,该字段才有效
;;;505 */
;;;506 if (Rx_Desc[i].Stat & DMA_RX_ERROR_MASK)
00002e 4831 LDR r0,|L1.244|
000030 eb001004 ADD r0,r0,r4,LSL #4
000034 6800 LDR r0,[r0,#0]
000036 f249011a MOV r1,#0x901a
00003a 4008 ANDS r0,r0,r1
00003c b100 CBZ r0,|L1.64|
;;;507 {
;;;508 goto rel;
00003e e030 B |L1.162|
|L1.64|
;;;509 }
;;;510
;;;511 /*
;;;512 #define DMA_RX_SEG_MASK (DMA_RX_FS | DMA_RX_LS)
;;;513 位9 FS:第一个描述符 (First descriptor)
;;;514 该位置1时,指示此描述符包含帧的第一个缓冲区。如果第一个缓冲区的大小为0,则第二
;;;515 个缓冲区将包含帧的帧头。如果第二个缓冲区的大小为0,则下一个描述符将包含帧的帧头。
;;;516
;;;517 位8 LS:最后一个描述符 (Last descriptor)
;;;518 该位置1时,指示此描述符指向的缓冲区为帧的最后一个缓冲区。
;;;519
;;;520 下面的函数用于判断此帧数据是否只有一个缓冲,初始化接收描述符列表的时候,每个描述符仅设置了
;;;521 一个缓冲。
;;;522 */
;;;523 if ((Rx_Desc[i].Stat & DMA_RX_SEG_MASK) != DMA_RX_SEG_MASK)
000040 482c LDR r0,|L1.244|
000042 eb001004 ADD r0,r0,r4,LSL #4
000046 6800 LDR r0,[r0,#0]
000048 f4007040 AND r0,r0,#0x300
00004c f5b07f40 CMP r0,#0x300
000050 d000 BEQ |L1.84|
;;;524 {
;;;525 goto rel;
000052 e026 B |L1.162|
|L1.84|
;;;526 }
;;;527
;;;528 RxLen = ((Rx_Desc[i].Stat >> 16) & 0x3FFF) - 4;
000054 4827 LDR r0,|L1.244|
000056 eb001004 ADD r0,r0,r4,LSL #4
00005a 6800 LDR r0,[r0,#0]
00005c f3c0400d UBFX r0,r0,#16,#14
000060 1f05 SUBS r5,r0,#4
;;;529 if (RxLen > ETH_MTU)
000062 f24050ea MOV r0,#0x5ea
000066 4285 CMP r5,r0
000068 d900 BLS |L1.108|
;;;530 {
;;;531 /* 数据包太大,直接放弃 */
;;;532 goto rel;
00006a e01a B |L1.162|
|L1.108|
;;;533 }
;;;534
;;;535 /* 申请动态内存,RxLen或上0x80000000表示动态内存不足了不会调用函数sys_error() */
;;;536 frame = alloc_mem (RxLen | 0x80000000);
00006c f0454000 ORR r0,r5,#0x80000000
000070 f7fffffe BL alloc_mem
000074 4606 MOV r6,r0
;;;537
;;;538 /* 如果动态内存申请失败了,放弃此帧数据;成功了,通过函数put_in_queue存入队列中 */
;;;539 if (frame != NULL)
000076 b19e CBZ r6,|L1.160|
;;;540 {
;;;541 sp = (U32 *)(Rx_Desc[i].Addr & ~3);
000078 481e LDR r0,|L1.244|
00007a eb001004 ADD r0,r0,r4,LSL #4
00007e 6880 LDR r0,[r0,#8]
000080 f0200703 BIC r7,r0,#3
;;;542 dp = (U32 *)&frame->data[0];
000084 f1060804 ADD r8,r6,#4
;;;543 for (RxLen = (RxLen + 3) >> 2; RxLen; RxLen--)
000088 1ce8 ADDS r0,r5,#3
00008a 0885 LSRS r5,r0,#2
00008c e003 B |L1.150|
|L1.142|
;;;544 {
;;;545 *dp++ = *sp++;
00008e cf01 LDM r7!,{r0}
000090 f8480b04 STR r0,[r8],#4
000094 1e6d SUBS r5,r5,#1 ;543
|L1.150|
000096 2d00 CMP r5,#0 ;543
000098 d1f9 BNE |L1.142|
;;;546 }
;;;547 put_in_queue (frame);
00009a 4630 MOV r0,r6
00009c f7fffffe BL put_in_queue
|L1.160|
;;;548 }
;;;549
;;;550 /* 设置此接收描述符继续接收新的数据 */
;;;551 rel: Rx_Desc[i].Stat = DMA_RX_OWN;
0000a0 bf00 NOP
|L1.162|
0000a2 f04f4000 MOV r0,#0x80000000
0000a6 4913 LDR r1,|L1.244|
0000a8 eb011104 ADD r1,r1,r4,LSL #4
0000ac 6008 STR r0,[r1,#0]
;;;552
;;;553 if (++i == NUM_RX_BUF) i = 0;
0000ae 1c60 ADDS r0,r4,#1
0000b0 4604 MOV r4,r0
0000b2 2804 CMP r0,#4
0000b4 d100 BNE |L1.184|
0000b6 2400 MOVS r4,#0
|L1.184|
;;;554 }
;;;555 while (!(Rx_Desc[i].Stat & DMA_RX_OWN));
0000b8 480e LDR r0,|L1.244|
0000ba eb001004 ADD r0,r0,r4,LSL #4
0000be 6800 LDR r0,[r0,#0]
0000c0 f0004000 AND r0,r0,#0x80000000
0000c4 2800 CMP r0,#0
0000c6 d0b2 BEQ |L1.46|
;;;556
;;;557 RxBufIndex = i;
0000c8 4909 LDR r1,|L1.240|
0000ca 700c STRB r4,[r1,#0]
;;;558
;;;559 /*
;;;560 DMASR DMA的状态寄存器(DMA status register)
;;;561 位7 RBUS:接收缓冲区不可用状态 (Receive buffer unavailable status)
;;;562 此位指示接收列表中的下一个描述符由CPU所拥有,DMA无法获取。接收过程进入挂起状态。
;;;563 要恢复处理接收描述符,CPU应更改描述符的拥有关系,然后发出接收轮询请求命令。如果
;;;564 未发出接收轮询请求命令,则当接收到下一个识别的传入帧时,接收过程会恢复。仅当上一
;;;565 接收描述符由DMA所拥有时,才能将ETH_DMASR[7]置1。
;;;566
;;;567 DMAIER的接收缓冲区不可用中断RBUIE是bit7,对于的接收缓冲区不可用状态在DMA状态寄存器中也是bit7。
;;;568 */
;;;569 if (ETH->DMASR & INT_RBUIE)
0000cc 480a LDR r0,|L1.248|
0000ce 6940 LDR r0,[r0,#0x14]
0000d0 f0000080 AND r0,r0,#0x80
0000d4 b120 CBZ r0,|L1.224|
;;;570 {
;;;571 /* 接收缓冲区不可用,重新恢复DMA传输 */
;;;572 ETH->DMASR = ETH_DMASR_RBUS;
0000d6 2080 MOVS r0,#0x80
0000d8 4907 LDR r1,|L1.248|
0000da 6148 STR r0,[r1,#0x14]
;;;573 ETH->DMARPDR = 0;
0000dc 2000 MOVS r0,#0
0000de 6088 STR r0,[r1,#8]
|L1.224|
;;;574 }
;;;575
;;;576 /*
;;;577 DMASR DMA的状态寄存器(DMA status register)
;;;578 这里实现清除中断挂起标志
;;;579 位16 ETH_DMASR_NIS:所有正常中断 (Normal interrupt summary)
;;;580 位15 ETH_DMASR_AIS:所有异常中断 (Abnormal interrupt summary)
;;;581 位6 ETH_DMASR_RS :接收状态 (Receive status)
;;;582 此位指示帧接收已完成,具体的帧状态信息已经包含在描述符中,接收仍保持运行状态。
;;;583 */
;;;584 ETH->DMASR = ETH_DMASR_NIS | ETH_DMASR_AIS | ETH_DMASR_RS;
0000e0 4806 LDR r0,|L1.252|
0000e2 4905 LDR r1,|L1.248|
0000e4 6148 STR r0,[r1,#0x14]
;;;585
;;;586 #if uCOS_EN == 1
;;;587 OSIntExit();
0000e6 f7fffffe BL OSIntExit
;;;588 #endif
;;;589 }
0000ea e8bd87f0 POP {r4-r10,pc}
;;;590
ENDP
0000ee 0000 DCW 0x0000
|L1.240|
DCD RxBufIndex
|L1.244|
DCD Rx_Desc
|L1.248|
DCD 0x40029000
|L1.252|
DCD 0x00018040
AREA ||i.init_ethernet||, CODE, READONLY, ALIGN=2
init_ethernet PROC
;;;119 */
;;;120 void init_ethernet (void)
000000 e92d41fc PUSH {r2-r8,lr}
;;;121 {
;;;122 U32 regv,tout,conn;
;;;123 GPIO_InitTypeDef GPIO_InitStructure;
;;;124
;;;125 /* 关闭PHY中断触发引脚 */
;;;126 NVIC_DisableIRQ(EXTI9_5_IRQn);
000004 2017 MOVS r0,#0x17
000006 2101 MOVS r1,#1
000008 4081 LSLS r1,r1,r0
00000a 4aca LDR r2,|L2.820|
00000c 0943 LSRS r3,r0,#5
00000e f8421023 STR r1,[r2,r3,LSL #2]
000012 bf00 NOP
;;;127
;;;128 /* 使能系统配置控制器时钟 */
;;;129 RCC->APB2ENR |= (1 << 14);
000014 48c8 LDR r0,|L2.824|
000016 6800 LDR r0,[r0,#0]
000018 f4404080 ORR r0,r0,#0x4000
00001c 49c6 LDR r1,|L2.824|
00001e 6008 STR r0,[r1,#0]
;;;130
;;;131 /* 复位以太网MAC */
;;;132 RCC->AHB1RSTR |= 0x02000000;
000020 48c5 LDR r0,|L2.824|
000022 3834 SUBS r0,r0,#0x34
000024 6800 LDR r0,[r0,#0]
000026 f0407000 ORR r0,r0,#0x2000000
00002a 49c3 LDR r1,|L2.824|
00002c 3934 SUBS r1,r1,#0x34
00002e 6008 STR r0,[r1,#0]
;;;133
;;;134 /* 选择RMII接口,必须在 MAC 处于复位状态且在使能 MAC 时钟之前完成此配置 */
;;;135 SYSCFG->PMC |= (1 << 23);
000030 48c2 LDR r0,|L2.828|
000032 6800 LDR r0,[r0,#0]
000034 f4400000 ORR r0,r0,#0x800000
000038 49c0 LDR r1,|L2.828|
00003a 6008 STR r0,[r1,#0]
;;;136
;;;137 /* 停止复位以太网MAC */
;;;138 RCC->AHB1RSTR &= ~0x02000000;
00003c 48be LDR r0,|L2.824|
00003e 3834 SUBS r0,r0,#0x34
000040 6800 LDR r0,[r0,#0]
000042 f0207000 BIC r0,r0,#0x2000000
000046 49bc LDR r1,|L2.824|
000048 3934 SUBS r1,r1,#0x34
00004a 6008 STR r0,[r1,#0]
;;;139
;;;140 /* 使能以太网时钟,GPIOA,GPIOB,GPIOC,GPIOG时钟 */
;;;141 RCC->AHB1ENR |= 0x1E000047;
00004c 48ba LDR r0,|L2.824|
00004e 3814 SUBS r0,r0,#0x14
000050 6800 LDR r0,[r0,#0]
000052 49bb LDR r1,|L2.832|
000054 4308 ORRS r0,r0,r1
000056 49b8 LDR r1,|L2.824|
000058 3914 SUBS r1,r1,#0x14
00005a 6008 STR r0,[r1,#0]
;;;142
;;;143 /* 原始驱动还配置了PA8,用于给PHY芯片提供时钟,V6开发板外置有源晶振,无需配置PA8 */
;;;144 /* 配置PA1,PA2和PA7,复用功能,推挽模式,100MHz,无上拉下拉,复用到AF11 (Ethernet) */
;;;145 GPIOA->MODER &= ~0x0000C03C;
00005c 48b9 LDR r0,|L2.836|
00005e 6800 LDR r0,[r0,#0]
000060 f24c013c MOV r1,#0xc03c
000064 4388 BICS r0,r0,r1
000066 49b7 LDR r1,|L2.836|
000068 6008 STR r0,[r1,#0]
;;;146 GPIOA->MODER |= 0x00008028;
00006a 4608 MOV r0,r1
00006c 6800 LDR r0,[r0,#0]
00006e f2480128 MOV r1,#0x8028
000072 4308 ORRS r0,r0,r1
000074 49b3 LDR r1,|L2.836|
000076 6008 STR r0,[r1,#0]
;;;147 GPIOA->OTYPER &= ~0x00000086;
000078 4608 MOV r0,r1
00007a 6840 LDR r0,[r0,#4]
00007c f0200086 BIC r0,r0,#0x86
000080 6048 STR r0,[r1,#4]
;;;148 GPIOA->OSPEEDR |= 0x0003C03C;
000082 4608 MOV r0,r1
000084 6880 LDR r0,[r0,#8]
000086 49b0 LDR r1,|L2.840|
000088 4308 ORRS r0,r0,r1
00008a 49ae LDR r1,|L2.836|
00008c 6088 STR r0,[r1,#8]
;;;149 GPIOA->PUPDR &= ~0x0003C03C;
00008e 4608 MOV r0,r1
000090 68c0 LDR r0,[r0,#0xc]
000092 49ad LDR r1,|L2.840|
000094 43c9 MVNS r1,r1
000096 4008 ANDS r0,r0,r1
000098 49aa LDR r1,|L2.836|
00009a 60c8 STR r0,[r1,#0xc]
;;;150 GPIOA->AFR[0] &= ~0xF0000FF0;
00009c 4608 MOV r0,r1
00009e 6a00 LDR r0,[r0,#0x20]
0000a0 49aa LDR r1,|L2.844|
0000a2 4008 ANDS r0,r0,r1
0000a4 49a7 LDR r1,|L2.836|
0000a6 6208 STR r0,[r1,#0x20]
;;;151 GPIOA->AFR[0] |= 0xB0000BB0;
0000a8 4608 MOV r0,r1
0000aa 6a00 LDR r0,[r0,#0x20]
0000ac 49a8 LDR r1,|L2.848|
0000ae 4308 ORRS r0,r0,r1
0000b0 49a4 LDR r1,|L2.836|
0000b2 6208 STR r0,[r1,#0x20]
;;;152
;;;153 /* 配置PC1,PC4和PC5,复用功能,推挽模式,100MHz,无上拉下拉,复用到AF11 (Ethernet) */
;;;154 GPIOC->MODER &= ~0x00000F0C;
0000b4 48a7 LDR r0,|L2.852|
0000b6 6800 LDR r0,[r0,#0]
0000b8 f640710c MOV r1,#0xf0c
0000bc 4388 BICS r0,r0,r1
0000be 49a5 LDR r1,|L2.852|
0000c0 6008 STR r0,[r1,#0]
;;;155 GPIOC->MODER |= 0x00000A08;
0000c2 4608 MOV r0,r1
0000c4 6800 LDR r0,[r0,#0]
0000c6 f6402108 MOV r1,#0xa08
0000ca 4308 ORRS r0,r0,r1
0000cc 49a1 LDR r1,|L2.852|
0000ce 6008 STR r0,[r1,#0]
;;;156 GPIOC->OTYPER &= ~0x00000032;
0000d0 1d08 ADDS r0,r1,#4
0000d2 6800 LDR r0,[r0,#0]
0000d4 f0200032 BIC r0,r0,#0x32
0000d8 1d09 ADDS r1,r1,#4
0000da 6008 STR r0,[r1,#0]
;;;157 GPIOC->OSPEEDR |= 0x00000F0C;
0000dc 1d08 ADDS r0,r1,#4
0000de 6800 LDR r0,[r0,#0]
0000e0 f640710c MOV r1,#0xf0c
0000e4 4308 ORRS r0,r0,r1
0000e6 499b LDR r1,|L2.852|
0000e8 3108 ADDS r1,r1,#8
0000ea 6008 STR r0,[r1,#0]
;;;158 GPIOC->PUPDR &= ~0x00000F0C;
0000ec 1d08 ADDS r0,r1,#4
0000ee 6800 LDR r0,[r0,#0]
0000f0 f640710c MOV r1,#0xf0c
0000f4 4388 BICS r0,r0,r1
0000f6 4997 LDR r1,|L2.852|
0000f8 310c ADDS r1,r1,#0xc
0000fa 6008 STR r0,[r1,#0]
;;;159 GPIOC->AFR[0] &= ~0x00FF00F0;
0000fc 4895 LDR r0,|L2.852|
0000fe 3020 ADDS r0,r0,#0x20
000100 6800 LDR r0,[r0,#0]
000102 4995 LDR r1,|L2.856|
000104 4008 ANDS r0,r0,r1
000106 4993 LDR r1,|L2.852|
000108 3120 ADDS r1,r1,#0x20
00010a 6008 STR r0,[r1,#0]
;;;160 GPIOC->AFR[0] |= 0x00BB00B0;
00010c 4608 MOV r0,r1
00010e 6800 LDR r0,[r0,#0]
000110 4992 LDR r1,|L2.860|
000112 4308 ORRS r0,r0,r1
000114 498f LDR r1,|L2.852|
000116 3120 ADDS r1,r1,#0x20
000118 6008 STR r0,[r1,#0]
;;;161
;;;162 //配置PG11, PG13
;;;163 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11 | GPIO_Pin_13;
00011a f44f5020 MOV r0,#0x2800
00011e 9000 STR r0,[sp,#0]
;;;164 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
000120 2003 MOVS r0,#3
000122 f88d0005 STRB r0,[sp,#5]
;;;165 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
000126 2002 MOVS r0,#2
000128 f88d0004 STRB r0,[sp,#4]
;;;166 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
00012c 2000 MOVS r0,#0
00012e f88d0006 STRB r0,[sp,#6]
;;;167 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
000132 f88d0007 STRB r0,[sp,#7]
;;;168 GPIO_Init(GPIOG, &GPIO_InitStructure);
000136 4669 MOV r1,sp
000138 4889 LDR r0,|L2.864|
00013a f7fffffe BL GPIO_Init
;;;169
;;;170 GPIO_PinAFConfig(GPIOG, GPIO_PinSource11, GPIO_AF_ETH);
00013e 220b MOVS r2,#0xb
000140 4611 MOV r1,r2
000142 4887 LDR r0,|L2.864|
000144 f7fffffe BL GPIO_PinAFConfig
;;;171 GPIO_PinAFConfig(GPIOG, GPIO_PinSource13, GPIO_AF_ETH);
000148 220b MOVS r2,#0xb
00014a 210d MOVS r1,#0xd
00014c 4884 LDR r0,|L2.864|
00014e f7fffffe BL GPIO_PinAFConfig
;;;172
;;;173 //配置PB13
;;;174 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
000152 f44f6000 MOV r0,#0x800
000156 9000 STR r0,[sp,#0]
;;;175 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
000158 2003 MOVS r0,#3
00015a f88d0005 STRB r0,[sp,#5]
;;;176 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
00015e 2002 MOVS r0,#2
000160 f88d0004 STRB r0,[sp,#4]
;;;177 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
000164 2000 MOVS r0,#0
000166 f88d0006 STRB r0,[sp,#6]
;;;178 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
00016a f88d0007 STRB r0,[sp,#7]
;;;179 GPIO_Init(GPIOB, &GPIO_InitStructure);
00016e 4669 MOV r1,sp
000170 487c LDR r0,|L2.868|
000172 f7fffffe BL GPIO_Init
;;;180
;;;181
;;;182 //配置PB13
;;;183 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;
000176 f44f5000 MOV r0,#0x2000
00017a 9000 STR r0,[sp,#0]
;;;184 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
00017c 2003 MOVS r0,#3
00017e f88d0005 STRB r0,[sp,#5]
;;;185 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
000182 2002 MOVS r0,#2
000184 f88d0004 STRB r0,[sp,#4]
;;;186 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
000188 2000 MOVS r0,#0
00018a f88d0006 STRB r0,[sp,#6]
;;;187 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
00018e f88d0007 STRB r0,[sp,#7]
;;;188 GPIO_Init(GPIOB, &GPIO_InitStructure);
000192 4669 MOV r1,sp
000194 4873 LDR r0,|L2.868|
000196 f7fffffe BL GPIO_Init
;;;189
;;;190 GPIO_PinAFConfig(GPIOB, GPIO_PinSource13, GPIO_AF_ETH);
00019a 220b MOVS r2,#0xb
00019c 210d MOVS r1,#0xd
00019e 4871 LDR r0,|L2.868|
0001a0 f7fffffe BL GPIO_PinAFConfig
;;;191
;;;192 //配置PA4为推完输出
;;;193 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;
0001a4 2010 MOVS r0,#0x10
0001a6 9000 STR r0,[sp,#0]
;;;194 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
0001a8 2003 MOVS r0,#3
0001aa f88d0005 STRB r0,[sp,#5]
;;;195 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
0001ae 2001 MOVS r0,#1
0001b0 f88d0004 STRB r0,[sp,#4]
;;;196 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推完输出
0001b4 2000 MOVS r0,#0
0001b6 f88d0006 STRB r0,[sp,#6]
;;;197 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
0001ba f88d0007 STRB r0,[sp,#7]
;;;198 GPIO_Init(GPIOA, &GPIO_InitStructure);
0001be 4669 MOV r1,sp
0001c0 4860 LDR r0,|L2.836|
0001c2 f7fffffe BL GPIO_Init
;;;199
;;;200 GPIO_ResetBits(GPIOA,GPIO_Pin_4); //硬件复位LAN8720
0001c6 2110 MOVS r1,#0x10
0001c8 485e LDR r0,|L2.836|
0001ca f7fffffe BL GPIO_ResetBits
;;;201 bsp_DelayMS(50);
0001ce 2032 MOVS r0,#0x32
0001d0 f7fffffe BL bsp_DelayMS
;;;202 GPIO_SetBits(GPIOA,GPIO_Pin_4); //复位结束
0001d4 2110 MOVS r1,#0x10
0001d6 485b LDR r0,|L2.836|
0001d8 f7fffffe BL GPIO_SetBits
;;;203 /*
;;;204 寄存器ETH->DMABMR的SR位置1后,MAC DMA控制器会复位所有MAC子系统的内部寄存器和逻辑。在所有内
;;;205 核时钟域完成复位操作后,该位自动清零。重新编程任何内核寄存器之前,在该位中读取0 值。
;;;206 */
;;;207 ETH->DMABMR |= DBMR_SR;
0001dc 4862 LDR r0,|L2.872|
0001de 6800 LDR r0,[r0,#0]
0001e0 f0400001 ORR r0,r0,#1
0001e4 4960 LDR r1,|L2.872|
0001e6 6008 STR r0,[r1,#0]
;;;208 while (ETH->DMABMR & DBMR_SR);
0001e8 bf00 NOP
|L2.490|
0001ea 485f LDR r0,|L2.872|
0001ec 6800 LDR r0,[r0,#0]
0001ee f0000001 AND r0,r0,#1
0001f2 2800 CMP r0,#0
0001f4 d1f9 BNE |L2.490|
;;;209 conn = 0;
0001f6 2600 MOVS r6,#0
;;;210
;;;211 /*
;;;212 HCLK的时钟是168MHz,这里选项CR位为100,CR占用寄存器ETH->MACMIIAR的bit4,bit3和bit2。
;;;213 CR 时钟范围选项可确定 HCLK 频率并用于决定 MDC 时钟频率:
;;;214 选项 HCLK MDC 时钟
;;;215 000 60-100MHz HCLK/42
;;;216 001 100-150MHz HCLK/62
;;;217 010 20-35MHz HCLK/16
;;;218 011 35-60MHz HCLK/26
;;;219 100 150-168MHz HCLK/102
;;;220 101、110、111 保留
;;;221 */
;;;222 ETH->MACMIIAR = 0x00000010;
0001f8 2010 MOVS r0,#0x10
0001fa 495c LDR r1,|L2.876|
0001fc 6108 STR r0,[r1,#0x10]
;;;223
;;;224 /*
;;;225 注意事项:DM9161可以上电后就读取其ID寄存器,但是DM9162不行,需要延迟一段时间这里为了方便起见,
;;;226 直接将其复位,发送复位指令可以立即执行。
;;;227 */
;;;228 /* 第1步:复位DM9161/9162 ***********************************************************/
;;;229 // printf_eth("===============================================================\r\n");
;;;230 // printf_eth("下面是DM9161/9162的硬件初始化:\r\n");
;;;231 // printf_eth("1. Start PHY_ID_DM9161/9162 Init\r\n");
;;;232
;;;233
;;;234 /* 第2步:配置DM9161/9162 ***********************************************************/
;;;235 #if defined (_10MBIT_)
;;;236 write_PHY (PHY_REG_BMCR, PHY_FULLD_10M); /* 连接到10Mbps的网络 */
;;;237 #elif defined (_100MBIT_)
;;;238 write_PHY (PHY_REG_BMCR, PHY_FULLD_100M); /* 连接到100Mbps的网络 */
;;;239 #else
;;;240 /* 通过Auto-Negotiation实现自适应10Mbps网络或者100Mbps网络 */
;;;241 write_PHY (PHY_REG_BMCR, PHY_AUTO_NEG);
0001fe 0201 LSLS r1,r0,#8
000200 2000 MOVS r0,#0
000202 f7fffffe BL write_PHY
;;;242
;;;243 /* 等待完成Auto-Negotiation */
;;;244 for (tout = 0; tout < 0x100000; tout++)
000206 2500 MOVS r5,#0
000208 e008 B |L2.540|
|L2.522|
;;;245 {
;;;246 regv = read_PHY (PHY_REG_BMSR);
00020a 2001 MOVS r0,#1
00020c f7fffffe BL read_PHY
000210 4604 MOV r4,r0
;;;247 if (regv & 0x0020)
000212 f0040020 AND r0,r4,#0x20
000216 b100 CBZ r0,|L2.538|
;;;248 {
;;;249 /* 完成Auto-Negotiation */
;;;250 // printf_eth("3. Auto-Negotiation Complete\r\n");
;;;251 break;
000218 e003 B |L2.546|
|L2.538|
00021a 1c6d ADDS r5,r5,#1 ;244
|L2.540|
00021c f5b51f80 CMP r5,#0x100000 ;244
000220 d3f3 BCC |L2.522|
|L2.546|
000222 bf00 NOP
;;;252 }
;;;253 }
;;;254 #endif
;;;255
;;;256 /* 第3步:检测连接状态 ***********************************************************/
;;;257 for (tout = 0; tout < 0x10000; tout++)
000224 2500 MOVS r5,#0
000226 e022 B |L2.622|
|L2.552|
;;;258 {
;;;259 regv = read_PHY (PHY_REG_BMSR);
000228 2001 MOVS r0,#1
00022a f7fffffe BL read_PHY
00022e 4604 MOV r4,r0
;;;260 if (regv & (1 << 2))
000230 f0040004 AND r0,r4,#4
000234 b1b8 CBZ r0,|L2.614|
;;;261 {
;;;262 //// printf_eth("4. Connection Succeeded\r\n");
;;;263
;;;264 /* PHY已经连接上网络 */
;;;265 g_ucEthLinkStatus = 1;
000236 2001 MOVS r0,#1
000238 494d LDR r1,|L2.880|
00023a 7008 STRB r0,[r1,#0]
;;;266
;;;267 /* 获取连接信息 */
;;;268 regv = read_PHY (PHY_REG_DSCSR);
00023c 2011 MOVS r0,#0x11
00023e f7fffffe BL read_PHY
000242 4604 MOV r4,r0
;;;269
;;;270 if ((regv & (1 << 15))|(regv & (1 << 13)))
000244 f4044000 AND r0,r4,#0x8000
000248 f4045100 AND r1,r4,#0x2000
00024c 4308 ORRS r0,r0,r1
00024e b108 CBZ r0,|L2.596|
;;;271 {
;;;272 /* 全双工 */
;;;273 // printf_eth("5. Full-duplex connection\r\n");
;;;274 conn |= PHY_CON_SET_FULLD;
000250 f0460602 ORR r6,r6,#2
|L2.596|
;;;275 }
;;;276
;;;277 if ((regv & (1 << 15))|(regv & (1 << 14)))
000254 f4044000 AND r0,r4,#0x8000
000258 f4044180 AND r1,r4,#0x4000
00025c 4308 ORRS r0,r0,r1
00025e b108 CBZ r0,|L2.612|
;;;278 {
;;;279 /* 速度100Mbps的网络 */
;;;280 // printf_eth("6. 100Mbps Mode\r\n");
;;;281 conn |= PHY_CON_SET_100M;
000260 f0460601 ORR r6,r6,#1
|L2.612|
;;;282 }
;;;283 break;
000264 e006 B |L2.628|
|L2.614|
;;;284 }
;;;285 else
;;;286 {
;;;287 // printf_eth("4. Connection failed\r\n");
;;;288
;;;289 /* 未连接上 */
;;;290 g_ucEthLinkStatus = 0;
000266 2000 MOVS r0,#0
000268 4941 LDR r1,|L2.880|
00026a 7008 STRB r0,[r1,#0]
00026c 1c6d ADDS r5,r5,#1 ;257
|L2.622|
00026e f5b53f80 CMP r5,#0x10000 ;257
000272 d3d9 BCC |L2.552|
|L2.628|
000274 bf00 NOP ;283
;;;291 }
;;;292 }
;;;293
;;;294 /* 第4步:使能DM9161/9162中断 ***********************************************************/
;;;295 /* 使能DM9161/9162的连接中断 */
;;;296 write_PHY (PHY_REG_INTERRUPT, 1<<12);
000276 f44f5180 MOV r1,#0x1000
00027a 2015 MOVS r0,#0x15
00027c f7fffffe BL write_PHY
;;;297
;;;298 /* 第5步:使能DM9161/9162中断 ***********************************************************/
;;;299 /*
;;;300 初始化MAC配置寄存器
;;;301 (1)当该位MCR_ROD置1时,MAC禁止在半双工模式下接收帧。
;;;302 (2)当该位MCR_ROD清0时,MAC接收PHY发送的所有数据包。
;;;303 (3)如果MAC在全双工模式下工作,该位不适用。
;;;304 */
;;;305 ETH->MACCR = MCR_ROD;
000280 f44f5000 MOV r0,#0x2000
000284 4939 LDR r1,|L2.876|
000286 6008 STR r0,[r1,#0]
;;;306
;;;307 /* 设置MAC工作在全双工模式 */
;;;308 if (conn & PHY_CON_SET_FULLD)
000288 f0060002 AND r0,r6,#2
00028c b120 CBZ r0,|L2.664|
;;;309 {
;;;310 /* 使能全双工 */
;;;311 ETH->MACCR |= MCR_DM;
00028e 4608 MOV r0,r1
000290 6800 LDR r0,[r0,#0]
000292 f4406000 ORR r0,r0,#0x800
000296 6008 STR r0,[r1,#0]
|L2.664|
;;;312 }
;;;313
;;;314 /*
;;;315 通过位MCR_FES配置MAC通信速度
;;;316 (1)0表示10Mbps
;;;317 (2)1表示100Mbps
;;;318 */
;;;319 if (conn & PHY_CON_SET_100M)
000298 f0060001 AND r0,r6,#1
00029c b128 CBZ r0,|L2.682|
;;;320 {
;;;321 /* 配置为100Mbps */
;;;322 ETH->MACCR |= MCR_FES;
00029e 4833 LDR r0,|L2.876|
0002a0 6800 LDR r0,[r0,#0]
0002a2 f4404080 ORR r0,r0,#0x4000
0002a6 4931 LDR r1,|L2.876|
0002a8 6008 STR r0,[r1,#0]
|L2.682|
;;;323 }
;;;324
;;;325 /* MACFFR 以太网帧过滤寄存器,配置可接收所有MAC组播包,即MAC地址第一个字节的bit0 = 1 */
;;;326 ETH->MACFFR = MFFR_HPF | MFFR_PAM;
0002aa f44f6082 MOV r0,#0x410
0002ae 492f LDR r1,|L2.876|
0002b0 6048 STR r0,[r1,#4]
;;;327
;;;328 /* MACFCR 以太网流控制寄存器,ZQPD零时间片暂停禁止 */
;;;329 ETH->MACFCR = MFCR_ZQPD;
0002b2 2080 MOVS r0,#0x80
0002b4 6188 STR r0,[r1,#0x18]
;;;330
;;;331 /* 设置以太网MAC地址寄存器 */
;;;332 ETH->MACA0HR = ((U32)own_hw_adr[5] << 8) | (U32)own_hw_adr[4];
0002b6 482f LDR r0,|L2.884|
0002b8 7900 LDRB r0,[r0,#4] ; own_hw_adr
0002ba 492e LDR r1,|L2.884|
0002bc 7949 LDRB r1,[r1,#5] ; own_hw_adr
0002be ea402001 ORR r0,r0,r1,LSL #8
0002c2 492a LDR r1,|L2.876|
0002c4 6408 STR r0,[r1,#0x40]
;;;333 ETH->MACA0LR = ((U32)own_hw_adr[3] << 24) | (U32)own_hw_adr[2] << 16 |
0002c6 482b LDR r0,|L2.884|
0002c8 78c0 LDRB r0,[r0,#3] ; own_hw_adr
0002ca 0600 LSLS r0,r0,#24
0002cc 4929 LDR r1,|L2.884|
0002ce 7889 LDRB r1,[r1,#2] ; own_hw_adr
0002d0 ea404001 ORR r0,r0,r1,LSL #16
0002d4 4927 LDR r1,|L2.884|
0002d6 7849 LDRB r1,[r1,#1] ; own_hw_adr
0002d8 ea402001 ORR r0,r0,r1,LSL #8
0002dc 4925 LDR r1,|L2.884|
0002de 7809 LDRB r1,[r1,#0] ; own_hw_adr
0002e0 4308 ORRS r0,r0,r1
0002e2 4922 LDR r1,|L2.876|
0002e4 6448 STR r0,[r1,#0x44]
;;;334 ((U32)own_hw_adr[1] << 8) | (U32)own_hw_adr[0];
;;;335
;;;336 /* 初始化DMA发送和接收描述符 */
;;;337 rx_descr_init ();
0002e6 f7fffffe BL rx_descr_init
;;;338 tx_descr_init ();
0002ea f7fffffe BL tx_descr_init
;;;339
;;;340 /*
;;;341 刷新FIFO,启动DMA发送和接收功能
;;;342 DMAOMR 工作模式寄存器
;;;343 位20 DOMR_FTF:刷新发送 FIFO (Flush transmit FIFO):
;;;344 该位置1时,发送FIFO控制器逻辑会复位为默认值,因此,TX FIFO中的所有数据均会
;;;345 丢失/刷新。刷新操作结束时该位在内部清零。此位清零之前不得对工作模式寄存器执
;;;346 行写操作。
;;;347 位13 DOMR_ST:启动/停止发送 (Start/stop transmission)
;;;348 该位置1时,启动发送,DMA会检查当前位置的发送列表来查找待发送的帧。
;;;349 位1 DOMR_SR:启动/停止接收 (Start/stop receive)
;;;350 该位置1时,启动接收,DMA尝试从接收列表中获取描述符并处理传入帧。
;;;351 */
;;;352 ETH->DMAOMR = DOMR_FTF | DOMR_ST | DOMR_SR;
0002ee 4822 LDR r0,|L2.888|
0002f0 491d LDR r1,|L2.872|
0002f2 6188 STR r0,[r1,#0x18]
;;;353
;;;354 /* 使能发送和接收 */
;;;355 ETH->MACCR |= MCR_TE | MCR_RE;
0002f4 481d LDR r0,|L2.876|
0002f6 6800 LDR r0,[r0,#0]
0002f8 f040000c ORR r0,r0,#0xc
0002fc 491b LDR r1,|L2.876|
0002fe 6008 STR r0,[r1,#0]
;;;356
;;;357 /* 复位所有MAC中断 */
;;;358 ETH->DMASR = 0xFFFFFFFF;
000300 f04f30ff MOV r0,#0xffffffff
000304 4918 LDR r1,|L2.872|
000306 6148 STR r0,[r1,#0x14]
;;;359
;;;360 /*
;;;361 使能发送和接收中断
;;;362 DMAIER 中断使能寄存器
;;;363 位16 NISE:使能所有正常中断(Normal interrupt summary enable)
;;;364 位15 AISE:使能所有异常中断(Abnormal interrupt summary enable)
;;;365 位7 RBUIE:接收缓冲区不可用中断使能(Receive buffer unavailable interrupt enable)
;;;366 当该位和AISE位都置1后,可使能接收缓冲区不可用中断。该位清零时,会禁止接
;;;367 收缓冲区不可用中断。
;;;368 位6 RIE:接收中断使能 (Receive interrupt enable)
;;;369 当该位和AISE都置1后,可使能接收中断。该位清零时,会禁止接收中断。
;;;370 */
;;;371 ETH->DMAIER = ETH_DMAIER_NISE | ETH_DMAIER_AISE | ETH_DMAIER_RBUIE | ETH_DMAIER_RIE;
000308 481c LDR r0,|L2.892|
00030a 61c8 STR r0,[r1,#0x1c]
;;;372
;;;373 /* 设置为最高优先级,仅调用NVIC->ISER设置的默认优先级也是最高优先级0 */
;;;374 NVIC_SetPriority(ETH_IRQn, 0);
00030c 203d MOVS r0,#0x3d
00030e 2100 MOVS r1,#0
000310 2800 CMP r0,#0
000312 da07 BGE |L2.804|
000314 070a LSLS r2,r1,#28
000316 0e17 LSRS r7,r2,#24
000318 4a19 LDR r2,|L2.896|
00031a f000030f AND r3,r0,#0xf
00031e 1f1b SUBS r3,r3,#4
000320 54d7 STRB r7,[r2,r3]
000322 e003 B |L2.812|
|L2.804|
000324 070a LSLS r2,r1,#28
000326 0e13 LSRS r3,r2,#24
000328 4a16 LDR r2,|L2.900|
00032a 5413 STRB r3,[r2,r0]
|L2.812|
00032c bf00 NOP
;;;375
;;;376 // printf_eth("===============================================================\r\n");
;;;377 }
00032e e8bd81fc POP {r2-r8,pc}
;;;378
ENDP
000332 0000 DCW 0x0000
|L2.820|
DCD 0xe000e180
|L2.824|
DCD 0x40023844
|L2.828|
DCD 0x40013804
|L2.832|
DCD 0x1e000047
|L2.836|
DCD 0x40020000
|L2.840|
DCD 0x0003c03c
|L2.844|
DCD 0x0ffff00f
|L2.848|
DCD 0xb0000bb0
|L2.852|
DCD 0x40020800
|L2.856|
DCD 0xff00ff0f
|L2.860|
DCD 0x00bb00b0
|L2.864|
DCD 0x40021800
|L2.868|
DCD 0x40020400
|L2.872|
DCD 0x40029000
|L2.876|
DCD 0x40028000
|L2.880|
DCD g_ucEthLinkStatus
|L2.884|
DCD own_hw_adr
|L2.888|
DCD 0x00102002
|L2.892|
DCD 0x000180c0
|L2.896|
DCD 0xe000ed18
|L2.900|
DCD 0xe000e400
AREA ||i.int_disable_eth||, CODE, READONLY, ALIGN=2
int_disable_eth PROC
;;;399 */
;;;400 void int_disable_eth (void)
000000 f04f5100 MOV r1,#0x20000000
;;;401 {
;;;402 NVIC->ICER[1] = 1 << 29;
000004 4801 LDR r0,|L3.12|
000006 6001 STR r1,[r0,#0]
;;;403 }
000008 4770 BX lr
;;;404
ENDP
00000a 0000 DCW 0x0000
|L3.12|
DCD 0xe000e184
AREA ||i.int_enable_eth||, CODE, READONLY, ALIGN=2
int_enable_eth PROC
;;;386 */
;;;387 void int_enable_eth (void)
000000 f04f5000 MOV r0,#0x20000000
;;;388 {
;;;389 NVIC->ISER[1] = 1 << 29;
000004 4901 LDR r1,|L4.12|
000006 6008 STR r0,[r1,#0]
;;;390 }
000008 4770 BX lr
;;;391
ENDP
00000a 0000 DCW 0x0000
|L4.12|
DCD 0xe000e104
AREA ||i.read_PHY||, CODE, READONLY, ALIGN=2
read_PHY PROC
;;;745 */
;;;746 static U16 read_PHY (U32 PhyReg)
000000 4601 MOV r1,r0
;;;747 {
;;;748 U32 tout;
;;;749
;;;750 /*
;;;751 MACMIIAR 以太网MAC MII 地址寄存器
;;;752 位 15:11 PA:PHY 地址 (PHY address),对应这里的PHY_DEF_ADDR
;;;753 该字段指示正在访问32个可能的PHY器件中的哪一个。
;;;754
;;;755 位 10:6 MR:MII寄存器 (MII register),对应这里的PhyReg
;;;756 这些位在所选的PHY器件中选择要访问的MII寄存器。
;;;757 位 1 MW:MII写(MII write),对应这里的MMAR_MW
;;;758 此位置1是在告知PHY,将要启动一个使用MII数据寄存器的写操作。
;;;759 如果此位未置,则表示会启动一个读操作,将数据放入MII数据寄存器。
;;;760 位 0 MB:MII忙碌 (MII busy),对应这里的MMAR_MB
;;;761 向ETH_MACMIIAR和ETH_MACMIIDR写入前,此位应读取逻辑0。向ETH_MACMIIAR写入过程中,此
;;;762 位也必须复位为0。在PHY寄存器访问过程中,此位由应用程序置1,指示读或写访问正在进行中。
;;;763 在对PHY进行写操作过程中,ETH_MACMIIDR(MII数据)应始终保持有效,直到MAC将此位清零。
;;;764 在对PHY进行读操作过程中,ETH_MACMIIDR始终无效,直到MAC将此位清零。在此位清零后,才
;;;765 可以向ETH_MACMIIAR(MII地址)写入。
;;;766 */
;;;767 ETH->MACMIIAR = PHY_DEF_ADDR << 11 | PhyReg << 6 | MMAR_MB;
000002 f44f6000 MOV r0,#0x800
000006 ea401081 ORR r0,r0,r1,LSL #6
00000a 1c40 ADDS r0,r0,#1
00000c 4b09 LDR r3,|L5.52|
00000e 6118 STR r0,[r3,#0x10]
;;;768
;;;769 /* 等待操作完成,即等待MMAR_MB位被清零 */
;;;770 tout = 0;
000010 2200 MOVS r2,#0
;;;771 for (tout = 0; tout < MII_RD_TOUT; tout++)
000012 bf00 NOP
000014 e006 B |L5.36|
|L5.22|
;;;772 {
;;;773 if ((ETH->MACMIIAR & MMAR_MB) == 0)
000016 4807 LDR r0,|L5.52|
000018 6900 LDR r0,[r0,#0x10]
00001a f0000001 AND r0,r0,#1
00001e b900 CBNZ r0,|L5.34|
;;;774 {
;;;775 break;
000020 e003 B |L5.42|
|L5.34|
000022 1c52 ADDS r2,r2,#1 ;771
|L5.36|
000024 f5b22fa0 CMP r2,#0x50000 ;771
000028 d3f5 BCC |L5.22|
|L5.42|
00002a bf00 NOP
;;;776 }
;;;777 }
;;;778
;;;779 /* 从 PHY 中读取16bit的数据值 */
;;;780 return (ETH->MACMIIDR & MMDR_MD);
00002c 4801 LDR r0,|L5.52|
00002e 6940 LDR r0,[r0,#0x14]
000030 b280 UXTH r0,r0
;;;781 }
000032 4770 BX lr
;;;782
ENDP
|L5.52|
DCD 0x40028000
AREA ||i.rx_descr_init||, CODE, READONLY, ALIGN=2
rx_descr_init PROC
;;;598 */
;;;599 static void rx_descr_init (void)
000000 2200 MOVS r2,#0
;;;600 {
;;;601 U32 i,next;
;;;602
;;;603 /*
;;;604 1. RDES0:接收描述符字0,对应Rx_Desc[i].Stat
;;;605 位31 OWN:所有关系位 (Own bit)
;;;606 该位置1时,指示描述符由MAC子系统的DMA所拥有。
;;;607 该位清零时,指示描述符由主机所拥有,即CPU。
;;;608 DMA在帧接收完成或此描述符的关联缓冲区已满时将该位清零。
;;;609
;;;610 2. RDES1:接收描述符字1,对应Rx_Desc[i].Ctrl
;;;611 位14 RCH: 链接的第二个地址 (Second address chained)
;;;612 该位置1时,表示描述符中的第二个地址是下一个描述符地址,而非第二个缓冲区地址。该
;;;613 位置1时,RBS2(RDES1[28:16])为无关值。RDES1[15]比RDES1[14]优先处理。
;;;614 位12:0 RBS1:接收缓冲区1大小 (Receive buffer 1 size)
;;;615 第一个数据缓冲区的大小以字节为单位。即使RDES2(缓冲区1地址指针)的值未对齐,缓
;;;616 冲区大小也必须为4、8或16的倍数,具体取决于总线宽度32、64或128。如果缓冲区大小不
;;;617 是4、8或16的倍数,这种情况的结果是未定义。如果该字段为0,则DMA会忽略该缓冲区并
;;;618 使用缓冲区2或下一个描述符,具体取决于RCH(位14)的值。
;;;619
;;;620 3. RDES2:接收描述符字2,对应Rx_Desc[i].Addr
;;;621 位31:0 RBAP1/RTSL:接收缓冲区1地址指针/接收帧时间戳低位
;;;622 Receive buffer 1 address pointer
;;;623 Receive frame time stamp low
;;;624
;;;625 4. RDES3:接收描述符字3,对应Rx_Desc[i].Next
;;;626 位31:0 RBAP2/RTSH:接收缓冲区2地址指针(下一个描述符地址)/ 接收帧时间戳高位
;;;627 Receive buffer 2 address pointer (next descriptor address)
;;;628 Receive frame time stamp high
;;;629 */
;;;630 RxBufIndex = 0;
000002 4b16 LDR r3,|L6.92|
000004 701a STRB r2,[r3,#0]
;;;631
;;;632 for (i = 0, next = 0; i < NUM_RX_BUF; i++)
000006 2000 MOVS r0,#0
000008 2100 MOVS r1,#0
00000a e021 B |L6.80|
|L6.12|
;;;633 {
;;;634 if (++next == NUM_RX_BUF) next = 0;
00000c 1c4a ADDS r2,r1,#1
00000e 4611 MOV r1,r2
000010 2a04 CMP r2,#4
000012 d100 BNE |L6.22|
000014 2100 MOVS r1,#0
|L6.22|
;;;635 Rx_Desc[i].Stat = DMA_RX_OWN;
000016 f04f4200 MOV r2,#0x80000000
00001a 4b11 LDR r3,|L6.96|
00001c eb031300 ADD r3,r3,r0,LSL #4
000020 601a STR r2,[r3,#0]
;;;636 Rx_Desc[i].Ctrl = DMA_RX_RCH | ETH_BUF_SIZE;
000022 f44f428c MOV r2,#0x4600
000026 4b0e LDR r3,|L6.96|
000028 eb031300 ADD r3,r3,r0,LSL #4
00002c 605a STR r2,[r3,#4]
;;;637 Rx_Desc[i].Addr = (U32)&rx_buf[i];
00002e eb000240 ADD r2,r0,r0,LSL #1
000032 4b0c LDR r3,|L6.100|
000034 eb032242 ADD r2,r3,r2,LSL #9
000038 4b09 LDR r3,|L6.96|
00003a eb031300 ADD r3,r3,r0,LSL #4
00003e 609a STR r2,[r3,#8]
;;;638 Rx_Desc[i].Next = (U32)&Rx_Desc[next];
000040 4a07 LDR r2,|L6.96|
000042 eb021201 ADD r2,r2,r1,LSL #4
000046 4b06 LDR r3,|L6.96|
000048 eb031300 ADD r3,r3,r0,LSL #4
00004c 60da STR r2,[r3,#0xc]
00004e 1c40 ADDS r0,r0,#1 ;632
|L6.80|
000050 2804 CMP r0,#4 ;632
000052 d3db BCC |L6.12|
;;;639 }
;;;640
;;;641 /* 接收描述符列表地址寄存器指向接收描述符列表的起始处 */
;;;642 ETH->DMARDLAR = (U32)&Rx_Desc[0];
000054 4a02 LDR r2,|L6.96|
000056 4b04 LDR r3,|L6.104|
000058 60da STR r2,[r3,#0xc]
;;;643 }
00005a 4770 BX lr
;;;644
ENDP
|L6.92|
DCD RxBufIndex
|L6.96|
DCD Rx_Desc
|L6.100|
DCD rx_buf
|L6.104|
DCD 0x40029000
AREA ||i.send_frame||, CODE, READONLY, ALIGN=2
send_frame PROC
;;;412 */
;;;413 void send_frame (OS_FRAME *frame)
000000 b570 PUSH {r4-r6,lr}
;;;414 {
000002 4601 MOV r1,r0
;;;415 U32 *sp,*dp;
;;;416 U32 i,j;
;;;417
;;;418 j = TxBufIndex;
000004 4d1b LDR r5,|L7.116|
000006 7828 LDRB r0,[r5,#0] ; TxBufIndex
;;;419
;;;420 /* 等待上一帧数据发送完成 */
;;;421 while (Tx_Desc[j].CtrlStat & DMA_TX_OWN);
000008 bf00 NOP
|L7.10|
00000a 4d1b LDR r5,|L7.120|
00000c eb051500 ADD r5,r5,r0,LSL #4
000010 682d LDR r5,[r5,#0]
000012 f0054500 AND r5,r5,#0x80000000
000016 2d00 CMP r5,#0
000018 d1f7 BNE |L7.10|
;;;422
;;;423 sp = (U32 *)&frame->data[0];
00001a 1d0a ADDS r2,r1,#4
;;;424 dp = (U32 *)(Tx_Desc[j].Addr & ~3);
00001c 4d16 LDR r5,|L7.120|
00001e eb051500 ADD r5,r5,r0,LSL #4
000022 68ad LDR r5,[r5,#8]
000024 f0250303 BIC r3,r5,#3
;;;425
;;;426 /* 复制要发送的数据到DMA发送描述符中 */
;;;427 for (i = (frame->length + 3) >> 2; i; i--)
000028 880d LDRH r5,[r1,#0]
00002a 1ced ADDS r5,r5,#3
00002c 10ac ASRS r4,r5,#2
00002e e002 B |L7.54|
|L7.48|
;;;428 {
;;;429 *dp++ = *sp++;
000030 ca20 LDM r2!,{r5}
000032 c320 STM r3!,{r5}
000034 1e64 SUBS r4,r4,#1 ;427
|L7.54|
000036 2c00 CMP r4,#0 ;427
000038 d1fa BNE |L7.48|
;;;430 }
;;;431
;;;432 /* 设置数据帧大小 */
;;;433 Tx_Desc[j].Size = frame->length;
00003a 880d LDRH r5,[r1,#0]
00003c 4e0e LDR r6,|L7.120|
00003e eb061600 ADD r6,r6,r0,LSL #4
000042 6075 STR r5,[r6,#4]
;;;434
;;;435 /* 发送描述符由DMA控制发送 */
;;;436 Tx_Desc[j].CtrlStat |= DMA_TX_OWN;
000044 4d0c LDR r5,|L7.120|
000046 eb051500 ADD r5,r5,r0,LSL #4
00004a 682d LDR r5,[r5,#0]
00004c f0454500 ORR r5,r5,#0x80000000
000050 4e09 LDR r6,|L7.120|
000052 eb061600 ADD r6,r6,r0,LSL #4
000056 6035 STR r5,[r6,#0]
;;;437
;;;438 if (++j == NUM_TX_BUF) j = 0;
000058 1c45 ADDS r5,r0,#1
00005a 4628 MOV r0,r5
00005c 2d02 CMP r5,#2
00005e d100 BNE |L7.98|
000060 2000 MOVS r0,#0
|L7.98|
;;;439 TxBufIndex = j;
000062 4e04 LDR r6,|L7.116|
000064 7030 STRB r0,[r6,#0]
;;;440
;;;441 /* 开始帧传输 */
;;;442 /*
;;;443 DMASR 以太网 DMA 状态寄存器
;;;444 向ETH_DMASR寄存器[16:0]中的(未保留)位写入1会将其清零,写入 0 则不起作用。
;;;445 位1 TPSS:发送过程停止状态 (Transmit process stopped status)
;;;446 当发送停止时,此位置 1。
;;;447 */
;;;448 ETH->DMASR = DSR_TPSS;
000066 2502 MOVS r5,#2
000068 4e04 LDR r6,|L7.124|
00006a 6175 STR r5,[r6,#0x14]
;;;449
;;;450 /*
;;;451 DMATPDR 以太网DMA发送轮询请求寄存器
;;;452 应用程序使用此寄存器来指示DMA轮询发送描述符列表。
;;;453 位 31:0 TPD:发送轮询请求(Transmit poll demand)
;;;454 向这些位写入任何值时,DMA都会读取ETH_DMACHTDR寄存器指向的当前描述符。如果
;;;455 该描述符不可用(由CPU所有),则发送会返回到挂起状态,并将ETH_DMASR寄存器位2
;;;456 进行置位。如果该描述符可用,则发送会继续进行。
;;;457 */
;;;458 ETH->DMATPDR = 0;
00006c 2500 MOVS r5,#0
00006e 6075 STR r5,[r6,#4]
;;;459 }
000070 bd70 POP {r4-r6,pc}
;;;460
ENDP
000072 0000 DCW 0x0000
|L7.116|
DCD TxBufIndex
|L7.120|
DCD Tx_Desc
|L7.124|
DCD 0x40029000
AREA ||i.tx_descr_init||, CODE, READONLY, ALIGN=2
tx_descr_init PROC
;;;652 */
;;;653 static void tx_descr_init (void)
000000 2200 MOVS r2,#0
;;;654 {
;;;655 U32 i,next;
;;;656
;;;657 /*
;;;658 1. TDES0:发送描述符字0,对应Tx_Desc[i].CtrlStat
;;;659 位29 LS :末段 (Last segment)
;;;660 该位置1时,指示缓冲区中包含帧的末段。
;;;661 位28 FS :首段 (First segment)
;;;662 该位置1时,指示缓冲区中包含帧的首段
;;;663 位20 TCH:链接的第二个地址 (Second address chained)
;;;664 该位置1时,表示描述符中的第二个地址是下一个描述符地址,而非第二个缓冲区地址。
;;;665 TDES0[20]置1时,TBS2(TDES1[28:16])为无关值。TDES0[21]比TDES0[20]优先处理。
;;;666
;;;667 2. TDES1:发送描述符字1,对应Tx_Desc[i].Size
;;;668
;;;669 3. TDES2:发送描述符字2,对应Tx_Desc[i].Addr
;;;670 位31:0 TBAP1:发送缓冲区1地址指针/发送帧时间戳低位
;;;671 Transmit buffer 1 address pointer / Transmitframe time stamp low
;;;672
;;;673 4. TDES3:发送描述符字3,对应Tx_Desc[i].Next
;;;674 位 1:0 TBAP2:发送缓冲区2地址指针(下一个描述符地址)/ 发送帧时间戳高位
;;;675 Transmit buffer 2 address pointer (Next descriptor address)
;;;676 Transmit frame time stamp high
;;;677 */
;;;678 TxBufIndex = 0;
000002 4b13 LDR r3,|L8.80|
000004 701a STRB r2,[r3,#0]
;;;679 for (i = 0, next = 0; i < NUM_TX_BUF; i++)
000006 2000 MOVS r0,#0
000008 2100 MOVS r1,#0
00000a e01a B |L8.66|
|L8.12|
;;;680 {
;;;681 if (++next == NUM_TX_BUF) next = 0;
00000c 1c4a ADDS r2,r1,#1
00000e 4611 MOV r1,r2
000010 2a02 CMP r2,#2
000012 d100 BNE |L8.22|
000014 2100 MOVS r1,#0
|L8.22|
;;;682 Tx_Desc[i].CtrlStat = DMA_TX_TCH | DMA_TX_LS | DMA_TX_FS;
000016 4a0f LDR r2,|L8.84|
000018 4b0f LDR r3,|L8.88|
00001a eb031300 ADD r3,r3,r0,LSL #4
00001e 601a STR r2,[r3,#0]
;;;683 Tx_Desc[i].Addr = (U32)&tx_buf[i];
000020 eb000240 ADD r2,r0,r0,LSL #1
000024 4b0d LDR r3,|L8.92|
000026 eb032242 ADD r2,r3,r2,LSL #9
00002a 4b0b LDR r3,|L8.88|
00002c eb031300 ADD r3,r3,r0,LSL #4
000030 609a STR r2,[r3,#8]
;;;684 Tx_Desc[i].Next = (U32)&Tx_Desc[next];
000032 4a09 LDR r2,|L8.88|
000034 eb021201 ADD r2,r2,r1,LSL #4
000038 4b07 LDR r3,|L8.88|
00003a eb031300 ADD r3,r3,r0,LSL #4
00003e 60da STR r2,[r3,#0xc]
000040 1c40 ADDS r0,r0,#1 ;679
|L8.66|
000042 2802 CMP r0,#2 ;679
000044 d3e2 BCC |L8.12|
;;;685 }
;;;686
;;;687 /* 发送描述符列表地址寄存器指向发送描述符列表的起始处 */
;;;688 ETH->DMATDLAR = (U32)&Tx_Desc[0];
000046 4a04 LDR r2,|L8.88|
000048 4b05 LDR r3,|L8.96|
00004a 611a STR r2,[r3,#0x10]
;;;689 }
00004c 4770 BX lr
;;;690
ENDP
00004e 0000 DCW 0x0000
|L8.80|
DCD TxBufIndex
|L8.84|
DCD 0x30100000
|L8.88|
DCD Tx_Desc
|L8.92|
DCD tx_buf
|L8.96|
DCD 0x40029000
AREA ||i.write_PHY||, CODE, READONLY, ALIGN=2
write_PHY PROC
;;;700 */
;;;701 static void write_PHY (U32 PhyReg, U16 Value)
000000 b510 PUSH {r4,lr}
;;;702 {
;;;703 U32 tout;
;;;704
;;;705 /* 数据寄存器,存入要写入PHY的16位数据 */
;;;706 ETH->MACMIIDR = Value;
000002 4b0b LDR r3,|L9.48|
000004 6159 STR r1,[r3,#0x14]
;;;707
;;;708 /*
;;;709 MACMIIAR 以太网MAC MII 地址寄存器
;;;710 位 15:11 PA:PHY 地址 (PHY address),对应这里的PHY_DEF_ADDR
;;;711 该字段指示正在访问32个可能的PHY器件中的哪一个。
;;;712
;;;713 位 10:6 MR:MII寄存器 (MII register),对应这里的PhyReg
;;;714 这些位在所选的PHY器件中选择要访问的MII寄存器。
;;;715 位 1 MW:MII写(MII write),对应这里的MMAR_MW
;;;716 此位置1是在告知PHY,将要启动一个使用MII数据寄存器的写操作。
;;;717 如果此位未置,则表示会启动一个读操作,将数据放入MII数据寄存器。
;;;718 位 0 MB:MII忙碌 (MII busy),对应这里的MMAR_MB
;;;719 向ETH_MACMIIAR和ETH_MACMIIDR写入前,此位应读取逻辑0。向ETH_MACMIIAR写入过程中,此
;;;720 位也必须复位为0。在PHY寄存器访问过程中,此位由应用程序置1,指示读或写访问正在进行中。
;;;721 在对PHY进行写操作过程中,ETH_MACMIIDR(MII数据)应始终保持有效,直到MAC将此位清零。
;;;722 在对PHY进行读操作过程中,ETH_MACMIIDR始终无效,直到MAC将此位清零。在此位清零后,才
;;;723 可以向ETH_MACMIIAR(MII地址)写入。
;;;724 */
;;;725 ETH->MACMIIAR = PHY_DEF_ADDR << 11 | PhyReg << 6 | MMAR_MW | MMAR_MB;
000006 14db ASRS r3,r3,#19
000008 ea431380 ORR r3,r3,r0,LSL #6
00000c 1cdb ADDS r3,r3,#3
00000e 4c08 LDR r4,|L9.48|
000010 6123 STR r3,[r4,#0x10]
;;;726
;;;727 /* 等待操作完成,即等待MMAR_MB位被清零 */
;;;728 tout = 0;
000012 2200 MOVS r2,#0
;;;729 for (tout = 0; tout < MII_WR_TOUT; tout++)
000014 bf00 NOP
000016 e006 B |L9.38|
|L9.24|
;;;730 {
;;;731 if ((ETH->MACMIIAR & MMAR_MB) == 0)
000018 4b05 LDR r3,|L9.48|
00001a 691b LDR r3,[r3,#0x10]
00001c f0030301 AND r3,r3,#1
000020 b903 CBNZ r3,|L9.36|
;;;732 {
;;;733 break;
000022 e003 B |L9.44|
|L9.36|
000024 1c52 ADDS r2,r2,#1 ;729
|L9.38|
000026 f5b22fa0 CMP r2,#0x50000 ;729
00002a d3f5 BCC |L9.24|
|L9.44|
00002c bf00 NOP
;;;734 }
;;;735 }
;;;736 }
00002e bd10 POP {r4,pc}
;;;737
ENDP
|L9.48|
DCD 0x40028000
AREA ||.bss||, DATA, NOINIT, ALIGN=2
Rx_Desc
% 64
Tx_Desc
% 32
rx_buf
% 6144
tx_buf
% 3072
AREA ||.data||, DATA, ALIGN=0
g_ucEthLinkStatus
000000 00 DCB 0x00
TxBufIndex
000001 00 DCB 0x00
RxBufIndex
000002 00 DCB 0x00
;*** Start embedded assembler ***
#line 1 "..\\..\\RL-ARM\\Driver\\ETH_STM32F4xx.c"
AREA ||.rev16_text||, CODE
THUMB
EXPORT |__asm___15_ETH_STM32F4xx_c_814deff3____REV16|
#line 129 "..\\..\\Libraries\\CMSIS\\Include\\core_cmInstr.h"
|__asm___15_ETH_STM32F4xx_c_814deff3____REV16| PROC
#line 130
rev16 r0, r0
bx lr
ENDP
AREA ||.revsh_text||, CODE
THUMB
EXPORT |__asm___15_ETH_STM32F4xx_c_814deff3____REVSH|
#line 144
|__asm___15_ETH_STM32F4xx_c_814deff3____REVSH| PROC
#line 145
revsh r0, r0
bx lr
ENDP
AREA ||.rrx_text||, CODE
THUMB
EXPORT |__asm___15_ETH_STM32F4xx_c_814deff3____RRX|
#line 300
|__asm___15_ETH_STM32F4xx_c_814deff3____RRX| PROC
#line 301
rrx r0, r0
bx lr
ENDP
;*** End embedded assembler ***