Zynq.TestEnetST.Mod 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359
  1. MODULE Test;
  2. IMPORT
  3. SYSTEM, Trace := EnetTrace, Platform, Kernel, EnetTiming, EnetBase, EmacPs7 := EnetEmacPs7, Objects, EnetArp, EnetIcmp, EnetUdp, Enet, Commands, Interfaces := EnetInterfaces;
  4. CONST
  5. IntfMacAddr = "00:0A:35:00:01:02";
  6. IntfIpAddr = "10.3.34.8";
  7. IntfGateway = "0.0.0.0";
  8. IntfSubnetMask = "255.255.255.0";
  9. LocalUdpPort = 65534;
  10. TYPE
  11. Int16 = EnetBase.Int16;
  12. Int32 = EnetBase.Int32;
  13. Int = EnetBase.Int;
  14. Runner = OBJECT
  15. VAR
  16. res: Int;
  17. completionHandler: EnetBase.TaskHandler;
  18. timer: Kernel.Timer;
  19. alive: BOOLEAN;
  20. exited: BOOLEAN;
  21. waiting, waitingReq: BOOLEAN;
  22. sendFlag, setUdpDestFlag: BOOLEAN;
  23. dstIpAddr: EnetBase.IpAddr;
  24. dstPort: Int;
  25. numPacketsToSend: Int;
  26. PROCEDURE &InitRunner();
  27. BEGIN
  28. alive := TRUE;
  29. waitingReq := TRUE;
  30. waiting := TRUE;
  31. exited := FALSE;
  32. sendFlag := FALSE;
  33. setUdpDestFlag := FALSE;
  34. NEW(timer);
  35. NEW(completionHandler);
  36. END InitRunner;
  37. PROCEDURE Start*(VAR res: Int): BOOLEAN;
  38. BEGIN
  39. ASSERT(alive);
  40. IF Interfaces.StartAll(res) THEN
  41. BEGIN{EXCLUSIVE}
  42. waitingReq := FALSE;
  43. waiting := FALSE;
  44. END;
  45. RETURN TRUE;
  46. ELSE
  47. RETURN FALSE;
  48. END;
  49. END Start;
  50. PROCEDURE Stop*(VAR res: Int): BOOLEAN;
  51. VAR b: BOOLEAN;
  52. BEGIN
  53. ASSERT(alive);
  54. BEGIN{EXCLUSIVE}
  55. waitingReq := TRUE;
  56. AWAIT(waiting);
  57. END;
  58. RETURN Interfaces.StopAll(res);
  59. END Stop;
  60. PROCEDURE Reset*(VAR res: Int): BOOLEAN;
  61. VAR b: BOOLEAN;
  62. BEGIN
  63. ASSERT(alive);
  64. BEGIN{EXCLUSIVE}
  65. waitingReq := TRUE;
  66. AWAIT(waiting);
  67. END;
  68. RETURN Interfaces.ResetAll(res);
  69. END Reset;
  70. PROCEDURE Finalize(VAR res: Int): BOOLEAN;
  71. VAR b: BOOLEAN;
  72. BEGIN
  73. b := Stop(res);
  74. alive := FALSE;
  75. BEGIN{EXCLUSIVE}
  76. AWAIT(exited);
  77. END;
  78. RETURN b;
  79. END Finalize;
  80. PROCEDURE TriggerSend;
  81. BEGIN{EXCLUSIVE}
  82. sendFlag := TRUE;
  83. END TriggerSend;
  84. PROCEDURE TriggerSetUdpDest;
  85. BEGIN{EXCLUSIVE}
  86. setUdpDestFlag := TRUE;
  87. END TriggerSetUdpDest;
  88. PROCEDURE UdpRecvHandler(
  89. udpSocket: EnetUdp.Socket;
  90. CONST srcAddr: EnetBase.IpAddr;
  91. srcPort: EnetBase.Int;
  92. VAR data: ARRAY OF CHAR;
  93. dataOffs, dataLen: EnetBase.Int;
  94. packet: EnetBase.Packet
  95. );
  96. BEGIN
  97. END UdpRecvHandler;
  98. PROCEDURE SendPackets(n: Int);
  99. VAR
  100. data: ARRAY 1470 OF CHAR;
  101. i: Int;
  102. BEGIN
  103. FOR i := 0 TO LEN(data)-1 DO
  104. data[i] := CHR(i+1);
  105. END;
  106. Trace.StringLn("sending " & n & " UDP datagrams...");
  107. Trace.RefTimestamp(0);
  108. WHILE (n > 0) & EnetUdp.Send(udpSocket,data,0,LEN(data),{EnetBase.FlagNoDataCopy},NIL,res) DO
  109. DEC(n);
  110. END;
  111. Trace.Timestamp(0,"sending time: ");
  112. IF n = 0 THEN
  113. Trace.StringLn("all UDP datagrams have been sent");
  114. ELSE
  115. Trace.StringLn("a failure to send UDP datagram, number of remained datagrams to send is" & n);
  116. END;
  117. END SendPackets;
  118. PROCEDURE SetUdpDest;
  119. VAR res: Int;
  120. BEGIN
  121. IF ~EnetUdp.SetDestination(udpSocket,dstIpAddr,dstPort,completionHandler,res) THEN
  122. Trace.StringLn("failed to setup image streaming destination, res=" & res);
  123. RETURN;
  124. END;
  125. IF res = EnetBase.OpInProgress THEN
  126. ASSERT((completionHandler.res = EnetBase.OpInProgress));
  127. WHILE (completionHandler.res = EnetBase.OpInProgress) & Interfaces.UpdateAll(res) DO
  128. END;
  129. IF res # 0 THEN
  130. Trace.StringLn("interface update error, res=" & res);
  131. RETURN;
  132. END;
  133. res := completionHandler.res;
  134. END;
  135. IF res = 0 THEN
  136. Trace.StringLn("image streaming destination has been set up");
  137. ELSE
  138. Trace.StringLn("failed to setup image streaming destination, res=" & res);
  139. END;
  140. END SetUdpDest;
  141. BEGIN{ACTIVE,PRIORITY(Objects.Realtime)}
  142. WHILE alive DO
  143. IF ~waitingReq THEN
  144. IF Interfaces.UpdateAll(res) THEN
  145. IF sendFlag THEN
  146. sendFlag := FALSE;
  147. SendPackets(numPacketsToSend);
  148. ELSIF setUdpDestFlag THEN
  149. setUdpDestFlag := FALSE;
  150. SetUdpDest;
  151. END;
  152. ELSE
  153. BEGIN{EXCLUSIVE} waitingReq := TRUE; END;
  154. END;
  155. ELSE
  156. BEGIN{EXCLUSIVE}
  157. waiting := TRUE;
  158. AWAIT(~waiting OR ~alive)
  159. END;
  160. END;
  161. END;
  162. BEGIN{EXCLUSIVE}
  163. exited := TRUE;
  164. END;
  165. END Runner;
  166. VAR
  167. runner: Runner;
  168. intf: Enet.Interface;
  169. udpSocket: EnetUdp.Socket;
  170. recvCounter: Int;
  171. PROCEDURE Start*(context: Commands.Context);
  172. BEGIN
  173. IF ~runner.Start(context.result) THEN
  174. END;
  175. END Start;
  176. PROCEDURE Stop*(context: Commands.Context);
  177. BEGIN
  178. IF ~runner.Stop(context.result) THEN
  179. END;
  180. END Stop;
  181. PROCEDURE Reset*(context: Commands.Context);
  182. BEGIN
  183. IF ~runner.Reset(context.result) THEN
  184. END;
  185. END Reset;
  186. PROCEDURE ShowArpCache*;
  187. BEGIN
  188. EnetArp.ShowArpCache(intf.ipv4AddrCache(EnetArp.ArpCache));
  189. END ShowArpCache;
  190. PROCEDURE ShowRecvCounter*;
  191. BEGIN
  192. Trace.StringLn("recvCounter=" & recvCounter);
  193. END ShowRecvCounter;
  194. (**
  195. Setup UDP socket destination
  196. Syntax:
  197. SetUdpDest dstIpAddr dstPort ~
  198. *)
  199. PROCEDURE SetUdpDest*(context: Commands.Context);
  200. VAR
  201. strDstIpAddr: ARRAY 16 OF CHAR;
  202. dstPort: Int;
  203. dstIpAddr: EnetBase.IpAddr;
  204. completionHandler: EnetBase.TaskHandler;
  205. res: Int;
  206. BEGIN
  207. IF ~context.arg.GetString(strDstIpAddr) OR ~context.arg.GetInteger(dstPort,FALSE) THEN
  208. context.result := 1;
  209. context.error.String("destination IP address and destination port number are expected!"); context.error.Ln;
  210. RETURN;
  211. END;
  212. IF ~EnetBase.StrToIpAddr(strDstIpAddr,dstIpAddr) THEN
  213. context.result := 1;
  214. context.error.String("destination IP address string has invalid format!"); context.error.Ln;
  215. RETURN;
  216. END;
  217. runner.dstIpAddr := dstIpAddr;
  218. runner.dstPort := dstPort;
  219. runner.TriggerSetUdpDest;
  220. END SetUdpDest;
  221. PROCEDURE SendPackets*(context: Commands.Context);
  222. VAR n: Int;
  223. BEGIN
  224. ASSERT(context.arg.GetInteger(n,FALSE));
  225. runner.numPacketsToSend := n;
  226. runner.TriggerSend;
  227. END SendPackets;
  228. (*PROCEDURE FromMicro(us: EnetTiming.Time): EnetTiming.Time;
  229. BEGIN
  230. RETURN us * ENTIERH(0.5D0+Platform.CpuClockHz/2.0D6);
  231. END FromMicro;
  232. PROCEDURE FromMilli(ms: EnetTiming.Time): EnetTiming.Time;
  233. BEGIN
  234. RETURN ms * ENTIERH(0.5D0+Platform.CpuClockHz/2.0D3);
  235. END FromMilli;*)
  236. PROCEDURE InitMod;
  237. VAR
  238. res: Int;
  239. dev: EnetBase.LinkDevice;
  240. macAddr: EnetBase.MacAddr;
  241. ipAddr, gateway, subnetMask: EnetBase.IpAddr;
  242. BEGIN
  243. ASSERT(~EnetBase.ThreadSafe);
  244. NEW(runner);
  245. (* initialize the interface *)
  246. ASSERT(EmacPs7.GetDevice(0,2048,2048,8192,8192,dev,res));
  247. NEW(intf);
  248. Enet.InitInterface(intf,dev,res); ASSERT(res = 0);
  249. (* setup link layer of the interface *)
  250. ASSERT(EnetBase.StrToMacAddr(IntfMacAddr,macAddr));
  251. ASSERT(Interfaces.SetMacAddr(intf,macAddr,res));
  252. ASSERT(Interfaces.SetLinkSpeed(intf,"Auto",TRUE,res));
  253. (* setup IP configuration of the interface *)
  254. ASSERT(EnetBase.StrToIpAddr(IntfIpAddr,ipAddr));
  255. ASSERT(EnetBase.StrToIpAddr(IntfSubnetMask,subnetMask));
  256. ASSERT(EnetBase.StrToIpAddr(IntfGateway,gateway));
  257. ASSERT(Interfaces.SetIpConfig(intf,ipAddr,subnetMask,gateway,res));
  258. ASSERT(Interfaces.Add(intf,res));
  259. (* create a UDP socket *)
  260. ASSERT(EnetUdp.NewSocket(udpSocket,LocalUdpPort,res));
  261. ASSERT(EnetUdp.SetRecvHandler(udpSocket,runner.UdpRecvHandler,res));
  262. END InitMod;
  263. BEGIN
  264. InitMod;
  265. END Test.
  266. (* KRM *)
  267. FSTools.CreateFile -c -r Replacements.tmp
  268. BootConfig.UartInputClockHz = 100000000;
  269. BootConfig.KernelOutputUart = 0;
  270. BootConfig.CpuNb = 2;
  271. EnetBase.ThreadSafe = TRUE;
  272. Enet.UseSpinLocks = TRUE;
  273. ~
  274. (* ZYBO & ZedBoard *)
  275. FSTools.CreateFile -c -r Replacements.tmp
  276. BootConfig.UartInputClockHz = 50000000;
  277. BootConfig.KernelOutputUart = 1;
  278. BootConfig.CpuNb = 2;
  279. EnetBase.ThreadSafe = TRUE;
  280. Enet.UseSpinLocks = TRUE;
  281. EnetEmacPs7.AllowZeroPhyAddr = [TRUE,TRUE];
  282. ~
  283. SystemTools.DoCommands
  284. Release.Build -b -f=ARM.Release.Tool -o='--replacements=Replacements.tmp --noInitLocals --traceModule=Trace' --only="Kernel" ZynqMinos ~
  285. Release.Build -b -f=ARM.Release.Tool -o='--replacements=Replacements.tmp --traceModule=Trace' --only="System Enet Shell" ZynqMinos ~
  286. Compiler.Compile -b=ARM --traceModule=Trace --replacements=Replacements.tmp
  287. Zynq.TestEnetST.Mod
  288. ~
  289. ~
  290. Release.Build -l -f=ARM.Release.Tool --only="Kernel System Enet Shell" ZynqMinos ~
  291. FSTools.CloseFiles Test.bin ~
  292. FoxARMInstructionSet.Disassemble Test.bin -a=1A71E4H ~