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++
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
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
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
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);
절대 좌표 값을 지정하는 경우 값의 최소 값과 최대 값을 지정한다.