So I have a driver that does a child enum on the ACPI PDO. It gets back the methods, and then does an evaluate. There are two ways of doing this, evaluateex and evaluate. Oddly for exactly the same methods they return different data, not different in value, but the ex evaluation data has a 4 byte padding after each package, the eval method doesent. This is for _PSS data.
What is also odd that if the eval is called during IRP_MJ_START_DEVICE the _PCT data is also different to that obtained later on so I assume even then the device hasnt completely started. The _PCT at IRP_MJ_START_DEVICE shows IO port access, but later shows FFHW as the acces.
What is also interesting is that attaching to the PDO outside of AddDevice causes enum children to returns STATUS_NOT_SUPPORTED, which is odd, since the only interface to the PDO is the PDO pointer and the Irp, how DOES the PDO know the Irp is being sent from a DO attached outside of AddDevice? Odd stuff indeed.
Anyway it doesnt affect the functioning of the driver, it controls COU speed OK, but this variability of what the PDO is returning is odd and I cant exmplain it. Anyone have any idea why this is?
First thing, Has you PIC got built in USB hardware or are you trying to do this from basics with I/O lines? If it's the latter, go for the first. If you can't consider finding a USB chip and connecting it to your PIC. Its much much easier to get these things done in hardware than try to do them your self. If you can't do that, consider a PIC with Rs232 and get a USB to Rs232 converter.
Unless you're on the real cutting edge others will have done this before you. It's just a matter of finding them. I remember there are quite a few PIC code sites, though be wary of taking code at face value. I remember seeing a book on coding for USB in my local bookshop a few years ago, which takes, as you request, the developers perspective rather than a protocol specifier's perspective. so have a look.
Obviously you can do this yourself, Its just harder as you already know and you need time, information and patience.
PIC24FJ256GB210 if you like long strings of letters and digits.
It has a USB port already built in.
I believe it already has its SIE (Serial Interface "Engine" (eyes roll, etc.)) already built into the module.
Microchip (purportedly) has working source code on their site. I have looked at that code. There is a good chance that the person who wrote it knows what some of the statements are doing, and quite possibly why they are doing it.
What I'm really trying to figure out is: Who gives What byte to Whom in What order to make What action occur on What part of What machine ?
I see the spec you linked to is called 'usb made simple' and I think as far as it goes that's fine.
But from what I saw at a glance you need to find the PIC Serial Engine interface, and depending on its level, probably get into the detail of loading registers and setting bits etc. Nothing I can really advise here part from reading the detailed PIC Serial Engine docs. Its possible that the USB Enginer interface is similar to, say, the PIC Rs232 Engine interface etc so it may help to look at code for other Engine types.
Having worked on interfaces to several bus systems, but not USB, I've found the relevant specs essential. I'm not saying you have to read the whole thing but when the software gets tough its good to be able to look at the spec and compare with what your code is doing, or not doing. I found someone had coded to cope with the situation when everything happened ideally, no bus conflicts, no unresolved addresses, no planning for when a thread to receive wasn't available etc. At times it was only by reading the bus spec I could find out what should have been coded for. For instance I found an unreliable bus system on the test rig was due to no pull up resistors on the data lines, something I found in the spec, and something somebody had spent a long time trying to resolve with a debugger.
EDIT - Thanks to everyone that replied. I have found a better solution than an INF file.
My company has an existing software-only driver. The 32-bit version is being installed using InstallShield. Unfortunately for me, the company wants to get away from InstallShield as the product in question is going to be part of a customer's own installation. The build system here produces the 64-bit signed driver, and I am tasked with creating a .inf file to install this driver. I've been reading Microsoft documents about .inf files (until my eyes are bleeding) and all of this documentation seems to be centered around the Windows Driver Development Kit. I believe that this kit generates a .inx file which is really the .inf file. However, all I need to do is create a .inf file that will do the job.
When right-clicking on the .inf file and selecting Install, the install process is spectacularly silent about anything that is happening (right or wrong). So it is very difficult to determine what is happening.
Some of my problems include the following:
1. The driver is already signed, so I find it unlikely that I will need a CatalogFile. Will the .inf file work without a defined CatalogFile?
2. It seems that a software-only driver needs to have some dummy device installed, and (from the InstallShield results) I see this dummy device in HKLM\CurrentControlSet\Enum\Root\LEGACY_DRIVER_NAME. This is somehow linked to service entry in HKLM\CurrentControlSet\services\driver_name which points to the actual driver executable in \Windows\System32\drivers. I'm getting lost trying to define this dummy device.
3. I am successful installing the service, and I find it in the registry, but the install process never copies my driver into the drivers directory, so it appears to die before it gets that far.
4. I keep reading about a CoInstaller, but I get the feeling that it is not exactly necessary. Is this correct?
What I need is a clue. I haven't defined the dummy driver entry which is where I need the help. I've also made the assumption that the install directory where the .inf file is executed from is the root of the SourceDisk. Here's what I have in my .inf file so far: