1. 程式人生 > >MTK手機晶片如何新增乙太網卡支援(上層部分)

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中的內容就可以了。