旧手机android的linux内核编译2-Wifi驱动加入。

经过一些时间的分析与调试,还是把wifi的驱动调通了。

首先要分析旧手机的wifi。

1,要分析旧手机的wifi,在recovery下配通wifi 是一个不错的选择。在recovery已经配通了adb 接口,其实它除去没有应用软件外,与硬件系统相关的内容都是完整的。经过我多次偿试,对我的MSM8625的A385说。如下的ADB命令完成recovery下wifi配置。

mount -t ext4 /dev/block/mmcblk0p17 /system
mount -t ext4 /dev/block/mmcblk0p21 /data

#上面两命令,在手机正常启动后,用mount命令看分区。

export PATH=/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin
export LD_LIBRARY_PATH=/vendor/lib:/system/lib

#如上命令并不一定必需,加要最好,具体的变量值,正常启动后的copy一下。

ln -s /data/ququfile/wifi/firmware /etc/firmware

#recovery下的etc是空的。我为了改的方便把/system/etc中的firmware目录copy到自已所用目录下。在recovery下再链回到/etc下。
#chmod 666 /dev/diag #调试时遇到一个错误报,无diag权限。其实这时出错后,代码才访问的设备,正常时不会管这个。
insmod /data/ququfile/wifi/cfg80211.ko
insmod /data/ququfile/wifi/ath6kl_sdio.ko

#加入模块可以在任何目录下。

#如下用的wpa_supplicant 一个是自编译静态链接的代码。一个是原手机系统的。自已编译的不能处理/data/misc/wifi/wpa_supplicant.conf中与android有关的信息。删/data/misc/wifi/wpa_supplicant.conf中的与android上关的指令。只要配网络的部分,就可用。反而原来的wpa_supplicant命令在recovery下有问题,但只用配网络的部分内容,好似也可以。
/data/ququfile/wifi/wpa_supplicant -Dnl80211 -iwlan0 -c/data/ququfile/wifi/wpa_supplicant.conf &
android的wpa_supplicant要调用android的一些内容在recovery下有问题。
/system/bin/wpa_supplicant -Dnl80211 -iwlan0 -c/data/ququfile/wifi/wpa_supplicant.conf

#如果用bosybox 的ifconfig 在正常启动时,可用,但在recovery下报访问权限错。但系统自带的ifconfig没问题。

ifconfig wlan0 192.168.1.228 netmask 255.255.255.0 up

/system/bin/ping 192.168.1.2

2,第二步就用新内核,并试用新编的模块。

a,我所下在内核分支中,有相关的驱动,但这个是不完整的。有太多的内容需要增改。我把这个分支的直接编成模块,结果模块数量和手机原配的都不一样。下到手机上,insmod是不报错,但没反应。分析原因,模块的加电部分实际用的GPIO与代码不同。就读这一部分的代码. 实际上dmesg在加载模块的过程中没输出信息。只能自已加输出,定位到了probe没有调用。还是加电的原因。另还有一个是bus没配。在分析GPIO配电的过程中,发现高通给的代码中,这块msm8625不需要GPIO外部控电。是联想自改了,还是msm8625的新设计中有了一个专用的接口。没有手册,真是搞不明白。但把一些高通代码中一些通用的GPIO试了一下时,没法,与wifi启电有关的接口。

b,调试过程中,发现/sys/bus/sdio/devices/目录下无设备。按网上的说法,如果设备启电后,这里应当有一个设备显示。没有一是总线驱动没装,二是设备没接入。前者到make menuconfig下看一下就好。后者的原因,在所用代码中没能找到有用信息时,就到网上找了。

c,网上的信息说明,这个wifi用的驱动是由compat-wireless改编的。github是个好东西。正常启动wifi后,dmesg对比会发现,原手机的驱动有对android_readwrite_file的调用,但我下的代码中没有这个。github直接找这个东西,然所找到的东西中,再找与自已已知的信息做对比,选了两个代码改变两试。一个是别人改的内核的代码,试的结果是不通。但通过这个发现他也是把compat-wireless融合到自已的内核编译中。第二个试,是用compat-wireless。全部下了,但只是仿前面的改法,只改wifi相关驱动代码,和,mach下的相关代码。发现自已下的内核版本是有点低了。有一些东西不支持。只发与wifi有关的代码。编译改错后,下载后通过了。

d,在写这个文章时,断网了一次,重新insmod ath6kl_sdio.ko后,再配置后,正常。感觉这东西会自动休眠吗?我配了这么多就是相要长期,单一工作的稳定性。这要是时不时断网,我所做的东西,就是在玩一玩。

猜你喜欢

转载自blog.csdn.net/qushaobo/article/details/84727542