교육센터에서 프로젝트 진행하면서 개발했던 V4L2 Driver 관련 기술문서입니다.

제대로 이해하지 못한 부분도 많아서 내용이 많이 부족하지만 실제로 개발했던 부분들에 대한 설명 위주로 작성하였습니다.


문서 

Device_Driver_V4L2_by_T.pdf




영상


' 2016년 이전 > Embedded' 카테고리의 다른 글

V4L2 드라이버 개발 당시 일지??  (0) 2016.08.22
지능형 자율주행 RC Tank 시연 영상  (0) 2016.08.19
USB to CAN 모듈 등록  (0) 2016.07.23



2016. 06. 02.

 - 카메라가 인식 됬을 때 디바이스 파일 생성하도록 만들기 O

 - 카메라 연결이 해제되거나 드라이버가 종료되었을 때 디바이스 파일 삭제되도록 만들기 O


2016. 06. 03. ~ ??

 - file_operations 만들기


2016. 06. 09.

 - uvc_v4l2_try_format 등 함수 분석


2016. 06. 10.

 -vidioc_reqbufs 동작 안하는 원인 찾기

==> 해당 함수가 동작하기 위해선 vidioc_g_fmt_vid_cap 함수 혹은

 vidioc_g_fmt_vid_cap_mplane 함수가 선언되어 있어야함


2016. 06. 11.

 -vidioc_reqbufs 에러 잡기

-> 아무래도 vb2_queue 구조체에 동작에 필요한 값이 대입이 안되있어서 그런 듯

==> 구조체에 값이 없었던 것이 맞음. uvc와 skel 코드를 참고하여 해결


2016. 06. 13.

 - 333 TODO 작업 이어서 하기

-> PAGE_ALIGN 값이 0으로 나와서 메모리 할당이 실패되는 현상 잡아야됨

 --> R5 <-> DSP CAN 통신 구현

==> 따로 디바이스 드라이버 없이 시리얼 통신으로 동작


2016. 06. 14.

 - 333 TODO 작업 이어서 하기

-> PAGE_ALIGN 값이 0으로 나와서 메모리 할당이 실패되는 현상 잡아야됨


2016. 06. 15.

 - 333 TODO 작업 이어서 하기

-> coherent DMA mask is unset 이 에러 잡으면 뭔가 진행이 될 듯???

-> 어쩌면 지금 짜는 코드가 DMA용 코드가 아닌데 DMA관련 ....

==> DMA용 코드를 사용해서 에러가 낫었음. vmalloc 코드로 바꾸니 동작

-> VIDIOC_QUERYBUF 코드 만들기

==> 잘 된건지는 모르겟지만 일단 에러 없이 통과

-> mmap 함수 만들기

-> VIDIOC_QBUF 만들기

==> 구동에 필요한 함수들은 다 만들었음


2016. 06. 16.

-> usb, urb 관련 코드 수정하기

-> 다른건 모르겠으나 일단 urb 전송?? 무튼 usb 통신 자체가 제대로 안되는 듯


2016. 06. 17.

-> usb, urb 관련 코드 수정하기

-> 다른건 모르겠으나 일단 urb 전송?? 무튼 usb 통신 자체가 제대로 안되는 듯

==> usb_device_id 구조체 내용 수정을 하면 urb 전송 가능

2016. 06. 18.

-> usb, urb 관련 코드 수정하기

-> 통신은 되는 것 같으나 .. usb_device_id 수정하면 probe가 두번 실행되면서

장치 파일이 두 개 생성되는 문제가 있음 ... 


2016. 06. 19.

-> usb, urb 관련 코드 수정하기

==> 어느 정도 통신은 되는 듯????

-> 장치파일 두개 생성 되는거 해결하기

==> usb_submit_urb 함수 리턴 값에 따라 probe 종료 시키는 걸로 해결


2016. 06. 20.

-> Setting Pixel Format: Device or resource busy 오류 해결하기

-> video_usercopy 함수 가져다가 정확하게 어디서 에러 나는 것인지 찾기

==> vfh와 vfd의 prio 비교 함수에서 나는 에러였는데 file->private_data에 v4l2_fh 

값을 넘겨줬어야 했음. open에서 처리했어야 하나 querycap 함수에서 넘겨줌

==> 그 외 v4l2_fh 관련 에러 다 잡음


2016. 06. 21.

-> qbuf 함수 리턴 값이 -512인데 원인 찾고 고치기

--> 아마 buffer_prepare랑 buffer_queue 함수 쪽 문제인듯


2016. 06. 22. ~ 23.

-> qbuf 함수 리턴 값이 -512인데 원인 찾고 고치기

--> 아마 buffer_prepare랑 buffer_queue 함수 쪽 문제인듯

==> 놀아서 뭐했는지 기억이 안남.


2016. 06. 24.

-> s_fmt 부터 reqbufs 함수, queue_setup 함수 에러 잡기

==> file->private_data로 전달하는 값 문제

--> 어느 정도 잡은듯 한데 아직 queue_setup쪽 에러 남음


2016. 06. 25.

-> queue_setup 에러 잡기

--> uvc_parse_format 이쪽을 분석해봐야 할듯 ?

--> uvc_probe의 uvc_parse_control함수부터 시작..

-> probe함수 중 set_data 부분이 제대로 안되고 있음(test_20 파일에 TODO표시)

==> 두 개 문제 동시 해결? fmt.sizeimage 값을 get_data의 값으로 대체

-> qbuf 함수 리턴 값이 -512인데 원인 찾고 고치기


2016. 06. 26.

-> qbuf 함수 리턴 값이 -512인데 원인 찾고 고치기

--> 일단 종료 시그널 받기 전까지는 에러는 없으나 계속 wait하고 있는 듯?

--> __vb2_wait_for_done_vb 이 함수를 분석해볼 필요가 있음


2016. 06. 27.

-> qbuf 함수 리턴 값이 -512인데 원인 찾고 고치기

--> 일단 종료 시그널 받기 전까지는 에러는 없으나 계속 wait하고 있는 듯?

--> __vb2_wait_for_done_vb 이 함수를 분석해볼 필요가 있음

==> __vb2_wait_for_done_vb 이 함수에서는 특별히 문제가 있는 것이 아니고 버퍼를 기다리는 상태가 지속되는 것 뿐이었음. 따라서 다른 함수를 분석해야됨

-> uvcvideo 컴파일 해보기

==> "Following the move to linuxtv.org and its mercurial repositories, the uvcvideo

 can't be compiled alone anymore." 고로 독립적으로 컴파일 안될듯

-> vb2_streamon 함수에서 호출하는 start_streaming 함수 구현하기

-> 위에꺼 하기 전에 uvcvideo 코드를 내가 작성한 코드 순서와 동일하게 재구성해보기

--> open

--> querycap

-->s_fmt

-->reqbuf

-->queue_setup

-->querybuf

-->mmap

-->qbuf

-->buffer_prepare

-->streamon

--> buffer_queue

-->start_streaming

-->dqbuf

==>uvcvideo 코드를 어느정도 재구성해본 결과 코딩 방향은 어느 정도 맞았으나 ..

코덱 코드를 분석해야하는 상황임


2016. 06. 28.

-> vb2_streamon 함수에서 호출하는 start_streaming 함수 구현하기

--> 초반 몇 개 함수를 구현한다고 했으나 .. altsetting 값이 음수로 에러발생


2016. 06. 29.

-> vb2_streamon 함수에서 호출하는 start_streaming 함수 구현하기

--> header.bEndpointAddress의 값과 동일한 값을 t_struct->bEndpointAddress에 구하는 것까지 성공

-> 다음으로 start_streaming 함수 오류 해결하기


2016. 06. 30.

-> 다음으로 start_streaming 함수 오류 해결하기

--> 현재 uvc_init_video 내용 중 ret = uvc_init_video_isoc 함수 전까지 구현했음...

--> uvc_init_video_isoc 함수의 urb->complete 부분 제외 구현

--> complete부분은 decode 관련 함수들이 구현 되어야 구현 가능

-> uvc_video_init 함수 내에 uvc_video_decode_isoc 이 함수 구현해야됨 ㅠㅠ 

--> t_video_decode_isoc라는 이름으로 틀은 만들어 놓음


2016. 07. 01.

-> t_video_decode_isoc 마저 구현하기

-->uvc 코드를 보면 uvc_buffer 구조체가 필요한데 동일한 구조체를 만들어야할 듯

-> 위 함수 구현 끝나면 complete 부분 구현하기


2016. 07. 02.

-> t_video_decode_isoc 마저 구현하기

--> uvc_queue_next_buffer구현하기


2016. 07. 03.

-> t_video_decode_isoc 마저 구현하기

==> uvcvideo 코드에서 거의 이름만 바꿈 .. 

-> complete 부분 구현하기


2016. 07. 04.

-> t_video_decode_isoc 함수가 동작하면 OS가 뻗는 현상이 발생

--> t_video_decode_data 이 함수와 t_video_decode_end이 함수 문제인걸로 추측

--> 위 두개 함수는 상관 없음

--> 새로운 후보로 t_buffer_prepare이 함수가 의심됨


2016. 07. 05.

-> t_video_decode_isoc 함수가 동작하면 OS가 뻗는 현상이 발생

--> t_buffer_prepare이 함수의 주석 부분 제대로 구현하기

---> 아마 구현하려면 probe때부터 다 구현해야할듯???

---> container_of 함수 알아보기

=> OK

--> 여전히 OS 다운 현상 발생

==> t_buffer_prepare가 아닌 t_buffer_queue 함수에서 잘 못 코딩

-> uvc 코드와 비슷하게 동작하는 듯한데 정상적인 동작은 안되는 상태.


2016. 07. 06.

-> 비슷하게 동작은 하니까 이제 똑같이 동작하도록 해보기 ... 

--> dmesg 상의 메시지는 동일 하나 이후 진행이 안됨


2016. 07. 07.

-> t_uvc와 지속적으로 비교하고 있으나 원하는 포인트를 찾을 수가 없음 ..

--> streamon이라는 함수가 start_streaming을 호출해서 frame complete메시지가 

나오는 줄 알았으나 아무래도 해당 메시지는 호출 후 계속 동작하는 걸로 

예상되는 complete 함수 때문인듯?

--> 예상해볼 수 있는건 .............. 있나? .. ㅠㅠ 

---> 아무래도 thirdydriver_2 사진 처럼 dqbuf 때 계속 waitting만 하고 있는듯?

---> ^C 누르기 전까지 계속 대기하고 있는 듯한데 아무래도 이 부분이 의심됨

---> done_list 쪽 확인..


2016. 07. 08.

-> 진전이 없음.

-> 그동안 애써 무시하고 넘어왔던 스핀락하고 뮤텍스 코드를 추가해보기로 결정

--> 이래도 안되면 .. 안됨.. 허허

-> trace_v4l2_qbuf 라는 함수를 주석을 쳐놨는데 어디에도 존재하지 않음 .. 

  주석을 해제하면 컴파일이 안됨. 

-> trace_v4l2_qbuf 함수 찾아내기 ... 어딨는걸까 .. 

--> 아무래도 trace라는 단어가 붙은게 시스템콜 같기도 해서 "SYSCALL_DEFINE"으로 

찾아보았으나 안나옴

==> #include <trace/events/v4l2.h> 추가하면 컴파일 가능.. 별 의미 없는 함수였는듯

아 별의미 없는거 맞음. 이 함수는 내 드라이버 코드 부분이 아님.


2016. 07. 09.

-> 처음부터 끝까지 모든 함수 비교해보기.

--> mutex부분 추가 도중 s_fmt 함수가 uvc 함수랑 많이 다르게 작성되어있는 걸 발견

---> s_fmt 부분이 큰 영향을 주는 건지 모르겠음.. 포맷 설정 부분인데.. 흠


2016. 07. 10.

-> queue->irqqueue와 queue->queue 부분 추적 중 t_queue_next_buffer함수와 

   uvc_queue_next_buffer함수 동작에 차이를 발견

--> 스샷 남겨둠. t_dmesg_*와 uvc_dmesg_*

--> 위 함수 문제가 아닌 t_video_validate_buffer 함수의 if문 내용이 

uvc_video_validate_buffer와 달라서 생긴 문제

==> if문 내용 수정으로 해결

=> 해결! 화면 출력 잘됨(test_33)

-> 크기 조절이 안되는 문제가 있는데 이는 아무래도 어제 발견한 s_fmt 부분 문제 인듯

-> 속도가 굉장히 느린데 이거 해결할 수 있을까..

-> 화면 중간중간 하단 부분이 번져보이는 현상도 있음


2016. 07. 11.

-> s_fmt 함수부분 구현하기(1)

-> 화면 번짐현상... 잡아보기(2)

-> 발표자료 만들기(0)

-> 이날 그냥 놈


2016. 07. 12.

-> s_fmt 함수부분 구현하기

-> 화면 번짐현상... 잡아보기

-> 발표자료 만들기


2016. 07. 13.

-> 발표자료 만들기


2016. 07. 14.

-> 함수화 하기

=> OK

-> s_fmt 분석하기

-> rmmod 했을 때 안 멈추게 하기

-> 라인 디텍팅꺼 그 그거 구조체 그거 하기


2016. 07. 15.

-> s_fmt 분석하기

=> 분석은 끝나지 않았지만 640 x 480로 해상도 고정시킴

-> rmmod 했을 때 안 멈추게 하기


2016. 07. 18.

-> rmmod 했을 때 안 멈추게하기(종료 부분 제대로 구현하기)

-> 총구 개선하기

=> OK


2016. 07. 19.

-> 놈


2016. 07. 20.

-> 발표자료 정리

-> 드라이버 코드 분리

-> DSP 전원 ON 시 프로그램 동작되도록


2016. 07. 21.

-> 드라이버 코드 분리

-> DSP 전원 ON 시 프로그램 동작되도록

-> PPT에 넣을 Flow Chart 그리기

-> 함수화한 코드 메모리 반환 시키기


2016. 07. 22.

-> 드라이버 코드 분리

-> PPT에 넣을 Flow Chart 그리기

-> 지금까지 작업한 것(V4L2) 문서화 하기

-> DSP 전원 ON 시 프로그램 동작되도록

=> init.d에 스크립트 작성해놓음

-> 함수화한 코드 메모리 반환 시키기

--> IplImage 구조체가 메모리 반환을 하지 않아 생겻던 문제

=> IplImage를 사용하지 않고 Mat을 사용함으로써 해결

-> 부팅하면 uvcvideo말고 내꺼 동작하게

=> 커널에 포함 안시키고 단순히 메인프로그램 스크립트에 rmmod와 insmod로 해결

-> 메인 프로그램 실행 시간이 오래 지나면 killed 되는 현상

--> 커널 영역 메모리 부족 현상인걸로 사료

--> 부팅 후 대략 1시간 정도는 유지되는 듯?

--> 일단 보류


2016. 07. 23.

-> 드라이버 정상 종료되도록 코드 개선

-> 드라이버 코드 분리

-> PPT에 넣을 Flow Chart 그리기

-> V4L2 문서화하기


2016. 07. 24.

-> 드라이버 정상 종료되도록 코드 개선

-> 드라이버 코드 분리

-> PPT에 넣을 Flow Chart 그리기

-> V4L2 문서화하기

-> 세진이꺼 구조체 초기값 부분 고치기

--> 현재 lane.h라는 헤더파일을 만들어놓았고 구조체 통으로 리턴 받는 형식으로

진행해야할듯

-> 메모리 누수 잡는다고 했던 IplImage -> Mat 부분에서 치명적인 문제 발생

--> 변환이 제대로 되지 않았는지 정상적인 이미지 출력이 안됨

--> IplImage로 되돌렸을 때 정상 작동

=> IplImage 메모리 해제를 Main 코드에서 해주니 정상작동


2016. 07. 25.

-> 드라이버 정상 종료되도록 코드 개선

--> dmesg확인결과 exit함수 수행 직후 커널 패닉에 빠짐

--> 버퍼나 큐를 제대로 해제하지 않고 종료하면서 생긴 문제로 생각됨

--> insmod 후 카메라 동작시킨 다음 rmmod하면 커널 패닉에 빠지지 않음

-> 드라이버 코드 분리

-> PPT에 넣을 Flow Chart 그리기

-> V4L2 문서화하기


2016. 07. 26.

-> 드라이버 정상 종료되도록 코드 개선

--> dmesg확인결과 exit함수 수행 직후 커널 패닉에 빠짐

--> 버퍼나 큐를 제대로 해제하지 않고 종료하면서 생긴 문제로 생각됨

--> insmod 후 카메라 동작시킨 다음 rmmod하면 커널 패닉에 빠지지 않음

-> 드라이버 코드 분리

--> 보류

-> PPT에 넣을 Flow Chart 그리기

--> 보류

-> V4L2 문서화하기

--> USB 장치 관련

--> V4L2 소개

--> PPT 처럼 각 주요 API 설명(코드)

--> 작동화면


2016. 07. 27.

-> 드라이버 정상 종료되도록 코드 개선

--> dmesg확인결과 exit함수 수행 직후 커널 패닉에 빠짐

--> 버퍼나 큐를 제대로 해제하지 않고 종료하면서 생긴 문제로 생각됨

--> insmod 후 카메라 동작시킨 다음 rmmod하면 커널 패닉에 빠지지 않음

-> V4L2 문서화하기

--> USB 장치 관련

--> V4L2 소개

--> PPT 처럼 각 주요 API 설명(코드)

--> 작동화면


프로젝트 진행하면서 하루하루 기록한다고 했던건데 .... 중간중간 놀아서 안한 날도 꽤 많네 ㅋㅋㅋㅋㅋㅋ

' 2016년 이전 > Embedded' 카테고리의 다른 글

V4L2 Driver 기술문서  (1) 2016.08.22
지능형 자율주행 RC Tank 시연 영상  (0) 2016.08.19
USB to CAN 모듈 등록  (0) 2016.07.23



--------------------------------------------------------------------------------

비트캠프

Embedded ICT기반의 SW엔지니어 과정 중 진행한 내용입니다.


영상처리(OpenCV)를 기반으로 라인 인식과 목표물 타격을 할 수 있도록 구현하였습니다.

' 2016년 이전 > Embedded' 카테고리의 다른 글

V4L2 Driver 기술문서  (1) 2016.08.22
V4L2 드라이버 개발 당시 일지??  (0) 2016.08.22
USB to CAN 모듈 등록  (0) 2016.07.23


由щˆ… ????????????????


뭘로 검색을 해서 들어온거지 ???????


???????????????????????



' 2016년 이전 > 그냥' 카테고리의 다른 글

포기하고 시험 봤는데 ..  (0) 2015.04.19
오...  (0) 2014.12.29
와..  (0) 2014.07.03
노트북 사고 ..  (2) 2014.07.01
  (0) 2014.06.19

v4l2-ctl -d /dev/video1 -c exposure_absolute=270 (노출 값)


v4l2-ctl -d /dev/video1 -c exposure_auto=3 (자동밝기, 1은 수동)




참고 : http://askubuntu.com/questions/211971/v4l2-ctl-exposure-auto-setting-fails

' 2016년 이전 > etc' 카테고리의 다른 글

Firefox ScribeFile을 이용한 블로깅  (1) 2011.11.29
Fedora15 Audacious 설치 !  (0) 2011.11.28
Fedora 16 설치  (0) 2011.11.28
지금 노트북 배경 ~ !  (0) 2011.11.27
Fedora 에서 ET-131x 랜카드 인식 시키기  (0) 2011.10.18

* 환경

Board : TI AM5728(Cortex-A + C66 DSP + SGX) Heterogeneous DSP - http://www.ti.com/tool/TMDSEVM572X

OS : TI Linux (Kernel 4.18)

Module : MW USB2CAN(VCP) - http://www.devicemart.co.kr/1111711


위 환경에서 최초 USB2CAN 모듈을 보드에 연결하면 일반적으로 생성되어야 할 해당 장치에 대한 장치파일이 생성되지 않는다.

dmesg를 확인해본 결과 아래 사진처럼 장치가 인식이 되기는 했는데 .. 장치 파일이 생성이 되지 않았었다.



무엇이 문제일까 생각하다 내린 결론은 장치는 인식이 됬지만 해당 장치를 관리하고 동작시킬 드라이버가 없는 것이 아닐까였다.

이런 저런 키워드로 구글링을 하며 여러 글들을 보고 많은 해결책들이 제시 되어있었는데 현재 환경이 일반적인 리눅스 환경이 아닌

TI사에서 보드에 맞춰 수정한 커널이라서 그런지 제대로 동작하는 것이 없었다..

그러다 처음으로 제대로 동작하는 명령을 찾았는데 아래 내용이다.


# modprobe ftdi_sio

# chmod 666 /sys/bus/usb-serial/drivers/ftdi_sio/new_id  

# echo 0403 4001 > /sys/bus/usb-serial/drivers/ftdi_sio/new_id  

# modprobe ftdi_sio


ftdi_sio라는 드라이버에 모듈을 등록해주는 과정인 것 같다.

3번째 줄 echo 뒤에 따라오는 숫자들은 위쪽 사진에서 idVendor와 idProduct의 값인 것을 확인 할 수 있다.

저 부분을 각자 본인이 가진 모듈에 맞게 수정을 해주어야한다. 



위 처럼 아무 오류 없이 명령이 잘 처리되었다면 dmesg로 아래와 같은 결과를 얻을 수 있을 것이다.



해당 내용은 프로젝트를 진행하면서 혼자서 해결했던 내용이라 틀렸을 수도 있으니 수정할 부분이 보인다면 댓글 남겨주세요!

' 2016년 이전 > Embedded' 카테고리의 다른 글

V4L2 Driver 기술문서  (1) 2016.08.22
V4L2 드라이버 개발 당시 일지??  (0) 2016.08.22
지능형 자율주행 RC Tank 시연 영상  (0) 2016.08.19

version="$(wget -q -O - http://sourceforge.net/projects/opencvlibrary/files/opencv-unix | egrep -m1 -o '\"[0-9](\.[0-9]+)+' | cut -c2-)"

echo "Installing OpenCV" $version

mkdir OpenCV

cd OpenCV

echo "Removing any pre-installed ffmpeg and x264"

sudo apt-get -qq remove ffmpeg x264 libx264-dev

echo "Installing Dependenices"

sudo apt-get -qq install libopencv-dev build-essential checkinstall cmake pkg-config yasm libjpeg-dev libjasper-dev libavcodec-dev libavformat-dev libswscale-dev libdc1394-22-dev libxine-dev libgstreamer0.10-dev libgstreamer-plugins-base0.10-dev libv4l-dev python-dev python-numpy libtbb-dev libqt4-dev libgtk2.0-dev libfaac-dev libmp3lame-dev libopencore-amrnb-dev libopencore-amrwb-dev libtheora-dev libvorbis-dev libxvidcore-dev x264 v4l-utils cmake qt5-default checkinstall

echo "Downloading OpenCV" $version

wget -O OpenCV-$version.zip http://sourceforge.net/projects/opencvlibrary/files/opencv-unix/$version/opencv-"$version".zip/download

echo "Installing OpenCV" $version

unzip OpenCV-$version.zip

cd opencv-$version

mkdir build

cd build

cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -D WITH_TBB=ON -D BUILD_NEW_PYTHON_SUPPORT=ON -D WITH_V4L=ON -D INSTALL_C_EXAMPLES=ON -D INSTALL_PYTHON_EXAMPLES=ON -D BUILD_EXAMPLES=ON -D WITH_QT=ON -D WITH_OPENGL=ON ..

make -j2

sudo checkinstall

sudo sh -c 'echo "/usr/local/lib" > /etc/ld.so.conf.d/opencv.conf'

sudo ldconfig

echo "OpenCV" $version "ready to be used"


다운 받고 설치할 디렉토리에서 vi 등 편집기를 통해 위 스크립트를 opencv.sh 파일명으로 저장한다.


터미널을 열고 파일을 저장한 위치로 이동한 후 아래 명령어를 실행한다.


$ chmod +x opencv.sh


$ ./opencv.sh



그외 테스트 코드 등은 아래 출처 참고 


출처 : http://ledgku.tistory.com/59 (feat. 동키)

정보보안기사 책 잘 못사서 암호학만 대충 보고 포기하고 시험봤는데...

생각보다 학과 수업 내용이 꽤 도움이 되서 ㅋㅋㅋㅋㅋ



난이도가 쉬운 것도 있었지만 찍기 운도 좋았던듯..

네트워크 아슬아슬하게 과락 면한 거 같고 ..


공부를 거의 안해서 포기상태에다 첫 번째 응시라 기대도 안했었는데 .. 합격하니 얼떨떨

문제는 실기 준비하는건데 .. 합격률 최악의 실기를 과연 .. 

' 2016년 이전 > 그냥' 카테고리의 다른 글

이게 뭐지??  (0) 2016.07.23
오...  (0) 2014.12.29
와..  (0) 2014.07.03
노트북 사고 ..  (2) 2014.07.01
  (0) 2014.06.19

+ Recent posts