之前的前两篇写w5500网卡驱动是我的思路有偏差,用的是一种取巧的方法,在linux的用户空间利用spidev直接进行w5500的设置与tcp连接,这只能叫做是一个w5500的应用程序驱动,虽然能达到相应的目的,但是感觉是一种取巧的方法,没能充分利用到linux内核强大的任务多线程能力,所以决定编写调试一个w5500的内核网络设备驱动,自己也借此学习linux的网络设备驱动等相关知识。
现在硬件也有所升级,mcu由stm32f407升级为stm32f429,内部内存存储升为2M,外部又加了2M的sram,这样内存是完全能够满足的,stm32f407和stm32f429是完全兼容的,把之前的f407Uclinux内核做相对应的修改即可在stm32f429运行
由于对linux网络设备驱动的知识缺乏了解就去查阅了相应的资料,看了书和韦东山老师的视频,有了一点认识,于是先做一个简单的虚拟网卡驱动来试验一下。
步骤:
1. 分配一个net_device结构体
2. 设置:
2.1 发包函数: hard_start_xmit //高版本linux有所修改
2.2 收到数据时(在中断处理函数里)用netif_rx上报数据
2.3 其他设置
3. 注册: register_netdevice
具体思路大致是这样并没有错误,但是随着linux内核版本的升级,网络设备驱动的相关函数和数据结构都发生了不少变化,我用的是2.6.33这个版本的linux内核,直接编译韦老师的驱动代码会冒出很多编译错误,这里面的发包函数hard_start_xmit我已经找不到了,net_device_ops结构体的新加入,它里面的.ndo_start_xmit函数,就是发包函数,所以要对net_device_ops结构体进行填充。
于是参照韦老师视频的虚拟网卡设备驱动程序进行相应的修改,几经调试终于实现了。
参考的韦老师的程序,具体程序在这里下载http://download.****.net/download/jccg89104/10116263
在linux内核设置中选择相应选项
编译内核,把内核映像拷入单片机,然后进行相应操作
测试:
1. ifconfig // 查看,无网络设备
2. ifconfig vnet0 3.3.3.3
ifconfig // 查看,出现vnet0,可见虚拟网卡的ip已经设置为3.3.3.3
3.
ping 3.3.3.4 // 试ping3.3.3.4成功,并且有回应,因为在程序中已做相关修改回应处理
经过这个虚拟网卡设备驱动的编写调试,对linux网络设备驱动有了一个清楚的理解,接下来就要去编写和调试w5500网卡设备驱动了!!