硬汉嵌入式论坛

 找回密码
 立即注册
查看: 7125|回复: 11
收起左侧

[ThreadX全家桶] ThreadX NetXDUO上电未插入网线的解决办法

  [复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2021-3-24 10:46:41 | 显示全部楼层 |阅读模式
在底层驱动这里先初始化PHY芯片即可,然后等待网线插入。

F4和H7的ETH的HAL版驱动略有不同,但处理方法是一样的。

关键部分:

  1.     /* Initialize the DM9162 ETH PHY */
  2.     DM9162_Init(&DM9162);

  3.     PHYLinkState = DM9162_GetLinkState(&DM9162);

  4.     while(PHYLinkState <= DM9162_STATUS_LINK_DOWN)
  5.     {
  6.         PHYLinkState = DM9162_GetLinkState(&DM9162);
  7.         tx_thread_sleep(100);
  8.     }
复制代码


完整:

  1. /* 这里直接将相对变量和头文件都放在这里 */
  2. #include "dm9162.h"

  3. dm9162_Object_t DM9162;
  4. TX_THREAD *netx_thread_ptr;

  5. static UINT  _nx_driver_hardware_initialize(NX_IP_DRIVER *driver_req_ptr)
  6. {
  7. INT PHYLinkState;
  8. UINT duplex, speed = 0;
  9. dm9162_IOCtx_t  DM9162_IOCtx = {ETH_PHY_IO_Init,
  10.                                ETH_PHY_IO_DeInit,
  11.                                ETH_PHY_IO_WriteReg,
  12.                                ETH_PHY_IO_ReadReg,
  13.                                ETH_PHY_IO_GetTick};
  14. NX_PACKET           *packet_ptr;
  15. UINT                i;
  16. ETH_DMADescTypeDef  *DMATxDesc;
  17. ETH_DMADescTypeDef  *DMARxDesc = nx_driver_information.nx_driver_information_dma_rx_descriptors;


  18.     HAL_ETH_MspInit(NULL);
  19.                               
  20.     /* Default to successful return.  */
  21.     driver_req_ptr -> nx_ip_driver_status =  NX_SUCCESS;

  22.     /* Setup indices.  */
  23.     nx_driver_information.nx_driver_information_receive_current_index = 0;
  24.     nx_driver_information.nx_driver_information_transmit_current_index = 0;
  25.     nx_driver_information.nx_driver_information_transmit_release_index = 0;

  26.     /* Clear the number of buffers in use counter.  */
  27.     nx_driver_information.nx_driver_information_number_of_transmit_buffers_in_use = 0;

  28.     /* Make sure there are receive packets... otherwise, return an error.  */
  29.     if (nx_driver_information.nx_driver_information_packet_pool_ptr == NULL)
  30.     {
  31.    
  32.         /* There must be receive packets. If not, return an error!  */
  33.         return(NX_DRIVER_ERROR);
  34.     }
  35.    
  36.     EthHandle.Instance = ETH;  
  37.     EthHandle.Init.MACAddr = _nx_driver_hardware_address;
  38.     EthHandle.Init.AutoNegotiation = ETH_AUTONEGOTIATION_ENABLE;
  39.     EthHandle.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII;
  40.     EthHandle.Init.RxMode = ETH_RXINTERRUPT_MODE;
  41.     EthHandle.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE;
  42.     EthHandle.Init.PhyAddress = DM9162_PHY_ADDR;
  43.    
  44.     /* Set PHY IO functions */
  45.     DM9162_RegisterBusIO(&DM9162, &DM9162_IOCtx);
  46.    
  47.     /* Initialize the DM9162 ETH PHY */
  48.     DM9162_Init(&DM9162);

  49.     PHYLinkState = DM9162_GetLinkState(&DM9162);

  50.     while(PHYLinkState <= DM9162_STATUS_LINK_DOWN)
  51.     {
  52.         PHYLinkState = DM9162_GetLinkState(&DM9162);
  53.         tx_thread_sleep(100);
  54.     }

  55.     switch (PHYLinkState)
  56.     {
  57.       case DM9162_STATUS_100MBITS_FULLDUPLEX:
  58.         duplex = ETH_MODE_FULLDUPLEX;
  59.         speed = ETH_SPEED_100M;
  60.         break;
  61.       case DM9162_STATUS_100MBITS_HALFDUPLEX:
  62.         duplex = ETH_MODE_HALFDUPLEX;
  63.         speed = ETH_SPEED_100M;
  64.         break;
  65.       case DM9162_STATUS_10MBITS_FULLDUPLEX:
  66.         duplex = ETH_MODE_FULLDUPLEX;
  67.         speed = ETH_SPEED_10M;
  68.         break;
  69.       case DM9162_STATUS_10MBITS_HALFDUPLEX:
  70.         duplex = ETH_MODE_HALFDUPLEX;
  71.         speed = ETH_SPEED_10M;
  72.         break;
  73.       default:
  74.         duplex = ETH_MODE_FULLDUPLEX;
  75.         speed = ETH_SPEED_100M;
  76.         break;
  77.     }
  78.    
  79.     EthHandle.Init.Speed = speed;
  80.     EthHandle.Init.DuplexMode = duplex;

  81.     /* Configure Ethernet peripheral (GPIOs, clocks, MAC, DMA) */
  82.     if (HAL_ETH_Init(&EthHandle) != HAL_OK)
  83.     {
  84.         /* Return error.  */
  85.         return(NX_DRIVER_ERROR);
  86.     }

  87.     /* Initialize TX Descriptors list: Ring Mode.  */

  88.     /* Fill each DMATxDesc descriptor with the right values.  */   
  89.     for(i = 0; i < NX_DRIVER_TX_DESCRIPTORS; i++)
  90.     {
  91.         /* Get the pointer on the ith member of the Tx Desc list.  */
  92.         DMATxDesc = &nx_driver_information.nx_driver_information_dma_tx_descriptors[i];

  93. #ifdef HARDWARE_CHECKSUM_ENABLE

  94.         /* Set Second Address Chained bit and checksum offload options.  */
  95.         DMATxDesc -> Status = ETH_DMATXDESC_TCH | ETH_DMATXDESC_IC | ETH_DMATXDESC_CIC_TCPUDPICMP_FULL | ETH_DMATXDESC_CIC_IPV4HEADER;        
  96. #else

  97.         /* Set Second Address Chained bit.  */
  98.         DMATxDesc -> Status = ETH_DMATXDESC_TCH | ETH_DMATXDESC_IC;        
  99. #endif

  100.         /* Initialize the next descriptor with the Next Descriptor Polling Enable */
  101.         if(i < (NX_DRIVER_TX_DESCRIPTORS - 1))
  102.         {
  103.             /* Set next descriptor address register with next descriptor base address */
  104.             DMATxDesc -> Buffer2NextDescAddr = (ULONG)(nx_driver_information.nx_driver_information_dma_tx_descriptors + i + 1);
  105.         }
  106.         else
  107.         {
  108.             /* For last descriptor, set next descriptor address register equal to the first descriptor base address */
  109.             DMATxDesc -> Buffer2NextDescAddr = (ULONG) nx_driver_information.nx_driver_information_dma_tx_descriptors;  
  110.         }
  111.     }
  112.    
  113.     /* Set Transmit Descriptor List Address Register */
  114.     ETH -> DMATDLAR = (ULONG) nx_driver_information.nx_driver_information_dma_tx_descriptors;

  115.     /* Initialize RX Descriptors list: Ring Mode  */

  116.     /* Fill each DMARxDesc descriptor with the right values */  
  117.     for(i = 0; i < NX_DRIVER_RX_DESCRIPTORS; i++)
  118.     {

  119.         /* Allocate a packet for the receive buffers.  */
  120.         if (nx_packet_allocate(nx_driver_information.nx_driver_information_packet_pool_ptr, &packet_ptr,
  121.                                NX_RECEIVE_PACKET, NX_NO_WAIT) == NX_SUCCESS)
  122.         {

  123.             /* Adjust the packet.  */
  124.             packet_ptr -> nx_packet_prepend_ptr += 2;
  125.             DMARxDesc[i].Buffer1Addr =          (uint32_t) packet_ptr -> nx_packet_prepend_ptr;
  126.             DMARxDesc[i].ControlBufferSize =    ETH_DMARXDESC_RCH | (packet_ptr -> nx_packet_data_end - packet_ptr -> nx_packet_data_start);

  127.             /* Remember the receive packet poitner.  */
  128.             nx_driver_information.nx_driver_information_receive_packets[i] =  packet_ptr;

  129.             /* Set Own bit of the RX descriptor Status.  */
  130.             DMARxDesc[i].Status =  ETH_DMARXDESC_OWN;         
  131.         }
  132.         else
  133.         {

  134.             /* Cannot allocate packets from the packet pool. */
  135.             return(NX_DRIVER_ERROR);
  136.         }

  137.         /* Initialize the next descriptor with the Next Descriptor Polling Enable.  */
  138.         if(i < (NX_DRIVER_RX_DESCRIPTORS - 1))
  139.         {
  140.             /* Set next descriptor address register with next descriptor base address.  */
  141.             DMARxDesc[i].Buffer2NextDescAddr = (ULONG)(nx_driver_information.nx_driver_information_dma_rx_descriptors + i + 1);
  142.         }
  143.         else
  144.         {
  145.             /* For last descriptor, set next descriptor address register equal to the first descriptor base address.  */
  146.             DMARxDesc[i].Buffer2NextDescAddr = (uint32_t)(nx_driver_information.nx_driver_information_dma_rx_descriptors);
  147.         }
  148.     }
  149.    
  150.     /* Save the size of one rx buffer.  */
  151.     nx_driver_information.nx_driver_information_rx_buffer_size = packet_ptr -> nx_packet_data_end - packet_ptr -> nx_packet_data_start;
  152.         
  153.     /* Clear the number of buffers in use counter.  */
  154.     nx_driver_information.nx_driver_information_multicast_count = 0;

  155.     /* Set Receive Descriptor List Address Register */
  156.     ETH -> DMARDLAR = (ULONG) nx_driver_information.nx_driver_information_dma_rx_descriptors;  

  157.     /* Return success!  */
  158.     return(NX_SUCCESS);
  159. }
复制代码



回复

使用道具 举报

610

主题

3055

回帖

4905

积分

至尊会员

积分
4905
发表于 2021-3-24 15:07:59 | 显示全部楼层
如果中途吧网线拔掉 或者断电了,有什么好的解决方法 啊 ?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
 楼主| 发表于 2021-3-24 15:21:08 | 显示全部楼层
hpdell 发表于 2021-3-24 15:07
如果中途吧网线拔掉 或者断电了,有什么好的解决方法 啊 ?

中途插拔,我准备采用我此贴的方案:

【实战经验分享】一劳永逸的解决网线随意热插拔问题
http://www.armbbs.cn/forum.php?m ... 5386&fromuid=58
(出处: 硬汉嵌入式论坛)
回复

使用道具 举报

610

主题

3055

回帖

4905

积分

至尊会员

积分
4905
发表于 2021-3-24 16:54:49 | 显示全部楼层
eric2013 发表于 2021-3-24 15:21
中途插拔,我准备采用我此贴的方案:

【实战经验分享】一劳永逸的解决网线随意热插拔问题

好哇,期待大神的完整作品啊,辛苦大神了
回复

使用道具 举报

7

主题

23

回帖

44

积分

新手上路

积分
44
发表于 2021-7-20 17:25:25 | 显示全部楼层
好像NetX没发现类似的函数来notify,是不是需要自己创建任务调用LAN8742_GetLinkState(&lan8742);来获取网线插拔状态啊
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
 楼主| 发表于 2021-7-21 09:17:23 | 显示全部楼层
jacksimcom 发表于 2021-7-20 17:25
好像NetX没发现类似的函数来notify,是不是需要自己创建任务调用LAN8742_GetLinkState(&lan8742);来获取网 ...

对,我是这么玩的。

NetX的原装玩法,我还没有研究。
回复

使用道具 举报

58

主题

267

回帖

446

积分

高级会员

积分
446
发表于 2021-7-23 10:17:09 | 显示全部楼层
用NETX DUO做网络功能,PHY 芯片是 LAN8720。现在遇到个问题,上电之后 网口的两个灯都是暗亮,插不插网线都是暗亮,连不上网络,大家有遇到过吗? 是什么原因呢?
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
 楼主| 发表于 2021-7-23 14:53:16 | 显示全部楼层
ihavedone 发表于 2021-7-23 10:17
用NETX DUO做网络功能,PHY 芯片是 LAN8720。现在遇到个问题,上电之后 网口的两个灯都是暗亮,插不插网线 ...

你的意思是用其它网络协议栈正常?
回复

使用道具 举报

610

主题

3055

回帖

4905

积分

至尊会员

积分
4905
发表于 2021-7-24 18:26:16 | 显示全部楼层
ihavedone 发表于 2021-7-23 10:17
用NETX DUO做网络功能,PHY 芯片是 LAN8720。现在遇到个问题,上电之后 网口的两个灯都是暗亮,插不插网线 ...

估计硬件有问题吧 ??
回复

使用道具 举报

0

主题

3

回帖

3

积分

新手上路

积分
3
发表于 2023-12-6 11:52:28 | 显示全部楼层
楼主,请问现在有NETXDUO的网线插拔解决方案吗?求
回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
 楼主| 发表于 2023-12-6 12:12:37 | 显示全部楼层
Jarm 发表于 2023-12-6 11:52
楼主,请问现在有NETXDUO的网线插拔解决方案吗?求

现在还没有一劳永逸的方案。

现在的机制式定期查询网线插拔状态,来对程序做处理
回复

使用道具 举报

3

主题

56

回帖

65

积分

初级会员

积分
65
发表于 2023-12-7 20:42:38 来自手机 | 显示全部楼层
要重新初始化的话,必须要把所有的端口释放才可以,不知道有什么办法更便捷呢?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-8 06:15 , Processed in 0.187061 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表