下面我们描述一下采用Linux系统和Android系统的用户都需要注意的地方:
驱动层移植完成后, MTK的Porting Guid会告诉你需要在用户态运行wmt_launcher工具,作为后台的一个服务程序运行,该服务会配置串口的工作参数,下载固件补丁到MT6620中,他的源代码相对比较简单,只有一个.c文件:
原始文件位于MTK发布包:
APEX_Android_4.4_MP_SW_package_V2.0/APEX_Android_4.4_MP_001_panda_combo_mt66xx_Package_Common/New/hardware/mediatek/wmt/stp_uart_launcher.c
修改后的文件位于iTOP4412 Android4.4发布包:
iTop4412_KK4.4/hardware/mediatek/wmt/stp_uart_launcher.c
修改点主要在串口参数配置上,由于内核版本不同,串口设置参数也略有不同.
具体修改可以使用代码比对工具进行比较。
另外需要说明的是运行wmt_launcher的运行参数 跟MTK给的移植文档有点不同,PortingGuid 里面推荐串口波特率使用921600, 而在iTOP4412的板子上面采用该值会工作不正常,导致固件补丁无法下载,开始怀疑板卡不支持该波特率,后使用串口测试工具专门针对这个串口进行921600测试,也没发现问题,后没有继续查找,而是运行wmt_launcher时采用115200波特率:
wmt_launcher -b 115200 -d /dev/ttySAC0 -p /system/etc/firmware &
注意: 如果您的操作系统使用的是Linux而不是Android,需要修改stp_uart_launcher.c
原始代码里面有Android特有的属性相关部分,Linux系统不具有这个特性,我们提供了修改好的文件:stp_uart_launcher-linux-ok.c ,用户可以作为参考,该文件与原始文件stp_uart_launcher-ori.c,及正常工作的文件 stp_uart_launcher.c 位于相同目录下面.
运行 wmt_launcher 服务后,然后执行 "echo 1 > /dev/wmtWifi"命令,如果工作正常,会产生wlan0网络节点,如果没有产生设备节点中间会提示出错信息,需要根据信息查找相关问题,默认情况下WiFi驱动的调试级别为DEBUG级别,可以提升调试级别为更高,当然不要忘记把Kernel控制台输出级别也设置的高一些,驱动的输出信息依赖于驱动代码设置的调试级别及Kernel的控制台级别两部分。
调试信息多一些,方便定位与分析问题,驱动工作正常后需要把调试级别恢复为正常状态,过多的调试信息输出会影响驱动的工作效率和工作的结果,笔者在调试MMC部分由于把MMC总线的调试信息全部放开,导致MMC工作效率降低,WiFi相关驱动总是适配不到SDIO设备,因为WiFI驱动会按一定的循环次数查找SDIO设备,由于SDIO相关驱动工作效率很低(大量的调试信息输出引起),导致WiFi驱动轮训次数结束了都没有匹配到设备。
如果产生了wlan0设备节点,那么下一步就是移植wpa_supplicant及wpa_cli程序了,Android4.4采用的wpa_supplicanat_8 版本,而不是以前Android4.0采用的wpa_supplicant版本,他们之间的差异还是比较大的,显著的一个区别是Android4.4里面 wpa_supplicant_8使用的是 NL80211驱动库。而Android4.0中的wpa_supplicant采用的是WEXT 驱动库,如果您使用的是Android4.4的内核版本,运行的是Linux系统,那么需要您移植wpa_supplicanat_8到Linux文件系统中。
Android4.4系统包含wpa_supplicant_8代码,编译Android4.4时会编译生产wpa_supplicant_8.
wpa_cli为wpa_supplicant的客户端程序,可以使用该程序扫描无线网络,设置网络的ESSID和密码,连接到无线网络,Linux用户需要使用wpa_cli进行网络连接。Android用户也可以在命令行中使用该工具验证WiFi驱动及wpa_supplicant_8是否工作正常.
这些都没有问题后我们需要移植HAL层相关代码。