LinuxAlt 2013: Writing a driver for unknown USB device
-
Upload
lubomir-rintel -
Category
Technology
-
view
1.843 -
download
2
description
Transcript of LinuxAlt 2013: Writing a driver for unknown USB device
![Page 1: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/1.jpg)
Writing a Linux driverfor an unknown device
Ľubomír Rintel <[email protected]>LinuxAlt 2013, Brno
BTC: 1GrpeEj18B6X7QFbh794bFGnZLRhVMqwL8
![Page 2: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/2.jpg)
Linux 2.4?
![Page 3: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/3.jpg)
Linux 2.2?
![Page 4: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/4.jpg)
Linux 2.0?
![Page 5: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/5.jpg)
Great hardware support!
![Page 6: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/6.jpg)
Our device● Unknown to Linux● No documentation● No Google hits for chip● Desperate users in
Ubuntu forums
![Page 7: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/7.jpg)
No Linux support at all!
![Page 8: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/8.jpg)
The Plan● Make it work in Windows● Capture what happens● Find image data● Mimic the behavior in userspace● Transform into a kernel module
![Page 9: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/9.jpg)
USB
![Page 10: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/10.jpg)
USB Architecture● Network of Host, Hubs and Devices
![Page 11: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/11.jpg)
USB Addresses● Bus & Device number
Host
Device 1:1Hub
Device 2:1Hub
Device 3:1Mouse
Device 2:2Flash Drive
![Page 12: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/12.jpg)
USB Addresses$ lsusbBus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hubBus 002 Device 001: ID 1337:abcd Trololol USB 1.1 HubBus 002 Device 002: ID 1337:0123 Trololol Flash DriveBus 003 Device 001: ID dead:b4b3 Random Mouse$ lsusb -v...
![Page 13: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/13.jpg)
USB Device● Self-describing● Endpoints
● CONTROL● INTERRUPT● BULK● ISOCHRONOUS
● Endpoints grouped into Interfaces● Interfaces grouped into Configurations
![Page 14: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/14.jpg)
Our device
Device
Alternate setting 1Endpoints:
0x81 Isochronous IN0x82 Bulk IN0x83 Bulk IN0x84 Interrupt IN
Alternate setting 0Endpoints:
0x81 Isochronous IN0x82 Bulk IN0x83 Bulk IN0x84 Interrupt IN
![Page 15: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/15.jpg)
The Plan● Make it work in Windows● Capture what happens● Find image data● Mimic the behavior in userspace● Transform into a kernel module
![Page 16: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/16.jpg)
Do try thisat home!
![Page 17: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/17.jpg)
Windows & VirtualBox
![Page 18: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/18.jpg)
Wireshark & usbmon
![Page 19: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/19.jpg)
What did we see● Number of CONTROL requests● ISOCHRONOUS packets once capture starts
![Page 20: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/20.jpg)
RGB
R R R R R R R R
G G G G G G G G
B B B B B B B B
![Page 21: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/21.jpg)
YUV2Y Y Y Y U1 U1 U1 U1
Y Y Y Y V1 V1 V1 V1
Y Y Y Y U2 U2 U2 U2
Y Y Y Y V2 V2 V2 V2
![Page 22: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/22.jpg)
LibUSB● We could replay the traffic● In userspace – no kernel hacking needed● C, Python & Perl bindings● Now we need to find start & end of the picture
![Page 23: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/23.jpg)
Test image
0xaaaaaaaa0xff00ff00
0x00ff00ff
0x80808080
0x00000000
![Page 24: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/24.jpg)
Frame format
88 01 00 00
88 01 02 cf
88 02 80 00
88 02 82 cf
88 03 00 00
xx xx xx xx • 240 00 00 00 00 • 15
88 01 00 01...
...
● Frame number● Even/odd● Chunk number 0 – 0x2cf = 719
740 x 480 YUV2 Interlaced (NTSC)
...
![Page 25: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/25.jpg)
To kernel!
![Page 26: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/26.jpg)
To kernel!● Booooring!● A module● USB framework
● Linux Device Drivers: http://lwn.net/Kernel/LDD3/
● Video4Linux2● LWN Series: http://lwn.net/Articles/203924/
● Videobuf2● LWN Article: http://lwn.net/Articles/447435/
![Page 27: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/27.jpg)
Architecture
Video4Linux2
Videobuf2
USB
Use
rspa
ce
Our
cod
e
Har
d war
e
![Page 28: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/28.jpg)
Video4Linux2● Provide a device with known API
● open(), close()● read(), write()● ioctl()● mmap()
● Negotiate format with userspace
![Page 29: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/29.jpg)
Videobuf2● Manages buffers of frames● Connects to Video4Linux2
● read(), write(), mmap()● some ioctl()s
– Start/stop capture– Exchange buffers with userspace
![Page 30: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/30.jpg)
USB framework● Setup the device● Allocate buffers for exchange of data with
device● Handle start/stop● Isochronous callbacks
● Copy data from USB buffers to Videobuf2 buffers
![Page 31: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/31.jpg)
Architecture
Video4Linux2
Videobuf2
USB
Use
rspa
ce
Our
cod
e
Har
d war
e
![Page 32: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/32.jpg)
Works!
![Page 33: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/33.jpg)
Community
![Page 34: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/34.jpg)
Free Software● Mainline Linux 3.11
● drivers/media/usb/usbtv
● Contributions● Review● Bug fixes● Features!
![Page 35: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/35.jpg)
Questions?
![Page 36: LinuxAlt 2013: Writing a driver for unknown USB device](https://reader034.fdocuments.us/reader034/viewer/2022042518/55838fdbd8b42a8e0c8b5197/html5/thumbnails/36.jpg)
See you!
http://base48.cz#[email protected]
Did you find this useful? My Bitcoin address is:1GrpeEj18B6X7QFbh794bFGnZLRhVMqwL8
http://base48.cz#[email protected]