안드로이드 오디오 시스템 구성 요소

Posted in 개인/ㄴAndroid by


1. 어플리케이션 프레임워크 계층 : 자바 어플리케이션들이 오디오 시스템을 사용하기 위한 자바 API들이 존재하는 곳

구성요소

설  명 

 AudioTrack(Java)

오디오 출력을 담당하는 자바 클래스이다. AudioTrack(Java)은 파일이나 네트워크로부터 PCM데이터를 추출한 후, 네이티브 계층의 AudioTrack(C++)으로 PCM데이터를 전달하여 소리를 출력한다. 

 AudioRecord(Java)

오디오 입력 장치로부터 PCM데이터를 받아오기 위한 자바 클래스이다. AudioRecord(Java)는 네이티브 계층의 AudioRecord(C++)를 통해 PCM 데이터를 획득한 후 압축 파일로 저장하거나 네트워크를 통해서 소리를 다른 곳으로 전달할 수 있다. 

 AudioManager(Java)

오디오 시스템에서 볼륨을 조정하거나 오디오 출력 장치를 결정하는 등의 오디오 시스템 제어를 위한 자바 클래스이다. 


2. JNI 계층 : 어플리케이션 프레임워크 계층의 자바 클래스들이 C++ 클래스를 사용하기 위한 인터페이스를 정의한 곳

구성요소

설  명 

android_media_AudioTrack

네이티브 계층의 AudioTrack(C++) 클래스를 사용하기 위한 JNI정의

android_media_AudioRecord

네이티브 계층의 AudioRecord(C++) 클래스를 사용하기 위한 JNI정의

android_media_AudioSystem

네이티브 계층의 AudioSystem(C++) 클래스를 사용하기 위한 JNI정의


3. 네이티브 계층 : 오디오 시스템의 핵심 동작을 수행하는 계층 / 크게 오디오 출력, 오디오 입력, 오디오 제어 동작을 수행


3-1. 네이티브 프록시 : 어플리케이션이 시스템 서비스에 접근하기 위한 방법을 정의

구성요소

설  명 

AudioTrack(C++)

오디오 출력을 담당하는 서비스 클라이언트의 클래스이다. AudioTrack(C++)는  IAudioTrack 서비스 프록시를 통해 AudioFlinger 서비스에게 오디오 출력을 요청한다.

 AudioRecord(C++)

오디오 입력을 담당하는 서비스 클라이언트의 클래스이다. AudioFlinger 서비스는 하드웨어로부터  PCM데이터를 받아 RecordTrack을 통해 애플리케이션으로 전달한다. AudioRecord(C++)는 IAudioRecord 서비스 프록시를 통해 AudioFlinger 서비스에게 오디오 입력을 요청한다.

 AudioSystem(C++)

오디오 제어 요청을 담당하는 서비스 클라이언트의 클래스이다. 오디오 라우팅, 오디오 볼륨 조정 등 제어에 관한 동작을 AudioPolicyService에게 요청한다.


3-2. 서비스 프록시 : 오디오 시스템의 네이티브 프록시가 시스템 서비스를 사용하기 위한 인터페이스

구성요소

설  명 

 IAudioFlinger

서비스 클라이언트가 서비스 서버의 AudioFlinger 클래스에 접근하기 위해 사용한다.

IAudioTrack

트랙 핸들 리모트 서비스를 사용하기 위한 서비스 프록시이다. 서비스 서버의 TrackHandle클래스에 접근하기 위해 사용한다.

IAudioRecord

레코드 트랙 핸들 리모트 서비스를 사용하기 위한 서비스 프록시이다. 서비스 서버의 RecordHandle 클래스에 접근하기 위해 사용한다.

IAudioPolicyService

서비스 서버의 AudioPolicyService 클래스에 접근하기 위해 사용한다.


3-3. 시스템 서비스 : 서비스 서버에서 오디오 시스템의 동작을 실제로 수행하는 서비스들

구성요소

설  명 

AudioFlinger

오디오 시스템의 중추적 역활을 하는 시스템 서비스이다. 크게 오디오 출력, 입력 역활을 가지고 왔으며, 오디오 HAL을 통해 오디오 하드웨어에 접근이 가능하다.

AudioPolicyService

네이티브 프록시로부터 오디오 시스템의 제어 요청(볼륨 조정, 라우팅, 포커싱 등)을 받아서 처리하는 서비스이다. 제조사 고유의 오디오 시스템 정책을 추가할 수도 있다. 그리고 실제 정책을 하드웨어 혹은 현재의 동작에 적용하도록 AudioFlinger 서비스에게 요청한다.


3-4. 트랙 핸들 리모트 서비스 : 서비스 클라이언트가 서비스 프록시를 통해 접근하는 서비스

구성요소

설  명 

TrackHandle

트랙에 접근하기 위한 트랙 핸들이다. AudioTrack(C++)은 TrackHandle 클래스를 통해 Track 클래스의 함수를 접근한다.

Track

AudioTrack(C++)이 서비스 서버로 전달한 PCM데이터를 관리하는 역활을 한다. AudioTrack(C++) 클래스를 통해 생성 가능하다.

AudioMixer

트랙들이 가진 PCM 데이터에 대한 리샘플링 작업과 믹싱작업을 한다.

MixerThread

믹서 쓰레드는 트랙들의 PCM 데이터를 얻어온 후, 오디오 믹서에게 전달한다. 또한 오디오 믹서에 의해 믹싱된 PCM 데이터를 오디오 HAL에게 전달하여 소리로 출력한다.


3-5. 레코드 핸들 리모트 서비스 : 서비스 클라이언트가 서비스 프록시를 통해 접근하는 서비스

구성요소

설  명 

RecordHandle

AudioRecord(C++)에서 트랙에 접근하기 위한 트랙 핸들이다. AudioRecord(C++)는 RecordHandle 클래스를 통해 RecordTrack 클래스의 함수에 접근한다.

RecordTrack

오디오 하드웨어가 전달한 PCM 데이터를 AudioRecord(C++)로 전달하는 역활을 한다. 서비스 서버에서 오디오 입력을 담당하는 클래스이다. AudioRecord(C++) 클래스를 통해 생성 가능하며, 단 하나의 레코드 트랙만 존재한다.

AudioResampler

오디오 입력시 PCM 데이터에 대한 리샘플링을 수행한다.

RecordThread

RecordThread는 오디오 HAL에서 PCM 데이터를 얻어 온 후 AudioResampler에게 전달한다. 오디오 입력 리셈플러에서 리샘플된 PCM 데이터는 서비스 클라이언트로 전달된다.


4. 오디오 HAL 계층 : 제조사마다 다른 오디오 하드웨어를 안드로이드 플랫폼이 동일한 인터페이스를 통해 사용할 수 있도록 해줌


5. 리눅스 커널 및 하드웨어 계층 : 오디오 입출력을 위한 오디오 하드웨어 및 이를 구동하기 위한 디바이스 드라이버가 존재하는 계층



참조 : 안드로이드 미디어 프레임워크 - 4장 안드로이드 오디오 시스템

Odroid X-2 SDcard에 U-boot쓰기

Posted in 개인/ㄴAndroid by

# 출처 : http://com.odroid.com/sigong/nf_board/nboard_view.php?brd_id=odroidx&kind=52&bid=1329



# toolchain 다운로드기
http://www.mentor.com/ 에 가입(가입해야 툴체인 다운로드 가능)
로그인후 https://sourcery.mentor.com/GNUToolchain/release1294?lite=arm 에서 IA32 GNU/Linux TAR 또는 IA32 GNU/Linux Installer 다운로드

 

# toolchain 설치
하드커널에서 본 어떤 페이지에서 진저브레드 이후는 64bit OS에서 컴파일 해야 된다는걸 얼핏봐서, 우분투 64bit 를 설치했었습니다. 64bit 환경에서는 32bit 라이브러리가 없어 툴체인이 작동을 제대로 안하거나 설치가 안되니 32bit 라이브러리를 설치해줘야 합니다. OS를 32bit 로 설치하신경우는 상관 없을듯합니다.

-IA32 GNU/Linux Installer 를 이용해 설치하는경우 아래와 같은 에러 메세지가 뜹니다.
-----------------------------------------------------------------------------------------
Error: Missing 32-bit libraries on 64-bit Linux host

Your 64-bit Linux host is missing the 32-bit libraries
required to install and use Sourcery G++.

Please follow this Knowledge Base entry to install the
required 32-bit libraries:
https://support.codesourcery.com/GNUToolchain/kbentry62

Once you have installed the 32-bit libraries, please restart
the installer.
-----------------------------------------------------------------------------------------

-IA32 GNU/Linux TAR 를 이용해 압축을 풀어 설치한 경우는 arm-none-eabi-gcc 파일을 실행하면 그런 파일을 찾을수 없다는 에러가 뜹니다. 분명 경로지정이 제대로 되있는데도 불구하고 실행하면 파일을 찾을수 없다는 에러만 계속 뜸



# 32bit 라이브러리 설치(우분투가 64bit인 경우만)
sudo apt-get install ia32-libs

 

# toolchain 설치 & path 추가
- IA32 GNU/Linux Installer 로 설치하는경우
sudo chmod a+x arm-2010q1-188-arm-none-eabi.bin
sudo dpkg-reconfigure -plow dash
./arm-2010q1-188-arm-none-eabi.bin
GUI 설치화면이 뜹니다.

- IA32 GNU/Linux TAR 경우는 원하는곳에 압출을 풀기만 하면됩니다.

- path 추가(경로는 자신이 툴체인 설치한곳의 bin 디렉토리를 지정)
cat >> ~/.bashrc <<EOF
export ARCH=arm 
export CROSS_COMPILE=arm-none-eabi-
PATH=$PATH:/home/odroid/CodeSourcery/Sourcery_G++_Lite/bin;
EOF

- path 갱신(갱신을 해줘야 바로 path가 적용됨)
source ~/.bashrc

 

# u-boot 빌드 전 p4412_s_fwbl1.bin , p4412_s_tzsw.bin 백업(uboot/sd_fuse/ 에 있음, make distclean 하면 사라짐)

 

# 빌드
make distclean
make smdk4412_config
make

 

# bl2 생성
./mkbl2 u-boot.bin bl2.bin 14336

 

# 부트로더 SD메모리에 기록(기록 하기 전에 아까 백업한 p4412_s_fwbl1.bin , p4412_s_tzsw.bin 두개 파일을 sd_fuse 디렉토리로 다시 복사해주세요.), /dev/sdb 는 자신의 SD리더에 맞는 장치파일을 적어주시면됩니다.
cd sd_fuse
./sd_fusing_4412.sh /dev/sdb
-------------------------SD에 기록하는 모습--------------------
Exynos4412 BL1 fusing
[sudo] password for odroid: 
32+0 records in
32+0 records out
16384 bytes (16 kB) copied, 0.0992948 s, 165 kB/s
16+0 records in
16+0 records out
8192 bytes (8.2 kB) copied, 0.0929718 s, 88.1 kB/s
Exynos4412 BL2 fusing
28+0 records in
28+0 records out
14336 bytes (14 kB) copied, 0.127858 s, 112 kB/s
Exynos4412 bootloader fusing
541+1 records in
541+1 records out
277128 bytes (277 kB) copied, 1.68265 s, 165 kB/s
Exynos4412 tzsw fusing
320+0 records in
320+0 records out
163840 bytes (164 kB) copied, 1.04169 s, 157 kB/s
U-boot image is fused successfully.
Eject SD card and insert it again.
----------------------------------------------------------------
다른 장치들은 bl1 기록하고 바로 그다음에 u-boot를 기록하고 끝나는데 특이하게 Exynos4412용 스크립트는

1.부트섹터 초기화 
2.p4412_s_fwbl1.bin -> bl1
3.bl2.bin -> bl2
4.u-boot.bin -> u-boot
5.p4412_s_tzsw.bin -> tzsw(일종의 키파일인거 같습니다)

순으로 SD메모리에 기록합니다.

sd_fusing_4412.sh 라는 스크립트를 통해 SD메모리에 기록할때 p4412_s_fwbl1.bin , p4412_s_tzsw.bin 는 sd_fuze 디렉토리에 위치하고 u-boot.bin과 bl2.bin은 그 상위디렉토리에 파일이 있는걸로 경로를 참조합니다. bl2.bin과 u-boot.bin을 sd_fuze 디렉토리로 복사안하셔도됩니다.

 

# 우분투 64bit 환경에서 위와 같이 빌드하고 u-boot만 SD메모리에 기록한 상태로 minicom에서 정상적으로 u-boot 작동하는거 확인했습니다.

Ubuntu 12.04 마이크 설정

Posted in 개인/ㄴLinux by

Microphone not working on ubuntu (tested on 12.04)

If on UBUNTU microphone is not working; on skype or on gtalk: follow these simple steps:

1. Open terminal
2. Hit the following command, you may need sudo
        gksudo gedit /etc/modprobe.d/alsa-
base.conf 
3. Add following lines at the end of the open file:
        alias snd-card-0 snd-hda-intel
        options snd-hda-intel model=auto
4. Hit the following command on terminal, which will open Alsamixer levels:
        alsamixer
5. Press f4 to see 'capture' Alsamixer levels
6. Maximize all levels
7. Use following command to save it:
        sudo alsactl -f /var/lib/alsa/asound.state store
8. Restart.

Use recorder to see the device is working or not, :) 
If any problem post comment here.

우분투 커널 컴파일과 교체

Posted in 개인/ㄴLinux by

www.kernel.org에서 교체할 커널 버전 다운로드


/usr/src/에 복사 및 압축해제


패키지설치

sudo apt-get install build-essential bin86 kernel-package libqt3-headers libqt3-mt-dev wget libncurses5 libncurses5-dev

sudo apt-get install build-essential bin86 kernel-package wget libncurses5 libncurses5-dev


$cd /usr/src/linux-3.0(version)

make menuconfig
make
make modules_install install
update-initramfs -c -k 3.0(컴파일한 버전)


Grub Customizer 설치 (/etc/default/grub 수정이 안될 경우)

sudo add-apt-repository ppa:danielrichter2007/grub-customizer
sudo apt-get update
sudo apt-get install grub-customizer


$ grub-customizer

getneral-settings에서 show menu체크


Android build setting

Posted in 개인/ㄴAndroid by

## 패키지 업데이트 & 업그레이드 ##

$sudo apt-get update

$sudo apt-get upgrade


## Oracle JDK 6 설치 ##

http://eldora.tistory.com/97


## 빌드하는데 필요한 패키지 파일들 설치 ##

$sudo apt-get install git-core gnupg flex bison gperf build-essential

$sudo apt-get install zip curl zlib1g-dev libc6-dev lib32ncurses5-dev

$sudo apt-get install ia32-libs x11proto-core-dev libx11-dev xsltproc

$sudo apt-get install lib32readline-gplv2-dev lib32z-dev libgl1-mesa-dev

$sudo apt-get install g++-multilib mingw32 tofrodos python-markdown libxml2-utils


## Libx11-dev:i386 설치 ##

$sudo apt-get install libx11-dev:i386 –yes


## gcc4.4, g++ 4.4 설치 ##

sudo apt-get install gcc-4.4 g++-4.4 g++-4.4-multilib gcc-4.4-multilib

echo "export CC=gcc-4.4 CXX=g++-4.4" >> ~/.bashrc

source ~/.bashrc

sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 50

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 50


## U-boot-tools 설치 ##

sudo apt-get install u-boot-tools


## Sourcery G++ Lite 2010q1-188 for ARM GNU/Linux 설치 ##

아래 URL에서 IA32 GNU/Linux Installer 다운로드

https://sourcery.mentor.com/sgpp/lite/arm/portal/release1294


cd ~/다운로드

sudo chmod a+x arm-2010q1-188-arm-none-eabi.bin

sudo dpkg-reconfigure -plow dash


dash 환경설정 - 아니오 - Enter

./arm-2010q1-188-arm-none-eabi.bin

계속 다음을 누르면서 설치


## CrossCompile 환경설정 ##

vi ~/.bashrc

맨아래 코드3줄 입력

export CROSS_COMPILE=arm-none-eabi-

export ARCH=arm

export PATH=$PATH:/home/본인계정/CodeSourcery/Sourcery_G++_Lite/bin;

source ~/.bashrc


참고 : http://source.android.com

GCC 다운그레이드 - How to install older gcc version

Posted in 개인/ㄴLinux by

특정 gcc 버전으로 gcc를 다운그레이드 하고 싶을 때 apt-get install로써 내가 원하는 gcc버전이 안나올 경우가 있다.

이럴때는 http://packages.ubuntu.com/ 에 모든 패키지 파일이 있으므로 검색을 통하여 특정 버전의 gcc를 설치한다.

이 때 주의할 것은 내가 원하는 gcc 버전의 deb 패키지 파일만 받지 말고 검색된 패키지의 depends 패키지들을 모두 설치해준 후

마지막에 gcc의 deb패키지를 설치해줘야한다.

나는 12.04에서 gcc 4.2를 설치하기 위해 cpp-4.2, gcc-4.2-base설치 후 gcc-4.2를 설치해주었다.

설치 후에 

$sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.2 50

Or

$sudo update-alternatives --config gcc 로 내가 원하는 gcc버전으로 링크를 연결해준다


How to use APT

Posted in 개인/ㄴLinux by

APT 쓰는 법

APT(Advanced Packaging Tool)는 원래 데비안 GNU/리눅스에서 소프트웨어 설치 또는 제거 작업(윈도우즈의 '프로그램 추가/제거'를 생각하면 됩니다)을 할 때 쓰는 소프트웨어이며 데비안 GNU/리눅스에서 갈라져 나온 우분투도 이 APT로 소프트웨어 설치 또는 제거 작업을 합니다. 글이 깨져서 나온다면 export LANG=en_US.UTF-8라고 입력한 다음 다시 써 보세요.

패키지 설치하거나 제거하기

우분투에서는 '패키지(package)'라는 단위로 소프트웨어를 관리합니다. 여러분이 원하는 소프트웨어는 하나의 패키지에 담겨 있는 여러 소프트웨어들 가운데 하나일 수도 있고, 반대로 여러분이 원하는 소프트웨어 하나가 여러 개의 패키지로 분리되어 있을 수도 있습니다. 이제 apt로 원하는 소프트웨어를 찾고, 설치하거나 제거하는 방법을 알아봅시다. 여기서는 한글 입력 소프트웨어인 '나비'를 예로 들겠습니다. 우분투에서 나비의 패키지 이름은 nabi입니다. 참고로 패키지를 설치하거나 제거하려면 root의 권한이 있어야 되기 때문에 root 암호를 기억하고 있어야 됩니다.

  • 패키지 찾기
apt-cache search <패키지 이름>
apt-cache search nabi
  • 패키지 설치하기
apt-get install <패키지 이름>
apt-get install nabi
  • 패키지 제거하기
apt-get remove <패키지 이름>
apt-get remove nabi
  • 패키지 다시 설치하기(주로 소프트웨어가 잘못되어 있을 때 쓰입니다)
apt-get reinstall <패키지 이름>
apt-get reinstall nabi

:!:참고) apt-get install 명령어로 받은 deb 파일의 저장 위치

/var/cache/apt/archive/
위 폴더에 .deb 패키지 파일로 저장됩니다.
  • /var/cache/apt/archive/ 비우기
apt-get clean

패키지 관리

apt는 최신 패키지를 다운로드 하여 설치하게 되는데 upgrade 하기전에 update 해서 source.list 를 갱신

  • 패키지 정보보기
apt-cache show <패키지명>
(예: nabi) apt-cache show nabi
  • 소스리스트 업데이트
apt-get update
  • 설치된 패키지들 업데이트
apt-get upgrade
  • 의존성 검사 수행하면서 업그레이드
apt-get -s dist-upgrade
  • CD-ROM 목록 추가
apt-cdrom add
  • 삭제하는 패키지의 설정화일들가지 모두 삭제시
apt-get --purge remove <패키지명>
  • dselect에서 선택한 패키지의 설치 및 삭제
apt-get dselect-upgrade

dpkg를 이용한 프로그램 설치와 제거

  • deb파일 설치
dpkg -i nabi_0.15-2_i386.deb
  • 제거하기
dpkg -P <패키지명>
(예: nabi) dpkg -P nabi
  • 설치 deb파일들의 리스트
dpkg -l
  • 설치된 패키지에 포함된 파일들 보기
dpkg -L nabi
  • deb파일 패키지에 포함된 파일들 보기
dpkg -c nabi_0.15-2_i386.deb
  • deb파일의 정보보기
dpkg -I nabi_0.15-2_i386.deb
  • 파일이 포함된 패키지 이름 알아내기
dpkg -S /usr/bin/nabi
  • 설치된 패키지를 볼때
dpkg -l 패키지명


출처 - 우분투 한국 사용자 모임

http://ubuntu.or.kr/wiki/doku.php?id=%EB%AA%A9%EC%B0%A8:apt_%EC%82%AC%EC%9A%A9%EB%B2%95

Install JDK6 for Ubuntu 12.04 (32bit & 64bit)

Posted in 개인/ㄴLinux by

Install Oracle JDK 6 for Ubuntu 12.04 (32bit & 64bit)

$ sudo add-apt-repository ppa:webupd8team/java

$ sudo apt-get update

$ sudo apt-get install oracle-java6-installer (oracle-java7-installer)


Config Setting

$ sudo update-alternatives --config java

캐쉬 구조 동작원리 (Cache Organization)

Posted in 개인/ㄴLinux by

출처 : http://www.cyworld.com/uryoni_home2/3661131


Cache Organization

 

 

 

 

 

Cache가 어떻게 체계화되는지의 방법을 충분히 이해하기 위해 두 가지 용어는 정의가 필요하다. 이 용어는 cache page와 cache line이다. Cache page부터 정의해보면, main memory는 cache page로 불리는 같은 크기의 조각으로 나누어진다. Page의 크기는 cache의 크기와 cache가 체계화되는 방법에 의존된다. Cache page는 cache line으로 불리는 더 작은 조각으로 나누어진다. Cache line의 크기는 processor와 cache design에 의해 결정된다. 그림 1은 main memory가 cache page들로 나누어지는 방법과 cache page가 cache line들로 나누어지는 방법을 보여준다.

 

 

1. Fully-Associative

 

 

 

 

첫 번째 cache 체계는 Fully-Associative cache이다. 그림 2는 Fully-Associative cache의 다이어그램을 보여준다. 이 체계적 구조는 cache의 어느 장소로의 저장이 main memory의 어느 line이나 허가된다. Fully-Associative cache는 cache page를 사용하지 않고, 단지 line을 사용한다. Main memory와 cache memory는 같은 크기의 line으로 나누어진다. 예를 들어 그림 2는 main memory의 Line 1이 cache의 Line 0으로 저장되는 것을 보여준다. 그러나 이것은 단지 가능성만을 보여주는 것이 아니고, Line 1은 cache안의 어느 장소에든 저장된다. 어느 cache line이든 어느 memory line에 저장할 수 있고, 그래서 Fully-Associative이다.

 

Fully-Associative 구조는 어느 memory 위치든 어느 cache 위치에 저장될 수 있기 때문에 최고의 성능을 제공한다. 단점은 이러한 구조를 충족하는 복잡성이다. 복잡성은 요청된 데이터가 cache로 제공되는 결정을 갖는데서 온다. Timing 요구을 만족하기 위해, 현재의 주소는 TRAM으로 제공되는 모든 주소를 비교해야 한다. 이것은 복잡성의 증가와 큰 cache를 충족하는 비용으로 인해 많은 수의 비교기를 요구한다. 그러므로 cache의 이러한 종류는 4K보다 작은 cache를 위해 일반적으로 사용된다.

 

 

2. Direct Map

 

 

 

 

Direct Mapped cache는 1-Way set associative cache로 불린다. 그림 3은 Direct Map 구조의 다이어그램을 보여준다. 이 구조에서 main memory는 cache page로 나누어진다. 각 page의 크기는 cache의 크기와 같다. Fully-Associative cache와 다르게 Direct Map cache는 cache의 같은 line으로 memory의 특정한 line만이 저장할 수 있다. 예를 들어 memory의 어느 page의 Line 0은 cache memory의 Line 0에 저장되어야 한다. 그러므로 만약 Page 0의 Line 0은 cache 내부에 저장되고, Page 1의 Line 0이 요청되면 Page 0의 Line 0은 Page 1의 Line 0으로 교체될 것이다. 이 구조는 대응하는 cache line으로 memory line이 직접적으로 그려진다. 그래서 Direct Mapped cache이다.

 

Direct Mapped cache 구조는 모든 세 가지 caching 구조에서 가장 적은 복잡성을 갖는다. Direct Mapped cache는 현재 요청된 주소가 단지 하나의 cache 주소와 비교를 요청한다. 이러한 복잡성이 적은 구현으로 다른 caching 구조보다 훨씬 저렴하다. 단점은 Direct Mapped cache는 훨씬 낮은 수준의 성능으로 유연성이 적고, 특히 cache page 사이를 점핑할 때 두드러진다.

 

 

3. Set Associative

 

 

Set-Associative cache 구조는 Fully-Associative와 Direct Mapped caching 구조의 혼합형이다. 이 구조는 cache way로 불리는 같은 section(2 또는 4 sections)으로 cache SRAM을 나눔으로 동작한다. Cache page 크기는 cache way의 크기와 같다. 각 cache way는 작은 direct mapped cache와 같이 다루어진다. 그림 4는 2-Way Set Associate cache 구조의 다이어그램을 보여준다. 이 구조에서 memory의 두 라인은 언제라도 저장되어질 수 있다.

 

이 구조는 비교기의 수가 cache way의 수와 같기 때문에 Fully-Associative cache보다 복잡성이 덜하다. 2-Way Set-Associate cache는 단지 Fully-Associative 구조보다 적은 비용의 구조를 만드는 두 개의 비교기을 요구한다.

JNI를 사용하여 GPIO LED 컨트롤

Posted in 단체/ㄴKETI 연수생 by

저번에 작성한 파일은 Syscall을 이용하여 디바이스를 컨트롤했지만 이번에는 sysfs의 attribute를 사용하여 컨트롤 해보자


디바이스 드라이버 컨트롤 4가지 방식 : proc, sysfs, syscall, 디바이스모드 파일 


### FLOW CHART ###

1. 디바이스 드라이버 제작(myled.c)

#include <linux/module.h>

#include <linux/fs.h>

#include <linux/errno.h>

#include <linux/kernel.h>

#include <linux/major.h>

#include <linux/mutex.h>

#include <linux/proc_fs.h>

#include <linux/seq_file.h>

#include <linux/stat.h>

#include <linux/init.h>

#include <linux/device.h>

#include <linux/tty.h>

#include <linux/kmod.h>

#include <linux/gfp.h>

#include <linux/spinlock.h>

#include <linux/delay.h>

#include <linux/platform_device.h>

#include <linux/gpio.h>

#include <linux/sysfs.h>

#include <linux/myled.h>

#include <plat/gpio-cfg.h>

#include <asm/uaccess.h>

static ssize_t set_myled(struct device *dev, struct device_attribute *attr, const char *buf, size_t count);

static DEVICE_ATTR(led, S_IWUGO, NULL, set_myled);

static struct myled_platform_data *pdata;

static struct attribute *myled_sysfs_entries[] = {

&dev_attr_led,

NULL

};

static struct attribute_group myled_sysfs_attr_group = {

.name = NULL,

.attrs = myled_sysfs_entries,

};

static ssize_t set_myled(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)

{

unsigned int val;

if(!(sscanf(buf, "%d\n", &val))) return -EINVAL;

gpio_set_value(pdata->gpio_tx, ((val != 0) ? 1 : 0));

return count;

}

static int myled_probe(struct platform_device *pdev)

{

int err;

pdata = pdev->dev.platform_data;

err = gpio_request(pdata->gpio_tx, pdata->gpio_tx_bank);

if (err < 0) {

pr_err("myled : failed to request GPIO %d,"

" error %d\n", pdata->gpio_tx, err);

goto fail;

}

gpio_direction_output(pdata->gpio_tx, 0);

return sysfs_create_group(&pdev->dev.kobj, &myled_sysfs_attr_group);

fail:

gpio_free(pdata->gpio_tx);

platform_set_drvdata(pdev, NULL);

return err;

}

static int myled_remove(struct platform_device *pdev)

{

return 0;

}

static struct platform_driver myled_device_driver = {

.probe = myled_probe,

.remove = myled_remove,

.driver = {

.name = "myled",

.owner = THIS_MODULE,

}

};

static int __init myled_init(void)

{

platform_driver_register(&myled_device_driver);

printk(KERN_INFO "============= myled init OK =============\n");

return 0;

}

static void __exit myled_exit(void)

{

platform_driver_unregister(&myled_device_driver);

}

module_init(myled_init);

module_exit(myled_exit);

MODULE_LICENSE("GPL");

MODULE_DESCRIPTION("GPIO LED TEST");


2. 안드로이드 APK 제작(myled.apk)

    1) Eclipse에서 MyLed 프로젝트를 작성

    2) java 파일에서 public native 반환자료형 함수명(...);으로 C언어로 사용할 함수명을 선언

    3) XML파일을 작성

    4) MyLed 프로젝트 아래에 Eclipse에서 JNI 폴더 생성

    5) 프로젝트\bin\class로 이동 후 Javah -classpath C:\CookAndroid\android-sdk\platforms\

        android-8\android.jar; com.example.myled.MainActivity 실행하여 헤더파일 작성

        [platforms\android-OS버전별 API레벨\android.jar; 패키지명.MainClass명]

        → 이 때 JAVA파일에 선언된 native 함수명을 참조하여 헤더파일을 만드므로 미리 선언해놔야한다.

     6) 프로젝트\bin\class에 생성된 헤더파일을 JNI폴더 아래로 복사

     7) JNI 폴더 아래 myled.c 작성

         JNIEXPORT 반환자료형 JNICALL (위에서 생성된 헤더파일 안에 선언된 함수명 - 동일해야 링크됨)

     8) JNI 폴더 아래 Android.mk 파일 작성

LOCAL_PATH := $(call my-dir)

include $(CLEAR_VARS)

LOCAL_MODULE := myled

LOCAL_SRC_FILES := myled.c

include $(BUILD_SHARED_LIBRARY)

9) Cygwin 창에서 /cygdrive/c/CookAndroid/Project/HelloWorld/JNI로 이동 후

    $/cygdrive/c/CookAndroid/android-ndk-r8b/ndk-build

10) MyLed/libs/armeabi/libmyled.so 파일 생성 확인, MyLed/bin/Myled.apk 생성된 것을 sdcard에 복사후 설치


3. MyLed\JNI\myled.c 소스 파일

#include <stdlib.h>

#include "android_log.h"

#include "com_example_myled_MainActivity.h"


JNIEXPORT void JNICALL Java_com_example_myled_MainActivity_LED_1ON(JNIEnv *env, jobject jObj){

system("echo 0 > /sys/devices/platform/myled.0/led");

}

JNIEXPORT void JNICALL Java_com_example_myled_MainActivity_LED_1OFF(JNIEnv *env, jobject jObj){

system("echo 1 > /sys/devices/platform/myled.0/led");

}


4. MyLed\JNI\Android.mk 소스 파일 (log를 사용하기 위해 2,3줄 추가)

LOCAL_PATH := $(call my-dir)

LOCAL_LDLIBS := -L$(SYSROOT)/usr/lib -llog

LOCAL_CFLAGS := -DCONFIG_EMBEDDED\ -DUSE_IND_THREAD\


include $(CLEAR_VARS)

LOCAL_MODULE := myled

LOCAL_SRC_FILES := myled.c


include $(BUILD_SHARED_LIBRARY)