硬汉哥,请教一下,这个PHY芯片是如何传输网络的信息的,我不是很清楚?
dm9162.c这个文件里面只是实现了两个函数,一个初始化芯片,一个读取连接状态。这里的使用方法和手册里的都对的上。
然后从nx_stm32_eth_driver.c这个文件里,可以知道要实现以下的函数:
[C] 纯文本查看 复制代码
static VOID _nx_driver_interface_attach(NX_IP_DRIVER *driver_req_ptr);
static VOID _nx_driver_initialize(NX_IP_DRIVER *driver_req_ptr);
static VOID _nx_driver_enable(NX_IP_DRIVER *driver_req_ptr);
static VOID _nx_driver_disable(NX_IP_DRIVER *driver_req_ptr);
static VOID _nx_driver_packet_send(NX_IP_DRIVER *driver_req_ptr);
static VOID _nx_driver_multicast_join(NX_IP_DRIVER *driver_req_ptr);
static VOID _nx_driver_multicast_leave(NX_IP_DRIVER *driver_req_ptr);
static VOID _nx_driver_get_status(NX_IP_DRIVER *driver_req_ptr);
从名字猜测,在驱动注册后,实际上调用_nx_driver_hardware_packet_send和 _nx_driver_hardware_packet_received 这两个函数来收发。
看了里面实际的代码实现,里面应该是调了STM32的接口,不过不明白你们是怎么知道要这样子去实现的?
[C] 纯文本查看 复制代码 /**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _nx_driver_hardware_packet_received STM32H7xx/IAR */
/* 6.1 */
/* AUTHOR */
/* */
/* Yuxin Zhou, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function processes packets received by the ethernet */
/* controller. This driver assumes NX_PACKET to be MTU size */
/* */
/* INPUT */
/* */
/* None */
/* */
/* OUTPUT */
/* */
/* None */
/* */
/* CALLS */
/* */
/* _nx_driver_transfer_to_netx Transfer packet to NetX */
/* nx_packet_allocate Allocate receive packets */
/* _nx_packet_release Release receive packets */
/* */
/* CALLED BY */
/* */
/* _nx_driver_deferred_processing Deferred driver processing */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 05-19-2020 Yuxin Zhou Initial Version 6.0 */
/* xx-xx-xxxx Yuxin Zhou Modified comment(s), */
/* resulting in version 6.1 */
/* */
/**************************************************************************/
static VOID _nx_driver_hardware_packet_received(VOID)
{
NX_PACKET *packet_ptr;
NX_PACKET *received_packet_ptr;
INT i;
uint32_t framelength = 0;
static ETH_BufferTypeDef RxBuff[NX_DRIVER_RX_DESCRIPTORS];
memset(RxBuff, 0 , NX_DRIVER_RX_DESCRIPTORS*sizeof(ETH_BufferTypeDef));
for(i = 0; i < NX_DRIVER_RX_DESCRIPTORS -1; i++)
{
RxBuff[i].next=&RxBuff[i+1];
}
while (HAL_ETH_GetRxDataBuffer(&heth, RxBuff) == HAL_OK)
{
HAL_ETH_GetRxDataLength(&heth, &framelength);
ETH_RxDescListTypeDef *dmarxdesclist = &heth.RxDescList;
uint32_t FirstAppDesc = dmarxdesclist->FirstAppDesc;
/* This driver assumes the recieved packet size is 1536 bytes */
received_packet_ptr = nx_driver_information.nx_driver_information_receive_packets[FirstAppDesc];
received_packet_ptr->nx_packet_append_ptr = received_packet_ptr->nx_packet_prepend_ptr + framelength;
received_packet_ptr->nx_packet_length = framelength;
received_packet_ptr->nx_packet_next = NULL;
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;
SCB_InvalidateDCache_by_Addr((uint32_t*)packet_ptr -> nx_packet_data_start, packet_ptr -> nx_packet_data_end - packet_ptr -> nx_packet_data_start);
HAL_ETH_DescAssignMemory(&heth, FirstAppDesc, packet_ptr -> nx_packet_prepend_ptr, NULL);
nx_driver_information.nx_driver_information_receive_packets[FirstAppDesc] = packet_ptr;
/* Build Rx descriptor to be ready for next data reception */
HAL_ETH_BuildRxDescriptors(&heth);
/* Transfer the packet to NetX. */
_nx_driver_transfer_to_netx(nx_driver_information.nx_driver_information_ip_ptr, received_packet_ptr);
}
else
{
HAL_ETH_BuildRxDescriptors(&heth);
}
}
}
[C] 纯文本查看 复制代码 /**************************************************************************/
/* */
/* FUNCTION RELEASE */
/* */
/* _nx_driver_hardware_packet_send STM32H7xx/IAR */
/* 6.1 */
/* AUTHOR */
/* */
/* Yuxin Zhou, Microsoft Corporation */
/* */
/* DESCRIPTION */
/* */
/* This function processes hardware-specific packet send requests. */
/* */
/* INPUT */
/* */
/* packet_ptr Pointer to packet to send */
/* */
/* OUTPUT */
/* */
/* status [NX_SUCCESS|NX_DRIVER_ERROR] */
/* */
/* CALLS */
/* */
/* [_nx_driver_transmit_packet_enqueue] Optional internal transmit */
/* packet queue routine */
/* */
/* CALLED BY */
/* */
/* _nx_driver_packet_send Driver packet send processing */
/* */
/* RELEASE HISTORY */
/* */
/* DATE NAME DESCRIPTION */
/* */
/* 05-19-2020 Yuxin Zhou Initial Version 6.0 */
/* xx-xx-xxxx Yuxin Zhou Modified comment(s), */
/* resulting in version 6.1 */
/* */
/**************************************************************************/
static UINT _nx_driver_hardware_packet_send(NX_PACKET *packet_ptr)
{
NX_PACKET *pktIdx;
UINT buffLen = 0;
ETH_BufferTypeDef Txbuffer[ETH_TX_DESC_CNT];
memset(Txbuffer, 0 , ETH_TX_DESC_CNT*sizeof(ETH_BufferTypeDef));
int i = 0;
for (pktIdx = packet_ptr;pktIdx != NX_NULL ; pktIdx = pktIdx -> nx_packet_next)
{
if (i >= ETH_TX_DESC_CNT)
{
return NX_DRIVER_ERROR;
}
Txbuffer[i].buffer = pktIdx->nx_packet_prepend_ptr;
Txbuffer[i].len = (pktIdx -> nx_packet_append_ptr - pktIdx->nx_packet_prepend_ptr);
buffLen += (pktIdx -> nx_packet_append_ptr - pktIdx->nx_packet_prepend_ptr);
if(i>0)
{
Txbuffer[i-1].next = &Txbuffer[i];
}
if (pktIdx-> nx_packet_next ==NULL)
{
Txbuffer[i].next = NULL;
}
i++;
SCB_CleanDCache_by_Addr((uint32_t*)(pktIdx -> nx_packet_data_start), pktIdx -> nx_packet_data_end - pktIdx -> nx_packet_data_start);
}
#ifdef NX_ENABLE_INTERFACE_CAPABILITY
if (packet_ptr -> nx_packet_interface_capability_flag & (NX_INTERFACE_CAPABILITY_TCP_TX_CHECKSUM |
NX_INTERFACE_CAPABILITY_UDP_TX_CHECKSUM |
NX_INTERFACE_CAPABILITY_ICMPV4_TX_CHECKSUM |
NX_INTERFACE_CAPABILITY_ICMPV6_TX_CHECKSUM))
{
TxPacketCfg.ChecksumCtrl = ETH_DMATXNDESCRF_CIC_IPHDR_PAYLOAD_INSERT_PHDR_CALC;
}
else if (packet_ptr -> nx_packet_interface_capability_flag & NX_INTERFACE_CAPABILITY_IPV4_TX_CHECKSUM)
{
TxPacketCfg.ChecksumCtrl = ETH_DMATXNDESCRF_CIC_IPHDR_INSERT;
}
#else
TxPacketCfg.ChecksumCtrl = ETH_DMATXNDESCRF_CIC_DISABLE;
#endif /* NX_ENABLE_INTERFACE_CAPABILITY */
TxPacketCfg.Length = buffLen;
TxPacketCfg.TxBuffer = Txbuffer;
/* transmit the packet */
if(HAL_ETH_Transmit(&heth, &TxPacketCfg, 2000))
{
/* Return error. */
return(NX_DRIVER_ERROR);
}
/* Remove the Ethernet header. */
NX_DRIVER_ETHERNET_HEADER_REMOVE(packet_ptr);
/* Free the packet. */
nx_packet_transmit_release(packet_ptr);
return(NX_SUCCESS);
}
|