在线时间102 小时
UID166490
注册时间2010-1-5
NXP金币73
该用户从未签到
高级会员

- 积分
- 971
- 最后登录
- 2025-7-21
|
MQX的RTCS协议栈具有强大的可扩展性,可以快速实现二层收发包功能,实现客户自己的私有协议。可以参考MQX自带的 IEEE 1588 MACNET driver,文件$MQX\mqx\source\io\enet\macnet\macnet_1588.c
1. 注册一个L2的协议回调函数,当MAC收到L2的数据帧后,根据注册的协议类型调用对应的回调函数,如IP是0x800,ARP是0x806,IEEE1588是0x88F7;
/* Registers the PTPV2 protocol type on an Ethernet channel */
retval = ENET_open(enet_ptr, MQX1588_PTP_ETHERTYPE_1588, MACNET_ptp_service_L2pckts, enet_ptr);
/* Allocate the queue for this type of messages */
priv->L2PCKS_PTR = (MACNET_PTP_L2QUEUE_PTR) _mem_alloc_system_zero(sizeof(MACNET_PTP_L2QUEUE));
MACNET_ptp_L2queue_init(priv->L2PCKS_PTR);
2. 协议回调函数处理收到的数据帧,如IEEE1588就将数据帧放到一个Queue中,供IEEE1588的上层协议栈调用;
void MACNET_ptp_service_L2pckts
(
PCB_PTR pcb,
/* [IN] the received packet */
pointer handle
/* [IN] the IP interface structure */
)
{
.......
//将IEEE1588帧放入队列
MACNET_ptp_L2queue_add_packet(priv->L2PCKS_PTR, pcb->FRAG[0].FRAGMENT, pcb->FRAG[0].LENGTH);
PCB_free(pcb);
}
3. 通过ENET_send_raw发送L2数据帧。上层协议栈将L2帧组装完毕后,通过ENET_send_raw发送到MAC。请参考:
int_32 MACNET_ptp_send_L2pckts(_enet_handle handle, pointer param_ptr)
{
……………
/* Ethernet msg. header */
htone(packet_ptr->DEST, ((MACNET_PTP_ETHERTYPE_PCK *)param_ptr)->DEST_MAC);
htone(packet_ptr->SOURCE, ((ENET_CONTEXT_STRUCT_PTR)handle)->ADDRESS);
htons(packet_ptr->TYPE, MQX1588_PTP_ETHERTYPE_1588);
……………
/* Payload */
_mem_copy( (pointer)(((MACNET_PTP_ETHERTYPE_PCK *)param_ptr)-> TP_MSG), (pointer)&mem_ptr[sizeof(PCB)+sizeof(PCB_FRAGMENT)+sizeof(ENET_HEADER)], len );
………………
return(ENET_send_raw((ENET_CONTEXT_STRUCT_PTR)handle, pcb_ptr));
}
|
|