How to Faking a PCI or USB device.
Hi Everyone, I'm learning how to write PCI and USB device drivers however I don't have any real device to work with. Most articles I read either have some USB device(real) or they just tell "how it works(like structures and api)". Is it possible to fake such a device that probably does nothing but I can say modify some parameters of the fake device? In short is it possible to devise a fake configuration address space of the fake device and try to use it (completely in memory device)?. If it can be done please give me some pointers. Thanks for reading! ::DISCLAIMER:: ---------------------------------------------------------------------------------------------------------------------------------------------------- The contents of this e-mail and any attachment(s) are confidential and intended for the named recipient(s) only. E-mail transmission is not guaranteed to be secure or error-free as information could be intercepted, corrupted, lost, destroyed, arrive late or incomplete, or may contain viruses in transmission. The e mail and its contents (with or without referred errors) shall therefore not attach any liability on the originator or HCL or its affiliates. Views or opinions, if any, presented in this email are solely those of the author and may not necessarily reflect the views or opinions of HCL or its affiliates. Any form of reproduction, dissemination, copying, disclosure, modification, distribution and / or publication of this message without the prior written consent of authorized representative of HCL is strictly prohibited. If you have received this email in error please delete it and notify the sender immediately. Before opening any email and/or attachments, please check them for viruses and other defects. ----------------------------------------------------------------------------------------------------------------------------------------------------
Hi.. On Mon, Nov 26, 2012 at 5:27 PM, Pranay Kumar Srivastava <Pranay.Shrivastava@hcl.com> wrote:
Is it possible to fake such a device that probably does nothing but I can say modify some parameters of the fake device? In short is it possible to devise a fake configuration address space of the fake device and try to use it (completely in memory device)?. If it can be done please give me some pointers.
what kind of device? maybe if you're lucky, QEMU can emulate that for you...e.g: network adapter... -- regards, Mulyadi Santosa Freelance Linux trainer and consultant blog: the-hydra.blogspot.com training: mulyaditraining.blogspot.com
-----Original Message----- From: Mulyadi Santosa [mailto:mulyadi.santosa@gmail.com] Sent: Monday, November 26, 2012 4:07 PM To: Pranay Kumar Srivastava Cc: kernelnewbies@kernelnewbies.org Subject: Re: How to Faking a PCI or USB device.
Hi..
On Mon, Nov 26, 2012 at 5:27 PM, Pranay Kumar Srivastava <Pranay.Shrivastava@hcl.com> wrote:
Is it possible to fake such a device that probably does nothing but I can say modify some parameters of the fake device? In short is it possible to devise a fake configuration address space of the fake device and try to use it (completely in memory device)?. If it can be done please give me some pointers.
what kind of device?
Any kind. I was looking around to find simplest of USB and PCI devices. I Found one article by Greg http://www.linuxjournal.com/article/7353 written a long time back, so maybe something like this. If I can find some cheap hardware like it I would like to use it to decorate my desk for new year :P. But while I find a simple hardware what would I need to know to fake such a simple device?
maybe if you're lucky, QEMU can emulate that for you...e.g: network adapter...
Well let's just say it emulates network adapter (PCI right?) so wouldn't a default driver exist for that? So I should just remove that driver and use my driver instead?
-- regards,
Mulyadi Santosa Freelance Linux trainer and consultant
blog: the-hydra.blogspot.com training: mulyaditraining.blogspot.com
Thanks for the help I really appreciate it. ::DISCLAIMER:: ---------------------------------------------------------------------------------------------------------------------------------------------------- The contents of this e-mail and any attachment(s) are confidential and intended for the named recipient(s) only. E-mail transmission is not guaranteed to be secure or error-free as information could be intercepted, corrupted, lost, destroyed, arrive late or incomplete, or may contain viruses in transmission. The e mail and its contents (with or without referred errors) shall therefore not attach any liability on the originator or HCL or its affiliates. Views or opinions, if any, presented in this email are solely those of the author and may not necessarily reflect the views or opinions of HCL or its affiliates. Any form of reproduction, dissemination, copying, disclosure, modification, distribution and / or publication of this message without the prior written consent of authorized representative of HCL is strictly prohibited. If you have received this email in error please delete it and notify the sender immediately. Before opening any email and/or attachments, please check them for viruses and other defects. ----------------------------------------------------------------------------------------------------------------------------------------------------
Hi, On Tue, Nov 27, 2012 at 11:21 AM, Pranay Kumar Srivastava <Pranay.Shrivastava@hcl.com> wrote:
-----Original Message----- From: Mulyadi Santosa [mailto:mulyadi.santosa@gmail.com] Sent: Monday, November 26, 2012 4:07 PM To: Pranay Kumar Srivastava Cc: kernelnewbies@kernelnewbies.org Subject: Re: How to Faking a PCI or USB device.
Hi..
On Mon, Nov 26, 2012 at 5:27 PM, Pranay Kumar Srivastava <Pranay.Shrivastava@hcl.com> wrote:
Is it possible to fake such a device that probably does nothing but I can say modify some parameters of the fake device? In short is it possible to devise a fake configuration address space of the fake device and try to use it (completely in memory device)?. If it can be done please give me some pointers.
Buy a demo board based on AT90USB micro controller like http://dorkbotpdx.org/wiki/duce http://www.atmel.in/tools/AT90USBKEY.aspx You can program this micro controller using lufa http://www.fourwalledcubicle.com/LUFA.php to act as : Android Accessory Host Audio In Device Audio In Host Audio Out Device Audio Out Host Dual Virtual Serial Device Generic HID Device Generic HID Host Joystick Device Joystick Host Keyboard Device Keyboard/Mouse Device Keyboard Host Keyboard Host/Device Dual Mode Mass Storage Device Mass Storage/Keyboard Device Mass Storage Host MIDI Device MIDI Host Mouse Device Mouse Host Printer Host RNDIS (CDC) Ethernet Device RNDIS (CDC) Ethernet Host Still Image Host Virtual Serial Device Virtual Serial Host Virtual Serial/Mass Storage Device Virtual Serial/Mouse Device
Hi :) On Tue, Nov 27, 2012 at 12:51 PM, Pranay Kumar Srivastava <Pranay.Shrivastava@hcl.com> wrote:
Well let's just say it emulates network adapter (PCI right?) so wouldn't a default driver exist for that? So I should just remove that driver and use my driver instead?
That should work... OK, good luck :) -- regards, Mulyadi Santosa Freelance Linux trainer and consultant blog: the-hydra.blogspot.com training: mulyaditraining.blogspot.com
Pranay Kumar Srivastava <Pranay.Shrivastava@hcl.com> writes:
maybe if you're lucky, QEMU can emulate that for you...e.g: network adapter...
Well let's just say it emulates network adapter (PCI right?) so wouldn't a default driver exist for that? So I should just remove that driver and use my driver instead?
well, you can always create your own completely new device in QEMU. It's not that hard. Just take one of the existing ones and modify it as you want. You'll find the device emulating drivers in qemu/hw/ I actually did this a few weeks ago. And I started out thinking like you. I had a new USB driver I wanted to test with a special device configuration variant, and I could not get hold of an actual device with such a configuration. But I did have some old and abandoned microcontroller project laying around. So I dug that out, including semi-working firmware source and old toolchain. Still took me several hours to just get the damn thing to run and enumerate as any USB device at all. And modifying the firmware, building and flashing it took forever. For each round. And I realized there would be many of them.... So I quickly gave up (there was a reason this project was abandoned :-), and gave QEMU (well, kvm-qemu really) a shot instead. Copying an existing usb device there and modifying the descriptors to suit my need took no time at all. Additional benefit of the QEMU route: If you are writing a driver and crash the host (not me, I never do anything wrong of course) , then you only crash a virtual machine. There is one drawback: QEMU device drivers are not modular, so you will have to restart your virtual test machine every time you modify the device. Still is a lot faster than flashing a microcontroller. Bjørn
participants (4)
-
Bjørn Mork -
Mulyadi Santosa -
Pranay Kumar Srivastava -
Prashant Shah