?login_element?

Subversion Repositories NedoOS

Rev

Rev 8 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1.  
  2. #ifndef __ETHFUNC_C
  3. #define __ETHFUNC_C
  4.  
  5. #include "config.h"
  6. #include "ethfunc.h"
  7. #include "opora.h"
  8.  
  9. extern const uint16_t MyMAC[3];
  10. extern const uint16_t MyIPAddress[2];
  11. /*-----------------------------------------------------
  12. *------------------------------------------------------
  13. *------------------------------------------------------
  14. *--------------- ╘єэъЎшш ъюэЄЁюыыЁр PHY ---------------
  15. *------------------------------------------------------
  16. *------------------------------------------------------
  17. ------------------------------------------------------*/
  18.  
  19.  
  20. //*** ╘єэъЎш  фы  ъюэЇшуєЁшЁютрэш  PHY ьюфєы  ўхЁхч MDIO шэЄхЁЇхщё ***
  21. //Addr - рфЁхё ьюфєы  PHY
  22. //Mode - Ёхцшь ЁрсюЄ√ ъюэЄЁюыыхЁр PHY
  23. void PHYInit(uint8_t Addr, uint8_t Mode)
  24. {
  25.                 uint32_t tmp;
  26.  
  27.                 tmp = ETHERNET->PHY_CTRL;
  28.                 tmp &= 0x0770;  //ёсЁюёшыш яюы  рфЁхёр PHY, Ёхцшьр ЁрсюЄ√ яю єьюыўрэш■, Ёхцшь FiberOptic
  29.                 tmp |= (Addr<<11)|(Mode<<1)|1;
  30.  
  31.                 ETHERNET->PHY_CTRL=tmp;
  32.                 while((ETHERNET->PHY_STATUS&0x10)==0);  //цфхь яюър ьюфєы№ т ёюёЄю эшш ёсЁюёр
  33. }
  34.  
  35. //*** ╘єэъЎш  фы  чряшёш ЁхушёЄЁют PHY ьюфєы  ўхЁхч MDIO шэЄхЁЇхщё ***
  36. //Addr  - рфЁхё ьюфєы  PHY
  37. //Num   - эюьхЁ ЁхушёЄЁр, ъєфр сєфхь чряшё√трЄ№ фрээ√х
  38. //Data  - фрээ√х фы  чряшёш
  39. void SetPHYReg(uint8_t Addr, uint8_t Num, uint16_t Data)
  40. {
  41.         uint32_t i;
  42.         ETHERNET->MDIO_DATA=Data;
  43.         i=0xC000|((Addr&0x1F)<<8)|(Num&0x1F)|(0x01<<5);
  44.         ETHERNET->MDIO_CTRL=(uint16_t)i;
  45.         while((ETHERNET->MDIO_CTRL&0x8000)==0);
  46. }
  47.  
  48. //*** ╘єэъЎш  фы  ўЄхэш  ЁхушёЄЁют PHY ьюфєы  ўхЁхч MDIO шэЄхЁЇхщё ***
  49. //Addr  - рфЁхё ьюфєы  PHY
  50. //Num   - эюьхЁ ЁхушёЄЁр, ъюЄюЁ√щ эхюсїюфшью яЁюўшЄрЄ№
  51. //тючтЁр∙рхЄ чэрўхэшх ЁхушёЄЁр яю рфЁхёє Num т Addr ьюфєых PHY.
  52. uint16_t GetPHYReg(uint8_t Addr, uint8_t Num)
  53. {
  54.         uint32_t i;
  55.         i=0xE000|((Addr&0x1F)<<8)|(0x1<<5)|(Num&0x1F);
  56.         ETHERNET->MDIO_CTRL=(uint16_t)i;
  57.         while((ETHERNET->MDIO_CTRL&0x8000)==0);
  58.         return  ETHERNET->MDIO_DATA;
  59. }
  60.  
  61. /*-----------------------------------------------------
  62. *------------------------------------------------------
  63. *------------------------------------------------------
  64. *--------------- ╘єэъЎшш ъюэЄЁюыыЁр MAC ---------------
  65. *------------------------------------------------------
  66. *------------------------------------------------------
  67. -----------------------------------------------------*/
  68. //*** ╘єэъЎш  фы  ъюэЇшуєЁшЁютрэш  MAC ьюфєы  ***
  69. void EthernetConfig()
  70. {
  71.         PHYInit(0x1C,3);        //PHY address 0x1C, Mode 100BaseT_Full_Duplex
  72.  
  73.         ETHERNET->MAC_T=MyMAC[0];
  74.         ETHERNET->MAC_M=MyMAC[1];
  75.         ETHERNET->MAC_H=MyMAC[2];
  76.  
  77.         MACReset();
  78.         ETHERNET->IMR=0x0101;   //ЁрчЁх°хэшх яЁхЁ√трэшщ яЁш єёях°эюь яЁшхьх яръхЄр
  79. }
  80.  
  81. //*** ╘єэъЎш  фы  ъюэЇшуєЁшЁютрэш  MAC ьюфєы  ё шёїюфэ√ьш чэрўхэш ьш ЁхушёЄЁют ***
  82. void MACReset()
  83. {
  84.         ETHERNET->G_CFG|=0x00030000;    //RRST=1, XRST=1 ёсЁюё яЁшхьэшър ш яхЁхфрЄўшър
  85.  
  86.         ClearMemory();
  87.  
  88.         ETHERNET->Delimiter=0x1000;     //4096 срщЄ сєЇхЁ яхЁхфрЄўшър, 4096 срщЄ сєЇхЁ яЁшхьэшър
  89.  
  90.         ETHERNET->HASH0=0;
  91.         ETHERNET->HASH1=0;
  92.         ETHERNET->HASH2=0;
  93.         ETHERNET->HASH3=0x8000;
  94.  
  95.         ETHERNET->IPG=0x0060;
  96.         ETHERNET->PSC=0x0050;
  97.         ETHERNET->BAG=0x0200;
  98.         ETHERNET->JitterWnd=0x0005;
  99.         ETHERNET->R_CFG=0x8406;
  100.         ETHERNET->X_CFG=0x81FA;
  101.  
  102.         ETHERNET->G_CFG=0x30030080;     //ышэхщэ√щ Ёхцшь ЁрсюЄ√ сєЇхЁют.
  103.  
  104.         ETHERNET->IMR=0;
  105.         ETHERNET->IFR=0xFFFF;
  106.  
  107.         ETHERNET->R_Head=0x0000;
  108.         ETHERNET->X_Tail=0x1000;
  109.  
  110.         ETHERNET->G_CFG&=0xFFFCBFFF;    //RRST=0, XRST=0 °ЄрЄэ√щ Ёхцшь ЁрсюЄ√
  111. }
  112.  
  113. //*** ╘єэъЎш  фы  юўшёЄъш сєЇхЁют яЁшхьэшър ш яхЁхфрЄўшър MAC ьюфєы  ***
  114. //┴єЇхЁ яЁшхьэшър 4096 срщЄ
  115. //┴єЇхЁ яхЁхфрЄўшър 4096 срщЄ
  116. void ClearMemory()
  117. {
  118.         uint32_t Temp;
  119.         uint32_t *ptr;
  120.         ptr=(uint32_t*)0x38000000;
  121.         for(Temp=0;Temp<2048;Temp++)    *ptr++=0;
  122. }
  123.  
  124.  
  125.  
  126. /*---------------------------------------------------------------------------------------------------
  127. *--------------- ╘єэъЎшш фы  ЁрсюЄ√ ё сєЇхЁрьш яЁшхьэшър ш яхЁхфрЄўшър ъюэЄЁюыыЁр MAC ---------------
  128. ---------------------------------------------------------------------------------------------------*/
  129. //*** ╘єэъЎш  фы  ёўшЄ√трэш  яръхЄр шч сєЇхЁр яЁшхьэшър ***
  130. //*** *Frame - єърчЄхы№ эр ёЄЁєъЄєЁє яръхЄр
  131. uint32_t ReadPacket(_Rec_Frame* Frame)
  132. {
  133.         uint16_t space_start=0;
  134.         uint16_t space_end=0;
  135.         uint16_t tail;
  136.         uint16_t head;
  137.         uint32_t *src, *dst;
  138.         uint32_t size, i;
  139.         uint16_t tmp[2];
  140.  
  141.         tail=ETHERNET->R_Tail;
  142.         head=ETHERNET->R_Head;
  143.  
  144.         if(tail>head)
  145.         {
  146.                 space_end=tail-head;
  147.                 space_start=0;
  148.         }
  149.         else
  150.         {
  151.                 space_end=0x1000-head;
  152.                 space_start=tail;
  153.         }
  154.  
  155.         src=(uint32_t*)(0x38000000+head);
  156.         dst=(uint32_t*)(Frame->Data);
  157.  
  158.         *((uint32_t*)tmp)=*src++;       //яЁюўшЄрыш ъюы-тю срщЄ т яюыєўхээюь яръхЄх
  159.         space_end-=4;
  160.         if((uint16_t)src>0xFFF) src=(uint32_t*)0x38000000;
  161.  
  162.         size=(tmp[0]+3)/4;
  163.         if(tmp[0]<=space_end)
  164.         {
  165.                 for(i=0;i<size;i++)
  166.                         *dst++ = *src++;
  167.         }
  168.         else
  169.         {
  170.                 size=size-space_end/4;
  171.                 for(i=0; i<(space_end/4); i++)
  172.                         *dst++ = *src++;
  173.                 src=(uint32_t*)0x38000000;
  174.                 for(i=0; i<size; i++)
  175.                         *dst++ = *src++;
  176.         }
  177.         if((uint16_t)src>0xFFF) src=(uint32_t*)0x38000000;
  178.  
  179.         ETHERNET->R_Head=(uint16_t)src;
  180.         ETHERNET->STAT-=0x20;
  181.         return tmp[0];
  182. }
  183.  
  184. //*** ╘єэъЎш  фы  чряшёш яръхЄр т сєЇхЁ яхЁхфрЄўшър ***
  185. //*** *buffer - єърчЄхы№ эр сєЇхЁ фрээ√ї
  186. //*** size - ъюы-тю юЄяЁрты хь√ї срщЄ
  187. int     SendPacket(void* buffer, int size)
  188. {
  189.         uint16_t i;
  190.         uint32_t tmp, head, tail;
  191.         uint32_t *src, *dst;
  192.         uint16_t space[2];
  193.  
  194.         head = ETHERNET->X_Head;
  195.         tail = ETHERNET->X_Tail;
  196.  
  197.         //т√ўшёы хь ъюы-тю ётюсюфэюую ьхёЄр т сєЇхЁх яхЁхфрЄўшър
  198.         if(head>tail)
  199.         {
  200.                 space[0]=head-tail;
  201.                 space[1]=0;
  202.         } else
  203.         {
  204.                 space[0]=0x2000-tail;
  205.                 space[1]=head-0x1000;
  206.         }
  207.         //т√ўшёышыш ъюы-тю ётюсюфэюую ьхёЄр т сєЇхЁх яхЁхфрЄўшър
  208.  
  209.         if(size>(space[0]+space[1]-8))  return 0;       //-8, Єръ ъръ 4 срщЄр чрэшьрхЄ яюых фышэ√ фрээ√ї ш 4 срщЄр чрэшьрхЄ яюых ёЄрЄєёр яръхЄр
  210.  
  211.         tmp=size;
  212.         src=buffer;
  213.         dst=(uint32_t*)(0x38000000+tail);
  214.  
  215.         *dst++ =tmp;
  216.         space[0]-=4;
  217.         if((uint16_t)dst>0x1FFC)        dst=(uint32_t*)0x38001000;
  218.  
  219.         tmp=(size+3)/4;
  220.  
  221.         if(size<=space[0])
  222.         {
  223.                 for(i=0; i<tmp; i++)
  224.                         *dst++ = *src++;
  225.         }
  226.         else
  227.         {
  228.                 tmp-=space[0]/4;
  229.                 for(i=0;i<(space[0]/4);i++)
  230.                         *dst++ = *src++;
  231.                 dst=(uint32_t*)0x38001000;
  232.                 for(i=0;i<tmp;i++)
  233.                         *dst++ = *src++;
  234.         }
  235.         if((uint16_t)dst>0x1FFC)        dst=(uint32_t*)0x38001000;
  236.         tmp=0;
  237.         *dst++ =tmp;
  238.         if((uint16_t)dst>0x1FFC)        dst=(uint32_t*)0x38001000;
  239.  
  240.         ETHERNET->X_Tail=(uint16_t)dst;
  241.         return  size;
  242. }
  243.  
  244.  
  245. #endif  //__ETHFUNC_C
  246.  
  247.