项目需求:nuc980需要一个WiFi模块,硬件设计上采用了esp32,通过spi接口连接了nuc980,因此esp32就作为了一个普通的WiFi模块。
移植步骤:
一,esp已经更新了esp32作为spi和sdio接口WiFi模块的Linux固件代码包,里面还包括了Linux下对应的驱动程序。下载:https://github.com/espressif/esp-hosted/tree/master,我采用的是ng包。
二,下载完成后找到esp_hosted_ng\esp\esp_driver\network_adapter,进去编译,不需要修改代码,但是要修改sdkconfig,我的make menuconfig 图形界面一直报错显示不出来,因此我就直接修改了sdkconfig,默认是支持SDIO的。需要把SDIO关闭,打开SPI。打开后编译烧录,具体编译步骤不再写了,esp官方文档很多。
二,开始编译980的驱动。
1.进入esp_hosted_ng\host目录,修改Makefile的CROSS_COMPILE和KERNEL目录,CROSS_COMPILE指定交叉编译工具链前缀,KERNEL指定内核源码目录。
2.由于内核版本不同,编译可能会遇到错误,根据具体错误提示进行修改源码,我的内核是4.4,修改如下图。大概就是不同内核的函数传参不同,还有的找不到我直接屏蔽掉了。
3.内核进行配置,具体可以看https://www.cnblogs.com/twzy/p/15160808.html
大概就是启用spi,启用cfg80211等。
4,先编译一遍没问题的话,就要修改驱动了,修改的地方不多,但很重要。
一,修改esp_release_ng_host\spi\esp_spi.c下的 esp_board.bus_num = 1和esp_board.chip_select = 0;具体看硬件连接在哪个spi总线。和对应的片选线是几。由于我的内核没有启用设备树,所以没有修改设备树,如果有设备树的话,对应总线上有其他设备要屏蔽掉。没有设备树在linux-4.4.y\arch\arm\mach-nuc980\dev.c中屏蔽掉。的提示。
如果spi修改完,加载驱动会有下面的打印。大概率代表spi没问题。
二,修改esp_release_ng_host\spi\esp_spi.h中对应的两个中断脚,具体是几看硬件原理图。
三,到这里本来以为已经没问题,但是对应的两个中断脚只有第一次中断函数会进去。就再也进不去中断了,后面用esp32模拟上升沿,下降沿都不行,最后查资料才知道,Linux下的中断也是要清中断标志位的。于是去新唐官网翻手册。找到RHIEN要置1,每次进入中断函数先把两个外部中断脚RHIEN置1。
四,到这里在nuc980里面加载驱动后,复位esp32,980打印下面说明驱动已经OK。
五,接下来ifconfig -a,可以看到esp32的网卡espsta0。修改etc/wpa_supplicant.conf,如果没有这个文件要在文件系统使能wpa,然后重新编译烧录文件系统。
使用wpa_supplicant -B -i espsta0 -c /etc/wpa_supplicant.conf,此时已经连上了路由器。使用命令找不到的话,要在文件系统中使能,然后重新编译烧录文件系统。
- wireless tools --无线管理工具
- wpa_supplicant --连接无线网络
- dhcpcd --获取IP地址
在用udhcpc -i espsta0,分配ip.
ifconfig -a可以看到已经有ip了
ping 百度测试网络,ping www.baidu.com -I espsta0,成功。