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