SlideShare una empresa de Scribd logo
1 de 40
Descargar para leer sin conexión
2010. 09
안드로이드안드로이드 와와
디바이스디바이스 드라이버드라이버
적용적용 기법기법
에프에이리눅스㈜에프에이리눅스㈜
유영창유영창
안드로이드 와 디바이스 드라이버 적용 기법
안드로이드와 리눅스 커널안드로이드와안드로이드와 리눅스리눅스 커널커널
안드로이드와 리눅스 커널안드로이드와안드로이드와 리눅스리눅스 커널커널
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/
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()
기본 디바이스 드라이버 구조기본기본 디바이스디바이스 드라이버드라이버 구조구조
기본 디바이스 드라이버 구조기본기본 디바이스디바이스 드라이버드라이버 구조구조
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()
기본 디바이스 드라이버 구조기본기본 디바이스디바이스 드라이버드라이버 구조구조
struct platform_device *platform_device_register_simple
(
const char *name,
int id,
struct resource *,
unsigned int
);
void platform_device_unregister( struct platform_device *pdev );
기본 디바이스 드라이버 구조기본기본 디바이스디바이스 드라이버드라이버 구조구조
int platform_device_register( struct platform_device * pdev );
void platform_device_del( struct platform_device *pdev );
기본 디바이스 드라이버 구조기본기본 디바이스디바이스 드라이버드라이버 구조구조
[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
디바이스 드라이버 사용디바이스디바이스 드라이버드라이버 사용사용
디바이스 드라이버
응용 프로그램
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( . . . )
{
:
}
(1) JNI 를 응용한 제어 방식(1) JNI(1) JNI 를를 응용한응용한 제어제어 방식방식
디바이스 드라이버디바이스 드라이버
H/WH/W
JAVA 어플리케이션JAVA 어플리케이션 JNIJNI
(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
안드로이드 NDK안드로이드안드로이드 NDKNDK
안드로이드가 제공하는 각종
어플리케이션들은 Java
하드웨어를 직접 제어해야
하는 프레임워크 영역은
C/C++
안드로이드가안드로이드가 제공하는제공하는 각종각종
어플리케이션들은어플리케이션들은 JavaJava
하드웨어를하드웨어를 직접직접 제어해야제어해야
하는하는 프레임워크프레임워크 영역은영역은
C/C++C/C++
안드로이드 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
안드로이드 NDK안드로이드안드로이드 NDKNDK
안드로이드 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
안드로이드 NDK안드로이드안드로이드 NDKNDK
NDK 루트 디렉토리
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
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
JNI 적용JNIJNI 적용적용
Hello-JNI 프로젝트 불러오기
Create project from existing sourceCreate project from existing source Project TreeProject Tree
JNI 적용JNIJNI 적용적용
Hello-JNI 프로젝트 실행
Screenshot of Hello-JNI sampleScreenshot of Hello-JNI sample
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 !");
}
①①
②②
③③
패키지 이름
클래스 이름
함수 이름
①① ②② ③③
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");
}
}
①①
②②
③③
안드로이드 디바이스 드라이버안드로이드안드로이드 디바이스디바이스 드라이버드라이버
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
안드로이드 디바이스 드라이버안드로이드안드로이드 디바이스디바이스 드라이버드라이버
Binder
drivers/android/binder.c
include/linux/binder.h
drivers/android/binder.cdrivers/android/binder.c
include/linux/binder.hinclude/linux/binder.h
안드로이드 디바이스 드라이버안드로이드안드로이드 디바이스디바이스 드라이버드라이버
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
안드로이드 디바이스 드라이버안드로이드안드로이드 디바이스디바이스 드라이버드라이버
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
안드로이드 디바이스 드라이버안드로이드안드로이드 디바이스디바이스 드라이버드라이버
logger
drivers/android/logging.c
'logcat' command
drivers/android/logging.cdrivers/android/logging.c
'logcat' command'logcat' command
안드로이드 디바이스 드라이버안드로이드안드로이드 디바이스디바이스 드라이버드라이버
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
안드로이드 디바이스 드라이버안드로이드안드로이드 디바이스디바이스 드라이버드라이버
oom handling
drivers/misc/lowmemorykiller.c
security/lowmem.c
drivers/misc/lowmemorykiller.cdrivers/misc/lowmemorykiller.c
security/lowmem.csecurity/lowmem.c
안드로이드 프레임 버퍼 디바이스 드라이버
- 프레임 버퍼의 기능
• 리눅스 표준 그래픽 디바이스 인터페이스
– 응용 프로그램이 그래픽 장치를 사용할 수 있도록 리눅스 커널에
서 제공되는 장치 드라이버
• 그래픽 장치 초기화
– 하드웨어를 초기화 하고 기본 해상도를 설정한다.
• 그래픽 장치 정보 제공
– 설정된 해상도와 같은 그래픽 장치의 정보를 어플리케이션에서 읽
을 수 있도록 정보를 제공한다.
• 그래픽 장치 제어
– 해상도 조정, 모니터 주파수 조정, 팔레트 처리등과 같은 조정을
응용 프로그램이 제어 할 수 있도록 한다.
• 그래픽 메모리 맵핑
– 응용 프로그램에서 직접적으로 비디오 메모리에 접근하여 처리 할
수 있도록 메모리 맵핑을 제공한다.
- 프레임 버퍼의 제어 구조
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
유저 영역 프로그램
(안드로이드)
커널 하드웨어
:
:
프레임프레임 버퍼버퍼 디바이스디바이스 드라이버드라이버 구조구조
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
- 안드로이드 지원 더블 버퍼링
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)
이벤트 핸들러 디바이스 드라이버
키보드 디바이스 드라이버 (kbd)
마우스 디바이스 드라이버 (mousedev, mic)
조이스틱 디바이스 드라이버 (joydev)
터치 스크린 디바이스 드라이버 (tsdev)
이벤트 디바이스 드라이버 (evdev)
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 에 구현
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 함수를 이용하여 버튼 또는 키 이벤트를 전달한다.
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);
절대 좌표 값을 지정하는 경우 값의 최소 값과 최대 값을 지정한다.
감사 합니다.감사감사 합니다합니다..

Más contenido relacionado

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

Python on Android
Python on AndroidPython on Android
Python on Android용 최
 
망고100 보드로 놀아보자 9
망고100 보드로 놀아보자 9망고100 보드로 놀아보자 9
망고100 보드로 놀아보자 9종인 전
 
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기Jaeseung Ha
 
안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주iamhjoo (송형주)
 
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱NAVER Engineering
 
Hideroot - Inc0gnito 2016
Hideroot - Inc0gnito 2016Hideroot - Inc0gnito 2016
Hideroot - Inc0gnito 2016perillamint
 
TestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolTestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolhyunae lee
 
TestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolTestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolhyunae lee
 
초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 YoungSu Son
 
3. 악성코드 분석 사례
3. 악성코드 분석 사례3. 악성코드 분석 사례
3. 악성코드 분석 사례Youngjun Chang
 
6. code level reversing
6. code level reversing6. code level reversing
6. code level reversingYoungjun Chang
 
JVM_트러블슈팅.pdf
JVM_트러블슈팅.pdfJVM_트러블슈팅.pdf
JVM_트러블슈팅.pdfkwbak
 
Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기hanbeom Park
 
[Td 2015]알아두면 핵 이득! vc++로 안드로이드 개발하기(김성엽)
[Td 2015]알아두면 핵 이득! vc++로 안드로이드 개발하기(김성엽)[Td 2015]알아두면 핵 이득! vc++로 안드로이드 개발하기(김성엽)
[Td 2015]알아두면 핵 이득! vc++로 안드로이드 개발하기(김성엽)Sang Don Kim
 
Linux 강의자료 ed10
Linux 강의자료 ed10Linux 강의자료 ed10
Linux 강의자료 ed10hungrok
 
[2012 CodeEngn Conference 06] x82 - 모바일 스마트 플랫폼 원격, 로컬 취약점 공격 분석
[2012 CodeEngn Conference 06] x82 - 모바일 스마트 플랫폼 원격, 로컬 취약점 공격 분석[2012 CodeEngn Conference 06] x82 - 모바일 스마트 플랫폼 원격, 로컬 취약점 공격 분석
[2012 CodeEngn Conference 06] x82 - 모바일 스마트 플랫폼 원격, 로컬 취약점 공격 분석GangSeok Lee
 
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoLinux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoMario Cho
 
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for AndroidSangkyoon Nam
 
우분투에 시스템콜 추가하기
우분투에 시스템콜 추가하기우분투에 시스템콜 추가하기
우분투에 시스템콜 추가하기Hoyoung Jung
 

Similar a 안드로이드 와 디바이스 드라이버 적용 기법 (20)

Python on Android
Python on AndroidPython on Android
Python on Android
 
Anatomy of an android
Anatomy of an androidAnatomy of an android
Anatomy of an android
 
망고100 보드로 놀아보자 9
망고100 보드로 놀아보자 9망고100 보드로 놀아보자 9
망고100 보드로 놀아보자 9
 
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기
NDC2018 안드로이드+유니티 네이티브 프로파일링 삽질기
 
안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주안드로이드 스터디 Jni 발표 자료 Rev05 송형주
안드로이드 스터디 Jni 발표 자료 Rev05 송형주
 
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
[TECHCON 2019: MOBILE - Android]7.20분만에 만들어보는 라이브 방송 앱
 
Hideroot - Inc0gnito 2016
Hideroot - Inc0gnito 2016Hideroot - Inc0gnito 2016
Hideroot - Inc0gnito 2016
 
TestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolTestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing tool
 
TestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing toolTestExplorer 소개 - Android application GUI testing tool
TestExplorer 소개 - Android application GUI testing tool
 
초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드 초보 개발자/학생들을 위한 오픈소스 트랜드
초보 개발자/학생들을 위한 오픈소스 트랜드
 
3. 악성코드 분석 사례
3. 악성코드 분석 사례3. 악성코드 분석 사례
3. 악성코드 분석 사례
 
6. code level reversing
6. code level reversing6. code level reversing
6. code level reversing
 
JVM_트러블슈팅.pdf
JVM_트러블슈팅.pdfJVM_트러블슈팅.pdf
JVM_트러블슈팅.pdf
 
Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기Android Native Module 안정적으로 개발하기
Android Native Module 안정적으로 개발하기
 
[Td 2015]알아두면 핵 이득! vc++로 안드로이드 개발하기(김성엽)
[Td 2015]알아두면 핵 이득! vc++로 안드로이드 개발하기(김성엽)[Td 2015]알아두면 핵 이득! vc++로 안드로이드 개발하기(김성엽)
[Td 2015]알아두면 핵 이득! vc++로 안드로이드 개발하기(김성엽)
 
Linux 강의자료 ed10
Linux 강의자료 ed10Linux 강의자료 ed10
Linux 강의자료 ed10
 
[2012 CodeEngn Conference 06] x82 - 모바일 스마트 플랫폼 원격, 로컬 취약점 공격 분석
[2012 CodeEngn Conference 06] x82 - 모바일 스마트 플랫폼 원격, 로컬 취약점 공격 분석[2012 CodeEngn Conference 06] x82 - 모바일 스마트 플랫폼 원격, 로컬 취약점 공격 분석
[2012 CodeEngn Conference 06] x82 - 모바일 스마트 플랫폼 원격, 로컬 취약점 공격 분석
 
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario ChoLinux Kernel Boot Process , SOSCON 2015, By Mario Cho
Linux Kernel Boot Process , SOSCON 2015, By Mario Cho
 
빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android빠르고 지속적으로 전달하기: Continuous Delivery for Android
빠르고 지속적으로 전달하기: Continuous Delivery for Android
 
우분투에 시스템콜 추가하기
우분투에 시스템콜 추가하기우분투에 시스템콜 추가하기
우분투에 시스템콜 추가하기
 

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

  • 1. 2010. 09 안드로이드안드로이드 와와 디바이스디바이스 드라이버드라이버 적용적용 기법기법 에프에이리눅스㈜에프에이리눅스㈜ 유영창유영창
  • 4. 안드로이드와 리눅스 커널안드로이드와안드로이드와 리눅스리눅스 커널커널 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/
  • 5. 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() 기본 디바이스 드라이버 구조기본기본 디바이스디바이스 드라이버드라이버 구조구조
  • 6. 기본 디바이스 드라이버 구조기본기본 디바이스디바이스 드라이버드라이버 구조구조 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()
  • 7. 기본 디바이스 드라이버 구조기본기본 디바이스디바이스 드라이버드라이버 구조구조 struct platform_device *platform_device_register_simple ( const char *name, int id, struct resource *, unsigned int ); void platform_device_unregister( struct platform_device *pdev );
  • 8. 기본 디바이스 드라이버 구조기본기본 디바이스디바이스 드라이버드라이버 구조구조 int platform_device_register( struct platform_device * pdev ); void platform_device_del( struct platform_device *pdev );
  • 9. 기본 디바이스 드라이버 구조기본기본 디바이스디바이스 드라이버드라이버 구조구조 [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
  • 10. 디바이스 드라이버 사용디바이스디바이스 드라이버드라이버 사용사용 디바이스 드라이버 응용 프로그램 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( . . . ) { : }
  • 11. (1) JNI 를 응용한 제어 방식(1) JNI(1) JNI 를를 응용한응용한 제어제어 방식방식 디바이스 드라이버디바이스 드라이버 H/WH/W JAVA 어플리케이션JAVA 어플리케이션 JNIJNI
  • 12. (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
  • 13. 안드로이드 NDK안드로이드안드로이드 NDKNDK 안드로이드가 제공하는 각종 어플리케이션들은 Java 하드웨어를 직접 제어해야 하는 프레임워크 영역은 C/C++ 안드로이드가안드로이드가 제공하는제공하는 각종각종 어플리케이션들은어플리케이션들은 JavaJava 하드웨어를하드웨어를 직접직접 제어해야제어해야 하는하는 프레임워크프레임워크 영역은영역은 C/C++C/C++
  • 14. 안드로이드 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
  • 16. 안드로이드 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
  • 18. 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
  • 19. 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
  • 20. JNI 적용JNIJNI 적용적용 Hello-JNI 프로젝트 불러오기 Create project from existing sourceCreate project from existing source Project TreeProject Tree
  • 21. JNI 적용JNIJNI 적용적용 Hello-JNI 프로젝트 실행 Screenshot of Hello-JNI sampleScreenshot of Hello-JNI sample
  • 22. 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 !"); } ①① ②② ③③ 패키지 이름 클래스 이름 함수 이름 ①① ②② ③③
  • 23. 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"); } } ①① ②② ③③
  • 24. 안드로이드 디바이스 드라이버안드로이드안드로이드 디바이스디바이스 드라이버드라이버 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
  • 25. 안드로이드 디바이스 드라이버안드로이드안드로이드 디바이스디바이스 드라이버드라이버 Binder drivers/android/binder.c include/linux/binder.h drivers/android/binder.cdrivers/android/binder.c include/linux/binder.hinclude/linux/binder.h
  • 26. 안드로이드 디바이스 드라이버안드로이드안드로이드 디바이스디바이스 드라이버드라이버 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
  • 27. 안드로이드 디바이스 드라이버안드로이드안드로이드 디바이스디바이스 드라이버드라이버 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
  • 28. 안드로이드 디바이스 드라이버안드로이드안드로이드 디바이스디바이스 드라이버드라이버 logger drivers/android/logging.c 'logcat' command drivers/android/logging.cdrivers/android/logging.c 'logcat' command'logcat' command
  • 29. 안드로이드 디바이스 드라이버안드로이드안드로이드 디바이스디바이스 드라이버드라이버 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
  • 30. 안드로이드 디바이스 드라이버안드로이드안드로이드 디바이스디바이스 드라이버드라이버 oom handling drivers/misc/lowmemorykiller.c security/lowmem.c drivers/misc/lowmemorykiller.cdrivers/misc/lowmemorykiller.c security/lowmem.csecurity/lowmem.c
  • 31. 안드로이드 프레임 버퍼 디바이스 드라이버
  • 32. - 프레임 버퍼의 기능 • 리눅스 표준 그래픽 디바이스 인터페이스 – 응용 프로그램이 그래픽 장치를 사용할 수 있도록 리눅스 커널에 서 제공되는 장치 드라이버 • 그래픽 장치 초기화 – 하드웨어를 초기화 하고 기본 해상도를 설정한다. • 그래픽 장치 정보 제공 – 설정된 해상도와 같은 그래픽 장치의 정보를 어플리케이션에서 읽 을 수 있도록 정보를 제공한다. • 그래픽 장치 제어 – 해상도 조정, 모니터 주파수 조정, 팔레트 처리등과 같은 조정을 응용 프로그램이 제어 할 수 있도록 한다. • 그래픽 메모리 맵핑 – 응용 프로그램에서 직접적으로 비디오 메모리에 접근하여 처리 할 수 있도록 메모리 맵핑을 제공한다.
  • 33. - 프레임 버퍼의 제어 구조 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 유저 영역 프로그램 (안드로이드) 커널 하드웨어 : :
  • 34. 프레임프레임 버퍼버퍼 디바이스디바이스 드라이버드라이버 구조구조 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
  • 35. - 안드로이드 지원 더블 버퍼링 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)
  • 36. 이벤트 핸들러 디바이스 드라이버 키보드 디바이스 드라이버 (kbd) 마우스 디바이스 드라이버 (mousedev, mic) 조이스틱 디바이스 드라이버 (joydev) 터치 스크린 디바이스 드라이버 (tsdev) 이벤트 디바이스 드라이버 (evdev)
  • 37. 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 에 구현
  • 38. 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 함수를 이용하여 버튼 또는 키 이벤트를 전달한다.
  • 39. 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); 절대 좌표 값을 지정하는 경우 값의 최소 값과 최대 값을 지정한다.