There are three IOP messages related to analog pin in AN1139.
Message Name
ID
Source
Description
iop_SetAnalogPinNotify
0xD300
Host
Configure automatic reporting of analog pin.
iop_GetAnalogPin
0xD301
Host
Report current analog pin value.
iop_AnalogPinValue
0xA301
CP2615
Current analog pin value
These IOP messages are intended to be used for CP2615 GPIO.8/ADC analog pin only, see AN1139 for more details about the format of these messages.
When USB host sends these API commands, the first parameter 'PinNumber' for iop_SetAnalogPinNotify (0xD300) and iop_GetAnalogPin (0xD301) must be set to 0. It is invalid for the two commands if the pin number is set to other values.
The ADC analog value message returned by iop_AnalogPinValue looks as below:
0x000D is the total message length for this message (header + message payload)
0xA301 is the ID of iop_AnalogPinValue message
pp is the analog pin number, here it is 0x00
vv vv is the current value read from the analog pin, 10-bit right-justified, full-scale VDD corresponds to 0x03FF.
tt tt tt tt is 32-bit timestamp, MSB, 1 ms resolution
The CP2615 GPIO pins can be configured using Xpress Configurator in Simplicity Studio. Ensure the GPIO.8 is set as ADC input when using these IOP messages, otherwise host will not receive analog notification if it is configured as GPIO function, although the GPIO.8 is set to ADC input by default.
I am using the CP2102N and I have an external 3.3 V regulator that is used to supply 3.3 V to VREGIN and VDD. I have the VBUS pin connected to the USB 5 V. Do I need a voltage divider for VBUS to reduce the input voltage? Alternately, is connecting the VBUS pin to the 3.3 V regulator output a supported configuration, and if so, can the required voltage divider on VBUS be omitted?
Answer:
The power configuration described above is that of a self-powered configuration, and requires a voltage divider on the VBUS pin. This power configuration, with the voltage divider, is shown in Figure 2.6 on page 6 of the CP2102N datasheet. Please note that any power configuration (self or bus-powered) in which the USB VBUS signal is connected to the CP2102N VBUS pin requires a voltage divider (as shown in Figure 2.6) on VBUS to avoid a possible overvoltage condition on VBUS (see https://www.silabs.com/community/interface/knowledge-base.entry.html/2018/03/31/cp2102n_requiresav-NFly).
As for the connecting of the VBUS pin to the same 3.3V supply connected to VDD and VREGIN, this configuration should be acceptable as long as the regulator on the CP2102N is bypassed (i.e. VDD = VREGIN = externally supplied 3.3 V). If the device is self powered with the internal regulator used to supply VDD (for instance if the USB 5 V VBUS signal is connected to VREGIN), the delay in the rise time of VDD may cause a violation of the maximum voltage rating on the VBUS pin, which is not supported. In these cases, the VBUS voltage divider should be used.
Problem: Couldn't recognize CP2615 as output audio device in Mac OS when configured for 24-bit-only output.
Root cause: The failure to enumerate is due to the Mac OS not tolerating the Interface 3 Alt 1 zero-bandwidth descriptor that is sent by the CP2615 when configured for 24-bit-only operation. The presence of this zero-bandwidth descriptor is not prohibited by the USB standards and is tolerated by other operating systems (Windows, Linux, Android).
Workaround: The problem can be avoided by configuring the CP2615 Audio Out interface for 24/16 bit operation, instead of 24-bit-only. This just adds the 16-bit capability in addition to 24-bit, so there is no loss in the quality. 24-bit source material will still be sent over USB as 24 bits; the only difference is that 16-bit source material will get transmitted across USB as 16 bits, rather than being artificially padded to 24 bits as it would if the CP2615 was configured for 24-bit-only operation. (Padding 16-bit audio to 24-bit does not increase its actual resolution, it just wastes USB bandwidth.)
CP2114 supports record mute by USB host or GPIO pin. CP2114 mutes Record when the USB host sends an Audio Class-Specific request SET_CUR (0x01) to mute the Record audio. In addition, single-pressing the Record Mute button (GPIO.0 by default) will toggle between record mute and unmute states. The Record Mute LED (GPIO.4 by default) is turned on/off accordingly for both control methods.
For Windows machine, the CP2114 device record can be muted with following steps:
From the Recording tab of the Sound window, select the CP2114 recording device.
Click Properties to open the Properties window.
Select Levels tab
Click the Mute button to turn on/off mute
The Record Mute LED on CP2114 evaluation board will be toggled as well.
Note:
1. Record Mute controlled by Host PC is available for CP2114-B02 revision only. See CP2114 Errata for more information.
2. Record functionality must be enable. User can test with the index 0 of preprogrammed configuration by installing all jumpers of GPIO.5 ~ GPIO.8 on the CP2114 EVB.
Table 3.13 in the CP2615 Datasheet (captioned "Read CP2615 Firmware Revision") depicts an operation available in Configuration Mode to read the Firmware Version Number. How does the value obtained by this sequence map to a CP2615 firmware revision?
Answer:
The CP2615-A02 firmware version number consists of an ASCII-encoded null-terminated string in the format 2615.x.y.z, where 'x', 'y', and 'z' comprise the firmware version number, and can be one or more characters each. The following table illustrates the data returned by reading 16 bytes from address 0xFFFB on a CP2615-A02 device:
CP2615-A02
ASCII
2
6
1
5
.
1
.
1
.
8
Hex
32
26
31
35
2E
31
2E
31
2E
38
00
00
00
00
00
00
The CP2615-A01 device does not have its firmware version encoded as described above. For the -A01 device, reading 16 bytes from address 0xFFFB returns the following data
CP2615-A01
Hex
00
00
00
00
00
00
00
43
00
00
00
00
00
00
00
00
For more information, including an alternative means to determine the revision of a CP2615 device (suitable for an end-user situation, e.g. where an app running on the phone or USB host would query the version number), see the KB article "Methods to determine CP2615 revision".
When a CP210x device is connected to the USB host, the host will send a reset signal to the USB device to start the enumeration process. After reset, the host will read the USB device’s information and assign a unique address. If USB host has the driver for the device, the driver will be loaded after enumeration done.
Sometimes the USB enumeration may fail because of bad USB signal quality, incorrect USB driver for the specified VID/PID device, etc. So, it is important to check if the CP210x device is enumerated successfully.
This KBA introduces two methods for checking this.
The first way is to execute shell command, the steps are below.
a) Connect the CP210x device to USB host on Linux.
b) Start a terminal on Linux, type “lsusb” and press Enter. There will be one more USB devices, take the CP2104EK as an example, it named CP210x UART Bridge / myAVR mySmartUSB light (it's a wrong name because of Ubuntu OS, it should be "Silicon Labs CP210x USB to UART Bridge") in my case. The hex value 10c4:ea60 represents VID and PID as shown below. The PID and product name may different if the device is customized.
c) Typing“lsusb -d VID:PID -v” and press Enter, it is “lsusb -d 10c4:ea60 -v” in my case. Then the CP210x device descriptor will be printed out on the screen. By checking the descriptor information we should know if the device has been correctly enumerated. However, if all the data is zeroes (0x0000, for example) or if an error is reported, the device did not properly enumerated.
USBView is a graphical user interface application that enables you to browse USB controllers and connected USB devices on your computer. It displays the information on each of the USB devices (like VID, PID, Product String, descriptors, etc.). The driver for the device does not need to be installed or loaded for USBView to read the information, as the utility uses the low-level USB driver to talk to the device. This is useful when a CP210x is not enumerating because of an incorrectly programmed PID.
You can run USBView by double-click a USBView.exe package on Window. But there is difficulty to run it on Linux. This article will explain how to install and run USBView on Ubuntu.
Install gtk3.0
Gtk3.0 is required for running USBView, you can install gtk3.0 by typing below command and press Enter on terminal.
$ sudo apt-get install libgtk-3-dev
Install USBView
The Ubuntu website provides a .deb package and source code of USBView, you can download it from following link: http://manpages.ubuntu.com/manpages/trusty/man8/usbview.8.html. If you choose to install USBView with .deb package, you can finish it just by double-click .deb package. If you want to install it with source code, you should extract the source code package and enter the extracted directory, then follow three steps to install it.
Some CP210x devices include GPIO pins that can be controlled at runtime. This article discusses reading and writing the latch value of these pins with software on different operating system platforms.
On Windows
Before connecting to a device, the host must install relevant VCP driver, you can get the appropriate installation package from the link below:
After installing the VCP driver, the CP210x device is recognized by the host when it was plugged in the host USB port. Silabs offers a CP210x Port Read/Write Example application to read/write GPIO latch at runtime.
Taking CP2104EK as testing platform to show how to read/write the GPIO by the CP210x Port Read/Write Example, the CP210x Port Read/Write Example application can be found in AN223SW. Besides, reading AN223 for more information, you can get both of them from the website here https://www.silabs.com/community. we will write value to GPIOs and then read it back by three steps blow.
Install suitable VCP driver and the CP210x Port Read/Write Example.
Connect the CP2104EK to the USB host. Then, a new COM port appears in Device Manager Window, it’s “Silicon Labs CP210x USB to UART Bridge(COM4)” in my case.
Open the CP210x Port Read/Write Example, the main window of the CP210x Port Read/Write Example contains one section to write GPIO latch and another to read GPIO latch. Below that is a list to select the COM port and display boxes for the device part number, product string, and serial number. Select the correct COM port in the drop-down box at the bottom left of the software. Select GPIO0, GPIO1, GPIO2 and GPIO3, set the pins state as low (0) for each, press the “Write latch” button. The LED DS0-DS3 on CP2104EK turned on. At any time, press the “Read Latch” button can read the current GPIO latch value of the device.
The CP210x Port Read/Write Example illustrates how the GPIO latch can be read from and written to device by using the CP210xRuntime.DLL. You can develop a custom application using CP210xRuntime.DLL, the functions in this API (CP210xRT_ReadLatch() and CP210xRT_WriteLatch()) give host-based software access to the CP210x device’s GPIO latch using the USB connection.
On Linux
The CP210x driver has been distributed as part of the Linux kernel since v2.6.12, and GPIO operations also be supported by Linux 4.10.0 kernel or later.
If you are using an older kernel version, please download the latest Linux VCP driver from link below and merge the GPIO operation related source code into your kernel. The .zip package contains VCP driver and example code show how to control GPIOs.
After merging the VCP driver cp210x.c, compile it with make command and install it with command "insmod ". Note that the command "rmmod cp210x.ko" should be executed if VCP driver already exists before installing the driver that support GPIO control.
In the cp210x_gpio_example.c, use the following function to open a CP210x device.
Use the function below to read latch, where the third parameter gpioread is a buffer address of one-byte length for storing the read latch value.
ioctl(fd, IOCTL_GPIOGET, &gpioread);
The returned read latch value is represented as follows: bits 0–7: Current latch state, where bit 0 is GPIO0, bit 1 is GPIO1, etc. Up to GPIOn where n is the total number of GPIO pins the interface supports.
Use the function below to write latch, where the third parameter gpio is write latch value.
ioctl(fd, IOCTL_GPIOSET, &gpio);
The write latch value that is supplied in the Data phase represents as follows:
bits 0–7: Mask of the latch state (in bits 8-15) to write, where bit 0 is GPIO0, bit 1 is GPIO1, etc. Up to GPIOn where n is the total number of GPIO pins the interface supports.
bits 8–15: Latch state to write, where bit 8 is GPIO0, bit 9 is GPIO1, etc. Up to GPIOn where n is the total number of GPIO pins the interface supports.
Get more information from AN571.
Compile the application with “gcc cp210x_gpio_example.c”, a executable file “a.out” is generated. Execute it with “./a.out”.
On MacOS
The Mac VCP driver v5.0 or later version supports the GPIO control on the CP210x devices. Download the latest driver here:
For using the python, you should install libusb and Pyusb library on your Mac machine, please refer to the following code to write a Python script to control the CP210x GPIO.
import time
import usb.core
import usb.util
PID = 0xea60
VID = 0x10c4
dev = usb.core.find(idVendor=VID, idProduct=PID)
if not dev:
print "CP2104 was not found :("
exit(1)
print "Yeeha! Found CP2104"
reqType = 0x41
bReq = 0xFF
wVal = 0x37E1
while True:
wIndex = 0xffff
print "toggling On"
dev.ctrl_transfer(reqType, bReq, wVal, wIndex, [])
time.sleep(5)
print "toggling Off"
wIndex = 0x00ff
dev.ctrl_transfer(reqType, bReq, wVal, wIndex, [])
time.sleep(5)
You can learn more through this video from Lady Ada.
The CP2102N has some additional configuration options that are not available on other CP210x devices. These are displayed in the [Advanced Serial Configuration] tab in Xpress Configurator.
The [Allowed Baudrates] options set the SettableBaud element in this structure, while the [Maximum Baudrate] sets the MaxBaud element in the structure.
These settings for this SERIAL_COMMPROP structure have no direct impact on the device's behavior. For example, if the [Maximum Baudrate] is set as 300, an application can still request a higher baudrate, and the CP2102N will happily oblige. It's then up to the application to read the SERIAL_COMMPROP structure and then prevent the user from requesting baudrates that are set to be not supported.
Question
Using CP210x in Linux embedded platform, when host sends requests to CP210x, it returns below error:
"cp210x ttyUSB1: failed set request 0x7 status: -32"
How to interpret the error message?
Answer
Table 6 Interface Commands in AN571 lists all API commands that CP210x device supports. Viewing from this Table, request of 0x7 represents SET_MHS command, which is used to set modem handshaking (DTR and RTS lines) states.
The negative error is returned by the underlying call to usb_control_msg() from the cp210x.c driver.
If this function is not successful, a negative error number is returned.
How does CP210x handle the SET_MHS request from host?
For CP210x SET_MHS (0x07) command, as AN571 stated, the DTR and RTS values can be set only if the current handshaking state of the interface allows direct control of the modem control lines.
When the device receives the SET_MHS command intending to change the state of DTR or RTS pin, CP210x device will then check current Flow Control setting in the device base on the SET_FLOW() from host, and then make a different response.
If the hardware Flow Control is currently enabled, it means the handshaking lines have been managed by the CP210x device itself rather than host, the device will not response the current SET_MHS request, and a STALL would be returned.
Interface Knowledge Base
CP2615 IOP Messages for GPIO.8/ADC Analog Input
There are three IOP messages related to analog pin in AN1139.
iop_SetAnalogPinNotify
0xD300
Configure automatic reporting of analog pin.
iop_GetAnalogPin
0xD301
Report current analog pin value.
iop_AnalogPinValue
0xA301
These IOP messages are intended to be used for CP2615 GPIO.8/ADC analog pin only, see AN1139 for more details about the format of these messages.
When USB host sends these API commands, the first parameter 'PinNumber' for iop_SetAnalogPinNotify (0xD300) and iop_GetAnalogPin (0xD301) must be set to 0. It is invalid for the two commands if the pin number is set to other values.
The ADC analog value message returned by iop_AnalogPinValue looks as below:
0x2A 0x2A 0x00 0x0D 0xA3 0x01 pp vv vv tt tt tt tt
where:
0x2A2A is the preamble of CP2615 IOP message
0x000D is the total message length for this message (header + message payload)
0xA301 is the ID of iop_AnalogPinValue message
pp is the analog pin number, here it is 0x00
vv vv is the current value read from the analog pin, 10-bit right-justified, full-scale VDD corresponds to 0x03FF.
tt tt tt tt is 32-bit timestamp, MSB, 1 ms resolution
The CP2615 GPIO pins can be configured using Xpress Configurator in Simplicity Studio. Ensure the GPIO.8 is set as ADC input when using these IOP messages, otherwise host will not receive analog notification if it is configured as GPIO function, although the GPIO.8 is set to ADC input by default.
Self powered CP2102N, VBUS pin connection, and VBUS voltage divider
Question:
I am using the CP2102N and I have an external 3.3 V regulator that is used to supply 3.3 V to VREGIN and VDD. I have the VBUS pin connected to the USB 5 V. Do I need a voltage divider for VBUS to reduce the input voltage? Alternately, is connecting the VBUS pin to the 3.3 V regulator output a supported configuration, and if so, can the required voltage divider on VBUS be omitted?
Answer:
The power configuration described above is that of a self-powered configuration, and requires a voltage divider on the VBUS pin. This power configuration, with the voltage divider, is shown in Figure 2.6 on page 6 of the CP2102N datasheet. Please note that any power configuration (self or bus-powered) in which the USB VBUS signal is connected to the CP2102N VBUS pin requires a voltage divider (as shown in Figure 2.6) on VBUS to avoid a possible overvoltage condition on VBUS (see https://www.silabs.com/community/interface/knowledge-base.entry.html/2018/03/31/cp2102n_requiresav-NFly).
As for the connecting of the VBUS pin to the same 3.3V supply connected to VDD and VREGIN, this configuration should be acceptable as long as the regulator on the CP2102N is bypassed (i.e. VDD = VREGIN = externally supplied 3.3 V). If the device is self powered with the internal regulator used to supply VDD (for instance if the USB 5 V VBUS signal is connected to VREGIN), the delay in the rise time of VDD may cause a violation of the maximum voltage rating on the VBUS pin, which is not supported. In these cases, the VBUS voltage divider should be used.
Couldn't recognize CP2615 as output audio device in Mac OS when configured for 24-bit-only output
Problem: Couldn't recognize CP2615 as output audio device in Mac OS when configured for 24-bit-only output.
Root cause: The failure to enumerate is due to the Mac OS not tolerating the Interface 3 Alt 1 zero-bandwidth descriptor that is sent by the CP2615 when configured for 24-bit-only operation. The presence of this zero-bandwidth descriptor is not prohibited by the USB standards and is tolerated by other operating systems (Windows, Linux, Android).
Workaround: The problem can be avoided by configuring the CP2615 Audio Out interface for 24/16 bit operation, instead of 24-bit-only. This just adds the 16-bit capability in addition to 24-bit, so there is no loss in the quality. 24-bit source material will still be sent over USB as 24 bits; the only difference is that 16-bit source material will get transmitted across USB as 16 bits, rather than being artificially padded to 24 bits as it would if the CP2615 was configured for 24-bit-only operation. (Padding 16-bit audio to 24-bit does not increase its actual resolution, it just wastes USB bandwidth.)
CP2114 Record Mute Control
CP2114 supports record mute by USB host or GPIO pin. CP2114 mutes Record when the USB host sends an Audio Class-Specific request SET_CUR (0x01) to mute the Record audio. In addition, single-pressing the Record Mute button (GPIO.0 by default) will toggle between record mute and unmute states. The Record Mute LED (GPIO.4 by default) is turned on/off accordingly for both control methods.
For Windows machine, the CP2114 device record can be muted with following steps:
The Record Mute LED on CP2114 evaluation board will be toggled as well.
Note:
1. Record Mute controlled by Host PC is available for CP2114-B02 revision only. See CP2114 Errata for more information.
2. Record functionality must be enable. User can test with the index 0 of preprogrammed configuration by installing all jumpers of GPIO.5 ~ GPIO.8 on the CP2114 EVB.
Related Articles
CP2114 B01 vs B02 Package Marking
Parsing the CP2615 Firmware Version Number
Question:
Table 3.13 in the CP2615 Datasheet (captioned "Read CP2615 Firmware Revision") depicts an operation available in Configuration Mode to read the Firmware Version Number. How does the value obtained by this sequence map to a CP2615 firmware revision?
Answer:
The CP2615-A02 firmware version number consists of an ASCII-encoded null-terminated string in the format 2615.x.y.z, where 'x', 'y', and 'z' comprise the firmware version number, and can be one or more characters each. The following table illustrates the data returned by reading 16 bytes from address 0xFFFB on a CP2615-A02 device:
The CP2615-A01 device does not have its firmware version encoded as described above. For the -A01 device, reading 16 bytes from address 0xFFFB returns the following data
For more information, including an alternative means to determine the revision of a CP2615 device (suitable for an end-user situation, e.g. where an app running on the phone or USB host would query the version number), see the KB article "Methods to determine CP2615 revision".
How to check if the CP210x be enumerated successfully on Linux
When a CP210x device is connected to the USB host, the host will send a reset signal to the USB device to start the enumeration process. After reset, the host will read the USB device’s information and assign a unique address. If USB host has the driver for the device, the driver will be loaded after enumeration done.
Sometimes the USB enumeration may fail because of bad USB signal quality, incorrect USB driver for the specified VID/PID device, etc. So, it is important to check if the CP210x device is enumerated successfully.
This KBA introduces two methods for checking this.
a) Connect the CP210x device to USB host on Linux.
b) Start a terminal on Linux, type “lsusb” and press Enter. There will be one more USB devices, take the CP2104EK as an example, it named CP210x UART Bridge / myAVR mySmartUSB light (it's a wrong name because of Ubuntu OS, it should be "Silicon Labs CP210x USB to UART Bridge") in my case. The hex value 10c4:ea60 represents VID and PID as shown below. The PID and product name may different if the device is customized.
c) Typing“lsusb -d VID:PID -v” and press Enter, it is “lsusb -d 10c4:ea60 -v” in my case. Then the CP210x device descriptor will be printed out on the screen. By checking the descriptor information we should know if the device has been correctly enumerated. However, if all the data is zeroes (0x0000, for example) or if an error is reported, the device did not properly enumerated.
How to Install and Run USBView on Linux
USBView is a graphical user interface application that enables you to browse USB controllers and connected USB devices on your computer. It displays the information on each of the USB devices (like VID, PID, Product String, descriptors, etc.). The driver for the device does not need to be installed or loaded for USBView to read the information, as the utility uses the low-level USB driver to talk to the device. This is useful when a CP210x is not enumerating because of an incorrectly programmed PID.
You can run USBView by double-click a USBView.exe package on Window. But there is difficulty to run it on Linux. This article will explain how to install and run USBView on Ubuntu.
Gtk3.0 is required for running USBView, you can install gtk3.0 by typing below command and press Enter on terminal.
The Ubuntu website provides a .deb package and source code of USBView, you can download it from following link: http://manpages.ubuntu.com/manpages/trusty/man8/usbview.8.html. If you choose to install USBView with .deb package, you can finish it just by double-click .deb package. If you want to install it with source code, you should extract the source code package and enter the extracted directory, then follow three steps to install it.
After installation, you will see the following directory structure.
Running the USBView by typing “sudo ./usbview”, and the graphical display of connected USB devices are shown as below.
Detailed information may be displayed by selecting individual devices in the display.
How to control GPIOs of CP210x at runtime
Some CP210x devices include GPIO pins that can be controlled at runtime. This article discusses reading and writing the latch value of these pins with software on different operating system platforms.
On Windows
Before connecting to a device, the host must install relevant VCP driver, you can get the appropriate installation package from the link below:
https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers
After installing the VCP driver, the CP210x device is recognized by the host when it was plugged in the host USB port. Silabs offers a CP210x Port Read/Write Example application to read/write GPIO latch at runtime.
Taking CP2104EK as testing platform to show how to read/write the GPIO by the CP210x Port Read/Write Example, the CP210x Port Read/Write Example application can be found in AN223SW. Besides, reading AN223 for more information, you can get both of them from the website here https://www.silabs.com/community. we will write value to GPIOs and then read it back by three steps blow.
The CP210x Port Read/Write Example illustrates how the GPIO latch can be read from and written to device by using the CP210xRuntime.DLL. You can develop a custom application using CP210xRuntime.DLL, the functions in this API (CP210xRT_ReadLatch() and CP210xRT_WriteLatch()) give host-based software access to the CP210x device’s GPIO latch using the USB connection.
On Linux
The CP210x driver has been distributed as part of the Linux kernel since v2.6.12, and GPIO operations also be supported by Linux 4.10.0 kernel or later.
If you are using an older kernel version, please download the latest Linux VCP driver from link below and merge the GPIO operation related source code into your kernel. The .zip package contains VCP driver and example code show how to control GPIOs.
https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers .
After merging the VCP driver cp210x.c, compile it with make command and install it with command "insmod ". Note that the command "rmmod cp210x.ko" should be executed if VCP driver already exists before installing the driver that support GPIO control.
In the cp210x_gpio_example.c, use the following function to open a CP210x device.
Use the function below to read latch, where the third parameter gpioread is a buffer address of one-byte length for storing the read latch value.
The returned read latch value is represented as follows: bits 0–7: Current latch state, where bit 0 is GPIO0, bit 1 is GPIO1, etc. Up to GPIOn where n is the total number of GPIO pins the interface supports.
Use the function below to write latch, where the third parameter gpio is write latch value.
The write latch value that is supplied in the Data phase represents as follows:
bits 0–7: Mask of the latch state (in bits 8-15) to write, where bit 0 is GPIO0, bit 1 is GPIO1, etc. Up to GPIOn where n is the total number of GPIO pins the interface supports.
bits 8–15: Latch state to write, where bit 8 is GPIO0, bit 9 is GPIO1, etc. Up to GPIOn where n is the total number of GPIO pins the interface supports.
Get more information from AN571.
Compile the application with “gcc cp210x_gpio_example.c”, a executable file “a.out” is generated. Execute it with “./a.out”.
On MacOS
The Mac VCP driver v5.0 or later version supports the GPIO control on the CP210x devices. Download the latest driver here:
https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers. We can control the GPIO pins with python.
For using the python, you should install libusb and Pyusb library on your Mac machine, please refer to the following code to write a Python script to control the CP210x GPIO.
You can learn more through this video from Lady Ada.
https://www.youtube.com/watch?v=xH_y05pIDTo
The python script is also suitable for other OS including Window and Linux.
CP2102N: "Advanced Serial Configuration" options
The CP2102N has some additional configuration options that are not available on other CP210x devices. These are displayed in the [Advanced Serial Configuration] tab in Xpress Configurator.
These settings are Windows only and application specific. These settings apply to the SERIAL_COMMPROP structure described here: https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/ntddser/ns-ntddser-_serial_commprop
The [Allowed Baudrates] options set the SettableBaud element in this structure, while the [Maximum Baudrate] sets the MaxBaud element in the structure.
The SERIAL_COMMPROP structure describes the capabilities and properties of the serial port, and is returned by the IOCTL_SERIAL_GET_PROPERTIES request, described here: https://docs.microsoft.com/en-us/windows-hardware/drivers/ddi/content/ntddser/ni-ntddser-ioctl_serial_get_properties
These settings for this SERIAL_COMMPROP structure have no direct impact on the device's behavior. For example, if the [Maximum Baudrate] is set as 300, an application can still request a higher baudrate, and the CP2102N will happily oblige. It's then up to the application to read the SERIAL_COMMPROP structure and then prevent the user from requesting baudrates that are set to be not supported.
What does "cp210x ttyUSB1: failed set request 0x07 status: -32" mean?
Question
Using CP210x in Linux embedded platform, when host sends requests to CP210x, it returns below error:
"cp210x ttyUSB1: failed set request 0x7 status: -32"
How to interpret the error message?
Answer
Table 6 Interface Commands in AN571 lists all API commands that CP210x device supports. Viewing from this Table, request of 0x7 represents SET_MHS command, which is used to set modem handshaking (DTR and RTS lines) states.
The negative error is returned by the underlying call to usb_control_msg() from the cp210x.c driver.
If this function is not successful, a negative error number is returned.
Looking at Linux USB Error Codes and errno-base.h, we can see that 32 is EPIPE, endpoint stalled.
How does CP210x handle the SET_MHS request from host?
For CP210x SET_MHS (0x07) command, as AN571 stated, the DTR and RTS values can be set only if the current handshaking state of the interface allows direct control of the modem control lines.
When the device receives the SET_MHS command intending to change the state of DTR or RTS pin, CP210x device will then check current Flow Control setting in the device base on the SET_FLOW() from host, and then make a different response.
If the hardware Flow Control is currently enabled, it means the handshaking lines have been managed by the CP210x device itself rather than host, the device will not response the current SET_MHS request, and a STALL would be returned.