usb descriptor에서 configuration, interface가 무엇인가요.?

quintus의 이미지

programming guide for linux USB Device Drivers 를 보고 있는데
http://usb.in.tum.de

descriptor부분에 Device descriptor, Configuration Descriptor, Interface Descriptor, endpoint 이런게 나오는데, 무엇을 얘기하는건지 모르겠습니다.

그게 이해가 안 되니까. active configuration 이니..usb_set_configuration, usb_set_interface 가 무슨 내용인지...모르겠네요.

Quote:

Descriptor

USB나 혹은 다른 PCI device같은 것을 다루게 될 때, device의 configuration을 알기 위해선 device의 descriptor들을 읽어와야 한다. 이렇게 읽어온 data를 기초로 어떤 device가 연결되었는지를 알 수 있게 되며, 또한 device로 data를 보내고자 할 때, device의 특성에 맞게 data의 양을 조절해 줄 수도 있게 된다.
USB device들은 bus에 붙게 되면, USB subsystem에 의해서 enumeration이 된다.(이것은 일종의 PNP-Plug and Play라고 보아도 될 것이다.) 즉, 고유한 device 번호가 할당된다. 그리고 나선 device의 descriptor가 읽혀지게 되며, 이렇게 읽어진 descriptor에는 device와 properties들이 정의 되어있다. USB Spec.에는 다음과 같은 Descriptor들이 정의 되어 있다. ([그림 4] 참조)

그림 4. USB Descriptor Hierarchy

Device descriptor : USB device에 대한 일반적인 정보를 제공한다. 단지 하나의 descriptor만이 존재하며 그 USB device에 전역적으로 영향을 미친다.

Configuration descriptor : 특정의 device configuration에 대한 정보를 제공한다. USB device는 하나나 그 이상의 configuration descriptor를 가질 수 있으며, 각각의 descriptor는 또한 하나나 그 이상의 interface를 가질 수 있다. 물론 각각의 interface들 역시 0이나 여러 개의 endpoint를 가질 수 있다. 이러한 endpoint들은 같은 interface의 다른 setting에 의해서 사용되지 않는다면, 단일의 configuration내에서 interface간에 공유될 수 없다. 하지만 이러한 제한이 없는 다른 configuration내의 interface에 의해서는 공유가 될 수 있다. configuration들은 control transfer에 의해서 배타적으로 activate될 수 있으며, global한 device setting을 변화시키기 위해서 사용될 수 있다.(여기서 사용되는 control command로는 set_configuration이 있다.)

Interface descriptor : 하나의 configuration내의 특정 interface를 말하며, 0이나 혹은 여러 개의 endpoint를 가질 수 있다. 물론 이러한 endpoint들은 하나의 configuration내에서 고유한 set을 이룬다. Interface는 또한 alternate setting을 가질 수 있으며, 이것은 endpoint를 변화시키거나 endpoint의 특성을 device가 configure된 후에 변화시키기 위해서 사용될 수 있다. Interface에 대한 default setting은 항상 alternate setting 0이다. Alternate setting은 set_interface control command로 배타적으로 select될 수 있다. 이러한 예로서는 multi-functional device를 들 수 있다. 즉, 하나의 device가 camera로 사용되거나 Microphone으로 사용될 수 있는 경우이다. 이 경우 두 가지 모두로 사용될 수도 있을 것이다. 즉, 화상 회의 용으로 사용되어 image및 음성 data의 capture를 동시에 하는 경우라 할 수 있다.

Endpoint descriptor : host가 각각의 endpoint의 bandwidth requirements를 결정하기 위해서 필요하다. 간단히 이야기 해서 endpoint라는 것은 USB device에 있어서는 data의 논리적인 source가 되거나 sink가 된다고 할 수 있다.1 다른 말로 표현하자면 pipe라고도 한다. 가장 기본적으로 Endpoint 0는 항상 모든 control transfer에 사용되며, descriptor가 존재하지 않는다.
String descriptor : optional한 것이며, 사람이 읽을 수 있는 unicode format으로 된 string을 가진다. 이것은 vendor나 device name혹은, serial number등을 가질 수 있을 것이다.

이것을 정확이 이해하는 것이 이후의 프로그램에서 device를 검출하고, 사용하고자 하는 device의 feature를 선택하는데 있어서 중요하다. [그림 4]를 보면 device의 descriptor들이 상위에서 하위로 계층적인 구조를 가지고 정의 되어 있으며, 하나의 device descriptor에 configuration, interface, endpoint descriptor들이 있음을 볼 수 있다.

이상에서 USB를 기본적으로 이해하기 위한 것들을 살펴 보았다. 하지만, 실제에 있어서는 USB device들은 특정의 USB class내에 속하게 되며, 특정 class들에 대한 spec.은 따로 존재한다. 따라서, USB device driver를 작성하고자 하는 사람은 USB class Spec.에 대해서도 상세히 알고 있어야 할 것이다. Device descriptor들에 대한 실제적인 구현 code는 [그림 5]와 같다. 보면 알 수 있듯이, 상위의 descriptor가 하위의 descriptor를 reference하도록 구현되어져 있다.

flyduck의 이미지

크리스마스 연휴라서 조용하네요...

모두 USB 장치에 대한 정보를 나타내는 것인데, 우선 device descriptor는 USB 장치의 기본적인 정보를 나타내는 것으로 쉽게 이해할 것입니다.

그 다음에 나오는 것이 configuration descriptor인데, 이는 하나의 장치가 여러가기 설정으로 동작할 수 있도록 하기 위해서 제공하는 것입니다. 그리고 그 중의 하나의 설정을 선택해서 사용해야 하며 그것이 active configuration입니다. 대부분의 장치는 하나의 configuration만을 제공합니다. 만약 어떤 장치가 ethernet이 될 수도 있고 wireless도 될 수 있는데 동시에 둘 중의 하나만 선택해서 사용할 수 있다면 두 개의 configuration descriptor를 가지면서 그 중의 하나를 선택해서 사용하는 것입니다.

그 다음에 나오는 것은 interface descriptor인데, 하나의 장치가 multi-function이 될 수 있기 때문에 필요하고, 장치의 종류에 따라서 여러개의 interface를 요구하기도 합니다. 예를 들어 프린터나 스캐너같은 장치라면 하나의 interface가 존재하는데, sound card라면 AudioControl, AudioStream같은 interface가 존재합니다.

endpoint는 통신 창구입니다. 네트웍에서 소켓으로 비유를 해도 될 것 같은데, USB에서는 네가지 transfer type을 정의하고 있고 각각의 용도가 다릅니다. 그리고 입력도 있고 출력도 있고, 하나의 장치는 이를 필요에 따라서 사용하게 됩니다. 그래서 각 통신 방법에 따라서 endpoint를 정의하게 됩니다. 예를 들어 프린터라면 bulk in, bulk out, 키보드나 마우스는 interrupt in 같은 간단한 endpoint를 정의하고, sound나 storage는 각 interface마다 여러가지 endpoint를 정의하고 있습니다. 어떤 interface, 어떤 endpoint를 사용하는지는 장치의 종류에 따라 다릅니다.

Freedom is another word for nothing left to lose,
Nothing doesn't mean nothing if it ain't free.

extrealm의 이미지

그림과 함께 설명된 간략화된 USB 설명입니다.

http://www.beyondlogic.org/usbnutshell/usb1.htm (영문)

이때까지 본 문서중 가장 지루하지 않으면서 핵심적인 내용을 다루고 있는 것 같군요.

/E/X/T//R/E/A/L/M/ - 그대 품 안의 또하나의 세상

댓글 달기

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