| 
     
      
      
      From: <lin...@co...> - 2008-06-25 16:09:04
      
     
   | 
Keep in mind that I am new to this USB and hardware hacking stuff. 
Alright I am writing this little python application to pull the firmware from a device using the Cypress EzUSB Fx2 chip. Snazzy little thing.
To do that you generally use fxload to load the Cypress developer kit-supplied Vend_ax.hex code. It loads into ram, resets the cpu, and then you can get access to some vendor commands to read and write to the eeprom. 
The reason I am doing this is because I need to have a way to verify the firmware on any random device on of this type. This is due to some sticky certification issues that I won't bother you with. I like python so this seems the way to go.
Once you get the vend stuff loaded then you use control messages to send a request and your given a hunk of code. 
So.. it's the syntax of the controlmsg function that I have a question about. I have everything working right now and the script is working and all that, I just want to make sure that this behavior is 'correct'. Because once I say this is 'finished' it'll be very difficult to change the script.
So a truncated version of the script looks like this:
buses = usb.busses()
for bus in buses:
    for device in bus.devices:
        if device.idVendor == vend_id and device.idProduct == prod_id:
            mooCow = device
mooCowHandler = moocow.open()
results = mooCowHandler.controlMsg(0xc0, 0xa2, data, address, 0xBEEF, 10000)
Ok.. so it works and it makes me very happy with good feelings and all that.
But my question is this:
According to the documentation I would expect that the output from the command would be put into 'data' and the 'results' would be a return value for number of bytes written.
 |  controlMsg(...)
 |      controlMsg(requestType, request, buffer, value=0, index=0, timeout=100) -> bytesWritten|buffer
 |      
 |      Performs a control request to the default control pipe on a device.
 |      Arguments:
 |              requestType: specifies the direction of data flow, the type
 |                           of request, and the recipient.
 |              request: specifies the request.
 |              buffer: if the transfer is a write transfer, buffer is a sequence 
 |                      with the transfer data, otherwise, buffer is the number of
 |                      bytes to read.
 |              value: specific information to pass to the device. (default: 0)
 |              index: specific information to pass to the device. (default: 0)
 |              timeout: operation timeout in miliseconds. (default: 100)
 |      Returns the number of bytes written.
However with my code it does something quite differently. 
The 'results' end up being a tuple of returned values! Not the number of bytes. And the 'data' needs to be a number that tells it how many bytes I want returned from the command!
This is quite a bit different then what I expect after reading the docs and thus is why I am worried.
When I try to make the 'data' be a tuple or a list of objects or whatnot then It'll end up being unmodified when I run the script, but the results ends up being the number of items I put in the data list. I am confused.
So I want to make sure that this is the correct behavior for this function. (for it to return a tuple of the results) I am not a stickler for 'correctitude' or anything like that, but I want to make sure that this behavior isn't a 'bug' that is going to get 'fixed' and break my script in the distant future.
I am using python-usb package version 0.4.1-4  provided by Debian Testing/Unstable.
Thank you!!
 |