The MLA( Microchip Libraries for Applications ) ships with a MPLABX project for 18F4550 that makes the chip behave like a HID Custom device. i built the project, burnt the hex file, and was also able to test it using the plug_and_play executable provided for Linux
As per this project, there is 1 interface with 2 endpoints.
One is IN, other is OUT. Both are of type INTERRUPT.
( See usb_descriptors.c )
For the commands, see app_device_custom_hid.c.
The commands are :
Commands should be sent on the OUT endpoint, and data received on the IN.
i wanted to write my own code to control the device. came across the pyusb framework, which looked easy to use.
Here is working code for the first 2 commands :
As per this project, there is 1 interface with 2 endpoints.
One is IN, other is OUT. Both are of type INTERRUPT.
( See usb_descriptors.c )
For the commands, see app_device_custom_hid.c.
The commands are :
- COMMAND_TOGGLE_LED = 0x80 -- LED on RD0
- COMMAND_GET_BUTTON_STATUS = 0x81 -- Button on RB4, pressing should bring it to Ground
- COMMAND_READ_POTENTIOMETER = 0x37 -- ADC_CHANNEL_0
Commands should be sent on the OUT endpoint, and data received on the IN.
i wanted to write my own code to control the device. came across the pyusb framework, which looked easy to use.
Here is working code for the first 2 commands :
import usb.core
import usb.util
import sys
# find our device
dev = usb.core.find(idVendor=0x04d8, idProduct=0x003f)
# was it found?
if dev is None:
raise ValueError('Device not found')
interface = 0
if dev.is_kernel_driver_active(interface) is True:
print "but we need to detach kernel driver"
dev.detach_kernel_driver(interface)
# set the active configuration. With no arguments, the first
# configuration will be the active one
dev.set_configuration()
# get an endpoint instance
cfg = dev.get_active_configuration()
intf = cfg[(0,0)]
for cfg in dev:
sys.stdout.write("ConfigurationValue:" + str(cfg.bConfigurationValue) + '\n')
for intf in cfg:
#print vars(intf)
sys.stdout.write('\t' + \
"InterfaceNumber:" + str(intf.bInterfaceNumber) + \
',' + \
"AlternateSetting:" + str(intf.bAlternateSetting) + \
'\n')
for ep in intf:
#print vars(ep)
sys.stdout.write('\t\t' + \
"EndpointAddress:" + str(ep.bEndpointAddress) + \
'\n')
assert ep is not None
# toggle the led. COMMAND_TOGGLE_LED
# args : ep, value, timeout
dev.write( 1, chr(128), 100)
# read the button state. COMMAND_GET_BUTTON_STATUS
# first send the command on EP_OUT
dev.write( 1, chr(129), 100)
# read on EP_IN
ret = dev.read( 129, 100)
print "Received: %d,%d", ret[0], ret[1]
print "Button Status : " + "Released" if ret[1] == 1 else "Pressed"
