---
title: "W5500 ucLinux Driver based on stm32f429"
url: "https://maker.wiznet.io/chen/projects/W5500-ucLinux-Driver-based-on-stm32f429/"
markdown_url: "https://maker.wiznet.io/chen/projects/W5500-ucLinux-Driver-based-on-stm32f429/md"
type: "UCC: User Created Content"
author: "chen"
author_url: "https://maker.wiznet.io/chen/"
original_author: "chen"
original_url: "https://blog.csdn.net/jccg89104/article/details/78652474?spm=1001.2014.3001.5502"
published: "2022-07-04"
language: "en"
hardware: ["WIZnet W5500", "stm32f429"]
likes: 0
views: 193
comments: 0
source: "WIZnet Makers (https://maker.wiznet.io/)"
---

# W5500 ucLinux Driver based on stm32f429

> W5500 ucLinux Driver based on stm32f429

Original author: chen (source: https://blog.csdn.net/jccg89104/article/details/78652474?spm=1001.2014.3001.5502)

## Components

- **WIZnet W5500** x 1 ([docs](https://docs.wiznet.io/Product/Chip/Ethernet/W5500))
- **stm32f429** x 1
- Software: **ucLinux**

WIZnet parts: W5500 ([Datasheet](https://docs.wiznet.io/Product/Chip/Ethernet/W5500/datasheet?utm_source=maker&utm_medium=project&utm_campaign=w5500), [product hub](https://maker.wiznet.io/products/w5500/))

## Article

之前那篇?w5500??只是??的?用程序??，?然可以??一定的目的，但是?有充分利用到linux的?核，在一些?用?合就?得不合?宜，于是就?行w5500?????核??的??，幸?的是w5500??????的文件是在4.8版本的linux?核中?到，但是?我?在使用的2.6.33版本的?核在有些函?和?据??等都有一定程度上缺失，?此花了?久的一段??去修修??????C文件，?于修?到了??无??的程度了，但也??一定??的??才能?到想要的效果，但是通???也??到linux的????方面的知? ?里只是?w5500??????的一些重要的函?及?据??做??的分析??? W5500??????主要包括在??文件：w5500.c和w5500-spi.c w5100-spi.c?建spi????以使用spi接口方式??置w5500，?置w5500的基本??函?，w5100.c主要?建linux?核的??????，?置???送接收skb等函?，注意?者?密相?，缺一不可！修改?核文件中的Kconfig和makefile文件?????C文件。 基本流程?： 在w5100-spi.c主要是用spi的方式??置w5500的?、?函?，通?其中的w5100_spi_probe函?最后?入到w5100.c中的w5100_probe函?，下面重点?注w5100_spi_probe（）??函?： 1、 ?入??函?后，首先分配注????? ndev = alloc_etherdev(alloc_size); err = register_netdev(ndev); 2、 ?充????文件操作??? ndev->netdev_ops = &w5100_netdev_ops; static const struct net_device_ops w5100_netdev_ops = { .ndo_open = w5100_open, .ndo_stop = w5100_stop, .ndo_start_xmit = w5100_start_tx, .ndo_tx_timeout = w5100_tx_timeout, .ndo_set_rx_mode = w5100_set_rx_mode, .ndo_set_mac_address = w5100_set_macaddr, .ndo_validate_addr = eth_validate_addr, .ndo_change_mtu = eth_change_mtu, }; ?充????文件操作，open、stop、.ndo_start_xmit等函?，可??????据?送函??w5100_start_tx 3、 ?充ethtool_ops??? ndev->ethtool_ops = &w5100_ethtool_ops; ethtool_ops成?函??用?空?ethool工具的各?命令????，ethtool提供了??及????管理能力，能??linux????人?和管理人?提供???硬件、??程序和?????的?置、?看以及??等功能。 4、 netif_napi_add(ndev, &priv->napi, w5100_napi_poll, 16); ?函?用于初始化一?NAPI，netif_napi_add（）的poll??是NAPI要?度?行的??函? ?据接收的方式是NAPI（New API）,????，NAPI是?合中?方式???方式的技? 其?据接收流程?： 接收中?????》??接收中???》以??方式接收所有?据包直到收空??》??接收中???》接收中??? 注?中?函?： err = request_irq(priv->irq, w5100_interrupt,IRQF_TRIGGER_LOW, ndev->name, ndev); priv->irq：要申?的硬件中?? w5100_interrupt：向系?注?的中??理函?，是一?回?函?，中??生?，系??用??函?，ndev???被???? IRQF_TRIGGER_LOW：指定中????型：低?平有效 ndev->name：????程序的名? ndev：中?名?可作?共享中??的中?????，也可以用?指定中?服?函?需要?考的?据地址 5、 ?建??工作?列 priv->xfer_wq = alloc_workqueue(netdev_name(ndev), WQ_MEM_RECLAIM, 0); 添加四?任?到工作?列 INIT_WORK(&priv->rx_work, w5100_rx_work); INIT_WORK(&priv->tx_work, w5100_tx_work); INIT_WORK(&priv->setrx_work, w5100_setrx_work); INIT_WORK(&priv->restart_work, w5100_restart_work); INIT_WORK?在?定?的_work工作?列里面增加一?工作任?，?任?就是_func。_func??任??需要一些?据作???，????就是通?_data??的。 ⑴w5100_rx_work（）函?： w5100_rx_skb（）： ①skb = netdev_alloc_skb_ip_align(ndev, rx_len); netdev_alloc_skb_ip_align?申?一?sk_buff??，同?申?存放?文?据的buffer空?，??他???起? ②skb_put(skb, rx_len); skb_put()修改指向?据?末尾的指?tail，使之往下移len字?，?使?据?向下?大len字?，?更新?据??度len，通常在????的接收?据?理中??用此函?。 ③skb->protocol = eth_type_trans(skb, ndev); Linux kernel使用eth_type_trans?判??据?的?型，及???型 w5100_enable_intr(priv)：使能中? ⑵w5100_tx_work()函?：w5100_tx_skb，?送?入skb的函?，最后dev_kfree_skb(skb)?放套接字???。 ⑶w5100_setrx_work(struct work_struct *work) w5100_hw_start(priv)：w5500硬件?? u8 mode = S0_MR_MACRAW;//?w5500?置?原始套接字，此???！ ⑷w5100_restart_work w5100_restart： ①netif_stop_queue(ndev)： ?用linux?核提供的netif_stop_queue（）函?，停止????包。 ②w5100_hw_reset(priv); 函???w5500?置mac地址，?行socket0的初始化 ③netif_wake_queue(ndev); ?忙于?送的?据包被?送完成后，在以TX?束的中??理中，???用netif_wake_queue(ndev)?醒被阻塞的上?，以?????向???????送?据包。 6、 ?据?送函? w5100_netdev_ops函?中.ndo_start_xmit = w5100_start_tx,所以w5100_start_tx（）????据?送函? ?置w5500??ip地址?192.168.1.88，用??主机去ping，可以ping通，若在linux?核中加了tcp/ip???的?，?可以???主机服?器?行tcp和udp?接，但是??却?有使用w5500原本自?的硬件tcp/ip???，而是直接??去了，我?注意到的是w5500的??????程序是?置?原始套接字的形式，所以以后要?注的原始套接字在????中的??！！ ???????????????? 版??明：本文?CSDN博主「dq樣」的原?文章，遵循CC 4.0 BY-SA版???，???附上原文出??接及本?明。 原文?接：https://blog.csdn.net/jccg89104/article/details/78652474

---

Source: https://maker.wiznet.io/chen/projects/W5500-ucLinux-Driver-based-on-stm32f429/
