rt thread lwip協(xié)議棧培訓(xùn)驅(qū)動(dòng)結(jié)構(gòu)_第1頁
rt thread lwip協(xié)議棧培訓(xùn)驅(qū)動(dòng)結(jié)構(gòu)_第2頁
rt thread lwip協(xié)議棧培訓(xùn)驅(qū)動(dòng)結(jié)構(gòu)_第3頁
rt thread lwip協(xié)議棧培訓(xùn)驅(qū)動(dòng)結(jié)構(gòu)_第4頁
rt thread lwip協(xié)議棧培訓(xùn)驅(qū)動(dòng)結(jié)構(gòu)_第5頁
已閱讀5頁,還剩17頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

RT-ThreadlwIP協(xié)議棧培訓(xùn)驅(qū)動(dòng)、協(xié)議棧結(jié)構(gòu)RT-ThreadlwIP系統(tǒng)結(jié)構(gòu)網(wǎng)絡(luò)應(yīng)用lwIP協(xié)議棧lwIP移植RT-ThreadRTOS以太網(wǎng)發(fā)送任務(wù)以太網(wǎng)接收任務(wù)網(wǎng)絡(luò)驅(qū)動(dòng)程序RT-ThreadlwIP網(wǎng)絡(luò)驅(qū)動(dòng)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驅(qū)動(dòng)結(jié)構(gòu)fm3_emac_hw_initrt_device::init

openclosereadwriteeth_dstrevice::uct

netif

*netif;etheth_rx_txeth_device_init(eth_device)rt_device_registerRT-ThreadlwIP驅(qū)動(dòng)結(jié)構(gòu)netifnetifnetif_listtcp

threadtcpip_init_done_callbacknetif_adddhcp_startnetif_set_linkupRT-ThreadlwIP驅(qū)動(dòng)結(jié)構(gòu)etxtcp

threadetx

threadlink_output(netif,

p)eth_tx_thread_entryenetif->eth_tx(p);rt_sem_releaseRT-ThreadlwIP驅(qū)動(dòng)結(jié)構(gòu)erxEMAC

ISReth_device_readyerx

threadtcp

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

netif);//

tcpip_input(p,

netif);RT-ThreadlwIP驅(qū)動(dòng)總結(jié)驅(qū)動(dòng)結(jié)構(gòu)體#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驅(qū)動(dòng)總結(jié)設(shè)備接口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驅(qū)動(dòng)結(jié)構(gòu)設(shè)備控制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驅(qū)動(dòng)總結(jié)中斷通知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驅(qū)動(dòng)總結(jié)接收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驅(qū)動(dòng)結(jié)構(gòu)總結(jié)發(fā)送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網(wǎng)絡(luò)驅(qū)動(dòng)MB9BF618內(nèi)置雙EMAC,每個(gè)EMAC都單獨(dú)有DMA。DMA描述符(初始化成DMA鏈)StatusBufferSizeBufferAddrNextDescAddrStatusBufferSizeBufferAddrNextDescAddrStatusBufferSizeBufferAddrNextDescAddrDescriptor

#1Descriptor

#2Descriptor

#3MB9BF618網(wǎng)絡(luò)驅(qū)動(dòng)發(fā)送時(shí)流程獲取信號(hào)量(tx_buf_free)寫入pbuf到DMA

buffer中獲得DMA

buffer觸發(fā)發(fā)送DMADMAbuffer換下一個(gè)位置發(fā)送完成中斷釋放信號(hào)量(tx_buf_free)MB9BF618網(wǎng)絡(luò)驅(qū)動(dòng)接收流程檢查當(dāng)前DMAbuffer狀態(tài)分配pbuf,并讀出數(shù)據(jù)到pbuf獲得有效數(shù)據(jù)長度清除DMA

buffer狀態(tài)DMAbuffer換下一個(gè)位置接收中斷eth_device_ready();lwIP代碼結(jié)構(gòu)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;接收到數(shù)據(jù)包。回調(diào)消息。lwIP代碼結(jié)構(gòu)應(yīng)用TCPIPETX網(wǎng)卡lwip_sendtoTCPIP_API_MSGnetif->outputethernetif_linkoutputfm3_emac_txlwIP代碼結(jié)構(gòu)以郵箱為基礎(chǔ);大多數(shù)工作都在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等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論