red_pitaya_fsbl_hooks.c 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. #define _GNU_SOURCE
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "xiicps.h"
  5. #include "xemacps.h"
  6. u32 SetMacAddress()
  7. {
  8. XIicPs Iic;
  9. XIicPs_Config *IicConfig;
  10. XEmacPs Emac;
  11. XEmacPs_Config *EmacConfig;
  12. u32 Status, i;
  13. u8 Buffer[1024];
  14. char *Pointer;
  15. Buffer[0] = 0x18;
  16. Buffer[1] = 0;
  17. IicConfig = XIicPs_LookupConfig(XPAR_PS7_I2C_0_DEVICE_ID);
  18. if(IicConfig == NULL) return XST_FAILURE;
  19. Status = XIicPs_CfgInitialize(&Iic, IicConfig, IicConfig->BaseAddress);
  20. if(Status != XST_SUCCESS) return XST_FAILURE;
  21. Status = XIicPs_SetSClk(&Iic, 100000);
  22. if(Status != XST_SUCCESS) return XST_FAILURE;
  23. Status = XIicPs_MasterSendPolled(&Iic, Buffer, 2, 0x50);
  24. if(Status != XST_SUCCESS) return XST_FAILURE;
  25. while(XIicPs_BusIsBusy(&Iic));
  26. Status = XIicPs_MasterRecvPolled(&Iic, Buffer, 1024, 0x50);
  27. if(Status != XST_SUCCESS) return XST_FAILURE;
  28. Pointer = memmem(Buffer, 1024, "ethaddr=", 8);
  29. if(Pointer == NULL) return XST_FAILURE;
  30. Pointer += 7;
  31. for(i = 0; i < 6; ++i)
  32. {
  33. Buffer[i] = strtol(Pointer + 1, &Pointer, 16);
  34. }
  35. EmacConfig = XEmacPs_LookupConfig(XPAR_PS7_ETHERNET_0_DEVICE_ID);
  36. if(EmacConfig == NULL) return XST_FAILURE;
  37. Status = XEmacPs_CfgInitialize(&Emac, EmacConfig, EmacConfig->BaseAddress);
  38. if(Status != XST_SUCCESS) return XST_FAILURE;
  39. Status = XEmacPs_SetMacAddress(&Emac, Buffer, 1);
  40. if(Status != XST_SUCCESS) return XST_FAILURE;
  41. return Status;
  42. }