MTK手机芯片如何添加以太网卡支持(上层部分)
接:http://blog.csdn.net/zangcf/article/details/40870369,这边文章只描述如何移植底层部分
1, 由于android本身没有Ethernet的架构,我们必须从Android-x86上面移植,Android-x86是一个开源项目,大家可以翻墙从谷歌网站下载,或者是从这里
http://download.csdn.net/detail/zangcf/8187113下载。这个包包含4.04(ICS)和4.2(jb),两个版本的差分包。4.2不完整,但是对于移植到4.2系统上而言,架构上本4.04好一些,需要debug修改,建议使用ICS版本的差分包。
2,根据Android硬件管理架构Manager-Service-HAL(jni),我们需要在framework/base下面建立一个文件夹,这个包需要在编译路径上加入。
需要修改build//core/pathmap.mk
FRAMEWORKS_BASE_SUBDIRS变量上加上ethernet
3,我们知道android的dhcp的配置文件在rom的/system/etc/,其下面有一个dns相关的脚本文件/dhcpcd-hooks/20-dns.conf,这个脚本将记录dns服务器的地址,这个脚本在源代码的externel//dhcpcd-hooks/20-dns.conf下面,我们需要添加对ethernet的支持。
setprop net.dns${count} ${dnsaddr}
dhcpcd的工作原理,请参考文章:http://blog.csdn.net/cupidove/article/details/23122003
4,因为我们需要根据系统属性值变化来启动dhcp等,所以,我们必须修改/system/init/property_service.c的property_perms[]添加:
+ { "rw.", AID_SYSTEM, 0 },
+ { "net.", AID_DHCP, 0 },
关于属性之修改启动服务,请参考文章:http://blog.csdn.net/zmyde2010/article/details/6312615
5,由于我们添加的Ethernet模块中有AIDL文件,所以,我们需要把这个AIDL文件加入到framework的Android.mk的LOCAL_SRC_FILES中,采用+=的方式添加:
注:
AIDL文件
framework中包含的aidl是在frameworks/base/Android.mk中定义的。该文件定义了两处aidl文件列表。
第一处是给LOCAL_SRC_FILES变量中使用 “+=” 进行赋值,该变量将包含在framework.jar目标中的所有源文件,包括aidl文件和java文件。
第二处是给aidl_files变量使用“:=”赋值符号进行赋值,该变量仅仅包含android.jar目标中所有的aidl文件。
因此,当给Frameworks中添加新的aidl文件时,需要考虑文件是否要公开到SDK中。如果需要,则需要把该文件路径同时添加到以上两个变量中;如果不需要公开到SDK中,则只需要把文件路径添加到LOCAL_SRC_FILES变量中。
在完成这些操作后编译仍会出现问题,此时需要运行,make update-api命令
5,先留着api/current.txt不修改
6,注册以太网卡服务:framework/core/java/android/app/ContextImpl.java
+ registerService(ETHERNET_SERVICE, new ServiceFetcher() {
+ public Object createService(ContextImpl ctx) {
+ IBinder b = ServiceManager.getService(ETHERNET_SERVICE);
+ IEthernetManager service = IEthernetManager.Stub.asInterface(b);
+ return new EthernetManager(service, ctx.mMainThread.getHandler());
+ }});
7, 在framework/core/java/android/app/DownloadManager.java
添加静态变量 public static final int NETWORK_ETHERNET = 1 << 2;
有何用?不是很清楚。
8,在/frameworks/core/java/android/content/Context.java
添加以太网卡服务名称:public static final String ETHERNET_SERVICE = "ethernet";//这个名称上面注册过程事情,后面应用部分,要去的系统服务,也是靠这个名称。
9,在/frameworks/base/core/java/android/net/NetworkUtils.java,添加以太网卡配置接口,其实是直接调用jni的。NetworkUtils这个类可以查看网络状态,一起启动网络命令。
10,在SettingsProvider中定义接口:
/**
+ * Ethernet related configurations
+ */
+ public static final String ETHERNET_ON = "ethernet_on";
+ public static final String ETHERNET_MODE = "ethernet_mode";
+ public static final String ETHERNET_IP = "ethernet_ip";
+ public static final String ETHERNET_MASK = "ethernet_netmask";
+ public static final String ETHERNET_DNS = "ethernet_dns";
+ public static final String ETHERNET_ROUTE = "ethernet_iproute";
+ public static final String ETHERNET_CONF = "ethernet_conf";
+ public static final String ETHERNET_IFNAME = "ethernet_ifname";
11,添加jni文件
修改make文件:framework/core/jni/Android.mk添加android_net_ethernet.cpp
copy文件android_net_ethernet.cpp到目录framework/core/jni/
修改接口文件AndroidRuntime.cpp和android_net_NetUtils.cpp
12,修改系统配置文件
frameworks/core/res/res/values/config.xml
13, 拷贝Ethernet模块
/frameworks/base/ethernet/java/android/net/ethernet/EthernetDevInfo.aidl
/frameworks/base/ethernet/java/android/net/ethernet/EthernetDevInfo.java
/frameworks/base/ethernet/java/android/net/ethernet/EthernetManager.java
/frameworks/base/ethernet/java/android/net/ethernet/EthernetMonitor.java
/frameworks/base/ethernet/java/android/net/ethernet/EthernetNative.java
/frameworks/base/ethernet/java/android/net/ethernet/EthernetStateTracker.java
/frameworks/base/ethernet/java/android/net/ethernet/IEthernetManager.aidl
14,SystemUI和Settings部分暂时不修改,这两个部分一个是配置,一个是显示,暂时不影响功能。
15,修改Server部分,添加EthernetService
修改文件frameworks/services/java/com/android/server/EthernetService.java
拷贝文件/services/java/com/android/server/EthernetService.java
至此修改完成,网卡应该可以工作,但是没有SystemUI的图标和Settings.apk的设置项。
但是需要手动启动dhcp获取ip和dns,手动启动的方法是在终端输入netcfg eht0 up dhcp, 如果想让系统自动启动,需要修改Init.rc让系统自动自动:
on property:init.svc.dhcpcd_eth0=run
start dhcpcd_eth0
on property:init.svc.dhcpcd_eth0=stopped
start dhcpcd_eth0
至此,以太网卡可以正常工作,后面根据需要修改设置和systemui中的内容就可以了。
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。