rt thread lwip协议栈培训驱动结构_第1页
rt thread lwip协议栈培训驱动结构_第2页
rt thread lwip协议栈培训驱动结构_第3页
rt thread lwip协议栈培训驱动结构_第4页
rt thread lwip协议栈培训驱动结构_第5页
已阅读5页,还剩17页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

RT-ThreadlwIP协议栈培训驱动、协议栈结构RT-ThreadlwIP系统结构网络应用lwIP协议栈lwIP移植RT-ThreadRTOS以太网发送任务以太网接收任务网络驱动程序RT-ThreadlwIP网络驱动03_single_ethernet\drivers\fm3_emac.c03_single_ethernet\drivers\fm3_emac.h03_single_ethernet\drivers\eth_driver.c03_dual_ethernet\drivers\fm3_emac.c03_dual_ethernet\drivers\fm3_emac.h03_dual_ethernet\drivers\eth_driver.cRT-ThreadlwIP驱动结构fm3_emac_hw_initrt_device::init

openclosereadwriteeth_dstrevice::uct

netif

*netif;etheth_rx_txeth_device_init(eth_device)rt_device_registerRT-ThreadlwIP驱动结构netifnetifnetif_listtcp

threadtcpip_init_done_callbacknetif_adddhcp_startnetif_set_linkupRT-ThreadlwIP驱动结构etxtcp

threadetx

threadlink_output(netif,

p)eth_tx_thread_entryenetif->eth_tx(p);rt_sem_releaseRT-ThreadlwIP驱动结构erxEMAC

ISReth_device_readyerx

threadtcp

threadeth_rx_thread_entrynetifdevice->eth_rx(p)netif->input(p,

netif);//

tcpip_input(p,

netif);RT-ThreadlwIP驱动总结驱动结构体#define

MAX_ADDR_LEN6struct

rt_skeleton_eth{/*

inherit

from

ethernet

device

*/struct

eth_device

parent;/*

interface

address

info.

*/rt_uint8_t

dev_addr[MAX_ADDR_LEN];};static

struct

rt_skeleton_eth

_skeleton_device;RT-ThreadlwIP驱动总结设备接口static

rt_err_t

rt_skeleton_init(rt_device_t

dev){return

RT_EOK;}static

rt_err_t

rt_skeleton_open(rt_device_tdev,

rt_uint16_t

oflag){return

RT_EOK;}static

rt_err_t

rt_skeleton_close(rt_device_t

dev){return

RT_EOK;}static

rt_size_t

rt_skeleton_read(rt_device_t

dev,

rt_off_t

pos,

void*

buffer,rt_size_t

size){rt_set_errno(-RT_ENOSYS);return

0;}static

rt_size_t

rt_skeleton_write

(rt_device_t

dev,

rt_off_t

pos,

const

void*buffer,

rt_size_t

size){rt_set_errno(-RT_ENOSYS);return

0;}RT-ThreadlwIP驱动结构设备控制static

rt_err_t

rt_skeleton_control(rt_device_t

dev,

rt_uint8_t

cmd,

void

*args){struct

rt_skeleton_eth

*eth;eth

=

(struct

rt_skeleton_eth*)dev;RT_ASSERT(eth

!=

RT_NULL);switch

(cmd){case

NIOCTL_GADDR:/*

get

mac

address

*/if

(args)

rt_memcpy(args,

_skeleton_device.dev_addr,

6);else

return

-RT_ERROR;break;default

:break;}return

RT_EOK;}RT-ThreadlwIP驱动总结中断通知void

rt_skeleton_isr(int

irqno){rt_uint32_t

status;/*

read

status

*//*

Received

the

coming

packet

*/if

(status){/*

disable

receive

interrupt

*//*

a

frame

has

been

received

*/eth_device_ready(&(_skeleton_device.parent));}/*

Transmit

Interrupt

check

*/if

(status){}}RT-ThreadlwIP驱动总结接收struct

pbuf

*rt_skeltion_rx(struct

rt_device

*device){struct

pbuf

*p

=

RT_NULL;rt_uint32_t

pkt_len;/*

get

rx

packet

length

*/if

(pkt_len

>

0){p

=

pbuf_alloc(PBUF_LINK,

rx_len,

PBUF_RAM);/*

read

packet

to

pbuf

*/}else{/*

enable

interrupt

*/}return

p;}RT-ThreadlwIP驱动结构总结发送rt_err_t

rt_skeletion_tx(struct

rt_device

*device,

struct

pbuf*

p){struct

pbuf*

q;for

(q

=

p;

q

!=

RT_NULL;

q

=

q->next){/*

write

pbuf

to

device

*/}/*

wait

transmition

complete

*/return

RT_EOK;}MB9BF618网络驱动MB9BF618内置双EMAC,每个EMAC都单独有DMA。DMA描述符(初始化成DMA链)StatusBufferSizeBufferAddrNextDescAddrStatusBufferSizeBufferAddrNextDescAddrStatusBufferSizeBufferAddrNextDescAddrDescriptor

#1Descriptor

#2Descriptor

#3MB9BF618网络驱动发送时流程获取信号量(tx_buf_free)写入pbuf到DMA

buffer中获得DMA

buffer触发发送DMADMAbuffer换下一个位置发送完成中断释放信号量(tx_buf_free)MB9BF618网络驱动接收流程检查当前DMAbuffer状态分配pbuf,并读出数据到pbuf获得有效数据长度清除DMA

buffer状态DMAbuffer换下一个位置接收中断eth_device_ready();lwIP代码结构tcp主线程,tcpip.c入口:void

tcpip_thread(void*

arg)case

TCPIP_MSG_API:break;case

TCPIP_MSG_INPKT:break;case

TCPIP_MSG_NETIFAPI:break;case

TCPIP_MSG_TIMEOUT/UNTIMEOUT:break;case

TCPIP_MSG_CALLBACK:break;case

TCPIP_MSG_CALLBACK_STATIC:break;接收到数据包。回调消息。lwIP代码结构应用TCPIPETX网卡lwip_sendtoTCPIP_API_MSGnetif->outputethernetif_linkoutputfm3_emac_txlwIP代码结构以邮箱为基础;大多数工作都在tcp线程中完成;很多类似这样的代码:struct

api_msg

msg;msg.function

=

do_send;msg.msg.conn

=

conn;msg.msg.msg.b

=

buf;err

=

TCPIP_APIMSG(&msg);lwIP

pbuf,buffer管理nextpayloadtotal

lengthlengthtypeflagsrefpayloadnextpayloadtotal

lengthlengthtypeflagsrefpayloadfreespacenextpayloadtotal

lengthlengthtypeflagsreffreespacepayloadlwIP

pbuf,buffer管理struct

pbuf*

pbuf_alloc(pbuf_layer

layer,u16_t

length,

pbuf_type

type);u8_t

pbuf_free(struct

pbuf

*p);PBUF分配和释放u16_t

pbuf_copy_partial(struct

pbuf

*bu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论