USB Serial 문제

uosarang의 이미지


USB를 통해서 serial 연결을 맺고

이를 통해서 data를 전송하는 방법을 만들고 있습니다.

그런데 USB의 빠른 전송속도를 serial연결을 통한 tty쪽의

처리속도가 따라가질 못해서

packet들이 로스가 많이 발생하고 있는데요....

이런 문제를 어떻게 해결해야 하는지 궁금합니다.

호스트(PC) usb 상대편
serial <--------------> usb_serial (usb gadget serial)
모뎀 tty (ttygs)

와 같이 연결을 하고 있는데요.

상대편쪽의 usb_serial에서 tty로 data를 복사할 때

tty의 flip buffer가 data를 받을 충분한 공간이 있지 않으면

호스트에서 날아온 data를 그냥 버려버리는 문제가 발생하고 있습니다.

도와주세요..T.T

shyblue의 이미지

usb단에서 delay를 줘서, serial단이 처리할 수 있는 충분한 시간을 주는 방법외에는 없다고 판단됩니다.
이와 다르게, tty의 flip buffer를 키우는 방법이 있지만, 이 방법은 커널을 손대야 하는 부분이고, 매번 다른 환경에서 적용되지 않는 문제이기 때문에, usb단에서 처리하는 방법이 맞지 않을까 생각합니다.

時日也放聲大哭

時日也放聲大哭

bushi의 이미지

serial 통신에서 테이타를 잃어버리지 않기 위해 사용하는 표준적인 설비는 flow control 입니다.

gadget serial 은 ACM 을 지원하도록 작성되어 있고,
ACM 은 interrupt endpoint 를 요구하며,
USB 의 interrupt endpoint 는 device 에서 host 로 event 를 보내기 위한 유일한 통로입니다.

OTL

uosarang의 이미지

우선 delay를 주는 문제에 대해서는요.

호스트로부터 패킷이 들어왔을 때 처리하는 부분이 ISR이어서 그런지

delay를 사용했더니 꿍시렁꿍시렁 대더군요...

그리고 tty의 flip buffer size는 현재 8K로 잡혀 있는데(2.6.15.2)

2.6.21 커널에 보니 최대 32K까지 동적으로 flip버퍼를 필요할 때 잡아서 사용하는 것 같긴 하더군요.

16K까지는 커널에서 늘려봤지만 결국 문제가 발생하는 것은 동일합니다.

그리고 gadget serial에서 ACM을 지원한다고 되어 있는데
코드를 얼추 살펴보면 ACM spec에서 요구하는 많은 부분이 빠져있는 것 같던데..
제가 잘못알고 있는건지요....
제가 내린 결론은 USB Gadget serial은 ACM을 지원하려고는 했지만 아직은 제대로 지원을 하지
못하는 것 같다는 거에요....

그리고 gadget serial에 interrupt endpoint를 추가해서 notify interrupt를 발생시킬 수 있게
해놓고(뭐 이미 interrupt endpoint 뚫어주는건 기존코드에도 있으니)
interrupt endpoint 상으로 Serial state에 관련한 비트들(rx,tx및 send break, overrun등등)을 setting하여 올려보내도....
반응이....무덤덤하네요...-_-;; 깝깝해요..T.T
옆에선 어플을 조지라고 하는데...ㅎㅎ

답변해주신 두분 정말 감사합니다.

머리를 굴려라! 그래야 먹고 산다.

bushi의 이미지

맞습니다. 불완전합니다. 채워넣으면되죠 :)
아, 이게 아니고.

gadget 중에 CDC, RNDIS 도 있습니다.
예상과는 달리, ACM 보다 이놈이 전송속도는 더 높습니다.

host 가 windows 머신이라면 커널의
Documentation/usb/linux.inf
를 참고하시고요.

OTL

uosarang의 이미지

windows 쪽 드라이버는 g_serial.inf를 설치해서 잘 동작하고 있어요.

그리고 ethernet보다 serial을 사용해야 하는 이유는 호스트(window)쪽에서

사용하는 어플리케이션이 반드시 serial interface만을 사용해야 한다고 하네요.

ethernet을 사용할 수 있었으면...좋았을텐데..T.T

머리를 굴려라! 그래야 먹고 산다.

익명 사용자의 이미지

혹시 g_serial.inf말고 다른 파일도 필요하나요? 이것때문에 고민인데 동작하고 있는 환경좀 알수 있을까요?

uosarang의 이미지

구글에서 찾아서 다운로드 받아서(g_serial) 사용했습니다.

다운로드 받은 파일은
gserial.inf
usbser.sys

두개에요.

usb core driver는 저희껄 쓰고 있구요.

머리를 굴려라! 그래야 먹고 산다.

머리를 굴려라! 그래야 먹고 산다.

토끼아빠의 이미지

플로우 컨트롤을 잘 하면 될것 같은데요~~
확실한 답변 못되어 미안하네요~~

좋은 하루 되세요!!

finer의 이미지

TTY의 flip buffer size를 32KB까지 늘려보았지만 변화가 없더군요.
여전히 유실되는 USB data가 있었습니다.
결국 flow control 뿐이셨나요?

raniyan의 이미지

환경은 몬타비스타 리눅스 4.0(커널 2.6.10 + a)

가젯 설정하고 windows 7에서 테스트 중입니다.(CDC_ACM 사용)

가정 : 리눅스 머신에서 Windows로 데이터를 송신

작은크기(512 Bytes 이하)의 데이터 송/수신은 잘 되더군요...

전 이미지(약 150KBytes 이상)를 메모리에 덤프 받아 전송하는 부분을 구현 중인데...
전송을 잘 할경우와 그렇지 않을 경우가 생기더군요...

파일 송수신할 때...
마지막 바이트가 512Bytes의 배수가 되면,
전송을 못하는 건지 ..아님 받지를 못하는 건지...
전송이 먹통이 됩니다.ㅎㅎ(여기까지 디버깅은 못해봐서...)
약간의 딜레이 후, 아무 데이터나 전송을 하면 이전에 전송(혹은 수신)되지 않았던 데이터를 수신 받을 수 있더군요...
(아마, 송신(혹은 수신)측의 버퍼에 데이터를 모셔논 모양입니다.)

...해서, 제 생각엔 USB 패킷(혹은 버퍼) 크기와 관련된 버그로 보입니다.(윈도든 리눅스 이던...)

각설하고...
전송시 511바이트로 끊어서 보내면 송수신 상의 문제는 발생하지 않더군요...

혹시, 고생하시는 분 계실까봐 몇자 끄적여 봅니다.

댓글 달기

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