디바이스 드라이버가 한번 열었다 닫으면 동작하지 않습니다. OTL
글쓴이: brain2012 / 작성시간: 일, 2006/10/08 - 5:52오후
안녕하세요!
여기에 질문을 올려보는것도 처음이네요^_^;
다름이 아니라..
G2라는 공간인식 마우스를 리모컨 형태로 변형시켜 사용하려고 합니다.
기존에 있던 USB 마우스의 디바이스 드라이버를 수정해서
특수버튼과 상대좌표등의 로우데이터를 사용자
영역으로 가져오는데 성공은 했습니다.
어떤 버튼인지 어느비트가 어느버튼을 의미하는지는 모두 분석이 끝났는데
문제는(!) 디바이스에 open함수로 접근해서 데이터를 읽고
close를 하면 그 이후부터는 데이터를 읽어오지 못합니다.
뽑았다가 꼽아도 데이터를 가져오지 못하고 껐다 켜야만합니다;
read함수를 사용할때 내부에서 copy_to_user함수를 사용합니다.
디바이스 드라이버 내에서 어디선가 블럭이 걸리는 느낌인데..
어디까지나 저만의 느낌이고
일주일째 땅만파고 있네요ㅎ
이런 경험 해보신 분들 조언 부탁드립니다!
그럼 추석 연휴 마무리 잘하시길~!
Forums:
아참.. 환경은..
PXA255보드이고
거기에 달린 USB 호스트에
마우스의 RF리시버를 물려서
사용하려고 합니다.
커널 버전은 2.4.19입니다.
드라이버 소스를
드라이버 소스를 올려 주세요.
드라이버 소스와 타켓으로 잡고있는 마우스 스팩입니다.
관심 감사합니다 ^_^
일단 로우데이터만
유저영역으로 가져오고
비트분석에 따른 동작은
어플에서 처리하고 있습니다.
그럼..!
아참..파일로 저장하셔서 비쥬얼 툴에서 보시길 권해드립니다;
그냥 클릭해서 확인해보니..
OTL이군요
Development enviroment 에서
최적으로 보이도록 편집되어있습니다;
뽑았다가 다시
뽑았다가 다시 꽂았을 때, usb_mouse_probe() 이 호출 되나요?
probe함수는 정상적으로 호출되는듯 합니다.
claimed 되었다고 메세지가 나옵니다.
file_operations 구조체에
file_operations 구조체에 owner 멤버를 초기화 해 주시는 게 좋을 것 같습니다.
그리고 실수일 듯 한데요... struct 선언 뒤에 ;이 빠졌습니다.
struct file_operations my_usb_mouse_fops =
{
owner: THIS_MODULE,
read: usb_mouse_read,
};
아.. 콜론이 빠져있었군요
수정후 테스트 하였습니다만..
이것이 원인은 아닌듯 합니다;
input_device로 사용하는
input_device로 사용하는 것에는 문제가 있는 것 같습니다.
input_device로 사용하려면 ISR 안에서 input_report_key() 함수 호출 등으로 input driver로 feedback을 걸어주어서 입력으로 처리하는 방식이므로 곧바로 file operation을 걸어도 open 과정에서 file_operations 구조체가 변경되는 듯 합니다.
따라서 해결 방법으로는 input_device로 사용할 수 있게 ISR 안에서 input_report_key 함수를 호출하는 방법과 input_device가 아닌 일반 character device로 등록하는 방법 중에 하나를 택하셔야 할 것 같습니다.
일반 character device로 하실 경우에는 file_operations 구조체에 open, release를 구현하시고 (지금의 open, close에 인자가 좀 바뀝니다. 파일 하나만 여는 것으로 가정한다면 전역변수를 써서 처리를 할 수도 있을 것 같습니다.) probe 함수 내의 input_register_device 함수 호출 대신 devfs_register_chrdev 함수 호출을 쓰시면 됩니다. (단, 당연하게도 호출 인자는 다릅니다.) 제거 함수명은 어렵지 않게 추측하실 수 있을 겁니다.
input device 로 등록하는게 문제인가보군요
일반 character device와 input device사이에 그런차이가 있는지 몰랐네요
probe함수 내의 등록함수를 바꿔서 테스트 해보도록 하겠습니다.
제가 원하는건 마우스에서 동작에 따라 발생하는 로우데이터를 사용자 영역으로
문제없이 가져오기만을 원하고있습니다.
아무래도 두번째로 말씀해주신 character device로 등록해서 사용해봐야 겠습니다.
USB라는 생소한 인터페이스이기에 왠지 경직된 느낌이네요.
말씀 감사합니다^_^
devfs_register_chrdev함수를 사용해서 구현한 소스입니다.
첨부는 소스입니다.
거의 전체적으로 뜯어고쳤다고 봐도 될정도인데요;
어쨌든 컴파일에서 적재(insmod)까지 정상적으로 올라가는 소스입니다.
문제는 등록에 성공했다고 메세지가 나와도
디바이스 파일이 자동으로 생성되질 않습니다.
혹시나 해서 mknod my_gyro_mouse c 180 130 으로 만들어서
파일을 열려하면 세그먼트 폴트가 납니다;
(주번호 180은 USB주번호이고 130은 제보드에서 할당되지않은 부번호입니다)
devfs 시스템 자체가 2.4에서는 약간 미구현 상태라는 이야기가 있던데
그쪽에 문제가 있을련지 아니면 소스에서 뭔가 빼먹은 것인지..
깍두기 :
usb_alloc_dev(struct usb_device *parient,struct usb_bus *bus)
형태인데 소스에서 함수의 사용법이 저게 맞는지 모르겠습니다;;;
첨부파일이 보이지
첨부파일이 보이지 않아서 뭐라 말씀드리기 힘든 상황이지만...
usb_alloc_dev 함수를 호출할 필요는 없을 것 같습니다.
character device로 등록한 이후에 devfs_register 함수 호출로 디바이스 파일을 만들 수 있습니다.
usb 쪽에 연결하는 방법은 drivers/usb/usb-skeleton.c의 skel_probe 함수를 참조하시면 될 겁니다.
그리고 file_operations 구조체에 owner 설정이 되어 있지 않다면 open, release 함수 쪽에는 각각
MOD_INC_USE_COUNT;와 MOD_DEC_USE_COUNT;를 써주셔야 합니다.
난감하게도..
devfs가 마운트가 안되어있었군요 -_-;;
그럼 /dev폴더 밑에 형성되어있던 수많은 노드파일들은...;;;;
========================================================
너만 보고 달려요!
댓글 달기