SlideShare une entreprise Scribd logo
1  sur  26
Télécharger pour lire hors ligne
망고100 보드로 놀아보자-19

           Android Ethernet 분석
http://cafe.naver.com/embeddedcrazyboys
       http://www.mangoboard.com
Android Activity Lifecycle
안드로이드 Ethernet Config 추가
안드로이드 Ethernet Config 추가
Setting.xml 과 IconPreferenceScreen
<com.android.settings.IconPreferenceScreen
    android:title="@string/eth_radio_ctrl_title"
    settings:icon="@drawable/ic_settings_ethernet">
    <intent
       android:action="android.intent.action.MAIN"
       android:targetPackage="com.android.settings"
       android:targetClass="com.android.settings.EthernetSettings" />
   </com.android.settings.IconPreferenceScreen>
XML과 EthernetSettings class관계
 <com.android.settings.IconPreferenceScreen
      android:title="@string/eth_radio_ctrl_title"
      settings:icon="@drawable/ic_settings_ethernet">
      <intent
         android:action="android.intent.action.MAIN"
         android:targetPackage="com.android.settings"
         android:targetClass="com.android.settings.EthernetSettings"
 />
    </com.android.settings.IconPreferenceScreen>
Ethernet Service 초기화
 (EthernetManager) getSystemService(ETH_SERVICE),
./packages/apps/Settings/src/com/android/settings/EthernetSettings.java



  }else if (ETH_SERVICE.equals(name)) {
          return getEthernetManager();
 ./frameworks/base/core/java/android/app/ApplicationContext.java

    private EthernetManager getEthernetManager()
      {
         synchronized (sSync) {
            if (sEthManager == null) {
                IBinder b = ServiceManager.getService(ETH_SERVICE);
                IEthernetManager service = IEthernetManager.Stub.asInterface(b);
                sEthManager = new EthernetManager(service, mMainThread.getHandler());
    ./frameworks/base/core/java/android/app/ApplicationContext.java
Service Manager Ethernet 등록
  private EthernetManager getEthernetManager()
    {
       synchronized (sSync) {
          if (sEthManager == null) {
              IBinder b = ServiceManager.getService(ETH_SERVICE);
              IEthernetManager service = IEthernetManager.Stub.asInterface(b);
              sEthManager = new EthernetManager(service, mMainThread.getHandler());
  ./frameworks/base/core/java/android/app/ApplicationContext.java
                                 Connectivity service에서 등록

private ConnectivityService(Context context) {
….
ServiceManager.addService(Context.ETH_SERVICE, ethService);
./frameworks/base/services/java/com/android/server/ConnectivityService.java
Service Manager 역할
                      POWER_SERVICE




    CONNECTIVITY_S
                     Service          ETH_SERVICE


                     manager
       ERVICE




                           …
Connectivity Service
                       wifi




        ethernet
                   Connectivity   mms
                     service


                       ….
Ethernet service (부팅 시)
    private ConnectivityService(Context context) {
         if (DBG) Log.v(TAG, "ConnectivityService starting up");



if (DBG) Log.v(TAG, "Starting Ethernet Service");
     mEthernetStateTracker = new EthernetStateTracker(context,mHandler);
     EthernetService ethService = new EthernetService(context,
                               mEthernetStateTracker);
     ServiceManager.addService(Context.ETH_SERVICE, ethService);
     mNetTrackers[ConnectivityManager.TYPE_ETH] = mEthernetStateTracker;
Ethernetsuper는 자손클래스에서 조상클래스로부터 상속받은 멤버를 참
          service조하는데 사용되는 참조변수
                    (부팅 시)
 public EthernetStateTracker(Context context, Handler target) {
            super(context, target, ConnectivityManager.TYPE_ETH, 0, "ETH", "");
 Log.i(TAG,"Starts...");
            if(EthernetNative.initEthernetNative() != 0 )
            {
                       Log.e(TAG,"Can not init ethernet device layers");
                       return;
            }
Ethernet service (부팅 시)
static JNINativeMethod gEthernetMethods[] = {
      {"waitForEvent", "()Ljava/lang/String;“,      (void *)android_net_ethernet_waitForEvent},
      {"getInterfaceName", "(I)Ljava/lang/String;“, void )android_net_ethernet_getInterfaceName},
      {"initEthernetNative", "()I“,         (void *)android_net_ethernet_initEthernetNative},
      {"getInterfaceCnt","()I“,    (void *)android_net_ethernet_getInterfaceCnt}
   };




        static jint android_net_ethernet_initEthernetNative(JNIEnv *env,
                                          jobject clazz)
          {
       if ((ret = netlink_init_interfaces_list()) < 0) {
Ethernet service (부팅 시)
static int netlink_init_interfaces_list(void) {
..
if ((netdir = opendir(SYSFS_CLASS_NET)) != NULL) {
while((de = readdir(netdir))!=NULL) {

                                static const char SYSFS_CLASS_NET[]   =
                                "/sys/class/net";


snprintf(path, SYSFS_PATH_MAX,"%s/%s/ifindex",SYSFS_CLASS_NET,de->d_name);
if ((ifidx = fopen(path,"r")) != NULL ) {
Ethernet service (부팅 시)
Ethernet Service 등록 Flow
   private ConnectivityService(Context context) {
  …
  if (DBG) Log.v(TAG, "Starting Ethernet Service");
       mEthernetStateTracker = new EthernetStateTracker(context,mHandler);
       EthernetService ethService = new EthernetService(context,
                                 mEthernetStateTracker);

public EthernetService(Context context, EthernetStateTracker Tracker){
                  mTracker = Tracker;
                  mContext = context;
                  isEthEnabled = getPersistedState();
                  Log.i(TAG,"Ethernet dev enabled " + isEthEnabled );
                  getDeviceNameList();
                  setEthState(isEthEnabled);
                  Log.i(TAG, "Trigger the ethernet monitor");
                  mTracker.StartPolling();
         }
Ethernet Service 등록 Flow(계속)
public EthernetService(Context context, EthernetStateTracker Tracker){
…
                  getDeviceNameList();
         }




public String[] getDeviceNameList() {
                   if (scanEthDevice() > 0 )
                             return DevName;
                   else
                             return null;
          }
Ethernet Service 등록 Flow(계속)
private int scanEthDevice() {
                      int i = 0,j;
                      if ((i = EthernetNative.getInterfaceCnt()) != 0) {
                                   Log.i(TAG, "total found "+i+ " net devices");
                                   DevName = new String[i];
                      }
                      else
                                   return i;

                      for (j = 0; j < i; j++) {
                                   DevName[j] = EthernetNative.getInterfaceName(j);
                                   if (DevName[j] == null)
                                              break;
                                   Log.i(TAG,"device " + j + " name " + DevName[j]);
                      }

                      return i;
           }
Ethernet Service 등록 Flow(계속)
static jint android_net_ethernet_getInterfaceCnt() {
      return total_int;
   }

                  static jint android_net_ethernet_initEthernetNative(JNIEnv *env,
                                                    jobject clazz)




                                      netlink_init_interfaces_list()




                       LOGI("interface %s:%d found",intfinfo->name,intfinfo->i);
                                 add_int_to_list(intfinfo);//에서 total_int ++
Ethernet Service 등록 Flow(계속)
static jstring android_net_ethernet_getInterfaceName(JNIEnv *env,
jobject clazz,                                  jint index) {
      info= interfaces;
      if (total_int != 0 && index <= (total_int -1)) {
          while (info != NULL) {
            if (index == i) {
                LOGI("Found :%s",info->name);
                return env->NewStringUTF(info->name);
                        static jint android_net_ethernet_initEthernetNative(JNIEnv *env,
  }                                                       jobject clazz)



                                           netlink_init_interfaces_list()



                                LOGI("interface %s:%d found",intfinfo->name,intfinfo->i);
                                           add_int_to_list(intfinfo);//에서 Node 생성
Ethernet Event 처리 쓰레드 생성
  public EthernetService(Context context, EthernetStateTrackerTracker){
             Log.i(TAG, "Trigger the ethernet monitor");
             mTracker.StartPolling();

                 쓰레드 생성


                                static jstring
                                android_net_ethernet_waitForEvent(JNIEnv *env,
                                                             jobject clazz)
                                   {
이더넷이 연결된 경우(DHCP)

MonitorTh    EthernetM
  read         onitor


Connectivi   EthernetSt
tyService    ateTracker
이더넷이 연결된 경우(DHCP)
static jstring android_net_ethernet_waitForEvent(JNIEnv *env,
                                 jobject clazz)
   {
if((len = recvmsg(nl_socket_poll, &msg, 0))>= 0) {



     MonitorThread.run
     .
     } else if (cmd == NEW_LINK) {
     event = PHYUP;
     handleEvent(events[i],event);
이더넷이 연결된 경우(DHCP)
void handleEvent(String ifname,int event) {
switch (event) {
case PHYUP:
 mTracker.notifyPhyConnected(ifname););
           break;




     public void notifyPhyConnected(String ifname) {
                if synchronized(this) {
                this.sendEmptyMessage(EVENT_HW_PHYCONNECTED);




                                                        MonitorThread
이더넷이 연결된 경우(DHCP)
public void handleMessage(Message msg) {
..
case EVENT_HW_PHYCONNECTED:
try {
           configureInterface(info);
}


    private boolean configureInterface(EthernetDevInfo info) throws
    UnknownHostException {
    if (info.getConnectMode().equals(EthernetDevInfo.ETH_CONN_MODE_DHCP))
    {
     mDhcpTarget.sendEmptyMessage(EVENT_DHCP_START);



                                                             DHCP
                                                             Handler
이더넷이 연결된 경우(DHCP)
public void handleMessage(Message msg) {
..
switch (msg.what) {
case EVENT_DHCP_START:
if (NetworkUtils.runDhcp(mInterfaceName, mDhcpInfo)) {}




    static jboolean android_net_utils_runDhcp(JNIEnv* env, jobject clazz, jstring
    ifname, jobject info)
    {
    result = ::dhcp_do_request(nameStr, &ipaddr, &gateway, &mask,
                             &dns1, &dns2, &server, &lease);

Contenu connexe

Tendances

The Ring programming language version 1.5.2 book - Part 76 of 181
The Ring programming language version 1.5.2 book - Part 76 of 181The Ring programming language version 1.5.2 book - Part 76 of 181
The Ring programming language version 1.5.2 book - Part 76 of 181Mahmoud Samir Fayed
 
JNI - Java & C in the same project
JNI - Java & C in the same projectJNI - Java & C in the same project
JNI - Java & C in the same projectKarol Wrótniak
 
Java concurrency begining
Java concurrency   beginingJava concurrency   begining
Java concurrency beginingmaksym220889
 
#5 (Remote Method Invocation)
#5 (Remote Method Invocation)#5 (Remote Method Invocation)
#5 (Remote Method Invocation)Ghadeer AlHasan
 
Advanced Java Practical File
Advanced Java Practical FileAdvanced Java Practical File
Advanced Java Practical FileSoumya Behera
 
Concurrency Concepts in Java
Concurrency Concepts in JavaConcurrency Concepts in Java
Concurrency Concepts in JavaDoug Hawkins
 
Chat application in java using swing and socket programming.
Chat application in java using swing and socket programming.Chat application in java using swing and socket programming.
Chat application in java using swing and socket programming.Kuldeep Jain
 
Cleanup and new optimizations in WPython 1.1
Cleanup and new optimizations in WPython 1.1Cleanup and new optimizations in WPython 1.1
Cleanup and new optimizations in WPython 1.1PyCon Italia
 
Java practice programs for beginners
Java practice programs for beginnersJava practice programs for beginners
Java practice programs for beginnersishan0019
 
Swiss army knife Spring
Swiss army knife SpringSwiss army knife Spring
Swiss army knife SpringMario Fusco
 
.NET Multithreading and File I/O
.NET Multithreading and File I/O.NET Multithreading and File I/O
.NET Multithreading and File I/OJussi Pohjolainen
 
Java Performance Puzzlers
Java Performance PuzzlersJava Performance Puzzlers
Java Performance PuzzlersDoug Hawkins
 

Tendances (20)

Android workshop
Android workshopAndroid workshop
Android workshop
 
The Ring programming language version 1.5.2 book - Part 76 of 181
The Ring programming language version 1.5.2 book - Part 76 of 181The Ring programming language version 1.5.2 book - Part 76 of 181
The Ring programming language version 1.5.2 book - Part 76 of 181
 
Sam wd programs
Sam wd programsSam wd programs
Sam wd programs
 
Kotlin Generation
Kotlin GenerationKotlin Generation
Kotlin Generation
 
分散式系統
分散式系統分散式系統
分散式系統
 
IKH331-07-java-rmi
IKH331-07-java-rmiIKH331-07-java-rmi
IKH331-07-java-rmi
 
JNI - Java & C in the same project
JNI - Java & C in the same projectJNI - Java & C in the same project
JNI - Java & C in the same project
 
Java concurrency begining
Java concurrency   beginingJava concurrency   begining
Java concurrency begining
 
JVM Mechanics
JVM MechanicsJVM Mechanics
JVM Mechanics
 
#5 (Remote Method Invocation)
#5 (Remote Method Invocation)#5 (Remote Method Invocation)
#5 (Remote Method Invocation)
 
Advanced Java Practical File
Advanced Java Practical FileAdvanced Java Practical File
Advanced Java Practical File
 
Concurrency Concepts in Java
Concurrency Concepts in JavaConcurrency Concepts in Java
Concurrency Concepts in Java
 
Chat application in java using swing and socket programming.
Chat application in java using swing and socket programming.Chat application in java using swing and socket programming.
Chat application in java using swing and socket programming.
 
Guice2.0
Guice2.0Guice2.0
Guice2.0
 
Cleanup and new optimizations in WPython 1.1
Cleanup and new optimizations in WPython 1.1Cleanup and new optimizations in WPython 1.1
Cleanup and new optimizations in WPython 1.1
 
Java practice programs for beginners
Java practice programs for beginnersJava practice programs for beginners
Java practice programs for beginners
 
Grid gain paper
Grid gain paperGrid gain paper
Grid gain paper
 
Swiss army knife Spring
Swiss army knife SpringSwiss army knife Spring
Swiss army knife Spring
 
.NET Multithreading and File I/O
.NET Multithreading and File I/O.NET Multithreading and File I/O
.NET Multithreading and File I/O
 
Java Performance Puzzlers
Java Performance PuzzlersJava Performance Puzzlers
Java Performance Puzzlers
 

Similaire à 망고100 보드로 놀아보자 19

Connecting to the network
Connecting to the networkConnecting to the network
Connecting to the networkMu Chun Wang
 
Category theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) DataCategory theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) Datagreenwop
 
Non Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJavaNon Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJavaFrank Lyaruu
 
Orsiso
OrsisoOrsiso
Orsisoe27
 
比XML更好用的Java Annotation
比XML更好用的Java Annotation比XML更好用的Java Annotation
比XML更好用的Java Annotationjavatwo2011
 
Threads, Queues, and More: Async Programming in iOS
Threads, Queues, and More: Async Programming in iOSThreads, Queues, and More: Async Programming in iOS
Threads, Queues, and More: Async Programming in iOSTechWell
 
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageabilityDaniel Fisher
 
GDG Devfest 2019 - Build go kit microservices at kubernetes with ease
GDG Devfest 2019 - Build go kit microservices at kubernetes with easeGDG Devfest 2019 - Build go kit microservices at kubernetes with ease
GDG Devfest 2019 - Build go kit microservices at kubernetes with easeKAI CHU CHUNG
 
Tech Talk: App Functionality (Android)
Tech Talk: App Functionality (Android)Tech Talk: App Functionality (Android)
Tech Talk: App Functionality (Android)Lifeparticle
 
Networking and Data Access with Eqela
Networking and Data Access with EqelaNetworking and Data Access with Eqela
Networking and Data Access with Eqelajobandesther
 
MultiClient chatting berbasis gambar
MultiClient chatting berbasis gambarMultiClient chatting berbasis gambar
MultiClient chatting berbasis gambaryoyomay93
 
Laporan multiclient chatting berbasis grafis (gambar)
Laporan multiclient chatting berbasis grafis (gambar)Laporan multiclient chatting berbasis grafis (gambar)
Laporan multiclient chatting berbasis grafis (gambar)Rara Ariesta
 
OSGi World Congress Workshop Exercise - P Kriens
OSGi World Congress Workshop Exercise - P KriensOSGi World Congress Workshop Exercise - P Kriens
OSGi World Congress Workshop Exercise - P Kriensmfrancis
 
Async Best Practices
Async Best PracticesAsync Best Practices
Async Best PracticesLluis Franco
 

Similaire à 망고100 보드로 놀아보자 19 (20)

Connecting to the network
Connecting to the networkConnecting to the network
Connecting to the network
 
IoT Best practices
 IoT Best practices IoT Best practices
IoT Best practices
 
In kor we Trust
In kor we TrustIn kor we Trust
In kor we Trust
 
Category theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) DataCategory theory, Monads, and Duality in the world of (BIG) Data
Category theory, Monads, and Duality in the world of (BIG) Data
 
Non Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJavaNon Blocking I/O for Everyone with RxJava
Non Blocking I/O for Everyone with RxJava
 
Orsiso
OrsisoOrsiso
Orsiso
 
Multithreading in Java
Multithreading in JavaMultithreading in Java
Multithreading in Java
 
比XML更好用的Java Annotation
比XML更好用的Java Annotation比XML更好用的Java Annotation
比XML更好用的Java Annotation
 
Threads, Queues, and More: Async Programming in iOS
Threads, Queues, and More: Async Programming in iOSThreads, Queues, and More: Async Programming in iOS
Threads, Queues, and More: Async Programming in iOS
 
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
2008 - TechDays PT: WCF, JSON and AJAX for performance and manageability
 
Socket Programming
Socket ProgrammingSocket Programming
Socket Programming
 
GDG Devfest 2019 - Build go kit microservices at kubernetes with ease
GDG Devfest 2019 - Build go kit microservices at kubernetes with easeGDG Devfest 2019 - Build go kit microservices at kubernetes with ease
GDG Devfest 2019 - Build go kit microservices at kubernetes with ease
 
Nantes Jug - Java 7
Nantes Jug - Java 7Nantes Jug - Java 7
Nantes Jug - Java 7
 
Tech Talk: App Functionality (Android)
Tech Talk: App Functionality (Android)Tech Talk: App Functionality (Android)
Tech Talk: App Functionality (Android)
 
Networking and Data Access with Eqela
Networking and Data Access with EqelaNetworking and Data Access with Eqela
Networking and Data Access with Eqela
 
MultiClient chatting berbasis gambar
MultiClient chatting berbasis gambarMultiClient chatting berbasis gambar
MultiClient chatting berbasis gambar
 
Laporan multiclient chatting berbasis grafis (gambar)
Laporan multiclient chatting berbasis grafis (gambar)Laporan multiclient chatting berbasis grafis (gambar)
Laporan multiclient chatting berbasis grafis (gambar)
 
OSGi World Congress Workshop Exercise - P Kriens
OSGi World Congress Workshop Exercise - P KriensOSGi World Congress Workshop Exercise - P Kriens
OSGi World Congress Workshop Exercise - P Kriens
 
Async Best Practices
Async Best PracticesAsync Best Practices
Async Best Practices
 
Computer networkppt4577
Computer networkppt4577Computer networkppt4577
Computer networkppt4577
 

Plus de 종인 전

Quick start guide-mango-am335x
Quick start guide-mango-am335xQuick start guide-mango-am335x
Quick start guide-mango-am335x종인 전
 
망고100 메뉴얼 환경부터포팅까지-2011-0324
망고100 메뉴얼 환경부터포팅까지-2011-0324망고100 메뉴얼 환경부터포팅까지-2011-0324
망고100 메뉴얼 환경부터포팅까지-2011-0324종인 전
 
(망고210& Gingerbread) u-boot 컴파일 및 다운로드
(망고210& Gingerbread) u-boot 컴파일 및 다운로드(망고210& Gingerbread) u-boot 컴파일 및 다운로드
(망고210& Gingerbread) u-boot 컴파일 및 다운로드종인 전
 
망고210 android fastboot nand write 방법
망고210 android fastboot nand write 방법망고210 android fastboot nand write 방법
망고210 android fastboot nand write 방법종인 전
 
망고210 매뉴얼 2010 12-30
망고210 매뉴얼 2010 12-30망고210 매뉴얼 2010 12-30
망고210 매뉴얼 2010 12-30종인 전
 
망고100 보드로 놀아보자 18
망고100 보드로 놀아보자 18망고100 보드로 놀아보자 18
망고100 보드로 놀아보자 18종인 전
 
망고100(s5 pc100),망고64(s3c6410) 구입멤버대상 안드로이드포팅강좌
망고100(s5 pc100),망고64(s3c6410) 구입멤버대상 안드로이드포팅강좌망고100(s5 pc100),망고64(s3c6410) 구입멤버대상 안드로이드포팅강좌
망고100(s5 pc100),망고64(s3c6410) 구입멤버대상 안드로이드포팅강좌종인 전
 
망고100 보드로 놀아보자 17
망고100 보드로 놀아보자 17망고100 보드로 놀아보자 17
망고100 보드로 놀아보자 17종인 전
 
망고100 보드로 놀아보자 16
망고100 보드로 놀아보자 16망고100 보드로 놀아보자 16
망고100 보드로 놀아보자 16종인 전
 
망고100 보드로 놀아보자 15
망고100 보드로 놀아보자 15망고100 보드로 놀아보자 15
망고100 보드로 놀아보자 15종인 전
 
망고100 보드로 놀아보자 14
망고100 보드로 놀아보자 14망고100 보드로 놀아보자 14
망고100 보드로 놀아보자 14종인 전
 
망고100 보드로 놀아보자 13
망고100 보드로 놀아보자  13망고100 보드로 놀아보자  13
망고100 보드로 놀아보자 13종인 전
 
망고100 보드로 놀아보자 12
망고100 보드로 놀아보자  12망고100 보드로 놀아보자  12
망고100 보드로 놀아보자 12종인 전
 
망고100 보드로 놀아보자 11
망고100 보드로 놀아보자  11망고100 보드로 놀아보자  11
망고100 보드로 놀아보자 11종인 전
 
망고100 보드로 놀아보자 10
망고100 보드로 놀아보자 10망고100 보드로 놀아보자 10
망고100 보드로 놀아보자 10종인 전
 
Mango64 u boot 업데이트 하기
Mango64 u boot 업데이트 하기Mango64 u boot 업데이트 하기
Mango64 u boot 업데이트 하기종인 전
 
망고100 보드로 놀아보자 9
망고100 보드로 놀아보자 9망고100 보드로 놀아보자 9
망고100 보드로 놀아보자 9종인 전
 
망고100 보드로 놀아보자 9
망고100 보드로 놀아보자 9망고100 보드로 놀아보자 9
망고100 보드로 놀아보자 9종인 전
 
망고64(s3 c6410) 부팅모드
망고64(s3 c6410) 부팅모드망고64(s3 c6410) 부팅모드
망고64(s3 c6410) 부팅모드종인 전
 
망고64 부품도
망고64 부품도망고64 부품도
망고64 부품도종인 전
 

Plus de 종인 전 (20)

Quick start guide-mango-am335x
Quick start guide-mango-am335xQuick start guide-mango-am335x
Quick start guide-mango-am335x
 
망고100 메뉴얼 환경부터포팅까지-2011-0324
망고100 메뉴얼 환경부터포팅까지-2011-0324망고100 메뉴얼 환경부터포팅까지-2011-0324
망고100 메뉴얼 환경부터포팅까지-2011-0324
 
(망고210& Gingerbread) u-boot 컴파일 및 다운로드
(망고210& Gingerbread) u-boot 컴파일 및 다운로드(망고210& Gingerbread) u-boot 컴파일 및 다운로드
(망고210& Gingerbread) u-boot 컴파일 및 다운로드
 
망고210 android fastboot nand write 방법
망고210 android fastboot nand write 방법망고210 android fastboot nand write 방법
망고210 android fastboot nand write 방법
 
망고210 매뉴얼 2010 12-30
망고210 매뉴얼 2010 12-30망고210 매뉴얼 2010 12-30
망고210 매뉴얼 2010 12-30
 
망고100 보드로 놀아보자 18
망고100 보드로 놀아보자 18망고100 보드로 놀아보자 18
망고100 보드로 놀아보자 18
 
망고100(s5 pc100),망고64(s3c6410) 구입멤버대상 안드로이드포팅강좌
망고100(s5 pc100),망고64(s3c6410) 구입멤버대상 안드로이드포팅강좌망고100(s5 pc100),망고64(s3c6410) 구입멤버대상 안드로이드포팅강좌
망고100(s5 pc100),망고64(s3c6410) 구입멤버대상 안드로이드포팅강좌
 
망고100 보드로 놀아보자 17
망고100 보드로 놀아보자 17망고100 보드로 놀아보자 17
망고100 보드로 놀아보자 17
 
망고100 보드로 놀아보자 16
망고100 보드로 놀아보자 16망고100 보드로 놀아보자 16
망고100 보드로 놀아보자 16
 
망고100 보드로 놀아보자 15
망고100 보드로 놀아보자 15망고100 보드로 놀아보자 15
망고100 보드로 놀아보자 15
 
망고100 보드로 놀아보자 14
망고100 보드로 놀아보자 14망고100 보드로 놀아보자 14
망고100 보드로 놀아보자 14
 
망고100 보드로 놀아보자 13
망고100 보드로 놀아보자  13망고100 보드로 놀아보자  13
망고100 보드로 놀아보자 13
 
망고100 보드로 놀아보자 12
망고100 보드로 놀아보자  12망고100 보드로 놀아보자  12
망고100 보드로 놀아보자 12
 
망고100 보드로 놀아보자 11
망고100 보드로 놀아보자  11망고100 보드로 놀아보자  11
망고100 보드로 놀아보자 11
 
망고100 보드로 놀아보자 10
망고100 보드로 놀아보자 10망고100 보드로 놀아보자 10
망고100 보드로 놀아보자 10
 
Mango64 u boot 업데이트 하기
Mango64 u boot 업데이트 하기Mango64 u boot 업데이트 하기
Mango64 u boot 업데이트 하기
 
망고100 보드로 놀아보자 9
망고100 보드로 놀아보자 9망고100 보드로 놀아보자 9
망고100 보드로 놀아보자 9
 
망고100 보드로 놀아보자 9
망고100 보드로 놀아보자 9망고100 보드로 놀아보자 9
망고100 보드로 놀아보자 9
 
망고64(s3 c6410) 부팅모드
망고64(s3 c6410) 부팅모드망고64(s3 c6410) 부팅모드
망고64(s3 c6410) 부팅모드
 
망고64 부품도
망고64 부품도망고64 부품도
망고64 부품도
 

망고100 보드로 놀아보자 19

  • 1. 망고100 보드로 놀아보자-19 Android Ethernet 분석 http://cafe.naver.com/embeddedcrazyboys http://www.mangoboard.com
  • 5. Setting.xml 과 IconPreferenceScreen <com.android.settings.IconPreferenceScreen android:title="@string/eth_radio_ctrl_title" settings:icon="@drawable/ic_settings_ethernet"> <intent android:action="android.intent.action.MAIN" android:targetPackage="com.android.settings" android:targetClass="com.android.settings.EthernetSettings" /> </com.android.settings.IconPreferenceScreen>
  • 6. XML과 EthernetSettings class관계 <com.android.settings.IconPreferenceScreen android:title="@string/eth_radio_ctrl_title" settings:icon="@drawable/ic_settings_ethernet"> <intent android:action="android.intent.action.MAIN" android:targetPackage="com.android.settings" android:targetClass="com.android.settings.EthernetSettings" /> </com.android.settings.IconPreferenceScreen>
  • 7. Ethernet Service 초기화 (EthernetManager) getSystemService(ETH_SERVICE), ./packages/apps/Settings/src/com/android/settings/EthernetSettings.java }else if (ETH_SERVICE.equals(name)) { return getEthernetManager(); ./frameworks/base/core/java/android/app/ApplicationContext.java private EthernetManager getEthernetManager() { synchronized (sSync) { if (sEthManager == null) { IBinder b = ServiceManager.getService(ETH_SERVICE); IEthernetManager service = IEthernetManager.Stub.asInterface(b); sEthManager = new EthernetManager(service, mMainThread.getHandler()); ./frameworks/base/core/java/android/app/ApplicationContext.java
  • 8. Service Manager Ethernet 등록 private EthernetManager getEthernetManager() { synchronized (sSync) { if (sEthManager == null) { IBinder b = ServiceManager.getService(ETH_SERVICE); IEthernetManager service = IEthernetManager.Stub.asInterface(b); sEthManager = new EthernetManager(service, mMainThread.getHandler()); ./frameworks/base/core/java/android/app/ApplicationContext.java Connectivity service에서 등록 private ConnectivityService(Context context) { …. ServiceManager.addService(Context.ETH_SERVICE, ethService); ./frameworks/base/services/java/com/android/server/ConnectivityService.java
  • 9. Service Manager 역할 POWER_SERVICE CONNECTIVITY_S Service ETH_SERVICE manager ERVICE …
  • 10. Connectivity Service wifi ethernet Connectivity mms service ….
  • 11. Ethernet service (부팅 시) private ConnectivityService(Context context) { if (DBG) Log.v(TAG, "ConnectivityService starting up"); if (DBG) Log.v(TAG, "Starting Ethernet Service"); mEthernetStateTracker = new EthernetStateTracker(context,mHandler); EthernetService ethService = new EthernetService(context, mEthernetStateTracker); ServiceManager.addService(Context.ETH_SERVICE, ethService); mNetTrackers[ConnectivityManager.TYPE_ETH] = mEthernetStateTracker;
  • 12. Ethernetsuper는 자손클래스에서 조상클래스로부터 상속받은 멤버를 참 service조하는데 사용되는 참조변수 (부팅 시) public EthernetStateTracker(Context context, Handler target) { super(context, target, ConnectivityManager.TYPE_ETH, 0, "ETH", ""); Log.i(TAG,"Starts..."); if(EthernetNative.initEthernetNative() != 0 ) { Log.e(TAG,"Can not init ethernet device layers"); return; }
  • 13. Ethernet service (부팅 시) static JNINativeMethod gEthernetMethods[] = { {"waitForEvent", "()Ljava/lang/String;“, (void *)android_net_ethernet_waitForEvent}, {"getInterfaceName", "(I)Ljava/lang/String;“, void )android_net_ethernet_getInterfaceName}, {"initEthernetNative", "()I“, (void *)android_net_ethernet_initEthernetNative}, {"getInterfaceCnt","()I“, (void *)android_net_ethernet_getInterfaceCnt} }; static jint android_net_ethernet_initEthernetNative(JNIEnv *env, jobject clazz) { if ((ret = netlink_init_interfaces_list()) < 0) {
  • 14. Ethernet service (부팅 시) static int netlink_init_interfaces_list(void) { .. if ((netdir = opendir(SYSFS_CLASS_NET)) != NULL) { while((de = readdir(netdir))!=NULL) { static const char SYSFS_CLASS_NET[] = "/sys/class/net"; snprintf(path, SYSFS_PATH_MAX,"%s/%s/ifindex",SYSFS_CLASS_NET,de->d_name); if ((ifidx = fopen(path,"r")) != NULL ) {
  • 16. Ethernet Service 등록 Flow private ConnectivityService(Context context) { … if (DBG) Log.v(TAG, "Starting Ethernet Service"); mEthernetStateTracker = new EthernetStateTracker(context,mHandler); EthernetService ethService = new EthernetService(context, mEthernetStateTracker); public EthernetService(Context context, EthernetStateTracker Tracker){ mTracker = Tracker; mContext = context; isEthEnabled = getPersistedState(); Log.i(TAG,"Ethernet dev enabled " + isEthEnabled ); getDeviceNameList(); setEthState(isEthEnabled); Log.i(TAG, "Trigger the ethernet monitor"); mTracker.StartPolling(); }
  • 17. Ethernet Service 등록 Flow(계속) public EthernetService(Context context, EthernetStateTracker Tracker){ … getDeviceNameList(); } public String[] getDeviceNameList() { if (scanEthDevice() > 0 ) return DevName; else return null; }
  • 18. Ethernet Service 등록 Flow(계속) private int scanEthDevice() { int i = 0,j; if ((i = EthernetNative.getInterfaceCnt()) != 0) { Log.i(TAG, "total found "+i+ " net devices"); DevName = new String[i]; } else return i; for (j = 0; j < i; j++) { DevName[j] = EthernetNative.getInterfaceName(j); if (DevName[j] == null) break; Log.i(TAG,"device " + j + " name " + DevName[j]); } return i; }
  • 19. Ethernet Service 등록 Flow(계속) static jint android_net_ethernet_getInterfaceCnt() { return total_int; } static jint android_net_ethernet_initEthernetNative(JNIEnv *env, jobject clazz) netlink_init_interfaces_list() LOGI("interface %s:%d found",intfinfo->name,intfinfo->i); add_int_to_list(intfinfo);//에서 total_int ++
  • 20. Ethernet Service 등록 Flow(계속) static jstring android_net_ethernet_getInterfaceName(JNIEnv *env, jobject clazz, jint index) { info= interfaces; if (total_int != 0 && index <= (total_int -1)) { while (info != NULL) { if (index == i) { LOGI("Found :%s",info->name); return env->NewStringUTF(info->name); static jint android_net_ethernet_initEthernetNative(JNIEnv *env, } jobject clazz) netlink_init_interfaces_list() LOGI("interface %s:%d found",intfinfo->name,intfinfo->i); add_int_to_list(intfinfo);//에서 Node 생성
  • 21. Ethernet Event 처리 쓰레드 생성 public EthernetService(Context context, EthernetStateTrackerTracker){ Log.i(TAG, "Trigger the ethernet monitor"); mTracker.StartPolling(); 쓰레드 생성 static jstring android_net_ethernet_waitForEvent(JNIEnv *env, jobject clazz) {
  • 22. 이더넷이 연결된 경우(DHCP) MonitorTh EthernetM read onitor Connectivi EthernetSt tyService ateTracker
  • 23. 이더넷이 연결된 경우(DHCP) static jstring android_net_ethernet_waitForEvent(JNIEnv *env, jobject clazz) { if((len = recvmsg(nl_socket_poll, &msg, 0))>= 0) { MonitorThread.run . } else if (cmd == NEW_LINK) { event = PHYUP; handleEvent(events[i],event);
  • 24. 이더넷이 연결된 경우(DHCP) void handleEvent(String ifname,int event) { switch (event) { case PHYUP: mTracker.notifyPhyConnected(ifname);); break; public void notifyPhyConnected(String ifname) { if synchronized(this) { this.sendEmptyMessage(EVENT_HW_PHYCONNECTED); MonitorThread
  • 25. 이더넷이 연결된 경우(DHCP) public void handleMessage(Message msg) { .. case EVENT_HW_PHYCONNECTED: try { configureInterface(info); } private boolean configureInterface(EthernetDevInfo info) throws UnknownHostException { if (info.getConnectMode().equals(EthernetDevInfo.ETH_CONN_MODE_DHCP)) { mDhcpTarget.sendEmptyMessage(EVENT_DHCP_START); DHCP Handler
  • 26. 이더넷이 연결된 경우(DHCP) public void handleMessage(Message msg) { .. switch (msg.what) { case EVENT_DHCP_START: if (NetworkUtils.runDhcp(mInterfaceName, mDhcpInfo)) {} static jboolean android_net_utils_runDhcp(JNIEnv* env, jobject clazz, jstring ifname, jobject info) { result = ::dhcp_do_request(nameStr, &ipaddr, &gateway, &mask, &dns1, &dns2, &server, &lease);