Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for USB Host / CDC Devices based on FTDI chipsets (FT232) #7

Open
wants to merge 1 commit into
base: main
Choose a base branch
from

Conversation

shreeve
Copy link

@shreeve shreeve commented Dec 21, 2023

This PR is not intended to be merged, but rather to review to see if support can be enabled for USB Host / CDC Devices based on FTDI chipsets (FT232).

I am communicating with the Raspberry Pi Pico W through its UART.

The Pico is connected to a USB Device that internally uses an FT232 chip. This is essentially a USB CDC class device, but it presents itself as a device with a class of 0x00 and subclass of 0x00, which aren't valid.

As a result, in this PR, instead of calling UsbHostCdcOpen, I have a new method called UsbHostCdcOpenFTDI, which just creates one interface and a pair of endpoints.

In addition, instead of calling UsbHostCdcCfg, I have a new method called UsbHostCdcCfgFTDI which does three things:

  1. Sends a reset packet to the FT232 (clears RX/TX, clears DTR/CTS, sets 8N1, leaves baud alone)
  2. Sends a packet to enable DTR/CTS
  3. Sends a packet to set the baud rate to 9600

In addition, I added a little echo support to show if you type characters in the UART as well as small logging messages to track the progress.

This code is an initial effort to communicate with these FTDI based devices (millions exist in the world).

I think everything here should work, but it's still not 100% there. I think it's REALLY close though...

Any ideas to get it running? @Panda381 - is this the general idea? Is it close?

Thanks!

@shreeve
Copy link
Author

shreeve commented Dec 21, 2023

Everything with this seems to be working as expected, except for the last bit, which is actually getting data back from the device. 😨

Here's some (sloppy) code I was using to try to read from this FTDI device, which should have properly been enumerated and setup, etc.

int main()
{
	Print("Launched\n");
	UsbHostInit();

	// wait for connection
	while (!UsbCdcIsMounted())
	{
		Print("-");
		WaitMs(100);
	}
	Print("UsbCdcIsMounted\n");

	// print device descriptor
	sUsbHostDev *cfg;
	cfg = UsbHostGetDev(1);
        Print("\r\nDevice Descriptor:\r\n");
	Print("  idVendor             0x%04X\r\n", cfg->vendor);
	Print("  idProduct            0x%04X\r\n", cfg->product);
	Print("  Vendor               0x%02X\r\n", cfg->i_manufact);
	Print("  Product              0x%02X\r\n", cfg->i_product);
	Print("  Serial               0x%02X\r\n", cfg->i_serial);
	Print("  bMaxPacketSize       0x%02X\r\n", cfg->pktmax);

	// main loop
	u8 i = 0;
	char ch;

	while (True)
	{
		if ((++i % 100) == 0) {
			while (!UsbCdcWriteReady()) {
				WaitMs(100);
				Print("!");
			}
			if (!UsbCdcWriteChar(0x06)) {
				Print("N"); // NAK
			} else {
				Print("K"); // ACK
			}
		}
		WaitMs(100);
		if (UsbCdcIsMounted()) {
			while (ch = UsbCdcReadChar()) {
				Print("%02X\n", ch);
			}
			Print(".");
		} else {
			Print("-");
		}
	}
}

The output looks like this:

Launched
UsbHostCdcInit
--UsbHostEnum(1)
-UsbHostEnum(2)
----UsbHostEnum(3)
UsbHostEnum(4)
UsbHostEnum(5)
UsbHostEnum(6)
UsbHostEnum(7)
UsbHostEnum(8)
UsbHostEnum(9)
UsbHostCdcOpenFTDI
UsbHostEnum(10)
UsbHostCfgComp(1,255)
UsbHostCdcCfgFTDI
UsbHostCdcCfgFTDIBaud(1,0)
UsbHostCdcCfgFTDILine(1,0)
UsbHostCfgComp(1,1)
UsbCdcIsMounted

Device Descriptor:
  idVendor             0x0403
  idProduct            0xCD18
  Vendor               0x01
  Product              0x02
  Serial               0x03
  bMaxPacketSize       0x08
..........................................................................................
........K.................................................................................
...................K........................................................K.............
.........................................................................................K
..........................................................................................
.......

Any thoughts on this?

@Panda381
Copy link
Owner

Sorry I can't help, I don't know much about USB interface anymore (see email). :-(

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants