All of lore.kernel.org
 help / color / mirror / Atom feed
* Fwd: Help supporting IT9910 chipset
       [not found] <CALFMp8vtr3jjGApAoehc4vuS9mNprtGqrRd2+tSfCHbTTKj4og@mail.gmail.com>
@ 2022-06-29 21:49 ` Juan Antonio Zuloaga Mellino
  2022-07-07 18:06   ` Hugo "Bonstra" Grostabussiat
  0 siblings, 1 reply; 2+ messages in thread
From: Juan Antonio Zuloaga Mellino @ 2022-06-29 21:49 UTC (permalink / raw)
  To: linux-media

Hi. I've an ezcap295hd. It's an usb video grabber based on the IT9910
chipset manufactured by ITE Tech. Inc.

I wasn't able to find linux support for it. Is anybody working on it?

The chipset and device vendors were not helpful providing usb specs.
But I attempted to reverse the usb communication on windows and it
doesn't seem too complex.

It has 3 endpoints, I inferred that it works as follows:

ENDPOINT 1 Bulk OUT: Control Output
ENDPOINT 2 Bulk IN: Control Input
ENDPOINT 3 Bulk OUT: MPEG-TS Stream

So far I was able to extract and play the video stream from a pcapng.

I've some experience writing USB user space applications, but no
experience writing kernel modules nor with the video4linux api.

If nobody is working on this chipset I'd like to attempt to write a
driver for it.

Also, does anybody know of a module for a device similar to this one
that I could base my driver on? It would be of great help.

I'll leave lsusb output and attach a pcapng in case anybody wants to
check it out.

Regards.

Juan Zuloaga

/**********************************/
pcapng:  https://drive.google.com/file/d/1SCSLbJPqrUZKC7QXBO_En-p6JBcy_nTG/view?usp=sharing
/*********************************/

Bus 003 Device 026: ID 048d:9910 Integrated Technology Express, Inc.
IT9910 chipset based grabber
Device Descriptor:
  bLength                18
  bDescriptorType         1
  bcdUSB               2.00
  bDeviceClass            0
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  idVendor           0x048d Integrated Technology Express, Inc.
  idProduct          0x9910 IT9910 chipset based grabber
  bcdDevice            1.00
  iManufacturer           1 ITE TECH. INC.
  iProduct                2 ezcap HD Capture
  iSerial                 3
  bNumConfigurations      1
  Configuration Descriptor:
    bLength                 9
    bDescriptorType         2
    wTotalLength       0x0027
    bNumInterfaces          1
    bConfigurationValue     1
    iConfiguration          0
    bmAttributes         0x80
      (Bus Powered)
    MaxPower              500mA
    Interface Descriptor:
      bLength                 9
      bDescriptorType         4
      bInterfaceNumber        0
      bAlternateSetting       0
      bNumEndpoints           3
      bInterfaceClass       255 Vendor Specific Class
      bInterfaceSubClass      0
      bInterfaceProtocol      0
      iInterface              0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x81  EP 1 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x02  EP 2 OUT
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
      Endpoint Descriptor:
        bLength                 7
        bDescriptorType         5
        bEndpointAddress     0x83  EP 3 IN
        bmAttributes            2
          Transfer Type            Bulk
          Synch Type               None
          Usage Type               Data
        wMaxPacketSize     0x0200  1x 512 bytes
        bInterval               0
Device Qualifier (for other device speed):
  bLength                10
  bDescriptorType         6
  bcdUSB               2.00
  bDeviceClass            0
  bDeviceSubClass         0
  bDeviceProtocol         0
  bMaxPacketSize0        64
  bNumConfigurations      1
Device Status:     0x0000
  (Bus Powered)

^ permalink raw reply	[flat|nested] 2+ messages in thread

* Re: Fwd: Help supporting IT9910 chipset
  2022-06-29 21:49 ` Fwd: Help supporting IT9910 chipset Juan Antonio Zuloaga Mellino
@ 2022-07-07 18:06   ` Hugo "Bonstra" Grostabussiat
  0 siblings, 0 replies; 2+ messages in thread
From: Hugo "Bonstra" Grostabussiat @ 2022-07-07 18:06 UTC (permalink / raw)
  To: Juan Antonio Zuloaga Mellino; +Cc: linux-media

[-- Attachment #1: Type: text/plain, Size: 1103 bytes --]

Le 29/06/2022 à 23:49, Juan Antonio Zuloaga Mellino a écrit :
> Hi. I've an ezcap295hd. It's an usb video grabber based on the IT9910
> chipset manufactured by ITE Tech. Inc.
> 
> I wasn't able to find linux support for it. Is anybody working on it?

I did some reverse engineering on my IT9910 based video grabber, a 
generic model labeled "Awisio Game Capture v5".

I wrote a ugly Rust program to test my findings: 
https://github.com/Bonstra/it9910-stream-example
For my device, it is enough to output the MPEG TS stream to stdout, and 
pipe it into mpv.
It is possible that it won't work for other IT9910 devices because of 
differences in the firmware.

There is still some work to do to understand the meaning of various data 
blobs used as-is in the test program.

I also attempted to list all the USB properties I could find. I attached 
that tentative list to this email. Stay away from the firmware update 
properties :)

I don't plan on writing a Linux driver, at least not until I understand 
the inner workings of that device.

I hope the resources I provided will help.

Regards
--
Hugo

[-- Attachment #2: it9910-usb-props.txt --]
[-- Type: text/plain, Size: 3744 bytes --]

= USB property requests =

Offset	Name		Size	Description
0x00	len		4	Length of full property request
0x04	opcode		2	Operation code
0x06	sig		2	0x9910
0x08	operation	4	0x1 = GET, 0x2 = SET
0x0c	seq		2	Sequence number
0x0e	sig		2	0x9910
0x10	data		len-16	Data

== Opcodes ==

=== Reboot (0x1) ===

Length: 0x10
Supported operations:
	GET (1): Unknown
	SET (2): Yes

=== Get/Set state (0x2) ===

Length: 0x14
Supported operations:
	GET (1): Unknown
	SET (2): Yes

Offset	Name		Size	Description
0x10	?		4	?

=== Get/Set source (0x3) ===

Length: 0x18
Supported operations:
	GET (1): Yes
	SET (2): Yes

Offset	Name		Size	Description
0x10	audio_source	4	Audio source:
				0: Digital 1
				1: Digital 2 (reserved)
				2: Analog
0x14	video_source	4	Video source:
				0: Digital
				1: Analog YrYbY
				2: Analog composite
				3: Analog S/Video
				4: Analog RGB

=== Set firmware size (0x5) ===

Length: 0x14
Supported operations:
	GET (1): Unknown
	SET (2): Yes

Offset	Name		Size	Description
0x10	firmware_size	4	Firmware size, I guess

=== Set firmware data (0x6) ===

Length: 0x10 min, 0x200 max
Supported operations:
	GET (1): Unknown
	SET (2): Yes

Offset	Name		Size		Description
0x10	firmware_data	0 to 0x1f0	Firmware data

=== Get firmware status (0x8) ===

Length: 0x14
Supported operations:
	GET (1): Yes
	SET (2): Unlikely

Offset	Name		Size	Description
0x10	firmware_status	4	Firmware status, I guess

=== Get profile (0xa) ===

Length: 0x10, 0x14
Supported operations:
	GET (1): Yes
	SET (2): ?

Request (0x10 bytes):
Offset	Name		Size	Description

Response (0x14 bytes):
Offset	Name		Size	Description
0x10	profile		0x4	Device profile (features, etc...)
	BIT(1)	?
	BIT(0)	?

=== Get/Set brightness (0x101) ===

Length: 0x18
Supported operations:
	GET (1): Yes
	SET (2): Yes

Offset	Name		Size	Description
0x10	unk		4	0
0x14	brightness	4	Brightness value (0-100)

=== Get/Set contrast (0x102) ===

Length: 0x18
Supported operations:
	GET (1): Yes
	SET (2): Yes

Offset	Name		Size	Description
0x10	unk		4	0
0x14	contrast	4	Contrast value (0-100)

=== Get/Set hue (0x103) ===

Length: 0x18
Supported operations:
	GET (1): Yes
	SET (2): Yes

Offset	Name		Size	Description
0x10	unk		4	0
0x14	hue		4	Hue value (0-100)

=== Get/Set saturation (0x104) ===

Length: 0x18
Supported operations:
	GET (1): Yes
	SET (2): Yes

Offset	Name		Size	Description
0x10	unk		4	0
0x14	hue		4	Saturation value (0-100)

=== ? (0x200) ===

Length: 0x14
Supported operations:
	GET (1): ?
	SET (2): Yes

Offset	Name		Size	Description

=== Get video compression info (0x201) ===

Length: 0x1c
Supported operations:
	GET (1): Yes
	SET (2): Unknown

Offset	Name		Size	Description
0x0	unk		4	Stream index?
0x4	key_framerate	4	DefaultKeyFrameRate (DefaultPFrameRate is DefaultKeyFrameRate - 1)
0x8	quality		4	DefaultQuality

=== Get video compression keyframe rate (0x202) ===

Length: 0x18
Supported operations:
	GET (1): Yes
	SET (2): Yes

Offset	Name		Size	Description
0x0	stream_idx	4	Stream index
0x4	keyframe_rate	4	Keyframe rate

=== Get video compression quality (0x203) ===

Length: 0x18
Supported operations:
	GET (1): Yes
	SET (2): Yes

Offset	Name		Size	Description
0x0	stream_idx	4	Stream index
0x4	quality		4	Quality value from 0 (worst) to 10000 (best)

=== ? (0x2f0) ===

Length: 0x9e
Supported operations:
	GET (1): Yes
	SET (2): ?

Offset	Name		Size	Description

=== Get/Set PC grabber (0xe001) ===

Length: 0x1c,0x4c,0x200
Supported operations:
	GET (1): Yes
	SET (2): Yes

Offset	Name		Size	Description

=== Get timestamp? (0xf001) ===

Get elapsed milliseconds since last get timestamp request.

Length: 0x14
Supported operations:
	GET (1): Yes
	SET (2): ?

Offset	Name		Size	Description
0x00	millis		4	Number of elapsed milliseconds since last call


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2022-07-07 18:15 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
     [not found] <CALFMp8vtr3jjGApAoehc4vuS9mNprtGqrRd2+tSfCHbTTKj4og@mail.gmail.com>
2022-06-29 21:49 ` Fwd: Help supporting IT9910 chipset Juan Antonio Zuloaga Mellino
2022-07-07 18:06   ` Hugo "Bonstra" Grostabussiat

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.