Hi everyone,
I'm writing a USB device driver for an FTDI USB->Serial chip:
[0x6001,0x0403],
http://www.ftdichip.com/ based on the USB DDK Printer driver example,
since it has bulk in/out and some control setup.
I'm able to make the test LED going on and off
to the serial test board plugged to the FTDI in bitbang mode,
but usbd_urb_status == EBUSY and never return.
If I skip the bulk_wait part, I'm able to send data packets of 64 bytes to
the FTDI target,
but I'm unable to read anything.
bulk_cbf() is called only when I press CTRL-C, if I leave the bulk_wait().
Basically, I send a 5 bytes packet with the following decimal values
[18,27,68,18,69]
and I should retrieve a 2 bytes packet with the following decimal values
[71,13]
from a "pure serial port" point of view.
For instance, I'm getting the following decimal values in my
usbd_alloc(64)
read_data:
[33,96,144, 71,141,0...] or [0,0,0, 0,0,0...] garbage
instead of [71,13,0, 0,0,0...]
# io-usb -duhci
# usb -vvv
USB 0 (UHCI) v1.10, v1.01 DDK, v1.01 HCD
Control, Interrupt, Bulk, Isoch, Low speed
Device Address : 1
Upstream Host Controller : 0
Upstream Device Address : 0
Upstream Port : 0
Upstream Port Speed : Full
Vendor : 0x0403
Product : 0x6001
Device Release : r2.00
USB Spec Release : v1.10
Serial Number : N/A
Class : 0x00 (Independant per interface)
Max PacketSize0 : 8
Languages : No string descriptors
Current Frame : 929 (1024 bytes)
Configurations : 1
Configuration : 1
Attributes : 0x80 (Bus-powered)
Max Power : 90 mA
Interfaces : 1
Interface : 0 / 0
Class : 0xff (Vendor-specific)
Subclass : 0xff
Protocol : 0xff
Endpoints : Control + 2
Endpoint : 0
Attributes : Control
Max Packet Size: 8
Endpoint : 1
Attributes : Bulk/IN
Max Packet Size: 64
Endpoint : 2
Attributes : Bulk/OUT
Max Packet Size: 64
=================
program with fprintf log file for bulk_wait() enabled code:
inserted [8055f20][8055f8c]
{
devno 1 inserted
Read #0 = NULL
{
bLength[12],bDescriptorType[1],bcdUSB[110],bDeviceClass[0],
bDeviceSubClass[0],bDeviceProtocol[0],bMaxPacketSize0[8],
idVendor[403],idProduct[6001],bcdDevice[200],iManufacturer[1],
iProduct[2],iSerialNumber[3],bNumConfigurations[1]
}
Found CONTROL LINE - EndPoint#[0] - Max Packet Size [8]
Control pipe opened
Found BULK - EndPoint#[1]
BULK IN - Max Packet Size [64]
Input pipe opened
Found BULK - EndPoint#[2]
BULK OUT - Max Packet Size [64]
Output pipe opened
parse successful
Do something...
Initializing FTDI structure
Opening a FTDI device
usb_control_msg: setup...
urb[805a014], flags[2], request[0], request_type[40],value[0], index[0],
size[0], timeout[5000]
BYTES[0]=NULL or size[0]=0
CTRL_STATUS1[0]CTRL_STATUS2[0]usb_control_msg: setup...
urb[805a014], flags[2], request[3], request_type[40],value[4138],
index[0],
size[0], timeout[5000]
BYTES[0]=NULL or size[0]=0
CTRL_STATUS1[0]CTRL_STATUS2[0]ftdi open succeeded: 0
enabling bitbang mode
usb_control_msg: setup...
urb[805a014], flags[2], request[b], request_type[40],value[1ff], index[0],
size[0], timeout[5000]
BYTES[0]=NULL or size[0]=0
CTRL_STATUS1[0]CTRL_STATUS2[0]sleep 1 seconds...
disabling = Red Light
usb_bulk_write: bulk_io...
usb_bulk_io
usb_bulk_io: usbd_setup_bulk
usb_bulk_io: BEFORE BUFFER[^R^ESCD^RE] LENGTH[5]
{[0x12][18][_],[0x1b][27][_],[0x44][68][D],[0x12][18][_],[0x45][69][E],[0x0]
[0][_],[0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io
usb_bulk_io: AFTER BUFFER[^R^ESCD^RE] LENGTH[5]
{[0x12][18][_],[0x1b][27][_],[0x44][68][D],[0x12][18][_],[0x45][69][E],[0x0]
[0][_],[0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io: if(status[0]) bulk_wait...
usb_bulk_wait
usb_bulk_wait: Inside sleepon_lock()
usb_bulk_wait: Inside while... sleepon_wait()
usb_bulk_wait: urb_status[10],status[0],len[0],EBUSY[10]
]
{[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x
0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io
usb_bulk_io: AFTER BUFFER[] LENGTH[5]
{[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x
0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io: if(status[0]) bulk_wait...
usb_bulk_wait
usb_bulk_wait: Checking status[0].
enabling = Green Light
usb_bulk_write: bulk_io...
usb_bulk_io
usb_bulk_io: usbd_setup_bulk
usb_bulk_io: BEFORE BUFFER[^R^ESCE^RE] LENGTH[5]
{[0x12][18][_],[0x1b][27][_],[0x45][69][E],[0x12][18][_],[0x45][69][E],[0x0]
[0][_],[0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io
usb_bulk_io: AFTER BUFFER[^R^ESCE^RE] LENGTH[5]
{[0x12][18][_],[0x1b][27][_],[0x45][69][E],[0x12][18][_],[0x45][69][E],[0x0]
[0][_],[0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io: if(status[0]) bulk_wait...
usb_bulk_wait
usb_bulk_wait: Checking status[0].
usb_bulk_read: bulk_io...
usb_bulk_io
usb_bulk_io: usbd_setup_bulk
usb_bulk_io: BEFORE BUFFER[!] LENGTH[2]
{[0x21][33][!],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[
0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io
usb_bulk_io: AFTER BUFFER[!] LENGTH[2]
{[0x21][33][!],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[
0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io: if(status[0]) bulk_wait...
usb_bulk_wait
usb_bulk_wait: Checking status[0].
disabling = Red Light
usb_bulk_write: bulk_io...
usb_bulk_io
usb_bulk_io: usbd_setup_bulk
usb_bulk_io: BEFORE BUFFER[^R^ESCD^RE] LENGTH[5]
{[0x12][18][_],[0x1b][27][_],[0x44][68][D],[0x12][18][_],[0x45][69][E],[0x0]
[0][_],[0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io
usb_bulk_io: AFTER BUFFER[^R^ESCD^RE] LENGTH[5]
{[0x12][18][_],[0x1b][27][_],[0x44][68][D],[0x12][18][_],[0x45][69][E],[0x0]
[0][_],[0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io: if(status[0]) bulk_wait...
usb_bulk_wait
usb_bulk_wait: Checking status[0].
usb_bulk_read: bulk_io...
usb_bulk_io
usb_bulk_io: usbd_setup_bulk
usb_bulk_io: BEFORE BUFFER[!] LENGTH[5]
{[0x21][33][!],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[
0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io
usb_bulk_io: AFTER BUFFER[!] LENGTH[5]
{[0x21][33][!],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[
0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io: if(status[0]) bulk_wait...
usb_bulk_wait
usb_bulk_wait: Checking status[0].
enabling = Green Light
usb_bulk_write: bulk_io...
usb_bulk_io
usb_bulk_io: usbd_setup_bulk
usb_bulk_io: BEFORE BUFFER[^R^ESCE^RE] LENGTH[5]
{[0x12][18][_],[0x1b][27][_],[0x45][69][E],[0x12][18][_],[0x45][69][E],[0x0]
[0][_],[0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io
usb_bulk_io: AFTER BUFFER[^R^ESCE^RE] LENGTH[5]
{[0x12][18][_],[0x1b][27][_],[0x45][69][E],[0x12][18][_],[0x45][69][E],[0x0]
[0][_],[0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io: if(status[0]) bulk_wait...
usb_bulk_wait
usb_bulk_wait: Checking status[0].
usb_bulk_read: bulk_io...
usb_bulk_io
usb_bulk_io: usbd_setup_bulk
usb_bulk_io: BEFORE BUFFER[!] LENGTH[2]
{[0x21][33][!],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[
0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io
usb_bulk_io: AFTER BUFFER[!] LENGTH[2]
{[0x21][33][!],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[
0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io: if(status[0]) bulk_wait...
usb_bulk_wait
usb_bulk_wait: Checking status[0].
sleep 1 seconds...
disabling bitbang mode
usb_control_msg: setup...
urb[805a014], flags[2], request[b], request_type[40],value[0], index[0],
size[0], timeout[5000]
BYTES[0]=NULL or size[0]=0
CTRL_STATUS1[0]CTRL_STATUS2[0]insertion: closed.
=================
program with fprintf log file for bulk_wait() disabled code:
inserted [8055f20][8055f8c]
{
devno 1 inserted
Read #0 = NULL
{
bLength[12],bDescriptorType[1],bcdUSB[110],bDeviceClass[0],
bDeviceSubClass[0],bDeviceProtocol[0],bMaxPacketSize0[8],
idVendor[403],idProduct[6001],bcdDevice[200],iManufacturer[1],
iProduct[2],iSerialNumber[3],bNumConfigurations[1]
}
Found CONTROL LINE - EndPoint#[0] - Max Packet Size [8]
Control pipe opened
Found BULK - EndPoint#[1]
BULK IN - Max Packet Size [64]
Input pipe opened
Found BULK - EndPoint#[2]
BULK OUT - Max Packet Size [64]
Output pipe opened
parse successful
Do something...
Initializing FTDI structure
Opening a FTDI device
usb_control_msg: setup...
urb[805a014], flags[2], request[0], request_type[40],value[0], index[0],
size[0], timeout[5000]
BYTES[0]=NULL or size[0]=0
CTRL_STATUS1[0]CTRL_STATUS2[0]usb_control_msg: setup...
urb[805a014], flags[2], request[3], request_type[40],value[4138],
index[0],
size[0], timeout[5000]
BYTES[0]=NULL or size[0]=0
CTRL_STATUS1[0]CTRL_STATUS2[0]ftdi open succeeded: 0
enabling bitbang mode
usb_control_msg: setup...
urb[805a014], flags[2], request[b], request_type[40],value[1ff], index[0],
size[0], timeout[5000]
BYTES[0]=NULL or size[0]=0
CTRL_STATUS1[0]CTRL_STATUS2[0]sleep 1 seconds...
disabling = Red Light
usb_bulk_write: bulk_io...
usb_bulk_io
usb_bulk_io: usbd_setup_bulk
usb_bulk_io: BEFORE BUFFER[^R^ESCD^RE] LENGTH[5]
{[0x12][18][_],[0x1b][27][_],[0x44][68][D],[0x12][18][_],[0x45][69][E],[0x0]
[0][_],[0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io
usb_bulk_io: AFTER BUFFER[^R^ESCD^RE] LENGTH[5]
{[0x12][18][_],[0x1b][27][_],[0x44][68][D],[0x12][18][_],[0x45][69][E],[0x0]
[0][_],[0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io: if(status[0]) bulk_wait...
usb_bulk_wait
usb_bulk_wait: Checking status[0].
usb_bulk_read: bulk_io...
usb_bulk_io
usb_bulk_io: usbd_setup_bulk
usb_bulk_io: BEFORE BUFFER[] LENGTH[5]
{[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x
0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io
usb_bulk_io: AFTER BUFFER[] LENGTH[5]
{[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x
0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io: if(status[0]) bulk_wait...
usb_bulk_wait
usb_bulk_wait: Checking status[0].
enabling = Green Light
usb_bulk_write: bulk_io...
usb_bulk_io
usb_bulk_io: usbd_setup_bulk
usb_bulk_io: BEFORE BUFFER[^R^ESCE^RE] LENGTH[5]
{[0x12][18][_],[0x1b][27][_],[0x45][69][E],[0x12][18][_],[0x45][69][E],[0x0]
[0][_],[0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io
usb_bulk_io: AFTER BUFFER[^R^ESCE^RE] LENGTH[5]
{[0x12][18][_],[0x1b][27][_],[0x45][69][E],[0x12][18][_],[0x45][69][E],[0x0]
[0][_],[0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io: if(status[0]) bulk_wait...
usb_bulk_wait
usb_bulk_wait: Checking status[0].
usb_bulk_read: bulk_io...
usb_bulk_io
usb_bulk_io: usbd_setup_bulk
usb_bulk_io: BEFORE BUFFER[!] LENGTH[2]
{[0x21][33][!],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[
0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io
usb_bulk_io: AFTER BUFFER[!] LENGTH[2]
{[0x21][33][!],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[
0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io: if(status[0]) bulk_wait...
usb_bulk_wait
usb_bulk_wait: Checking status[0].
disabling = Red Light
usb_bulk_write: bulk_io...
usb_bulk_io
usb_bulk_io: usbd_setup_bulk
usb_bulk_io: BEFORE BUFFER[^R^ESCD^RE] LENGTH[5]
{[0x12][18][_],[0x1b][27][_],[0x44][68][D],[0x12][18][_],[0x45][69][E],[0x0]
[0][_],[0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io
usb_bulk_io: AFTER BUFFER[^R^ESCD^RE] LENGTH[5]
{[0x12][18][_],[0x1b][27][_],[0x44][68][D],[0x12][18][_],[0x45][69][E],[0x0]
[0][_],[0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io: if(status[0]) bulk_wait...
usb_bulk_wait
usb_bulk_wait: Checking status[0].
usb_bulk_read: bulk_io...
usb_bulk_io
usb_bulk_io: usbd_setup_bulk
usb_bulk_io: BEFORE BUFFER[!] LENGTH[5]
{[0x21][33][!],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[
0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io
usb_bulk_io: AFTER BUFFER[!] LENGTH[5]
{[0x21][33][!],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[0x0][0][_],[
0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io: if(status[0]) bulk_wait...
usb_bulk_wait
usb_bulk_wait: Checking status[0].
enabling = Green Light
usb_bulk_write: bulk_io...
usb_bulk_io
usb_bulk_io: usbd_setup_bulk
usb_bulk_io: BEFORE BUFFER[^R^ESCE^RE] LENGTH[5]
{[0x12][18][_],[0x1b][27][_],[0x45][69][E],[0x12][18][_],[0x45][69][E],[0x0]
[0][_],[0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io
usb_bulk_io: AFTER BUFFER[^R^ESCE^RE] LENGTH[5]
{[0x12][18][_],[0x1b][27][_],[0x45][69][E],[0x12][18][_],[0x45][69][E],[0x0]
[0][_],[0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io: if(status[0]) bulk_wait...
usb_bulk_wait
usb_bulk_wait: Checking status[0].
usb_bulk_read: bulk_io...
usb_bulk_io
usb_bulk_io: usbd_setup_bulk
usb_bulk_io: BEFORE BUFFER[!] LENGTH[2]
{[0x21][33][!],[0x0][0][_],[0x90][144][É],[0x0][0][_],[0x0][0][_],[0x0][0][_
],[0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io
usb_bulk_io: AFTER BUFFER[!] LENGTH[2]
{[0x21][33][!],[0x0][0][_],[0x90][144][É],[0x0][0][_],[0x0][0][_],[0x0][0][_
],[0x0][0][_],[0x0][0][_],}
usb_bulk_io: usbd_io: if(status[0]) bulk_wait...
usb_bulk_wait
usb_bulk_wait: Checking status[0].
sleep 1 seconds...
disabling bitbang mode
usb_control_msg: setup...
urb[805a014], flags[2], request[b], request_type[40],value[0], index[0],
size[0], timeout[5000]
BYTES[0]=NULL or size[0]=0
CTRL_STATUS1[0]CTRL_STATUS2[0]insertion: closed.
=========================
Anyone has any idea of what the problem could be ?!
Sincerely yours,
Fred.