交叉编译驱动

起因

之前把Nexus7装上NetHunter之后,发现OTG连接usb无线网卡(ep-n8508gs)不能用。这奇葩网卡在树莓派上都能完美运行的在Android上面不能运行= =也不知道几个意思。然后google了一下发现遇到识别问题的都是OTG线的问题。然而自己各种换线,以为是供电不够还另外供电,然而还是没能解决问题、

然后今天突然想到会不会是驱动的原因。然后就打算编译个驱动上去看看能不能解决。

经过

然后首先。从官网下载了驱动源码。和android的内核源码

解压内核源码,把对应处理器的config拷出来 修改Makefile把ARCH改成arm,CROSS_COMPILE改成交叉编译器的位置这样才能编译成arm版本(应该是只有编译内核的时候才需要?)

cp arch/arm/configs/flo_defconfig ./.config

或者make指定参数也行。。 解压驱动源码到drivers/net/wireless/下。应该也是只有编译到内核中去的时候需要。记得改个文件夹名字、

在wireless文件夹下的Makefile和Kconfig也要改。然后就能通过make menuconfig在里面设置编译选项了。原来打算的就是编译个驱动模块而已,也没必要改这些了。

修改驱动源码中的Makefile,添加自己的选项,设置标志y。设置好arch和编译器位置就行了。

make。然后提示找不到compiler-gcc5.h。是因为编译器新而源码比较旧导致,直接丢一份compiler-gcc5.h进去再次编译

make。然后提示error, forbidden warning。还是因为编译器。新的编译器会把warning当做error来处理。禁用掉后再次编译。

make。然后LD提示一大堆的

/home/cirno/linux-kernel/drivers/net/wireless/rtl8192cu/core/rtw_security.o:在函数‘is_multicast_mac_addr’中: /home/cirno/linux-kernel/drivers/net/wireless/rtl8192cu/include/ieee80211.h:1199: `is_multicast_mac_addr'被多次定义 /home/cirno/linux-kernel/drivers/net/wireless/rtl8192cu/core/rtw_cmd.o:/home/cirno/linux-kernel/drivers/net/wireless/rtl8192cu/include/ieee80211.h:1199:第一次在此定义

此时我的内心。崩溃。真的。全都是那个头文件的那几个函数中招。。 打开看了看。。全是函数定义。。为毛函数定义都塞在头文件里面。。。

不死心。在那堆函数的地方加了#ifndef#define。结果是没有效果的。#ifndef#define都是针对同一个文件而言,所以实际上是没效果。。然后又加了#pragma once。然而还是没效果。

好嘛。不就是定义到头文件去了。。全部拉出来不就好了

把那三个奇葩函数全部丢到c里面去,在头函数里面只留声明。最后终于链接成功。 然而。还是有错误

FATAL: section header offset=11258999068426292 in file '/home/cirno/linux-kernel/drivers/net/wireless/rtl8192cu/8192cu.o' is bigger than filesize=10236164

网上查了一下。原来make的时候还要指定ARCH和交叉编译器。

最后总算是可以成功编译出来了

cirno@LoveLive:~/linux-kernel/drivers/net/wireless/rtl8192cu$ file 8192cu.ko 8192cu.ko: ELF 32-bit LSB relocatable, ARM, EABI5 version 1 (SYSV), BuildID[sha1]=6c2f0c8f10c7c5e3efa824a51b13a4b914e25b69, not stripped

结果

终于编译出来啦!棒棒哒! 然后赶紧丢板子上看看吧

于是。

function not implemented

233333333333

官方的内核是没有启用Enable loadable module support的。也就是说想要用刚才编译出来的驱动模块,只能重新编译内核。

爽。反正编译出来了。就贡献出来给吧,有需要的直接拿去用就是了 适用于nexus7 flo 3.4.0内核

@

Show Comments