MTK手機晶片如何添加乙太網路卡支援(上層部分),mtk乙太網路卡
接:http://blog.csdn.net/zangcf/article/details/40870369,這邊文章只描述如何移植底層部分
1, 由於android本身沒有Ethernet的架構,我們必須從Android-x86上面移植,Android-x86是一個開源項目,大家可以翻牆從Google網站下載,或者是從這裡
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中的內容就可以了。