[ÇÖZÜLDÜ] Ethernet Kablosunun Takılı Olup Olmadığını Anlamak (STM32F7)

Başlatan volkanunal, 22 Haziran 2019, 11:20:28

volkanunal

Merhabalar ,

Ethernet kablosunun donanıma takılıp takılmadığını nasıl handle edebilirim ?

Kontrol ettiğim bazı noktalar  ,

PHYLinkState durumunu şu şekilde kontrol ediyorum.

ethernetif.c içerisinde

uint32_t regvalue = 0;
	
	HAL_ETH_ReadPHYRegister(&EthHandle, PHY_SR, &regvalue);
    
    /* Check whether the link is up or down*/
    
	if((regvalue & PHY_LINK_STATUS) == (uint16_t)RESET)
    {
      if (netif_is_link_up(netif))
		 status = true;
    }
    else
    {
       if (!netif_is_link_up(netif))
		status = false;
	}

Ancak status flag'i davranışı stabil değil , senkron bir şekilde ethernetin yeşil ışığı ile davranışı değişmekte.

Debug modda incelediğimde , stm32f7xx_hal_eth.c dosyası içerisinde HAL_ETH_Init fonksiyonunda kablo takılı olmadığı sürece

while (((phyreg & PHY_LINKED_STATUS) != PHY_LINKED_STATUS));

bu kısımda kalıyor , takılı olduktan sonra bu kısmı geçiyor. Yanlış hatırlamıyorsam STM'in kendi örneklerinde kablonun takılı olup olmadığını anlamak için yazılımda bir yeri aktif ediyorduk. Ancak  o kısmı  bulamadım. Daha önce handle etmek bir çalışma yapan oldu mu ?

Keyifli Çalışmalar.
Primum nil nocere

volkanunal

Merhabalar sorunu çözdüm ,

benzer başlık için arayışta olan arkadaşlar için aşamaları paylaşıyorum.

Öncelikle , lwipopts.h dosyası içerisinde bulunan

#define LWIP_NETIF_LINK_CALLBACK        0

1'e çekiyoruz.

#define LWIP_NETIF_LINK_CALLBACK        1

Ardından callback fonksiyonumuzu kullanımına hazırlıyoruz. Ben bunu ethernetif.c içerisinde bulunan etherhetif_input(struct netif *netif) fonksiyonu içerisinde yaptım.

netif_set_link_callback(netif, ethernetif_update_config); //added by Volkan

Ardından phy registerlarının düzgün bir şekilde init edilip , edilmediğini kontrol ediyoruz. Daha sonra link statusu kontrol ettiğimiz mekanizmamızı kuruyoruz. Ben kablo çıkarılıp , tekrar takıldığında sistemi resetledim.

if (HAL_ETH_ReadPHYRegister(&EthHandle, PHY_BSR, &regvalue) == HAL_OK) //added by Volkan
 {
  if((regvalue & PHY_LINKED_STATUS)== (uint16_t)RESET) 
  {
        // Link status = disconnected
 if (netif_is_link_up(netif))
      {
        netif_set_down(netif);
 printf("unplugged\r\n");
        netif_set_link_down(netif);
  }
 }
  else  {
 // Link status = connected
    if (!netif_is_link_up(netif))  {

    printf("plugged\r\n");
    NVIC_SystemReset();
    }
  }
 }
Primum nil nocere

volkanunal

Son bir güncelleme geçiyorum , void ethernetif_input(struct netif *netif) fonksiyonun hiyerarşisi bu şekilde olmalı.
void ethernetif_input(struct netif *netif)
{
  err_t err;
  struct pbuf *p;
  
  /* move received packet into a new pbuf */
  p = low_level_input(netif);
  uint32_t regvalue = 0;
  netif_set_link_callback(netif, ethernetif_update_config); //added by Volkan
  // Read PHY link status


  if (HAL_ETH_ReadPHYRegister(&EthHandle, PHY_BSR, &regvalue) == HAL_OK) //added by Volkan


  {
    if((regvalue & PHY_LINKED_STATUS)== (uint16_t)RESET) 
    {
    // Link status = disconnected
        if (netif_is_link_up(netif))


        {


         netif_set_down(netif);
         printf("unplugged\r\n");
         netif_set_link_down(netif);


        }


    }


   else


   {


    // Link status = connected


    if (!netif_is_link_up(netif))
    {
        
     printf("plugged\r\n");
     NVIC_SystemReset();
        
    }
   }
}


  /* no packet could be read, silently ignore this */
  if (p == NULL) return;
    
  /* entry point to the LwIP stack */
  err = netif->input(p, netif);
    
  if (err != ERR_OK)
  {
    LWIP_DEBUGF(NETIF_DEBUG, ("ethernetif_input: IP input error\n"));
    pbuf_free(p);
    p = NULL;
  }
}

Eğer

if (p == NULL) return;

kısmından sonrasına  yazdığınızda ethernet tekrar ayağa kalkamayacağı için sizin kod blogunuza ulaşamadan return ediyor.
Primum nil nocere

OptimusPrime

 ;)

Dogru yere bakmissin.  :) Baglantinin olup olmadiginin kontrol eden fiziksel katmandir yani PHY bu isi ustlenir. Genellikle PHY link durumu ile ilgili kesme geri dondurur. Bu kesme icerisinde TCP stack in kullandigi bir bit in icerigi degistirilir. Yani resetlemesende olurdu.  :D   
https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

volkanunal

Alıntı yapılan: OptimusPrime - 23 Haziran 2019, 08:42:11;)

Dogru yere bakmissin.  :) Baglantinin olup olmadiginin kontrol eden fiziksel katmandir yani PHY bu isi ustlenir. Genellikle PHY link durumu ile ilgili kesme geri dondurur. Bu kesme icerisinde TCP stack in kullandigi bir bit in icerigi degistirilir. Yani resetlemesende olurdu.  :D   

Cihaz bazen sahada power verildikten sonra ethernet kablosu takılması gibi bir durumda kalırsa diye böyle yapı oluşturduk.
Primum nil nocere

OptimusPrime

https://donanimveyazilim.wordpress.com || Cihân-ârâ cihân içredir ârâyı bilmezler, O mâhîler ki deryâ içredir deryâyı bilmezler ||

volkanunal

Primum nil nocere