기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

안녕하세요. 안드로이드를 공부한지 얼마 안됐지만 열심히 해보고싶은 학생입니다.


안드로이드에서 화면출력 하는부분을 바꿔보고 싶은데요. LCD화면에서 반을 나눠서 상하를 뒤집어서

출력해보고싶습니다.

1   ->   2

2          1


이런식으로요.

제가 이것을 하려는 이유는 안드로이드의 화면 출력을 픽셀단위로 컨트롤 해보고싶어서 입니다.


테스트하기위해서 오드로이드 U3 보드를 사서 안드로이드는 4.4 kitkt으로 surfaceflinger 부분을 보고 있습니다.

메모리에 픽셀 데이터들을 그릴 때 위치를 바꿔서 그릴 수 있는 부분을 찾아보고있습니다.


frameworks/native/service/surfaceflinger 디렉토리 밑의 소스들을 열심히 보는데

서피스들이 수정되면 layer들에서 clip 부분을 추출해 내고 layer들 layer->draw 로 다시 그리더라고요.

그래서 draw를 할 때 위치를 바꿔서 draw 하도록 보고있는데 딱히 손쓸 위치가 잘 안보여서 난감합니다.


postFramebuffer 함수에서도 합성된 서피스를 HWComposer로 보내는데 odroid는 exynos4 여서 samsung slsi의

libhwc 디렉토리의 소스들을 사용하는것을 확인했습니다. 프레임버퍼 디바이스에서 fb_post를 호출해서 커널의

디바이스 드라이버에 접근하는것 같던데 프레임버퍼에 데이터를 쓸때도 시작주소와 lengh 값만 지정해서 dma로 전송하게 해서

메모리의 데이터값들을 상하로 뒤바꾸게 하기가 애매하였습니다.


서론이 길었는데요........ 제가 드리고 싶은 질문은 화면의 상하를 뒤바꾸도록 소스를 수정하기위해 제가 하고있던 접근방법이

맞는지와 혹시 틀리다면 어디부분을 공부하고 접근해야 하는지에 대해 알려주셨으면 합니다.


아 그리고 surfaceflinger 공부하면서 이해가 안갔던 부분이 있었는데, surfaceflinger 초기화 후 displayHardware 를 초기화 하면서 gralloc으로 프레임버퍼 메모리를 할당 하던데 안드로이드 커널의 프레임버퍼 디바이스를 register_framebuufer 할 때 메모리를 잡아 놓는것으로 알 고 있는데 왜 안드로이드에서도 프레임버퍼 메모리를 잡는지 이해가 안갑니다..


제가 개념이 잘 잡히지 않은 상태가 좀 산만하게 글을 쓴 거 같습니다... 양해 바라면서 ..답변 부탁드립니다.



고도리

2015.04.15 11:02:13
*.151.13.202

간단하게 설명을 드리면....


4412와 같은 경우, 즉, 하드웨어 카메라/동영상 가속기를 쓰는 cpu들을 지원하기 위하여

안드로이드는 hwcomposer라는 것을 만들었습니다.


1. 일반 gui용 메모리

2. 동영상/카메라용 메모리


이렇게 구분을 해 놓습니다.


원하시는 것을 하려고 하면 메모리 내용을 바궈야 합니다

즉, 위에서 말씀드린 두가지에 대해서 다 손대야 합니다.


1. 일반 gui용 메모리는 메모리 포인터가 명확합니다.

이 경우 큰 문제없이 손대실 수가 있습니다.

ex. 실제 framebuffer에서 손을 대도 됩니다.


2. camera/media의 경우

이 부분은 실제 하드웨어에서 사용하는 color format을 먼저 알아야 하고,

해당 메모리는 ion과 같은 DMA 지원 풀을 쓰기 때문에, 실제 커널에서 사용하는 DMA메모리

를 가져다 볼 수 있는 코드를 짜야 합니다.


그래야만 메모리를 손댈 수 있습니다.


워낙 복잡한 부분이 많은 부분이라 간단하게만 설명드립니다.

ImYeol

2015.04.16 08:08:43
*.141.6.65

답변 감사합니다. T^T 

한달 전쯤에 리눅스가 올라가 있는 라즈베리파이의 프레임버퍼 메모리 데이터를 바꿔서

성공한 적이 있어서 안드로이드도 비슷하겠지 했는데.. 훨씬 복잡하네요..

제가 아직 잘 이해가 안가는데...일반 GUI 데이터 일때gralloc을 통해 프레임버퍼 사이즈만큼 할당한 메모리에서 실제 프레임버퍼로 데이터가 이동되는건가요?

List of Articles
번호 제목 글쓴이 날짜 조회 수sort
6368 Apple TV 온보드 메모리 변경 가능할까요? [1] 당그니 2011-01-20 94733
6367 android pwm backlight 밝기 제어 [4] 김태영 2011-07-28 54976
6366 com.google.android.maps.jar는 어디서 얻는 것인가요??? [2] 천동이 2014-09-02 52299
6365 USB bluetooth dongle on jellybean [4] 신현호 2014-02-21 50320
6364 우분투 리눅스 ip 변경 도중에 "No such process" [5] 이세종 2009-04-01 45969
6363 OpenOCD 0.2.0 [1] 김광준 2009-10-24 44725
6362 [질문]memset, mmap, memcpy에 대해서 질문 있습니다. [5] 이태간 2007-05-22 44685
6361 libpcap 설치 [1] Apostasy 2011-04-12 43866
6360 램디스크 파일 시스템 만들기 [4] sinwho 2015-08-19 43470
6359 USB 포팅관련 질문드립니다. [1] 김승한 2010-01-07 33314
6358 android에 libusb porting 해보신 분?? [2] 꿈의사람 2014-02-13 29616
6357 오드로이드 배터리 패치 문의 [1] 이종문 2010-07-01 29052
6356 ODROID-T 2.2 셧다운 후 부팅이 안됩니다. [2] shkim 2010-10-02 26878
6355 오드로이드 디버깅이 안되네요... [2] 현쓰 2010-02-01 26595
6354 [질문]wince 이미지 다운로드시 에러 [3] 이태간 2008-04-06 26265
6353 slide event에 따른 landscape & portrait mode 전환 [1] 나영찬 2010-03-25 24634
6352 Andorid ALSA에 관해서...2 [1] 꺼북이 2011-05-18 24234
6351 wm1811 드라이버를 찾아요 [9] 김민욱 2016-11-01 18767
6350 이더넷 핀에서 값을 읽어 오고 싶은데요... [2] rubio 2013-07-09 13050
6349 usb host api 가 리눅스단에서도 사용가능한가요? [1] biokk 2014-02-07 11392

사용자 로그인