Your SlideShare is downloading. ×
안드로이드 와 디바이스 드라이버 적용 기법
Upcoming SlideShare
Loading in...5
×

Thanks for flagging this SlideShare!

Oops! An error has occurred.

×

Saving this for later?

Get the SlideShare app to save on your phone or tablet. Read anywhere, anytime - even offline.

Text the download link to your phone

Standard text messaging rates apply

안드로이드 와 디바이스 드라이버 적용 기법

17,601
views

Published on

안드로이드 와 디바이스 드라이버 적용 기법

안드로이드 와 디바이스 드라이버 적용 기법

Published in: Education

0 Comments
8 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
17,601
On Slideshare
0
From Embeds
0
Number of Embeds
1
Actions
Shares
0
Downloads
463
Comments
0
Likes
8
Embeds 0
No embeds

Report content
Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
No notes for slide

Transcript

  • 1. 2010. 09 안드로이드안드로이드 와와 디바이스디바이스 드라이버드라이버 적용적용 기법기법 에프에이리눅스㈜에프에이리눅스㈜ 유영창유영창
  • 2. 안드로이드와 리눅스 커널안드로이드와안드로이드와 리눅스리눅스 커널커널
  • 3. 안드로이드와 리눅스 커널안드로이드와안드로이드와 리눅스리눅스 커널커널 2.6.29 – 적용 버전 2.6.33 • 안드로이드 커널 제거 • 포크 중? 구글의 공식적인 응답? http://android.git.kernel.org/ 2.6.292.6.29 –– 적용적용 버전버전 2.6.332.6.33 •• 안드로이드안드로이드 커널커널 제거제거 •• 포크포크 중중?? 구글의구글의 공식적인공식적인 응답응답?? http://android.git.kernel.org/http://android.git.kernel.org/
  • 4. insmodinsmod module_init( fabase_init )module_init( fabase_init ) fabase_init()fabase_init() platform_driver_register(&fabase_driver) struct platform_driver fabase_driverstruct platform_driver fabase_driver .probe = fabase_probe .remove = fabase_remove .suspend = fabase_suspend .resume = fabase_resume .driver = { .name = FABASE_DEVICE_DRIVER_NAME, } platform_device_register_simple( FABASE_DEVICE_DRIVER_NAME fabase_probe()fabase_probe() 기본 디바이스 드라이버 구조기본기본 디바이스디바이스 드라이버드라이버 구조구조
  • 5. 기본 디바이스 드라이버 구조기본기본 디바이스디바이스 드라이버드라이버 구조구조 rmmodrmmod module_exit(fabase_exit)module_exit(fabase_exit) fabase_exit()fabase_exit() platform_device_unregister(fabase_device) struct platform_driver fabase_driverstruct platform_driver fabase_driver .probe = fabase_probe .remove = fabase_remove .suspend = fabase_suspend .resume = fabase_resume .driver = { .name = FABASE_DEVICE_DRIVER_NAME, } fabase_remove()fabase_remove()
  • 6. 기본 디바이스 드라이버 구조기본기본 디바이스디바이스 드라이버드라이버 구조구조 struct platform_device *platform_device_register_simple ( const char *name, int id, struct resource *, unsigned int ); void platform_device_unregister( struct platform_device *pdev );
  • 7. 기본 디바이스 드라이버 구조기본기본 디바이스디바이스 드라이버드라이버 구조구조 int platform_device_register( struct platform_device * pdev ); void platform_device_del( struct platform_device *pdev );
  • 8. 기본 디바이스 드라이버 구조기본기본 디바이스디바이스 드라이버드라이버 구조구조 [root@falinux nfs]$ insmod fa_virtual.ko IORESOURCE_MEM 0 -> [10000000:1FFFFFFF] IORESOURCE_MEM 1 -> [20000000:2FFFFFFF] IORESOURCE_IRQ 0 -> [00000003:00000004] IORESOURCE_IRQ 1 -> [00000005:00000006] [root@falinux nfs]$ lsmod Module Size Used by Not tainted fa_virtual 2140 0 [root@falinux nfs]$ rmmod fa_virtual.ko
  • 9. 디바이스 드라이버 사용디바이스디바이스 드라이버드라이버 사용사용 디바이스 드라이버 응용 프로그램 struct file_operations xxx_fop = { open : xxx_open, read : xxx_read, write : xxx_write, ioctl : xxx_ioctl, release : xxx_release }; xxx_exit( . . . ) { : } open( . . . ) read( . . . ) write( . . . ) ioctl( . . . ) close( . . . ) insmod rmmod Hardware interrupt xxx_init( . . . ) { : } xxx_interrupt( . . . ) { : } xxx_open( . . . ) { : } xxx_read( . . . ) { : } xxx_write( . . . ) { : } xxx_ioctl( . . . ) { : } xxx_release( . . . ) { : }
  • 10. (1) JNI 를 응용한 제어 방식(1) JNI(1) JNI 를를 응용한응용한 제어제어 방식방식 디바이스 드라이버디바이스 드라이버 H/WH/W JAVA 어플리케이션JAVA 어플리케이션 JNIJNI
  • 11. (2) 어플리케이션 제어 방식(2)(2) 어플리케이션어플리케이션 제어제어 방식방식 디바이스 드라이버디바이스 드라이버 H/WH/W JAVA 어플리케이션JAVA 어플리케이션 C 데몬C 데몬 LOCAL NETWORK (127.0.0.1) TCP or UDP LOCAL NETWORK (127.0.0.1) TCP or UDP
  • 12. 안드로이드 NDK안드로이드안드로이드 NDKNDK 안드로이드가 제공하는 각종 어플리케이션들은 Java 하드웨어를 직접 제어해야 하는 프레임워크 영역은 C/C++ 안드로이드가안드로이드가 제공하는제공하는 각종각종 어플리케이션들은어플리케이션들은 JavaJava 하드웨어를하드웨어를 직접직접 제어해야제어해야 하는하는 프레임워크프레임워크 영역은영역은 C/C++C/C++
  • 13. 안드로이드 NDK안드로이드안드로이드 NDKNDK Bionic LIBCBionic LIBCBionic LIBC BIONIC LIBCBIONIC LIBC GNU LIBCGNU LIBC Bionic LIBCBionic LIBC에서에서 사용할사용할 수수 있는있는 각종각종 시스템시스템 함수함수 목록목록 {ANDROID_SROUCE}/ bionic/libc/SYSCALLS.txt{ANDROID_SROUCE}/ bionic/libc/SYSCALLS.txt
  • 14. 안드로이드 NDK안드로이드안드로이드 NDKNDK
  • 15. 안드로이드 NDK안드로이드안드로이드 NDKNDK NDK 툴체인 추출 $ mkdir arm-eabi-4.2.1 $ cd arm-eabi-4.2.1 $ cp –a {NDK_DIR}/build/prebuilt/linux-x86/arm-eabi-4.2.1/* . $ cp –a {NDK_DIR}/build/platform/android-5/arch-arm/usr/include ./arm-eabi/. $ cp –a {NDK_DIR}/build/platform/android-5/arch-arm/usr/lib ./arm-eabi/. $ mkdir arm-eabi-4.2.1 $ cd arm-eabi-4.2.1 $ cp –a {NDK_DIR}/build/prebuilt/linux-x86/arm-eabi-4.2.1/* . $ cp –a {NDK_DIR}/build/platform/android-5/arch-arm/usr/include ./arm-eabi/. $ cp –a {NDK_DIR}/build/platform/android-5/arch-arm/usr/lib ./arm-eabi/. Get Android toolchain from NDKGet Android toolchain from NDK
  • 16. 안드로이드 NDK안드로이드안드로이드 NDKNDK NDK 루트 디렉토리
  • 17. C 언어 어플리케이션 적용CC 언어언어 어플리케이션어플리케이션 적용적용 데몬 프로세스 service mydemon /usr/bin/mydemon oneshot service mydemon /usr/bin/mydemon oneshot Android demon script sample – init.rcAndroid demon script sample – init.rc
  • 18. JNI 적용JNIJNI 적용적용 Build the Hello-JNI $ cd {NDK_DIR}/samples/hello-jni $ {NDK_DIR}/ndk-build $ cd {NDK_DIR}/samples/hello-jni $ {NDK_DIR}/ndk-build Change directory to hello-jni in NDKChange directory to hello-jni in NDK $ cd ~/project/android-ndk-r4//samples/hello-jni $ ~/project/android-ndk-r4/ndk-build Gdbserver : [arm-eabi-4.4.0] /home/hyowon/project/android-ndk-r4/samples/hello- jni/libs/armeabi/gdbserver Gdbsetup : /home/hyowon/project/android-ndk-r4/samples/hello-jni/libs/armeabi/gdb.setup Gdbsetup : + source directory /home/hyowon/project/android-ndk-r4/samples/hello-jni/jni Compile thumb : hello-jni <= /home/hyowon/project/android-ndk-r4/samples/hello-jni/jni/hello- jni.c SharedLibrary : libhello-jni.so Install : libhello-jni.so => /home/hyowon/project/android-ndk-r4/samples/hello- jni/libs/armeabi $ cd ~/project/android-ndk-r4//samples/hello-jni $ ~/project/android-ndk-r4/ndk-build Gdbserver : [arm-eabi-4.4.0] /home/hyowon/project/android-ndk-r4/samples/hello- jni/libs/armeabi/gdbserver Gdbsetup : /home/hyowon/project/android-ndk-r4/samples/hello-jni/libs/armeabi/gdb.setup Gdbsetup : + source directory /home/hyowon/project/android-ndk-r4/samples/hello-jni/jni Compile thumb : hello-jni <= /home/hyowon/project/android-ndk-r4/samples/hello-jni/jni/hello- jni.c SharedLibrary : libhello-jni.so Install : libhello-jni.so => /home/hyowon/project/android-ndk-r4/samples/hello- jni/libs/armeabi Succeed message from NDKSucceed message from NDK
  • 19. JNI 적용JNIJNI 적용적용 Hello-JNI 프로젝트 불러오기 Create project from existing sourceCreate project from existing source Project TreeProject Tree
  • 20. JNI 적용JNIJNI 적용적용 Hello-JNI 프로젝트 실행 Screenshot of Hello-JNI sampleScreenshot of Hello-JNI sample
  • 21. JNI 적용JNIJNI 적용적용 hello-jni.c #include <string.h> #include <jni.h> /* HelloJni.java 파일이 호출하는 JNI의 네이티브 메소드 */ jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject this ) { return (*env)->NewStringUTF(env, "Hello from JNI !"); } #include <string.h> #include <jni.h> /* HelloJni.java 파일이 호출하는 JNI의 네이티브 메소드 */ jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject this ) { return (*env)->NewStringUTF(env, "Hello from JNI !"); } ①① ②② ③③ 패키지 이름 클래스 이름 함수 이름 ①① ②② ③③
  • 22. JNI 적용JNIJNI 적용적용 HelloJni.java package com.example.hellojni; import android.app.Activity; import android.widget.TextView; import android.os.Bundle; public class HelloJni extends Activity { /* 처음으로 호출되는 액티비티 */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* TextView를 생성하고 콘텐트를 지정한다. stringFromJNI() 함수에서 JNI로 글자를 가져온다. */ TextView tv = new TextView(this); tv.setText( stringFromJNI() ); setContentView(tv); } /* 네이티브 메소드가 'hello-jni' 네이티브 라이브러리에서 불러지도록 한다. */ public native String stringFromJNI(); public native String unimplementedStringFromJNI(); /* hello-jni 라이브러리를 어플리케이션으로 불러온다. */ static { System.loadLibrary("hello-jni"); } } package com.example.hellojni; import android.app.Activity; import android.widget.TextView; import android.os.Bundle; public class HelloJni extends Activity { /* 처음으로 호출되는 액티비티 */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* TextView를 생성하고 콘텐트를 지정한다. stringFromJNI() 함수에서 JNI로 글자를 가져온다. */ TextView tv = new TextView(this); tv.setText( stringFromJNI() ); setContentView(tv); } /* 네이티브 메소드가 'hello-jni' 네이티브 라이브러리에서 불러지도록 한다. */ public native String stringFromJNI(); public native String unimplementedStringFromJNI(); /* hello-jni 라이브러리를 어플리케이션으로 불러온다. */ static { System.loadLibrary("hello-jni"); } } ①① ②② ③③
  • 23. 안드로이드 디바이스 드라이버안드로이드안드로이드 디바이스디바이스 드라이버드라이버 Binder - IPC ashmem - Android shared memory pmem - Process memory allocator logger - system logging facilit wakelock - used for power management oom handling - lowmem notifications alarm paranoid network security timed gpio - Generic gpio is a mechanism to allow programs to access and manipulate gpio registers from user space RAM_CONSOLE http://elinux.org/Android_Kernel_Features#Important_update BinderBinder -- IPCIPC ashmemashmem -- Android shared memoryAndroid shared memory pmempmem -- Process memory allocatorProcess memory allocator loggerlogger -- system logging facilitsystem logging facilit wakelockwakelock -- used for power managementused for power management oom handlingoom handling -- lowmem notificationslowmem notifications alarmalarm paranoid network securityparanoid network security timed gpiotimed gpio -- Generic gpio is a mechanismGeneric gpio is a mechanism to allow programs to access andto allow programs to access and manipulate gpio registers frommanipulate gpio registers from user spaceuser space RAM_CONSOLERAM_CONSOLE http://elinux.org/Android_Kernel_Features#Important_updatehttp://elinux.org/Android_Kernel_Features#Important_update
  • 24. 안드로이드 디바이스 드라이버안드로이드안드로이드 디바이스디바이스 드라이버드라이버 Binder drivers/android/binder.c include/linux/binder.h drivers/android/binder.cdrivers/android/binder.c include/linux/binder.hinclude/linux/binder.h
  • 25. 안드로이드 디바이스 드라이버안드로이드안드로이드 디바이스디바이스 드라이버드라이버 ashmem mm/ashmem.c ioctl * ASHMEM_SET_NAME * ASHMEM_GET_NAME * ASHMEM_SET_SIZE * ASHMEM_GET_SIZE * ASHMEM_SET_PROT_MASK * ASHMEM_GET_PROT_MASK * ASHMEM_PIN * ASHMEM_UNPIN * ASHMEM_GET_PIN_STATUS * ASHMEM_PURGE_ALL_CACHES mm/ashmem.cmm/ashmem.c ioctlioctl * ASHMEM_SET_NAME* ASHMEM_SET_NAME * ASHMEM_GET_NAME* ASHMEM_GET_NAME * ASHMEM_SET_SIZE* ASHMEM_SET_SIZE * ASHMEM_GET_SIZE* ASHMEM_GET_SIZE * ASHMEM_SET_PROT_MASK* ASHMEM_SET_PROT_MASK * ASHMEM_GET_PROT_MASK* ASHMEM_GET_PROT_MASK * ASHMEM_PIN* ASHMEM_PIN * ASHMEM_UNPIN* ASHMEM_UNPIN * ASHMEM_GET_PIN_STATUS* ASHMEM_GET_PIN_STATUS * ASHMEM_PURGE_ALL_CACHES* ASHMEM_PURGE_ALL_CACHES
  • 26. 안드로이드 디바이스 드라이버안드로이드안드로이드 디바이스디바이스 드라이버드라이버 pmem large (1-16+MB) physically contiguousregions of memory shared between userspace and kernel drivers drivers/misc/pmem.c include/linux/android_pmem.h large (1large (1--16+MB) physically16+MB) physically contiguousregions of memorycontiguousregions of memory shared between userspace andshared between userspace and kernel driverskernel drivers drivers/misc/pmem.cdrivers/misc/pmem.c include/linux/android_pmem.hinclude/linux/android_pmem.h
  • 27. 안드로이드 디바이스 드라이버안드로이드안드로이드 디바이스디바이스 드라이버드라이버 logger drivers/android/logging.c 'logcat' command drivers/android/logging.cdrivers/android/logging.c 'logcat' command'logcat' command
  • 28. 안드로이드 디바이스 드라이버안드로이드안드로이드 디바이스디바이스 드라이버드라이버 wakelock drivers/android/power.c ioctl * WAKE_LOCK_IDLE * WAKE_LOCK_SUSPEND drivers/android/power.cdrivers/android/power.c ioctlioctl * WAKE_LOCK_IDLE* WAKE_LOCK_IDLE * WAKE_LOCK_SUSPEND* WAKE_LOCK_SUSPEND
  • 29. 안드로이드 디바이스 드라이버안드로이드안드로이드 디바이스디바이스 드라이버드라이버 oom handling drivers/misc/lowmemorykiller.c security/lowmem.c drivers/misc/lowmemorykiller.cdrivers/misc/lowmemorykiller.c security/lowmem.csecurity/lowmem.c
  • 30. 안드로이드 프레임 버퍼 디바이스 드라이버
  • 31. - 프레임 버퍼의 기능 • 리눅스 표준 그래픽 디바이스 인터페이스 – 응용 프로그램이 그래픽 장치를 사용할 수 있도록 리눅스 커널에 서 제공되는 장치 드라이버 • 그래픽 장치 초기화 – 하드웨어를 초기화 하고 기본 해상도를 설정한다. • 그래픽 장치 정보 제공 – 설정된 해상도와 같은 그래픽 장치의 정보를 어플리케이션에서 읽 을 수 있도록 정보를 제공한다. • 그래픽 장치 제어 – 해상도 조정, 모니터 주파수 조정, 팔레트 처리등과 같은 조정을 응용 프로그램이 제어 할 수 있도록 한다. • 그래픽 메모리 맵핑 – 응용 프로그램에서 직접적으로 비디오 메모리에 접근하여 처리 할 수 있도록 메모리 맵핑을 제공한다.
  • 32. - 프레임 버퍼의 제어 구조 User Level 프로그램 User Level 프로그램 프레임 버퍼 디바이스 드라이버 프레임 버퍼 디바이스 드라이버 비디오/LCD 컨트롤러 비디오/LCD 컨트롤러 비디오/LCD 표출 장치 비디오/LCD 표출 장치 /dev/fb0 : 디바이스 파일 /dev/fb0 : 디바이스 파일 ioctl open Cable I/F mmap VFS memory direct access BUS I/F 유저 영역 프로그램 (안드로이드) 커널 하드웨어 : :
  • 33. 프레임프레임 버퍼버퍼 디바이스디바이스 드라이버드라이버 구조구조 FBIOGET_VSCREENINFO - struct fb_var_screeninfo FBIOPUT_VSCREENINFO - struct fb_var_screeninfo 비디오 모드, 모니터 주파수, 가상 화면 관련 등등 변경이 가능한 프레임 버퍼 정보를 얻거나 설정 FBIOGET_FSCREENINFO - struct fb_fix_screeninfo 프레임 버퍼 메모리 크기와 같은 하드웨어 정보 얻기 FBIOGETCMAP - struct fb_cmap_user FBIOPUTCMAP - struct fb_cmap_user 팔레트 설정 및 정보 획득 IOCTL
  • 34. - 안드로이드 지원 더블 버퍼링 ioctlioctl FBIOPUT_VSCREENINFO - struct fb_var_screeninfoFBIOPUT_VSCREENINFO - struct fb_var_screeninfo int fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var)int fb_set_var(struct fb_info *info, struct fb_var_screeninfo *var) ret = info->fbops->fb_check_var(var, info); info->fbops->fb_set_par(info); fb_pan_display(info, &info->var); Int fb_pan_display(struct fb_info *info, struct fb_var_screeninfo *var)Int fb_pan_display(struct fb_info *info, struct fb_var_screeninfo *var) err = info->fbops->fb_pan_display(var, info)
  • 35. 이벤트 핸들러 디바이스 드라이버 키보드 디바이스 드라이버 (kbd) 마우스 디바이스 드라이버 (mousedev, mic) 조이스틱 디바이스 드라이버 (joydev) 터치 스크린 디바이스 드라이버 (tsdev) 이벤트 디바이스 드라이버 (evdev)
  • 36. input Kbd mousedev, mice joydev tsdev evdev touch screen device driver keyboard device driver mouse device driver keyboard api mouse api Joystick api toutch screen api event api application Kernel 2.6.24 부터 tsdev 삭제됨 키보드 이벤트 핸들러 디바이스 드라이버는 linux/driver/char/keyboard.c 에 구현
  • 37. INPUT 디바이스 드라이버 관련 함수 중 터치와 관련된 함수 정리 헤더 파일 : linux/include/linux/input.h static inline void init_input_dev(struct input_dev *dev); dev 에 전달된 구조체를 초기화 한다. void input_register_device(struct input_dev *); 입력 장치를 등록한다. void input_unregister_device(struct input_dev *); 입력 장치를 제거한다. void input_event(struct input_dev *dev, unsigned int type, unsigned int code, int value); 이벤트를 이벤트 핸들러 디바이스 드라이버에 전달한다. static inline void input_report_key(struct input_dev *dev, unsigned int code, int value); 내부적으로 input_event 함수를 이용하여 버튼 또는 키 이벤트를 전달한다.
  • 38. static inline void input_report_rel(struct input_dev *dev, unsigned int code, int value); 내부적으로 input_event 함수를 이용하여 이동 된 크기 이벤트를 전달한다. static inline void input_report_abs(struct input_dev *dev, unsigned int code, int value); 내부적으로 input_event 함수를 이용하여 이동 된 절대 좌표 이벤트를 전달한다. static inline void input_sync(struct input_dev *dev); 내부적으로 input_event 함수를 이용하여 하나의 상태에 대한 여러 이벤트가 동기 되어야 할 필 요가 있다는 것을 전달한다. static inline void input_set_abs_params(struct input_dev *dev, int axis, int min, int max, int fuzz, int flat); 절대 좌표 값을 지정하는 경우 값의 최소 값과 최대 값을 지정한다.
  • 39. 감사 합니다.감사감사 합니다합니다..