usb, serial, usb to serial 관련 질문 입니다.

swunk의 이미지

어쩌다 보니 팔자에도 없는 usb 및 serial 관련 커널 코드를 들여다 보고 있습니다.

한 두어가지 질문을 드리고자 합니다.

/usr/src/linux/driver/usb/serial/usbserial.c
코드를 기반으로 질문 드립니다.

(1) 해당 드라이버는 usb to serial driver 입니다. 응용 입장에서는 serial 로 open을 하고 실제 디바이스는 usb로 물려 있을때 사용을 하는것 같더군요...
독특하게 serial device 는 read 함수가 정의 되어 있지 않기 때문에 usbserial 에서도 usb 인터페이스를 통하여 수신되는 데이터들은 해당 callback function이 호출됩니다. 그 호출되는 함수는 generic_read_bulk_callback 이구요...해당 함수는 일반 serial driver 와 비슷하게 동작을 하는데 tty_flip_buffer에다가 tty_insert_flip_char 함수를 이용해서 데이터를 write 하고, 이를 응용 프로그램에 알려 주는 식으로 구현되어 있습니다. 그런데 generic_read_bulk_callback() 함수에서 flip buffer에 write를 하고 다시 urb를 채워서 (usb_fill_bulk_urb) usb 인터럽트를 발생 시키더군요..이 작업을 왜 하는지 궁금합니다.
참고로 generic_write_bulk_callback() 함수는 이해가 되는게 write를 하고 나서 실제 usb 로 패킷이 들어온 것처럼 해야 하기 때문에 위의 함수를 콜백으로 등록해서 사용하는 것은 명료하게 이해가 됩니다.

(2) 제가 궁극적으로 해야 하는 일은..(처음에는 이게 아니었는데 하드웨어 담당자와 말이 엇갈려서리..) serial 을 통해서 들어오는 데이터를 urb 형태로 바꿔서 이를 usb interrupt를 통해서 적절하게 처리를 해야 하는 일입니다. 좀더 자세하게 설명하면 host system에 serial 로 물려 있는 장치에서 무선 키보드 형태의 데이터로 부터 키보드 혹은 마우스 입력에 대한 데이터를 수신하면 이를 usb 형태로 바꿔서 마치 usb 키보드 혹은 마우스 이벤트가 발생한 것 처럼 처리를 해야 하는 일입니다. 반드시 usb 장치 에서 이벤트가 발생한것 처럼 해야 하는 것은 아니고, 어떠한 형태로든 키보드/마우스 처럼 동작을 하게 해야 하는데 serial로 바로 처리를 해서 serial keyboard/ serial mouse 드라이버를 짜서 처리를 할까도 생각을 해 봤지만...해당 드라이버를 짜거나 구하는 일이 만만치 않을 것 같고, usbserial 이 존재하니깐 위에서 말씀드린것 같이 serial 로 들어온 데이터를 usb 형태로 바꿔서 가장 보편적인 usb kbd 형태로 처리를 하려고 하는 겁니다. (설명이 너무 구구절절, 비명료하기 짝이 없군요)

여튼... 그렇게 하기 위해서 코드를 좀 들여다 봤더니 이 usbserial.c 드라이버는 원래 목적이 밑에서 usb로 들어오고 위로(응용) serial 로 바꾸주는 역할만 하더군요..저는 그 반대가 필요한건데..그래서 생각 하던 중 응용에서 write 하는 함수는 generic_write()함수를 좀 수정해서 하면 될것 같은 생각이 들더군요..이렇게 처리를 하면 가능할까요 ? 즉, 정리를 하면 serial 쪽에서 입력된 데이터를 마치 응용에서 전송된 데이터 처럼 처리를 하고 urb 를 만들어서 보내려고 하는 겁니다. 여기서 urb를 채울때에 endpoint 등을 keyboard 디바이스로 지정해서 처리를 하려고 하는거구요..

관련해서 작업하신 분들의 고견을 부탁드립니다.

감사합니다.

댓글 달기

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 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.