• Like

Loading…

Flash Player 9 (or above) is needed to view presentations.
We have detected that you do not have it on your computer. To install it, go here.

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

  • 16,974 views
Uploaded on

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

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

More in: Education
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
No Downloads

Views

Total Views
16,974
On Slideshare
0
From Embeds
0
Number of Embeds
1

Actions

Shares
Downloads
457
Comments
0
Likes
5

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/
  • 4. 기본 디바이스 드라이버 구조 insmod module_init( fabase_init ) fabase_init() platform_driver_register(&fabase_driver) platform_device_register_simple( FABASE_DEVICE_DRIVER_NAME struct platform_driver fabase_driver .probe = fabase_probe .remove = fabase_remove .suspend = fabase_suspend .resume = fabase_resume .driver = { .name = FABASE_DEVICE_DRIVER_NAME, } fabase_probe()
  • 5. 기본 디바이스 드라이버 구조 rmmod module_exit(fabase_exit) fabase_exit() platform_device_unregister(fabase_device) struct platform_driver fabase_driver .probe = fabase_probe .remove = fabase_remove .suspend = fabase_suspend .resume = fabase_resume .driver = { .name = FABASE_DEVICE_DRIVER_NAME, } 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. 디바이스 드라이버 사용 디바이스 드라이버 xxx_init( . . . ) { Hardware interrupt : } insmod xxx_interrupt( . . . ) 응용 프로그램 { : struct file_operations } xxx_open( . . . ) open( . . . ) xxx_fop = { xxx_read( . . . ) { : read( . . . ) open : xxx_open, } { xxx_write( . . . ) : read : xxx_read, } { xxx_ioctl( . . . ) write( . . . ) write : xxx_write, : ioctl : xxx_ioctl, } { xxx_release( . . . ) release : xxx_release : ioctl( . . . ) }; } { : close( . . . ) } xxx_exit( . . . ) rmmod { : }
  • 10. (1) JNI 를 응용한 제어 방식 JAVA 어플리케이션 JNI 디바이스 드라이버 H/W
  • 11. (2) 어플리케이션 제어 방식 JAVA 어플리케이션 C 데몬 디바이스 드라이버 LOCAL NETWORK (127.0.0.1) TCP or UDP H/W
  • 12. 안드로이드 NDK 안드로이드가 제공하는 각종 어플리케이션들은 Java 하드웨어를 직접 제어해야 하는 프레임워크 영역은 C/C++
  • 13. 안드로이드 NDK Bionic LIBC BIONIC LIBC GNU LIBC Bionic LIBC에서 사용할 수 있는 각종 시스템 함수 목록 {ANDROID_SROUCE}/ bionic/libc/SYSCALLS.txt
  • 14. 안드로이드 NDK
  • 15. 안드로이드 NDK NDK 툴체인 추출 $ $ mkdir arm-eabi-4.2.1 mkdir arm-eabi-4.2.1 $ $ cd 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/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/include ./arm-eabi/. $ $ cp –a {NDK_DIR}/build/platform/android-5/arch-arm/usr/lib ./arm-eabi/. cp –a {NDK_DIR}/build/platform/android-5/arch-arm/usr/lib ./arm-eabi/. Get Android toolchain from NDK Get Android toolchain from NDK
  • 16. 안드로이드 NDK NDK 루트 디렉토리
  • 17. C 언어 어플리케이션 적용 데몬 프로세스 service mydemon /usr/bin/mydemon service mydemon /usr/bin/mydemon oneshot oneshot Android demon script sample – init.rc Android demon script sample – init.rc
  • 18. JNI 적용 Build the Hello-JNI $ cd {NDK_DIR}/samples/hello-jni $ cd {NDK_DIR}/samples/hello-jni $ {NDK_DIR}/ndk-build $ {NDK_DIR}/ndk-build Change directory to hello-jni in NDK Change directory to hello-jni in NDK $ cd ~/project/android-ndk-r4//samples/hello-jni $ cd ~/project/android-ndk-r4//samples/hello-jni $ ~/project/android-ndk-r4/ndk-build $ ~/project/android-ndk-r4/ndk-build Gdbserver Gdbserver : [arm-eabi-4.4.0] /home/hyowon/project/android-ndk-r4/samples/hello- : [arm-eabi-4.4.0] /home/hyowon/project/android-ndk-r4/samples/hello- jni/libs/armeabi/gdbserver jni/libs/armeabi/gdbserver Gdbsetup Gdbsetup : /home/hyowon/project/android-ndk-r4/samples/hello-jni/libs/armeabi/gdb.setup : /home/hyowon/project/android-ndk-r4/samples/hello-jni/libs/armeabi/gdb.setup Gdbsetup Gdbsetup : + source directory /home/hyowon/project/android-ndk-r4/samples/hello-jni/jni : + 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- Compile thumb : hello-jni <= /home/hyowon/project/android-ndk-r4/samples/hello-jni/jni/hello- jni.c jni.c SharedLibrary : libhello-jni.so SharedLibrary : libhello-jni.so Install Install : libhello-jni.so => /home/hyowon/project/android-ndk-r4/samples/hello- : libhello-jni.so => /home/hyowon/project/android-ndk-r4/samples/hello- jni/libs/armeabi jni/libs/armeabi Succeed message from NDK Succeed message from NDK
  • 19. JNI 적용 Hello-JNI 프로젝트 불러오기 Create project from existing source Create project from existing source Project Tree Project Tree
  • 20. JNI 적용 Hello-JNI 프로젝트 실행 Screenshot of Hello-JNI sample Screenshot of Hello-JNI sample
  • 21. JNI 적용 hello-jni.c #include <string.h> #include <string.h> #include <jni.h> #include <jni.h> /* HelloJni.java 파일이 호출하는 JNI의 네이티브 메소드 */ /* HelloJni.java 파일이 호출하는 JNI의 네이티브 메소드 */ jstring jstring Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, Java_com_example_hellojni_HelloJni_stringFromJNI( JNIEnv* env, jobject this ) jobject this ) { { ① ② ③ return (*env)->NewStringUTF(env, "Hello from JNI !"); return (*env)->NewStringUTF(env, "Hello from JNI !"); } } ① 패키지 이름 ② 클래스 이름 ③ 함수 이름
  • 22. JNI 적용 HelloJni.java package com.example.hellojni; package com.example.hellojni; import android.app.Activity; ① import android.app.Activity; import android.widget.TextView; import android.widget.TextView; import android.os.Bundle; import android.os.Bundle; public class HelloJni extends Activity ② public class HelloJni extends Activity { { /* 처음으로 호출되는 액티비티 */ /* 처음으로 호출되는 액티비티 */ @Override @Override public void onCreate(Bundle savedInstanceState) public void onCreate(Bundle savedInstanceState) { { super.onCreate(savedInstanceState); super.onCreate(savedInstanceState); /* TextView를 생성하고 콘텐트를 지정한다. stringFromJNI() 함수에서 JNI로 글자를 가져온다. */ /* TextView를 생성하고 콘텐트를 지정한다. stringFromJNI() 함수에서 JNI로 글자를 가져온다. */ TextView tv = new TextView(this); TextView tv = new TextView(this); tv.setText( stringFromJNI() ); tv.setText( stringFromJNI() ); setContentView(tv); setContentView(tv); } } /* 네이티브 메소드가 'hello-jni' 네이티브 라이브러리에서 불러지도록 한다. */ /* 네이티브 메소드가 'hello-jni' 네이티브 라이브러리에서 불러지도록 한다. */ public native String stringFromJNI(); public native String stringFromJNI(); ③ public native String unimplementedStringFromJNI(); public native String unimplementedStringFromJNI(); /* hello-jni 라이브러리를 어플리케이션으로 불러온다. */ /* hello-jni 라이브러리를 어플리케이션으로 불러온다. */ static { static { System.loadLibrary("hello-jni"); System.loadLibrary("hello-jni"); } } } }
  • 23. 안드로이드 디바이스 드라이버 Binder Binder - IPC - IPC ashmem ashmem - Android shared memory - Android shared memory pmem pmem - Process memory allocator - Process memory allocator logger logger - system logging facilit - system logging facilit wakelock wakelock - used for power management - used for power management oom handling - lowmem notifications oom handling - lowmem notifications alarm alarm paranoid network security paranoid network security timed gpio - Generic gpio is a mechanism timed gpio - Generic gpio is a mechanism to allow programs to access and to allow programs to access and manipulate gpio registers from manipulate gpio registers from user space user space RAM_CONSOLE RAM_CONSOLE http://elinux.org/Android_Kernel_Features#Important_update http://elinux.org/Android_Kernel_Features#Important_update
  • 24. 안드로이드 디바이스 드라이버 Binder drivers/android/binder.c include/linux/binder.h
  • 25. 안드로이드 디바이스 드라이버 ashmem mm/ashmem.c ioctl * 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 (1-16+MB) contiguousregions of memory shared between userspace and kernel drivers drivers/misc/pmem.c include/linux/android_pmem.h
  • 27. 안드로이드 디바이스 드라이버 logger drivers/android/logging.c 'logcat' command
  • 28. 안드로이드 디바이스 드라이버 wakelock drivers/android/power.c ioctl * WAKE_LOCK_IDLE * WAKE_LOCK_IDLE * WAKE_LOCK_SUSPEND * WAKE_LOCK_SUSPEND
  • 29. 안드로이드 디바이스 드라이버 oom handling drivers/misc/lowmemorykiller.c security/lowmem.c
  • 30. 안드로이드 프레임 버퍼 디바이스 드라이버
  • 31. - 프레임 버퍼의 기능 • 리눅스 표준 그래픽 디바이스 인터페이스 – 응용 프로그램이 그래픽 장치를 사용할 수 있도록 리눅스 커널에 서 제공되는 장치 드라이버 • 그래픽 장치 초기화 – 하드웨어를 초기화 하고 기본 해상도를 설정한다. • 그래픽 장치 정보 제공 – 설정된 해상도와 같은 그래픽 장치의 정보를 어플리케이션에서 읽 을 수 있도록 정보를 제공한다. • 그래픽 장치 제어 – 해상도 조정, 모니터 주파수 조정, 팔레트 처리등과 같은 조정을 응용 프로그램이 제어 할 수 있도록 한다. • 그래픽 메모리 맵핑 – 응용 프로그램에서 직접적으로 비디오 메모리에 접근하여 처리 할 수 있도록 메모리 맵핑을 제공한다.
  • 32. - 프레임 버퍼의 제어 구조 open /dev/fb0 /dev/fb0 ioctl : VFS : BUS Cable 디바이스 디바이스 I/F I/F 파일 프레임 버퍼 프레임 버퍼 mmap 파일 User Level User Level 비디오/LCD 비디오/LCD 비디오/LCD 비디오/LCD 프로그램 디바이스 디바이스 컨트롤러 컨트롤러 표출 장치 표출 장치 프로그램 드라이버 드라이버 : : memory direct access 유저 영역 프로그램 커널 하드웨어 (안드로이드)
  • 33. 프레임 버퍼 디바이스 드라이버 구조 IOCTL 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 팔레트 설정 및 정보 획득
  • 34. - 안드로이드 지원 더블 버퍼링 ioctl FBIOPUT_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 evdev event api Kbd keyboard api mousedev, mice mouse api application joydev Joystick api tsdev toutch screen api touch screen device driver 키보드 이벤트 핸들러 디바이스 드라이버는 keyboard device driver linux/driver/char/keyboard.c 에 구현 mouse device driver Kernel 2.6.24 부터 tsdev 삭제됨
  • 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. 감사 합니다. 합니다.