Android 4.4 添加Ethernet(framework+kernel+package)

kernel

kernel中主要部分是驱动的移植:

1.解压驱动到目录:kernel/driver/net/usb/

2.Makefile中添加编译选项

obj-$(CONFIG_USB_NET_AX88772X)  += AX88772X/asix.o
obj-$(CONFIG_USB_USBNET)        += usbnet.o

3.修改Kconfig

config USB_NET_AX88772X
        tristate "ASIX AX88xxx Based USB 2.0 Ethernet Adapters"
        depends on USB_USBNET
        select CRC32
        default y
        help
          This option adds support for ASIX AX88xxx based USB 2.0
          10/100 Ethernet adapters.

4.修改make menuconfig。 Device drivers->Network device upport->Usb Network Adapters->Multi-purpose USB Networking Framework-> ASIX   AX88xxx Based USB 2.0 Ethernet Adapters.

5.编译刷机。插入rj45,通过命令netcfg ,查看是否获得eth0的数据。通过命令netcfg eth0 dhcp up 动态配置网口IP。

注意:此处遇到一个问题是USB-otg 有的时候识别不到。需要保留3G模块驱动,具体原因尚且不清楚。多次尝试后,发现在开机后几秒才能正常识别到OTG设备。如遇驱动移植成功RJ45插入没反应。需要排查OTG是否正常工作,以及OTG -ID引脚是否拉低并为外部设备提供5V电压。

framworks

Android4.4中,没有为Ethernet提供service来维护。需要自行移植。frameworks移植分为如下部分:1.添加设备以太网支持。2.添加Ethernet服务。3.为Ethernet添加systemUI 。4.修改package/apps/Settings/,在设置界面添加Ethernet设置。

1.添加设备以太网支持

①文件:frameworks/base/core/res/res/values/config.xml

在<string-array translatable="true" name="networkAttributes">后添加

<item>"ethernet,9,9,9,-1,true"</item>

在<string-array translatable="true" name="radioAttributes">后添加

<item>"9,1"</item>     

注意:数字9为以太网。添加此处后,在ConnectivityManager.java中创建相关的网络类型。如果此处不添加,则不会正常创建EthernetService

2.添加Ethernet服务

需要使用作者hclydao的代码。源码地址:http://download.csdn.net/detail/hclydao/9472079

 下载解压后得到文件android4.4-add-ethernet.

将android4.4-add-ethernet/frameworks/base/ethernet 拷贝到目录frameworks/base/底下

将android4.4-add-ethernet/EthernetService.java 拷贝到frameworks//base/services/java/com/android/server/底下

修改frameworks/base/Android.mk


    wifi/java/android/net/wifi/p2p/IWifiP2pManager.aidl \

下添加:

ethernet/java/android/net/ethernet/IEthernetManager.aidl \

修改build/core/pathmap.mk在

FRAMEWORKS_BASE_SUBDIRS中加上加入ethernet

修改frameworks/base/core/java/android/content/Context.java

在public static final String WIFI_P2P_SERVICE = "wifip2p";

后面添加

    * Use with {@link #getSystemService} to retrieve a {@link 
     * android.net.ethernet.EthernetManager} for handling management of 
     * Ethernet access. 
     * 
     * @see #getSystemService
     * @see android.net.ethernet.EthernetManager
     */
    public static final String ETH_SERVICE = "ethernet";//add by Sun

修改frameworks/base/core/java/android/app/ContextImpl.java添加:

    import android.net.ethernet.IEthernetManager;  
    import android.net.ethernet.EthernetManager;  

在    

registerService(WIFI_P2P_SERVICE, new ServiceFetcher() {

                public Object createService(ContextImpl ctx) {

                    IBinder b = ServiceManager.getService(WIFI_P2P_SERVICE);

                    IWifiP2pManager service = IWifiP2pManager.Stub.asInterface(b);

                    return new WifiP2pManager(service);

                }});

下增加如下内容

registerService(ETH_SERVICE, new ServiceFetcher() {  
        public Object createService(ContextImpl ctx) {  
            IBinder b = ServiceManager.getService(ETH_SERVICE);  
            IEthernetManager service = IEthernetManager.Stub.asInterface(b);  
            return new EthernetManager(service, ctx.mMainThread.getHandler());  
        }});

注释:添加以太网服务


修改frameworks/base/services/java/com/android/server/ConnectivityService.java

添加

import android.net.ethernet.EthernetManager;
import android.net.ethernet.EthernetStateTracker;  

// Create and start trackers for hard-coded networks
        for (int targetNetworkType : mPriorityList) {
            final NetworkConfig config = mNetConfigs[targetNetworkType];
            final NetworkStateTracker tracker;

            try {
                tracker = netFactory.createTracker(targetNetworkType, config);
                mNetTrackers[targetNetworkType] = tracker;
            } catch (IllegalArgumentException e) {
                Slog.e(TAG, "Problem creating " + getNetworkTypeName(targetNetworkType)
                        + " tracker: " + e);
                continue;
            }
下添加:
if(mNetConfigs[targetNetworkType].radio == ConnectivityManager.TYPE_ETHERNET) { //add by Sun  
           EthernetService ethernet = new EthernetService(context, (EthernetStateTracker)mNetTrackers[targetNetworkType]);
           ServiceManager.addService(Context.ETH_SERVICE, ethernet);
          // mNetTrackers[targetNetworkType].startMonitoring(context, mTrackerHandler);  
           }

注释掉

return EthernetDataTracker.getInstance();

添加

return new EthernetStateTracker(targetNetworkType, config.name);//add by Sun

注释掉//import android.net.EthernetDataTracker;

3.添加ethernet jni

使用作者hclydao提供的JNI代码,将解压目录底下的android_net_ethernet.cpp,拷贝到frameworks/base/core/jni/

修改frameworks/base/core/jni/AndroidRuntime.cpp

extern int register_android_net_wifi_WifiNative(JNIEnv* env);下
加上

extern int register_android_net_ethernet_EthernetManager(JNIEnv* env);//add by Sun


REG_JNI(register_android_net_wifi_WifiNative),
下加上如下代码

    REG_JNI(register_android_net_ethernet_EthernetManager),  

4.在Settings中添加配置api

在framework/base/core/java/android/provider/Settings.java中

       public static final String WIFI_ON = "wifi_on";

下加上如下代码关于以太网的读写接口:

    public static final String ETH_ON      = "eth_on";  
    public static final String ETH_MODE    = "eth_mode";  
    public static final String ETH_IP      = "eth_ip";  
    public static final String ETH_MASK    = "eth_mask";  
    public static final String ETH_DNS     = "eth_dns";  
    public static final String ETH_ROUTE   = "eth_route";  
    public static final String ETH_CONF    = "eth_conf";  
    public static final String ETH_IFNAME  = "eth_ifname";  
至此,frameworks层已经修改完成。包括添加Ethernet service与添加了Settings的API。此处需要保证jdk版本一致为1.6,并且make update-api。


package

修改package/apps/Settings.添加Ethernet设置选项,使用作者hclydao的代码包。

拷贝eth_configure.xml到Settings/res/layout/
拷贝ic_setttings_ethernet.png到Settings/res/drawable-hdpi与drawable-mdpi
拷贝ethernet_settings.xml到Settings/res/xml下
修改xml下settings_headers.xml在wifi下增加如下内容

    <!-- Ethernet -->
    <header  
    android:id="@+id/ethernet_settings"  
    android:title="@string/eth_setting"  
    android:icon="@drawable/ic_settings_ethernet"  
    android:fragment="com.android.settings.ethernet.EthernetSettings"/>

在文件Settings/res/values/strings.xml中添加:

    <!-- Ethernet configuration dialog -->
    <string name="eth_config_title">Configure Ethernet device</string>
    <string name="eth_setting">Ethernet</string>
    <string name="eth_dev_list">Ethernet Devices:</string>
    <string name="eth_con_type">Connection Type</string>
    <string name="eth_con_type_dhcp">DHCP</string>
    <string name="eth_con_type_manual">Static IP</string>
    <string name="eth_dns">DNS address</string>
    <string name="eth_gw">Gateway address</string>
    <string name="eth_ipaddr">IP address</string>
    <string name="eth_quick_toggle_title">Ethernet</string>
    <string name="eth_quick_toggle_summary">Turn on Ethernet</string>
    <string name="eth_conf_perf_title">Ethernet configuration</string>
    <string name="eth_conf_summary">Configure Ethernet devices</string>
    <string name="eth_mask">Netmask</string>
    <string name="eth_toggle_summary_off">Turn off Ethernet</string>
    <string name="eth_toggle_summary_on">Turn on Ethernet</string>
    <string name="eth_settings_error">Failed to set: Please enter the valid characters 0~255</string>
拷贝解压文件夹中的Settings/src/ethernet到Settings/src文件夹下
修改Settings/AndroidManifest.xml

        <activity android:name="Settings$WirelessSettingsActivity"
                android:taskAffinity="com.android.settings"
                android:label="@string/wireless_networks_settings_title"
                android:parentActivityName="Settings">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <action android:name="android.settings.WIRELESS_SETTINGS" />
                <action android:name="android.settings.AIRPLANE_MODE_SETTINGS" />
                <action android:name="android.settings.NFC_SETTINGS" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.VOICE_LAUNCH" />
            </intent-filter>
            <meta-data android:name="com.android.settings.FRAGMENT_CLASS"
                android:value="com.android.settings.WirelessSettings" />
            <meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"
                android:resource="@id/wireless_settings" />
        </activity>

之后添加:

     <!-- Ethernet controls add by Sun-->  
      
    <activity android:name="Settings$EthernetSettingsActivity"  
            android:label="@string/eth_setting">  
        <intent-filter>  
            <action android:name="android.intent.action.MAIN" />  
            <action android:name="android.settings.ETHERNET_SETTINGS" />  
            <category android:name="android.intent.category.DEFAULT" />  
            <category android:name="android.intent.category.VOICE_LAUNCH" />  
            <category android:name="com.android.settings.SHORTCUT" />  
        </intent-filter>  
        <meta-data android:name="com.android.settings.FRAGMENT_CLASS"  
            android:value="com.android.settings.ethernet.EthernetSettings" />  
        <meta-data android:name="com.android.settings.TOP_LEVEL_HEADER_ID"  
            android:resource="@id/ethernet_settings" />  
    </activity>  

文件Settings/src/com/android/settings/Utils.java中

    /**
     * Returns the WIFI IP Addresses, if any, taking into account IPv4 and IPv6 style addresses.
     * @param context the application context
     * @return the formatted and newline-separated IP addresses, or null if none.
     */
    public static String getWifiIpAddresses(Context context) {
        ConnectivityManager cm = (ConnectivityManager)
                context.getSystemService(Context.CONNECTIVITY_SERVICE);
        LinkProperties prop = cm.getLinkProperties(ConnectivityManager.TYPE_WIFI);
        return formatIpAddresses(prop);
    }

之后添加

    public static String getEtherProperties(Context context) {  
        ConnectivityManager cm = (ConnectivityManager)  
                context.getSystemService(Context.CONNECTIVITY_SERVICE);  
        LinkProperties prop = cm.getLinkProperties(ConnectivityManager.TYPE_ETHERNET);  
        return prop.toString();  
    }  

修改Settings/src/com/android/settings/Settings.java

添加

import com.android.settings.ethernet.EthernetSettings;

private int[] SETTINGS_FOR_RESTRICTED中添加

R.id.ethernet_settings,

在private static final String[] ENTRY_FRAGMENTS = {

添加:

EthernetSettings.class.getName(),

至此Settings设置已经完成。

这里按客户要求需要屏蔽掉wifi,BT设置。

在Settings/src/com/android/settings/Settings.java中修改如下代码

 else if (id == R.id.wifi_settings) {
                // Remove WiFi Settings if WiFi service is not available.
                //if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI)) {
                if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_WIFI)) {//将!符号取消
                    target.remove(i);
                }
            } else if (id == R.id.bluetooth_settings) {
                // Remove Bluetooth Settings if Bluetooth service is not available.
                //if (!getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) {
                if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_BLUETOOTH)) {//将符号!取消
                    target.remove(i);
                }

至此设置界面不会有bt、wifi 。


ramdisk

添加dhcp_eth0服务,这样开机时候会启动该服务。

文件:device/sscr/sc1_dvt1/conf/init.sc1_dvt1.rc

service dhcpcd_wlan0 /system/bin/dhcpcd -aABDKL

    class main
    disabled
    oneshot

后添加:

service dhcpcd_eth0 /system/bin/dhcpcd -ABDHKLd
    class main
    disabled
    oneshot
编译后刷入ramdisk-uboot.img


systemUI

拷贝systemui下所有.png文件到frameworks/base/packages/SystemUI/res/drawable下
修改frameworks/base/packages/SystemUI/res/values/strings.xml

    <string name="accessibility_no_sim">No SIM.</string>
下增加如下

    <!-- Content description of the Ethernet connected icon for accessibility (not shown on the screen). [CHAR LIMIT=NONE] -->  
    <string name="accessibility_ethernet_connected">Ethernet connected.</string>  
    <string name="accessibility_ethernet_disconnected">Ethernet disconnected.</string>  
    <string name="accessibility_ethernet_connecting">Ethernet connecting.</string>  
修改frameworks/base/packages/SystemUI/res/layout/signal_cluster_view.xml

    <View
        android:layout_height="6dp"
        android:layout_width="6dp"
        android:visibility="gone"
        android:id="@+id/spacer"
        />
    <!--<FrameLayout
        android:id="@+id/wimax_combo"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:layout_marginEnd="-6dp"
        >
上增加
    <FrameLayout  
        android:id="@+id/ethernet_combo"  
        android:layout_height="wrap_content"  
        android:layout_width="wrap_content"  
        android:layout_marginRight="-6dp"  
        >  
        <ImageView  
            android:id="@+id/ethernet_state"  
            android:layout_height="wrap_content"  
            android:layout_width="wrap_content"  
            android:layout_alignParentRight="true"  
            android:layout_centerVertical="true"  
            android:scaleType="center"  
            />  
    </FrameLayout>  


修改frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/SignalClusterView.java

    private int mWifiStrengthId = 0;
下增加

    private boolean mEthernetVisible = false;  
    private int mEthernetStateId = 0;  
在private String mWifiDescription, mMobileDescription, mMobileTypeDescription,mEthernetDescription;
后增加,mEthernetDescription如上

然后增加mEthernetGroup,mEthernet如下

    ViewGroup mWifiGroup, mMobileGroup,mEthernetGroup;
    ImageView mWifi, mMobile, mWifiActivity, mMobileActivity, mMobileType, mAirplane,mEthernet;


    @Override
    public void setIsAirplaneMode(boolean is, int airplaneIconId) {
        mIsAirplaneMode = is;
        mAirplaneIconId = airplaneIconId;

        apply();
    }
下增加

    @Override  
    public void setEthernetIndicators(boolean visible, int stateIcon, int activityIcon,  
            String contentDescription) {  
        mEthernetVisible = visible;  
        mEthernetStateId = stateIcon;  
        //mEthernetActivityId = activityIcon;  
        mEthernetDescription = contentDescription;  
      
        apply();  
    }  

mAirplane       = (ImageView) findViewById(R.id.airplane);
下增加
    mEthernetGroup  = (ViewGroup) findViewById(R.id.ethernet_combo);  
    mEthernet       = (ImageView) findViewById(R.id.ethernet_state);  
在mAirplane       = null;
下增加
    mEthernetGroup  = null;  
    mEthernet       = null;  

        if (mIsAirplaneMode) {
            mAirplane.setImageResource(mAirplaneIconId);
            mAirplane.setVisibility(View.VISIBLE);
        } else {
            mAirplane.setVisibility(View.GONE);
        }
下增加
    if (mEthernetVisible) {  
        mEthernetGroup.setVisibility(View.VISIBLE);  
        mEthernet.setImageResource(mEthernetStateId);  
        //mEthernetActivity.setImageResource(mEthernetActivityId);  
        mEthernetGroup.setContentDescription(mEthernetDescription);  
    } else {  
        mEthernetGroup.setVisibility(View.GONE);  
    }  
然后增加 mEthernetVisible如下

if (mMobileVisible && mWifiVisible && mIsAirplaneMode && mEthernetVisible) {

修改frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/policy/NetworkController.java
增加

    import android.net.ethernet.EthernetManager;  
    import android.net.ethernet.EthernetStateTracker;  
    import android.util.Slog;  
    import com.android.systemui.R;  

    String mContentDescriptionWimax;
下增加
String mContentDescriptionEthernet;

    private boolean mWimaxSupported = false;
    private boolean mIsWimaxEnabled = false;
    private boolean mWimaxConnected = false;
    private boolean mWimaxIdle = false;
    private int mWimaxIconId = 0;
    private int mWimaxSignal = 0;
    private int mWimaxState = 0;
    private int mWimaxExtraState = 0;
下增加
    // Ethernet  
    boolean mShowEthIcon, mEthernetWaitingDHCP;  
    boolean mEthernetPhyConnect=false ;  
    int mEthernetIconId = 0;  

    String mLastCombinedLabel = "";

下增加

int mLastEthernetIconId = -1; 

        void setIsAirplaneMode(boolean is, int airplaneIcon);
下增加
void setEthernetIndicators(boolean visible, int stateIcon, int activityIcon,  
        String contentDescription); 

        filter.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED);

下增加

filter.addAction(EthernetManager.ETH_STATE_CHANGED_ACTION);  

cluster.setIsAirplaneMode(mAirplaneMode, mAirplaneIconId);
上增加如
cluster.setEthernetIndicators(  
        mShowEthIcon,  
        mEthernetIconId,  
        -1,  
        mContentDescriptionEthernet); 

    else if (action.equals(WimaxManagerConstants.NET_4G_STATE_CHANGED_ACTION) ||
                    action.equals(WimaxManagerConstants.SIGNAL_LEVEL_CHANGED_ACTION) ||
                    action.equals(WimaxManagerConstants.WIMAX_NETWORK_STATE_CHANGED_ACTION)) {
                updateWimaxState(intent);
                refreshViews();
            }
下增加
    else if (action.equals(EthernetManager.ETH_STATE_CHANGED_ACTION)) {  
               updateEth(intent);  
               refreshViews();  
           }  

    updateWimaxIcons函数下增加函数
    // ===== Ethernet ===================================================================  
      private final void updateEth(Intent intent) {  
          final int event = intent.getIntExtra(EthernetManager.EXTRA_ETH_STATE, EthernetStateTracker.EVENT_HW_DISCONNECTED);  
          Slog.d(TAG, "updateEth event=" + event);  
          switch (event) {  
              case EthernetStateTracker.EVENT_HW_CONNECTED:  
                  if (mEthernetWaitingDHCP)  
                      return;  
                  // else fallthrough  
              case EthernetStateTracker.EVENT_INTERFACE_CONFIGURATION_SUCCEEDED: {  
                      mEthernetWaitingDHCP = false;  
                  EthernetManager ethManager = (EthernetManager) mContext.getSystemService(mContext.ETH_SERVICE);  
                  if (ethManager.isEthDeviceAdded()) {  
                      mShowEthIcon = true;  
                      mEthernetIconId =R.drawable.ethernet_connected ; //  sEthImages[0];   
                      mContentDescriptionEthernet = mContext.getString(R.string.accessibility_ethernet_connected);  
                  }  
                  return;  
              }  
              case EthernetStateTracker.EVENT_INTERFACE_CONFIGURATION_FAILED:  
                  mEthernetWaitingDHCP = false;  
            //if(!mEthernetPhyConnect)  
                   // return ;  
                  mShowEthIcon = true;  
                  mEthernetIconId = R.drawable.ethernet_disconnected; // sEthImages[1];   
                  mContentDescriptionEthernet = mContext.getString(R.string.accessibility_ethernet_disconnected);  
                  return;  
              case EthernetStateTracker.EVENT_DHCP_START:  
                  mEthernetWaitingDHCP = true ;  
                  return;  
              case EthernetStateTracker.EVENT_HW_PHYCONNECTED:  
                  mEthernetPhyConnect = true ;  
                  mShowEthIcon = true;  
                  mEthernetIconId =R.drawable.ethernet_connecting ; // sEthImages[2]; // 2  
                  mContentDescriptionEthernet = mContext.getString(R.string.accessibility_ethernet_connecting);  
                  return;  
              case EthernetStateTracker.EVENT_HW_PHYDISCONNECTED:  
                  mEthernetPhyConnect = false ;  
                  mEthernetWaitingDHCP = false;  
                  mShowEthIcon = false;  
                  mEthernetIconId = -1;  
                  mContentDescriptionEthernet = null;  
                  return;  
              case EthernetStateTracker.EVENT_HW_DISCONNECTED:  
                  mEthernetPhyConnect = false ;  
                  mEthernetWaitingDHCP = false;  
                  mShowEthIcon = false;  
                  mEthernetIconId = -1;  
                  mContentDescriptionEthernet = null;  
                  return ;  
              case EthernetStateTracker.EVENT_HW_CHANGED:  
                  return;              
                
              default:  
                  if (mEthernetWaitingDHCP)  
                      return;  
                  mShowEthIcon = false;  
                  mEthernetIconId = -1;  
                  mContentDescriptionEthernet = null;  
                  return;  
          }  
      }  

        if (mBluetoothTethered) {
            combinedLabel = mContext.getString(R.string.bluetooth_tethered);
            combinedSignalIconId = mBluetoothTetherIconId;
            mContentDescriptionCombinedSignal = mContext.getString(
                    R.string.accessibility_bluetooth_tether);
        }
下增加
    if (mShowEthIcon) {  
        wifiLabel = mContentDescriptionEthernet;  
        combinedSignalIconId = mEthernetIconId;  
        mContentDescriptionCombinedSignal = mContentDescriptionEthernet;  
    } 
 

在这个下面增加:

    final boolean ethernetConnected = (mConnectedNetworkType == ConnectivityManager.TYPE_ETHERNET);  
    if (ethernetConnected) {  
        // TODO: icons and strings for Ethernet connectivity  
        combinedLabel = mConnectedNetworkTypeName;  
    }  
注释掉之前的 
/*
        final boolean ethernetConnected = (mConnectedNetworkType == ConnectivityManager.TYPE_ETHERNET);
        if (ethernetConnected) {
            combinedLabel = context.getString(R.string.ethernet_label);
        }
在&& !ethernetConnected后增加 && !mShowEthIcon
在         || mLastWifiIconId                 != mWifiIconId
下增加
         || mLastEthernetIconId             != mEthernetIconId


        // the wimax icon on phones
        if (mLastWimaxIconId != mWimaxIconId) {
            mLastWimaxIconId = mWimaxIconId;
        }
下增加

    // ethernet icon on phones  
    if (mLastEthernetIconId != mEthernetIconId) {  
        mLastEthernetIconId = mEthernetIconId;  
        // Phone UI not supported yet.  
    }  

至此已完成systemUI的修改。

make update-api 后进行编译

参考博客:

https://blog.csdn.net/hclydao/article/details/50976868

https://blog.csdn.net/sunjing_/article/details/51942785










评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值