Android 에서 Gadget Driver 등록 방법에 대해 문의 드려요~~~ㅠㅠ

kieslv의 이미지

/gadget에 있는 file_storage 드라이버를 app에서 호출하는데 Node 생성방법은 어떻게해야 될까요?
file_storage를 그대로 사용하려는 것이 아니고 제가 수정하여 사용하려고 합니다.
커널에 포함하여 빌드하였지만, /dev에는 생성이 되지 않고, sys/module에만 생성이 되어 있는 상태 입니다.

ehter.c를 포함하여 빌드하였을 경우 장치가 USB Ether로 인식되는것을 확인하였습니다.

제가 하고 싶은것은 장치를 리셋하여 제가 구현한 기능을 전용으로 사용하려고 합니다.
그러기 위해서는 우선 장치가 단일 장치로 리셋이 되어야 할것이고(디스크립터는 수정하였습니다.)
해당 드라이버에 접근하여 IOCTL을 사용해야 할것으로 생각됩니다.

하지만 우선 노드가 생성되지 않아 어떤식으로 접근해야 하는지가 막막하여 문의 드립니다.

bushi의 이미지

node 가 어디에 어떤 이름으로 생길지, 과연 생기기나 할지, 등등은 드라이버마다 다릅니다.
질문을 구체적으로 하세요.

kieslv의 이미지

리턴값으로 13을 뱉어내내요...

에러넘버 13이면 permission denied로 알고 있는데, chmod로 강제 권한 설정을 해주고 다시 접근해봐도

마찬가지의 결과가 나옵니다.

android gadget드라이버를 내리고 다른 gadget드라이버를 올려서 이클립스로 디버깅도 안되고...

막막하네요....

bushi의 이미지

/sys/module/xxxxxx 는 무슨 얘긴가요 ?
그건 로드된 드라이버에 대한 정보를 보기 위한 인터페이스이지 I/O 는 어림턱도 없는데요.

file_storage 건 CDC Ether 건 간에 dev node 를 만들필요가 없으니 dev node 가 생길리 없고요.

end point 갯수만 넉넉하다면 android gadget 에 계속 추가할 수 있습니다.
http://android.git.kernel.org/?p=kernel/common.git;a=commit;h=2a9f8aca093e0a8e72f9e472077ddde313b186ba
필요한 gadget function 드라이버를 만들고 android gadget 에 추가해서 사용하세요.

적으면서도... 좀 공허하네요.
이클립스 디버깅이라니... 그 세상에서 이 바닥으로 내려오시려면 고생 좀 하시겠습니다.

kieslv의 이미지

거의 무지하다 싶을 정도의 지식으로 계속해서 삽질을 할 수 밖에 없는 상황에서 달아주신 답글은

진심으로 감사드립니다.

한가지 더 여쭙고 싶은게 있는데, 안드로이드 어플리케이션단에서 작업한 정보를 gadget function 드라이버에 I/O 작업을
하는 방법은 어떻게 해야 할까요?

bushi의 이미지

처음으로 되돌아가는데... gadget function 드라이버에 따라 다릅니다.
예로 드신 file_storage 는 그런 설비가 아예 없고,
CDC/Ether 는 이더넷이고, 소켓을 사용하면 되고 (장치는 아마도 usb? 일겁니다)
ACM/serial 은 모뎀이고, /dev/ttyGS? 를 사용하시면되고요.
(직접 gadget function 드라이버를 만드실거라면 원하는 대로 구현하셔도되지만,
host 쪽의 드라이버를 고려하신다면, 이미 만들어져있는 class function 드라이버를 그대로 사용하시는 게 좋을 겁니다.)

직접 만드실거라면,

웹사이트 여기저기에서 쉽게 찾을 수 있는 simple character device driver 강좌나 예제를 보고
file_operation 콜백들을 어떻게 만들어야하는지,
.read 콜백과 .write 콜백에서 어떤 식으로 어플리케이션과 데이타를 주고 받는지 보시고,
이걸로 어떻게 register_chrdev() 하는지 보시고요.
gadget function 드라이버는... 제일 간단한 예제가 f_loopback.c 밖에 없네요.
네트웍 프로그래밍 교육에서 흔히 쓰이는 echo server 같은 놈입니다.
어쨌든 ... bulk in/out end point 를 얻어오기 위해 usb_ep_autoconfig() 하는 것,
I/O 요청에 사용할 usb_request 를 얻기 위해 usb_ep_alloc_request() 하는 것,
I/O 에 사용할 버퍼에 대한 정보와 complete 콜백을 등록하는 것,
필요할 때 usb_ep_queue() 로 I/O 를 수행하는 것,
이 정도가 가장 기본적인 것이니 여기에 주의해서 코드를 보시면 되겠습니다.
(USB 용어들이 host 입장에서 정해진 것이라서 헷갈릴때가 많으실 겁니다.
예를 들면... device 입장에선... bulk-in end point 는 데이타 전송을 위해 사용되고, bulk-out end point 는 데이타 수신을 위해 사용됩니다.)

데이타 흐름만 보면,
char device file_operations 의 .write() 콜백내에서 어플리케이션으로 부터 데이타를 전달받아
bulk-in end point 에 대해 usb_ep_queue() 한 후에,
bulk-in end point 용으로 등록한 complete 콜백이 불려서 wakeup 해 줄 때 까지 sleep 상태로 빠지면 됩니다.
char device file_operations 의 .read() 콜백내에서 bulk-out end point 에 대해 usb_ep_queue() 한 후에,
bulk-out end point 용으로 등록한 complete 콜백에 불려서 wakeup 해 줄 때 까지 sleep 상태로 빠지고,
wakeup 된 후에 버퍼의 내용을 어플리케이션 쪽으로 전달해 주면 됩니다.

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.