디바이스 드라이버가 한번 열었다 닫으면 동작하지 않습니다. OTL

brain2012의 이미지

안녕하세요!

여기에 질문을 올려보는것도 처음이네요^_^;

다름이 아니라..

G2라는 공간인식 마우스를 리모컨 형태로 변형시켜 사용하려고 합니다.

기존에 있던 USB 마우스의 디바이스 드라이버를 수정해서

특수버튼과 상대좌표등의 로우데이터를 사용자

영역으로 가져오는데 성공은 했습니다.

어떤 버튼인지 어느비트가 어느버튼을 의미하는지는 모두 분석이 끝났는데

문제는(!) 디바이스에 open함수로 접근해서 데이터를 읽고

close를 하면 그 이후부터는 데이터를 읽어오지 못합니다.

뽑았다가 꼽아도 데이터를 가져오지 못하고 껐다 켜야만합니다;

read함수를 사용할때 내부에서 copy_to_user함수를 사용합니다.

디바이스 드라이버 내에서 어디선가 블럭이 걸리는 느낌인데..

어디까지나 저만의 느낌이고

일주일째 땅만파고 있네요ㅎ

이런 경험 해보신 분들 조언 부탁드립니다!

그럼 추석 연휴 마무리 잘하시길~!

brain2012의 이미지


PXA255보드이고

거기에 달린 USB 호스트에

마우스의 RF리시버를 물려서

사용하려고 합니다.

커널 버전은 2.4.19입니다.

김유석의 이미지

드라이버 소스를 올려 주세요.

brain2012의 이미지


관심 감사합니다 ^_^

일단 로우데이터만

유저영역으로 가져오고

비트분석에 따른 동작은

어플에서 처리하고 있습니다.

그럼..!

brain2012의 이미지


그냥 클릭해서 확인해보니..

OTL이군요

Development enviroment 에서

최적으로 보이도록 편집되어있습니다;

skysign의 이미지

뽑았다가 다시 꽂았을 때, usb_mouse_probe() 이 호출 되나요?

brain2012의 이미지

claimed 되었다고 메세지가 나옵니다.

grassman의 이미지

file_operations 구조체에 owner 멤버를 초기화 해 주시는 게 좋을 것 같습니다.
그리고 실수일 듯 한데요... struct 선언 뒤에 ;이 빠졌습니다.

struct file_operations my_usb_mouse_fops =
{
owner: THIS_MODULE,
read: usb_mouse_read,
};

brain2012의 이미지


수정후 테스트 하였습니다만..

이것이 원인은 아닌듯 합니다;

grassman의 이미지

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 함수 호출을 쓰시면 됩니다. (단, 당연하게도 호출 인자는 다릅니다.) 제거 함수명은 어렵지 않게 추측하실 수 있을 겁니다.

brain2012의 이미지


일반 character device와 input device사이에 그런차이가 있는지 몰랐네요

probe함수 내의 등록함수를 바꿔서 테스트 해보도록 하겠습니다.

제가 원하는건 마우스에서 동작에 따라 발생하는 로우데이터를 사용자 영역으로

문제없이 가져오기만을 원하고있습니다.

아무래도 두번째로 말씀해주신 character device로 등록해서 사용해봐야 겠습니다.

USB라는 생소한 인터페이스이기에 왠지 경직된 느낌이네요.

말씀 감사합니다^_^

brain2012의 이미지

첨부는 소스입니다.

거의 전체적으로 뜯어고쳤다고 봐도 될정도인데요;

어쨌든 컴파일에서 적재(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)

형태인데 소스에서 함수의 사용법이 저게 맞는지 모르겠습니다;;;

grassman의 이미지

첨부파일이 보이지 않아서 뭐라 말씀드리기 힘든 상황이지만...
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;를 써주셔야 합니다.

brain2012의 이미지

devfs가 마운트가 안되어있었군요 -_-;;

그럼 /dev폴더 밑에 형성되어있던 수많은 노드파일들은...;;;;

========================================================

너만 보고 달려요!

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.