test.c
上传用户:fy98168
上传日期:2015-06-26
资源大小:13771k
文件大小:4k
源码类别:

DVD

开发平台:

C/C++

  1. #include "Tcpip.h"
  2. #include "osp.h"
  3. //ST20 DM9000AE test code.
  4. #define udelay(x)  task_delay(ST_GetClocksPerSecond()/1000 * x)
  5. #define DEBUG_OUT printf
  6. //-------------------------------------------------------------------------------------------//
  7. #define DM9KS_ID 0x90000A46
  8. #define DM9010_ID 0x90100A46
  9. /*-------register name-----------------------*/
  10. #define DM9KS_NCR 0x00 /* Network control Reg.*/
  11. #define DM9KS_NSR 0x01 /* Network Status Reg.*/
  12. #define DM9KS_TCR 0x02 /* TX control Reg.*/
  13. #define DM9KS_TSRI 0x03
  14. #define DM9KS_TSRII 0x04
  15. #define DM9KS_RXCR 0x05 /* RX control Reg.*/
  16. #define DM9KS_RSR 0x06
  17. #define DM9KS_ROCR 0x07
  18. #define DM9KS_BPTR 0x08
  19. #define DM9KS_FCTR 0x09
  20. #define DM9KS_FCR 0x0a
  21. #define DM9KS_EPCR 0x0b
  22. #define DM9KS_EPAR 0x0c
  23. #define DM9KS_EPDRL 0x0d
  24. #define DM9KS_EPDRH 0x0e
  25. #define DM9KS_WCR 0x0f
  26. #define DM9KS_GPCR 0x1e
  27. #define DM9KS_GPR 0x1f /* General purpose register */
  28. #define DM9KS_TRPAL 0x22
  29. #define DM9KS_TRPAH 0x23
  30. #define DM9KS_RWPAL 0x24
  31. #define DM9KS_RWPAH 0x25
  32. #define DM9KS_VID_L 0x28
  33. #define DM9KS_VID_H 0x29
  34. #define DM9KS_PID_L 0x2A
  35. #define DM9KS_PID_H 0x2B
  36. #define DM9KS_CHIPR 0x2C
  37. #define DM9KS_TCR2 0x2d
  38. #define DM9KS_OCR 0x2E
  39. #define DM9KS_SMCR 0x2f  /* Special Mode Control Reg.*/
  40. #define DM9KS_ETXCSR 0x30 /* Early Transmit control/status Reg.*/
  41. #define DM9KS_TCCR 0x31 /* Checksum cntrol Reg. */
  42. #define DM9KS_RCSR 0x32 /* Receive Checksum status Reg.*/
  43. #define DM9KS_MPAR 0x33
  44. #define DM9KS_LEDCR 0x34
  45. #define DM9KS_BUSCR 0x38
  46. #define DM9KS_INTCR 0x39
  47. #define DM9KS_SCCR 0x50
  48. #define DM9KS_RSCCR 0x51
  49. #define DM9KS_MRCMDX 0xf0
  50. #define DM9KS_MRCMDX1 0xf1
  51. #define DM9KS_MRCMD 0xf2
  52. #define DM9KS_MDRAL 0xf4
  53. #define DM9KS_MDRAH 0xf5
  54. #define DM9KS_MWCMDX 0xf6
  55. #define DM9KS_MWCMD 0xf8
  56. #define DM9KS_MWRL 0xfa
  57. #define DM9KS_MWRH 0xfb
  58. #define DM9KS_TXPLL 0xfc
  59. #define DM9KS_TXPLH 0xfd
  60. #define DM9KS_ISR 0xfe
  61. #define DM9KS_IMR 0xff
  62. #define DM9KS_PHY 0x40 /* PHY address 0x01 */
  63. //-------------------------------------------------------------------------------------------//
  64. u32 iobase = 0x41000000; //DM9000AE bank address
  65. u32 iodata = 0x41000004; //CMD --> addr2
  66. #if 0
  67. // debug start
  68. u8 inb(u32 addr)
  69. {
  70. return (u8)(*(volatile u8 *)addr);
  71. }
  72. void outb(u8 reg, u32 addr)
  73. {
  74. *(volatile u8 *)addr = reg;
  75. }
  76. // debug end
  77. /*
  78.    Read a byte from I/O port
  79. */
  80. u8 ior(u8 reg, u32 addr)
  81. {
  82. outb(reg, addr);
  83. return inb(iodata);
  84. }
  85. /*
  86.    Write a byte to I/O port
  87. */
  88. void iow(u8 reg, u8 value)
  89. {
  90. outb(reg, iobase);
  91. outb(value, iodata);
  92. }
  93. /*
  94.    Write a word to phyxcer
  95. */
  96. void phy_write(u8 reg, u16 value)
  97. {
  98. /* Fill the phyxcer register into REG_0C */
  99. iow( DM9KS_EPAR, DM9KS_PHY | reg);
  100. /* Fill the written data into REG_0D & REG_0E */
  101. iow( DM9KS_EPDRL, (value & 0xff));
  102. iow( DM9KS_EPDRH, ( (value >> 8) & 0xff));
  103. iow( DM9KS_EPCR, 0xa); /* Issue phyxcer write command */
  104. udelay(500); /* Wait write complete */
  105. iow( DM9KS_EPCR, 0x0); /* Clear phyxcer write command */
  106. }
  107. #endif
  108. void dm9ks_test(void)
  109. {
  110. u8 io_mode;
  111. u32 id_val;
  112. /* I/O mode */
  113. io_mode = ior( DM9KS_ISR, iobase) >> 6; /* ISR bit7:6 keeps I/O mode */
  114. DEBUG_OUT("<DM9KS>:io_mode = 0x%x ",io_mode);
  115. if(io_mode==0)
  116. DEBUG_OUT("(16bit)rn");
  117. else
  118. DEBUG_OUT("(8bit)rn");
  119. outb(DM9KS_VID_L, iobase);
  120. id_val = inb(iodata);
  121. outb(DM9KS_VID_H, iobase);
  122. id_val |= inb(iodata) << 8;
  123. outb(DM9KS_PID_L, iobase);
  124. id_val |= inb(iodata) << 16;
  125. outb(DM9KS_PID_H, iobase);
  126. id_val |= inb(iodata) << 24;
  127. DEBUG_OUT("<DM9KS>:I/O: 0x%x, VID: 0x%x rn",iobase, id_val);
  128. if (id_val == DM9KS_ID || id_val == DM9010_ID) 
  129. {
  130. DEBUG_OUT("<DM9KS>:Init DM9KS...rn");
  131. iow(DM9KS_GPR, 1);  /* Power-Down PHY */
  132. udelay(2000);
  133. /* set the internal PHY power-on, GPIOs normal, and wait 2ms */
  134. iow( DM9KS_GPR, 0); /* GPR (reg_1Fh)bit GPIO0=0 pre-activate PHY */
  135. udelay(2000); /* wait 2ms for PHY power-on ready */
  136. /* do a software reset and wait 20us */
  137. iow( DM9KS_NCR, 3);
  138. udelay(20); /* wait 20us at least for software reset ok */
  139. iow( DM9KS_NCR, 3); /* NCR (reg_00h) bit[0] RST=1 & Loopback=1, reset on. Added by SPenser */
  140. udelay(20); /* wait 20us at least for software reset ok */
  141. phy_write(0, 0x1200);
  142. phy_write(4, 0x01e1);
  143. iow(DM9KS_TCR2, 0x80);
  144. DEBUG_OUT("Init OK!n");
  145. }
  146. else
  147. {
  148. DEBUG_OUT("<DM9KS>:************ERROR! NO DM9000A!rn");
  149. while(1);
  150. }
  151. }