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**, 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, 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, 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, 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.**