|
在底层驱动这里先初始化PHY芯片即可,然后等待网线插入。
F4和H7的ETH的HAL版驱动略有不同,但处理方法是一样的。
关键部分:
- /* Initialize the DM9162 ETH PHY */
- DM9162_Init(&DM9162);
- PHYLinkState = DM9162_GetLinkState(&DM9162);
- while(PHYLinkState <= DM9162_STATUS_LINK_DOWN)
- {
- PHYLinkState = DM9162_GetLinkState(&DM9162);
- tx_thread_sleep(100);
- }
复制代码
完整:
- /* 这里直接将相对变量和头文件都放在这里 */
- #include "dm9162.h"
- dm9162_Object_t DM9162;
- TX_THREAD *netx_thread_ptr;
- static UINT _nx_driver_hardware_initialize(NX_IP_DRIVER *driver_req_ptr)
- {
- INT PHYLinkState;
- UINT duplex, speed = 0;
- dm9162_IOCtx_t DM9162_IOCtx = {ETH_PHY_IO_Init,
- ETH_PHY_IO_DeInit,
- ETH_PHY_IO_WriteReg,
- ETH_PHY_IO_ReadReg,
- ETH_PHY_IO_GetTick};
- NX_PACKET *packet_ptr;
- UINT i;
- ETH_DMADescTypeDef *DMATxDesc;
- ETH_DMADescTypeDef *DMARxDesc = nx_driver_information.nx_driver_information_dma_rx_descriptors;
- HAL_ETH_MspInit(NULL);
-
- /* Default to successful return. */
- driver_req_ptr -> nx_ip_driver_status = NX_SUCCESS;
- /* Setup indices. */
- nx_driver_information.nx_driver_information_receive_current_index = 0;
- nx_driver_information.nx_driver_information_transmit_current_index = 0;
- nx_driver_information.nx_driver_information_transmit_release_index = 0;
- /* Clear the number of buffers in use counter. */
- nx_driver_information.nx_driver_information_number_of_transmit_buffers_in_use = 0;
- /* Make sure there are receive packets... otherwise, return an error. */
- if (nx_driver_information.nx_driver_information_packet_pool_ptr == NULL)
- {
-
- /* There must be receive packets. If not, return an error! */
- return(NX_DRIVER_ERROR);
- }
-
- EthHandle.Instance = ETH;
- EthHandle.Init.MACAddr = _nx_driver_hardware_address;
- EthHandle.Init.AutoNegotiation = ETH_AUTONEGOTIATION_ENABLE;
- EthHandle.Init.MediaInterface = ETH_MEDIA_INTERFACE_RMII;
- EthHandle.Init.RxMode = ETH_RXINTERRUPT_MODE;
- EthHandle.Init.ChecksumMode = ETH_CHECKSUM_BY_HARDWARE;
- EthHandle.Init.PhyAddress = DM9162_PHY_ADDR;
-
- /* Set PHY IO functions */
- DM9162_RegisterBusIO(&DM9162, &DM9162_IOCtx);
-
- /* Initialize the DM9162 ETH PHY */
- DM9162_Init(&DM9162);
- PHYLinkState = DM9162_GetLinkState(&DM9162);
- while(PHYLinkState <= DM9162_STATUS_LINK_DOWN)
- {
- PHYLinkState = DM9162_GetLinkState(&DM9162);
- tx_thread_sleep(100);
- }
-
- switch (PHYLinkState)
- {
- case DM9162_STATUS_100MBITS_FULLDUPLEX:
- duplex = ETH_MODE_FULLDUPLEX;
- speed = ETH_SPEED_100M;
- break;
- case DM9162_STATUS_100MBITS_HALFDUPLEX:
- duplex = ETH_MODE_HALFDUPLEX;
- speed = ETH_SPEED_100M;
- break;
- case DM9162_STATUS_10MBITS_FULLDUPLEX:
- duplex = ETH_MODE_FULLDUPLEX;
- speed = ETH_SPEED_10M;
- break;
- case DM9162_STATUS_10MBITS_HALFDUPLEX:
- duplex = ETH_MODE_HALFDUPLEX;
- speed = ETH_SPEED_10M;
- break;
- default:
- duplex = ETH_MODE_FULLDUPLEX;
- speed = ETH_SPEED_100M;
- break;
- }
-
- EthHandle.Init.Speed = speed;
- EthHandle.Init.DuplexMode = duplex;
- /* Configure Ethernet peripheral (GPIOs, clocks, MAC, DMA) */
- if (HAL_ETH_Init(&EthHandle) != HAL_OK)
- {
- /* Return error. */
- return(NX_DRIVER_ERROR);
- }
- /* Initialize TX Descriptors list: Ring Mode. */
- /* Fill each DMATxDesc descriptor with the right values. */
- for(i = 0; i < NX_DRIVER_TX_DESCRIPTORS; i++)
- {
- /* Get the pointer on the ith member of the Tx Desc list. */
- DMATxDesc = &nx_driver_information.nx_driver_information_dma_tx_descriptors[i];
- #ifdef HARDWARE_CHECKSUM_ENABLE
- /* Set Second Address Chained bit and checksum offload options. */
- DMATxDesc -> Status = ETH_DMATXDESC_TCH | ETH_DMATXDESC_IC | ETH_DMATXDESC_CIC_TCPUDPICMP_FULL | ETH_DMATXDESC_CIC_IPV4HEADER;
- #else
- /* Set Second Address Chained bit. */
- DMATxDesc -> Status = ETH_DMATXDESC_TCH | ETH_DMATXDESC_IC;
- #endif
- /* Initialize the next descriptor with the Next Descriptor Polling Enable */
- if(i < (NX_DRIVER_TX_DESCRIPTORS - 1))
- {
- /* Set next descriptor address register with next descriptor base address */
- DMATxDesc -> Buffer2NextDescAddr = (ULONG)(nx_driver_information.nx_driver_information_dma_tx_descriptors + i + 1);
- }
- else
- {
- /* For last descriptor, set next descriptor address register equal to the first descriptor base address */
- DMATxDesc -> Buffer2NextDescAddr = (ULONG) nx_driver_information.nx_driver_information_dma_tx_descriptors;
- }
- }
-
- /* Set Transmit Descriptor List Address Register */
- ETH -> DMATDLAR = (ULONG) nx_driver_information.nx_driver_information_dma_tx_descriptors;
- /* Initialize RX Descriptors list: Ring Mode */
- /* Fill each DMARxDesc descriptor with the right values */
- for(i = 0; i < NX_DRIVER_RX_DESCRIPTORS; i++)
- {
- /* Allocate a packet for the receive buffers. */
- if (nx_packet_allocate(nx_driver_information.nx_driver_information_packet_pool_ptr, &packet_ptr,
- NX_RECEIVE_PACKET, NX_NO_WAIT) == NX_SUCCESS)
- {
- /* Adjust the packet. */
- packet_ptr -> nx_packet_prepend_ptr += 2;
- DMARxDesc[i].Buffer1Addr = (uint32_t) packet_ptr -> nx_packet_prepend_ptr;
- DMARxDesc[i].ControlBufferSize = ETH_DMARXDESC_RCH | (packet_ptr -> nx_packet_data_end - packet_ptr -> nx_packet_data_start);
- /* Remember the receive packet poitner. */
- nx_driver_information.nx_driver_information_receive_packets[i] = packet_ptr;
- /* Set Own bit of the RX descriptor Status. */
- DMARxDesc[i].Status = ETH_DMARXDESC_OWN;
- }
- else
- {
- /* Cannot allocate packets from the packet pool. */
- return(NX_DRIVER_ERROR);
- }
- /* Initialize the next descriptor with the Next Descriptor Polling Enable. */
- if(i < (NX_DRIVER_RX_DESCRIPTORS - 1))
- {
- /* Set next descriptor address register with next descriptor base address. */
- DMARxDesc[i].Buffer2NextDescAddr = (ULONG)(nx_driver_information.nx_driver_information_dma_rx_descriptors + i + 1);
- }
- else
- {
- /* For last descriptor, set next descriptor address register equal to the first descriptor base address. */
- DMARxDesc[i].Buffer2NextDescAddr = (uint32_t)(nx_driver_information.nx_driver_information_dma_rx_descriptors);
- }
- }
-
- /* Save the size of one rx buffer. */
- nx_driver_information.nx_driver_information_rx_buffer_size = packet_ptr -> nx_packet_data_end - packet_ptr -> nx_packet_data_start;
-
- /* Clear the number of buffers in use counter. */
- nx_driver_information.nx_driver_information_multicast_count = 0;
- /* Set Receive Descriptor List Address Register */
- ETH -> DMARDLAR = (ULONG) nx_driver_information.nx_driver_information_dma_rx_descriptors;
- /* Return success! */
- return(NX_SUCCESS);
- }
复制代码
|
|