// 2004.05.28, 2004.10.20, 2005.01.08, 2005.03.25, 2005.04.28, 2005.07.18, 2005.07.28, 2005.09.19, 2007.12.19, 2008.10.15, 2022.5 //**************************************** //** Copyright (C) WCH 1999-2022 ** //** Web: http://www.winchiphead.com ** //**************************************** //** DLL for USB interface chip CH341 ** //** C, VC5.0 ** //**************************************** // // USB interface chip CH341 parallel application interface lib V2.2 // Nanjing Qinheng Microelectronics Co., Ltd. Author: W.ch 2008.10 // CH341-DLL V2.2 // Runtime environment: Windows 98/ME, Windows 2000/XP/7/10/11 // support USB chip: CH341, CH341A, CH347 SPI/I2C // USB => Parallel, I2C, SPI, ... // #ifndef _CH341_DLL_H #define _CH341_DLL_H #ifdef __cplusplus extern "C" { #endif #ifdef _WIN64 #define mOFFSET( s, m ) ( (ULONG_PTR) & ( ( ( s * ) 0 ) -> m ) ) // Defines a macro that gets the relative offset address of a structure member #else #define mOFFSET( s, m ) ( (ULONG) & ( ( ( s * ) 0 ) -> m ) ) // Defines a macro that gets the relative offset address of a structure member #endif #ifndef max #define max( a, b ) ( ( ( a ) > ( b ) ) ? ( a ) : ( b ) ) // Larger value #endif #ifndef min #define min( a, b ) ( ( ( a ) < ( b ) ) ? ( a ) : ( b ) ) // Smaller values #endif #ifdef ExAllocatePool #undef ExAllocatePool // Delete a memory allocation with TAG #endif #ifndef NTSTATUS typedef LONG NTSTATUS; // Return status #endif typedef struct _USB_SETUP_PKT { // USB control transmission of the establishment phase of the data request packet structure UCHAR mUspReqType; // 00H Request type UCHAR mUspRequest; // 01H Request code union { struct { UCHAR mUspValueLow; // 02H Value parameter low bytes UCHAR mUspValueHigh; // 03H Value parameter high bytes }; USHORT mUspValue; // 02H-03H Value parameter }; union { struct { UCHAR mUspIndexLow; // 04H Index parameter low bytes UCHAR mUspIndexHigh; // 05H Index parameter high bytes }; USHORT mUspIndex; // 04H-05H Index parameter }; USHORT mLength; // 06H-07H Data length of the data phase } mUSB_SETUP_PKT, *mPUSB_SETUP_PKT; #define mCH341_PACKET_LENGTH 32 // Length of data packets supported by CH341 #define mCH341_PKT_LEN_SHORT 8 // Length of short packets supported by CH341 typedef struct _WIN32_COMMAND { // Define WIN32 command interface structure union { ULONG mFunction; // Specify the function code or pipe number when entering NTSTATUS mStatus; // Returns operation status on output }; ULONG mLength; // Access length, returns the length of subsequent data union { mUSB_SETUP_PKT mSetupPkt; // USB controls the transmission of data requests during the setup phase UCHAR mBuffer[ 512]; // Data buffer, 0 to 255B in length }; } mWIN32_COMMAND, *mPWIN32_COMMAND; // WIN32 application layer interface command #define IOCTL_CH341_COMMAND ( FILE_DEVICE_UNKNOWN << 16 | FILE_ANY_ACCESS << 14 | 0x0f34 << 2 | METHOD_BUFFERED ) // Special interface #define mWIN32_COMMAND_HEAD mOFFSET( mWIN32_COMMAND, mBuffer ) // WIN32 command interface header length #define mCH341_MAX_NUMBER 16 // Maximum number of CH341 connected at the same time #define mMAX_BUFFER_LENGTH 0x1000 // Maximum length of the data buffer is 4096 #define mMAX_COMMAND_LENGTH ( mWIN32_COMMAND_HEAD + mMAX_BUFFER_LENGTH ) // Maximum data length plus the length of the command structure header #define mDEFAULT_BUFFER_LEN 0x0400 // Default length of the data buffer is 1024 #define mDEFAULT_COMMAND_LEN ( mWIN32_COMMAND_HEAD + mDEFAULT_BUFFER_LEN ) // Default data length plus the length of the command structure header // CH341 endpoint address #define mCH341_ENDP_INTER_UP 0x81 // Address of the interrupt data upload endpoint of CH341 #define mCH341_ENDP_INTER_DOWN 0x01 // Address of the interrupt data download endpoint of CH341 #define mCH341_ENDP_DATA_UP 0x82 // Address of the data block upload endpoint of CH341 #define mCH341_ENDP_DATA_DOWN 0x02 // IP address of the data block download endpoint of the CH341 // Operation command of pipes provided by device layer interfaces #define mPipeDeviceCtrl 0x00000004 // Integrated control piping for CH341 #define mPipeInterUp 0x00000005 // Interrupt data upload pipeline for CH341 #define mPipeDataUp 0x00000006 // CH341 data block upload pipeline #define mPipeDataDown 0x00000007 // CH341 data block dowload pipeline // Function code of the application interface #define mFuncNoOperation 0x00000000 // No operation #define mFuncGetVersion 0x00000001 // Gets the driver version number #define mFuncGetConfig 0x00000002 // Gets the USB device configuration descriptor #define mFuncSetTimeout 0x00000009 // Set USB communication timeout #define mFuncSetExclusive 0x0000000b // Set exclusive use #define mFuncResetDevice 0x0000000c // Reset USB device #define mFuncResetPipe 0x0000000d // Reset USB pipe #define mFuncAbortPipe 0x0000000e // Cancels data requests for USB pipes //Function code of CH341 parallel port dedicated #define mFuncSetParaMode 0x0000000f // Set parallel port mode #define mFuncReadData0 0x00000010 // Read block 0 from parallel port #define mFuncReadData1 0x00000011 // Read block 1 from parallel port #define mFuncWriteData0 0x00000012 // Write data block 0 to parallel port #define mFuncWriteData1 0x00000013 // Write data block 1 to parallel port #define mFuncWriteRead 0x00000014 // Output before input #define mFuncBufferMode 0x00000020 // Set buffered upload mode and query the length of data in the buffer #define mFuncBufferModeDn 0x00000021 // Set buffered download mode and query the length of data in the buffer #define mFuncGetVersionEx 0x00000022 // Get driver version number and chip model // USB device standard request code #define mUSB_CLR_FEATURE 0x01 #define mUSB_SET_FEATURE 0x03 #define mUSB_GET_STATUS 0x00 #define mUSB_SET_ADDRESS 0x05 #define mUSB_GET_DESCR 0x06 #define mUSB_SET_DESCR 0x07 #define mUSB_GET_CONFIG 0x08 #define mUSB_SET_CONFIG 0x09 #define mUSB_GET_INTERF 0x0a #define mUSB_SET_INTERF 0x0b #define mUSB_SYNC_FRAME 0x0c // Vendor-specific request type of CH341 control transmission #define mCH341_VENDOR_READ 0xC0 // CH341 Vendor-specific read operations which achieved by control transmission #define mCH341_VENDOR_WRITE 0x40 // CH341 Vendor-specific write operations which achieved by control transmission // Vendor-specific request code of CH341 control transmission #define mCH341_PARA_INIT 0xB1 // Initialize parallel port #define mCH341_I2C_STATUS 0x52 // Get status of the I2C interface #define mCH341_I2C_COMMAND 0x53 // Sends I2C interface command // CH341 Parallel port operation command code #define mCH341_PARA_CMD_R0 0xAC // Read data 0 from parallel port, subbyte length #define mCH341_PARA_CMD_R1 0xAD // Read data from parallel port 1, subbyte length #define mCH341_PARA_CMD_W0 0xA6 // Writes data 0 to parallel port, starting with the next byte as a data stream #define mCH341_PARA_CMD_W1 0xA7 // Writes data 1 to parallel port, starting with the next byte as a data stream #define mCH341_PARA_CMD_STS 0xA0 // Gets parallel port status // CH341A Parallel port operation command code #define mCH341A_CMD_SET_OUTPUT 0xA1 // Set parallel output #define mCH341A_CMD_IO_ADDR 0xA2 // MEM address read&write/ input&output, starting with the next byte as a command stream #define mCH341A_CMD_PRINT_OUT 0xA3 // Compatible PRINT print output, starting with the next byte as a code stream #define mCH341A_CMD_PWM_OUT 0xA4 // PWM command package for data output, starting with the next byte as a code stream #define mCH341A_CMD_SHORT_PKT 0xA5 // Short packet, the next byte is the actual length of the command packet, the next after next byte and the bytes after that are the original command packet #define mCH341A_CMD_SPI_STREAM 0xA8 // SPI interface command package, starting with the next byte as data stream //#define mCH341A_CMD_SIO_STREAM 0xA9 // SIO interface command package, starting with the next byte as data stream #define mCH341A_CMD_I2C_STREAM 0xAA // I2C interface command package ,I2C command stream starting from subbyte #define mCH341A_CMD_UIO_STREAM 0xAB // The command packet of the UIO interface, starting from the next byte is the command stream #define mCH341A_CMD_PIO_STREAM 0xAE // The command packet of the PIO interface, starting from the second byte is the data stream // Vendor-specific request code of CH341 control transmission #define mCH341A_BUF_CLEAR 0xB2 // Clear unfinished data #define mCH341A_I2C_CMD_X 0x54 // Issue the command of the I2C interface and execute it immediately #define mCH341A_DELAY_MS 0x5E // Delay the specified time in milliseconds #define mCH341A_GET_VER 0x5F // Get the chip version #define mCH341_EPP_IO_MAX ( mCH341_PACKET_LENGTH - 1 ) // The maximum length of a single read and write data block of CH341 in EPP/MEM mode #define mCH341A_EPP_IO_MAX 0xFF // The maximum length of a single read and write data block for CH341A in EPP/MEM mode #define mCH341A_CMD_IO_ADDR_W 0x00 // MEM command stream with address read/write/input and output: write data, bit 6-bit 0 is the address, and the next byte is the data to be written #define mCH341A_CMD_IO_ADDR_R 0x80 // MEM command stream with address read/write/input and output: read data, bit 6-bit 0 is the address, read data and return together #define mCH341A_CMD_I2C_STM_STA 0x74 // Command flow of I2C interface: generate start bit #define mCH341A_CMD_I2C_STM_STO 0x75 // Command flow of I2C interface: generate stop bit #define mCH341A_CMD_I2C_STM_OUT 0x80 // Command flow of I2C interface: output data, bit 5-bit 0 is the length, the subsequent bytes are data, and only one byte is sent with a length of 0 and a response is returned #define mCH341A_CMD_I2C_STM_IN 0xC0 // Command flow of I2C interface: input data, bit 5-bit 0 is the length, 0 length means only one byte is received and no response is sent #define mCH341A_CMD_I2C_STM_MAX ( min( 0x3F, mCH341_PACKET_LENGTH ) ) // The maximum length of the input and output data of a single command in the command stream of the I2C interface #define mCH341A_CMD_I2C_STM_SET 0x60 // Command flow of I2C interface: set parameters, bit 2=SPI I/O number (0=single input and single output, 1=double input and double output), bit 1 bit 0=I2C speed (00=low speed, 01=standard, 10=fast, 11=high speed) #define mCH341A_CMD_I2C_STM_US 0x40 // Command flow of I2C interface: delay in microseconds, bit 3-bit 0 is the delay value #define mCH341A_CMD_I2C_STM_MS 0x50 // Command flow of I2C interface: delay in milliseconds, bit 3-bit 0 is the delay value #define mCH341A_CMD_I2C_STM_DLY 0x0F // The maximum value of the single command delay of the command stream of the I2C interface #define mCH341A_CMD_I2C_STM_END 0x00 // Command flow of I2C interface: command packet ends prematurely #define mCH341A_CMD_UIO_STM_IN 0x00 // Command flow of UIO interface: input data D7-D0 #define mCH341A_CMD_UIO_STM_DIR 0x40 // Command flow of UIO interface: set I/O direction D5-D0, bit 5-bit 0 is the direction data #define mCH341A_CMD_UIO_STM_OUT 0x80 // Command flow of UIO interface: output data D5-D0, bit 5-bit 0 is data #define mCH341A_CMD_UIO_STM_US 0xC0 // Command flow of UIO interface: delay in microseconds, bit 5-bit 0 is the delay value #define mCH341A_CMD_UIO_STM_END 0x20 // Command flow of UIO interface: command packet ends prematurely // CH341 parallen port work model #define mCH341_PARA_MODE_EPP 0x00 // CH341 parallel port working mode is EPP mode #define mCH341_PARA_MODE_EPP17 0x00 // CH341A parallel port working mode is EPP mode V1.7 #define mCH341_PARA_MODE_EPP19 0x01 // CH341A parallel port working mode is EPP mode V1.9 #define mCH341_PARA_MODE_MEM 0x02 // CH341 parallel port working mode is MEM mode #define mCH341_PARA_MODE_ECP 0x03 // CH341A parallel port working mode is ECP mode // I/O direction setting bit definition, direct input status signal bit definition, direct output bit data definition #define mStateBitERR 0x00000100 // Read-only and writable, ERR# pin input status, 1: high level, 0: low level #define mStateBitPEMP 0x00000200 // Read-only and writable, PEMP pin input state, 1: high level, 0: low level #define mStateBitINT 0x00000400 // Read-only and writable, INT# pin input status, 1: high level, 0: low level #define mStateBitSLCT 0x00000800 // Read-only and writable, SLCT pin input status, 1: high level, 0: low level #define mStateBitWAIT 0x00002000 // Read-only and writable, WAIT# pin input status, 1: high level, 0: low level #define mStateBitDATAS 0x00004000 // Only write and read, DATAS#/READ# pin input status, 1: high level, 0: low level #define mStateBitADDRS 0x00008000 // Write only read, ADDRS#/ADDR/ALE pin input status, 1: high level, 0: low level #define mStateBitRESET 0x00010000 // Write only, RESET# pin input status, 1: high level, 0: low level #define mStateBitWRITE 0x00020000 // Write only, WRITE# pin input status, 1: high level, 0: low level #define mStateBitSCL 0x00400000 // Read only, SCL pin input status, 1: high level, 0: low level #define mStateBitSDA 0x00800000 // Read only, SDA pin input status, 1: high level, 0: low level #define MAX_DEVICE_PATH_SIZE 128 // Maximum number of characters for device name #define MAX_DEVICE_ID_SIZE 64 // Maximum number of characters for device ID typedef VOID ( CALLBACK * mPCH341_INT_ROUTINE ) ( // interrupt service routine ULONG iStatus ); // Interrupt status data, refer to the following bit description // Bit 7-bit 0 correspond to D7-D0 pins of CH341 // Bit 8 corresponds to ERR# pin of CH341, Bit 9 corresponds to PEMP pin of CH341, Bit 10 corresponds to INT# pin of CH341, Bit 11 corresponds to SLCT pin of CH341 HANDLE WINAPI CH341OpenDevice( // Open the CH341 device, return the handle, if an error occurs, it will be invalid ULONG iIndex ); // Specify the device serial number of CH341, 0 corresponds to the first device VOID WINAPI CH341CloseDevice( // Close the CH341 device ULONG iIndex ); // Specify the serial number of the CH341 device ULONG WINAPI CH341GetVersion( ); // Get the DLL version number, return the version number ULONG WINAPI CH341DriverCommand( // Directly pass the command to the driver, return 0 if there is an error, otherwise return the data length ULONG iIndex, // Specify the serial number of the CH341 device, the DLL above V1.6 can also be the handle after the device is opened mPWIN32_COMMAND ioCommand ); // pointer to command structure // The program returns the data length after the call, and still returns the command structure, if it is a read operation, the data is returned in the command structure, // The returned data length is 0 when the operation fails, and the length of the entire command structure when the operation is successful. For example, if one byte is read, mWIN32_COMMAND_HEAD+1 is returned. // Before the command structure is called, provide: pipe number or command function code, length of access data (optional), data (optional) // After the command structure is called, it returns: the operation status code, the length of the subsequent data (optional), // The operation status code is the code defined by WINDOWS, you can refer to NTSTATUS.H, // The length of the subsequent data refers to the length of the data returned by the read operation. The data is stored in the subsequent buffer, and is generally 0 for the write operation. ULONG WINAPI CH341GetDrvVersion( ); // Get the driver version number, return the version number, or return 0 if there is an error BOOL WINAPI CH341ResetDevice( // Reset USB device ULONG iIndex ); // Specify the serial number of the CH341 device BOOL WINAPI CH341GetDeviceDescr( // Read device descriptor ULONG iIndex, // Specify the serial number of the CH341 device PVOID oBuffer, // Points to a buffer large enough to hold the descriptor PULONG ioLength ); // Points to the length unit, the length to be read when input is the length to be read, and the actual read length after return BOOL WINAPI CH341GetConfigDescr( // Read configuration descriptor ULONG iIndex, // Specify the serial number of the CH341 device PVOID oBuffer, // Points to a buffer large enough to hold the descriptor PULONG ioLength ); // Points to the length unit, the length to be read when input is the length to be read, and the actual read length after return BOOL WINAPI CH341SetIntRoutine( // Set interrupt service routine ULONG iIndex, // Specify the serial number of the CH341 device mPCH341_INT_ROUTINE iIntRoutine ); // Specify the interrupt service routine, if it is NULL, the interrupt service will be cancelled, otherwise the routine will be called when interrupted BOOL WINAPI CH341ReadInter( // Read interrupt data ULONG iIndex, // Specify the serial number of the CH341 device PULONG iStatus ); // Points to a double word location used to store the read interrupt status data, see below // Bit 7-bit 0 correspond to D7-D0 pins of CH341 // Bit 8 corresponds to err# pin of CH341, bit 9 corresponds to PEMP pin of CH341, bit 10 corresponds to int# pin of CH341, and bit 11 corresponds to SLCT pin of CH341 BOOL WINAPI CH341AbortInter( // Abort interrupt data read operation ULONG iIndex ); // Specify the serial number of the CH341 device BOOL WINAPI CH341SetParaMode( // Set parallel port mode ULONG iIndex, // Specify the serial number of the CH341 device ULONG iMode ); // Specify parallel port mode: 0 is EPP mode/EPP mode V1.7, 1 is EPP mode V1.9, 2 is MEM mode BOOL WINAPI CH341InitParallel( // Reset and initialize the parallel port, RST# outputs a low-level pulse ULONG iIndex, // Specify the serial number of the CH341 device ULONG iMode ); // Specify parallel port mode: 0 is EPP mode/EPP mode V1.7, 1 is EPP mode V1.9, 2 is MEM mode, >= 0x00000100 keep current mode BOOL WINAPI CH341ReadData0( // Read data block from 0# port ULONG iIndex, // Specify the serial number of the CH341 device PVOID oBuffer, // Points to a buffer large enough to hold the read data PULONG ioLength ); // Points to the length unit, the length to be read when input is the length to be read, and the actual read length after return BOOL WINAPI CH341ReadData1( // Read data block from port 1# ULONG iIndex, // Specify the serial number of the CH341 device PVOID oBuffer, // Points to a buffer large enough to hold the read data PULONG ioLength ); // Points to the length unit, the length to be read when input is the length to be read, and the actual read length after return BOOL WINAPI CH341AbortRead( // Abort data block read operation ULONG iIndex ); // Specify the serial number of the CH341 device BOOL WINAPI CH341WriteData0( // Write data block to port 0# ULONG iIndex, // Specify the serial number of the CH341 device PVOID iBuffer, // Pointer to a buffer where the data to be written is placed PULONG ioLength ); // Points to the length unit, the length to be written out when input is the length to be written out, and the length actually written out after return BOOL WINAPI CH341WriteData1( // Write data block to port 1# ULONG iIndex, // Specify the serial number of the CH341 device PVOID iBuffer, // Pointer to a buffer where the data to be written is placed PULONG ioLength ); // Points to the length unit, the length to be written out when input is the length to be written out, and the length actually written out after return BOOL WINAPI CH341AbortWrite( // Abort block write operation ULONG iIndex ); // Specify the serial number of the CH341 device BOOL WINAPI CH341GetStatus( // Input data and status directly through CH341 ULONG iIndex, // Specify the serial number of the CH341 device PULONG iStatus ); // Points to a double word unit, used to save status data, refer to the following bit description // Bit 7-bit 0 correspond to D7-D0 pins of CH341 // Bit 8 corresponds to ERR# pin of CH341, Bit 9 corresponds to PEMP pin of CH341, Bit 10 corresponds to INT# pin of CH341, Bit 11 corresponds to SLCT pin of CH341, Bit 23 corresponds to SDA pin of CH341 // Bit 13 corresponds to BUSY/WAIT# pin of CH341, Bit 14 corresponds to AUTOFD#/DATAS# pin of CH341, Bit 15 corresponds to SLCTIN#/ADDRS# pin of CH341 BOOL WINAPI CH341ReadI2C( // Read one byte of data from the I2C interface ULONG iIndex, // Specify the serial number of the CH341 device UCHAR iDevice, // The lower 7 bits specify the I2C device address UCHAR iAddr, // Address of specified data unit PUCHAR oByte ); // Address of specified data unit BOOL WINAPI CH341WriteI2C( // Write a byte of data to the I2C interface ULONG iIndex, // Specify the serial number of the CH341 device UCHAR iDevice, // The lower 7 bits specify the I2C device address UCHAR iAddr, // Address of specified data unit UCHAR iByte ); // Byte data to be written BOOL WINAPI CH341EppReadData( // Byte data to be written ULONG iIndex, // Specify the serial number of the CH341 device PVOID oBuffer, // Points to a buffer large enough to hold the read data PULONG ioLength ); // Points to a buffer large enough to hold the read data BOOL WINAPI CH341EppReadAddr( // Read address in EPP mode: WR#=1, DS#=1, AS#=0, D0-D7=input ULONG iIndex, // Specify the serial number of the CH341 device PVOID oBuffer, // Point to a buffer large enough to hold the read address data PULONG ioLength ); // Points to the length unit, the length to be read when input is the length to be read, and the actual read length after return BOOL WINAPI CH341EppWriteData( // Write data in EPP mode: WR#=0, DS#=0, AS#=1, D0-D7=output ULONG iIndex, // Specify the serial number of the CH341 device PVOID iBuffer, // Pointer to a buffer where the data to be written is placed PULONG ioLength ); // Points to the length unit, the length to be written out when input is the length to be written out, and the length actually written out after return BOOL WINAPI CH341EppWriteAddr( // Write address in EPP mode: WR#=0, DS#=1, AS#=0, D0-D7=output ULONG iIndex, // Specify the serial number of the CH341 device PVOID iBuffer, // Point to a buffer to place the address data to be written out PULONG ioLength ); // Points to the length unit, the length to be written out when input is the length to be written out, and the length actually written out after return BOOL WINAPI CH341EppSetAddr( // EPP mode setting address: WR#=0, DS#=1, AS#=0, D0-D7=output ULONG iIndex, // Specify the serial number of the CH341 device UCHAR iAddr ); // Specify the EPP address BOOL WINAPI CH341MemReadAddr0( // Read the address in MEM mode 0: WR#=1, DS#/RD#=0, AS#/ADDR=0, D0-D7=input ULONG iIndex, // Specify the CH341 device number PVOID oBuffer, // Points to a buffer large enough to hold the data read from address 0 PULONG ioLength ); // Refers to the length unit, input is the length to read, return is the actual length to read BOOL WINAPI CH341MemReadAddr1( // Read the address in MEM mode 1: WR#=1, DS#/RD#=0, AS#/ADDR=1, D0-D7=input ULONG iIndex, // Specify the CH341 device number PVOID oBuffer, // Points to a buffer large enough to hold the data read from address 1 PULONG ioLength ); // Refers to the length unit, input is the length to read, return is the actual length to read BOOL WINAPI CH341MemWriteAddr0( // Write the address in MEM mode 0: WR#=0, DS#/RD#=1, AS#/ADDR=0, D0-D7=output ULONG iIndex, // Specify the CH341 device number PVOID iBuffer, // Points to a buffer to place the data to be written to address 0 PULONG ioLength ); // Refers to the length unit. The input is the intended length and the return is the actual length BOOL WINAPI CH341MemWriteAddr1( // Write the address in MEM mode 1: WR#=0, DS#/RD#=1, AS#/ADDR=1, D0-D7=output ULONG iIndex, // Specify the CH341 device number PVOID iBuffer, // Points to a buffer to place the data to be written to address 1 PULONG ioLength ); // Refers to the length unit. The input is the intended length and the return is the actual length BOOL WINAPI CH341SetExclusive( // Set exclusive use of the current CH341 device ULONG iIndex, // Specify the CH341 device number ULONG iExclusive ); // If the value is 0, the device can be shared. If the value is not 0, the device can be exclusively used BOOL WINAPI CH341SetTimeout( // Set the timeout of USB data read and write ULONG iIndex, // Specify the CH341 device number ULONG iWriteTimeout, // Specifies the timeout for USB to write data blocks, in milliseconds mS, 0xFFFFFFFF specifies no timeout (default) ULONG iReadTimeout ); // Specifies the timeout for USB to read data blocks, in milliseconds mS, 0xFFFFFFFF specifies no timeout (default) BOOL WINAPI CH341ReadData( // Read data block ULONG iIndex, // Specify the CH341 device number PVOID oBuffer, // Points to a buffer large enough to hold the read data PULONG ioLength ); // Refers to the length unit, input is the length to read, return is the actual length to read BOOL WINAPI CH341WriteData( // Write out blocks of data ULONG iIndex, // Specify the CH341 device number PVOID iBuffer, // Points to a buffer to place data ready to be written out PULONG ioLength ); // Refers to the length unit. The input is the intended length and the return is the actual length PVOID WINAPI CH341GetDeviceName( // Returns a buffer pointing to the CH341 device name, or NULL on error ULONG iIndex ); // Specify the CH341 device number,0 corresponds to the first device ULONG WINAPI CH341GetVerIC( // 0= device invalid,0x10=CH341,0x20=CH341A ULONG iIndex ); // Specify the CH341 device number #define IC_VER_CH341A 0x20 #define IC_VER_CH341A3 0x30 BOOL WINAPI CH341FlushBuffer( // Clear the buffer of CH341 ULONG iIndex ); // Specify the CH341 device number BOOL WINAPI CH341WriteRead( // Execute the data flow command, output before input ULONG iIndex, // Specify the CH341 device number ULONG iWriteLength, // Write the length, the length you're going to write PVOID iWriteBuffer, // Points to a buffer to place data ready to be written out ULONG iReadStep, // The length of a single block to be read. The total length to be read is(iReadStep*iReadTimes) ULONG iReadTimes, // Number of times you are ready to read PULONG oReadLength, // Points to the length unit and returns the length actually read PVOID oReadBuffer ); // Points to a buffer large enough to hold the read data BOOL WINAPI CH341SetStream( // Set the serial port flow mode ULONG iIndex, // Specify the CH341 device number ULONG iMode ); // To specify the mode, see Downlink // Bit 1-bit 0: I2C interface speed /SCL frequency, 00= low speed /20KHz,01= standard /100KHz(default),10= fast /400KHz,11= high speed /750KHz // Bit 2: SPI I/O number /IO pins, 0= single in/single out (D3 clock /D5 out /D7 in)(default),1= double in/double out (D3 clock /D5 out D4 out /D7 in D6 in) // Bit 7: Bit order in SPI bytes, 0= low first, 1= high first // All other reservations must be 0 BOOL WINAPI CH341SetDelaymS( // Set the hardware asynchronous delay to a specified number of milliseconds before the next stream operation ULONG iIndex, // Specify the CH341 device number ULONG iDelay ); // Specifies the number of milliseconds to delay BOOL WINAPI CH341StreamI2C( // Process I2C data stream, 2-wire interface, clock line for SCL pin, data line for SDA pin (quasi-bidirectional I/O), speed of about 56K bytes ULONG iIndex, // Specify the CH341 device number ULONG iWriteLength, // Number of bytes of data to write out PVOID iWriteBuffer, // Points to a buffer to place data to be written, usually with the I2C device address and read/write direction bits as the first byte ULONG iReadLength, // Number of bytes of data to be read PVOID oReadBuffer ); // Points to a buffer and returns the data read in typedef enum _EEPROM_TYPE { // EEPROM type ID_24C01, ID_24C02, ID_24C04, ID_24C08, ID_24C16, ID_24C32, ID_24C64, ID_24C128, ID_24C256, ID_24C512, ID_24C1024, ID_24C2048, ID_24C4096 } EEPROM_TYPE; BOOL WINAPI CH341ReadEEPROM( // Reads data blocks from EEPROM at a speed of about 56 KB ULONG iIndex, // Specify the CH341 device number EEPROM_TYPE iEepromID, // Specifies the EEPROM model ULONG iAddr, // Specifies the address of the data unit ULONG iLength, // Number of bytes of data to be read PUCHAR oBuffer ); // Points to a buffer and returns the data read in BOOL WINAPI CH341WriteEEPROM( // Writes a data block to the EEPROM ULONG iIndex, // Specify the CH341 device number EEPROM_TYPE iEepromID, // Specifies the EEPROM model ULONG iAddr, // Specifies the address of the data unit ULONG iLength, // Number of bytes of data to write out PUCHAR iBuffer ); // Points to a buffer to place data ready to be written out BOOL WINAPI CH341GetInput( // Using the CH341 to directly enter data and status is more efficient than using the CH341GetStatus function ULONG iIndex, // Specify the CH341 device number PULONG iStatus ); // Points to a two-word unit that holds state data, as described in the bit description below // Bits 7-0 correspond to the D7-D0 pins of CH341 // Bit 8 corresponds to the ERR# pin of CH341, bit 9 to the PEMP pin of CH341, bit 10 to the INT# pin of CH341, bit 11 to the SLCT pin of CH341, and bit 23 to the SDA pin of CH341 // Bit 13 corresponds to the BUSY/WAIT# pin of CH341, bit 14 corresponds to the AUTOFD#/ data # pin of CH341, and bit 15 corresponds to the SLCTIN#/ADDRS# pin of CH341 BOOL WINAPI CH341SetOutput( // Set the I/O direction for the CH341 and output data over the CH341 /* ***** Use this API with care to prevent damage to the chip by changing the I/O direction to change the input pin to the output pin, resulting in short circuits with other output pins ***** */ ULONG iIndex, // Specify the CH341 device number ULONG iEnable, // Data valid flag, refer to the bit description below // If bit 0 is 1, bits 15 to 8 of iSetDataOut are valid. Otherwise, it is ignored // If bit 1 is 1, bits 15 to 8 of iSetDirOut are valid. Otherwise, the value is ignored // If bit 2 is 1, the 7-bit 0 of iSetDataOut is valid. Otherwise, it is ignored // If bit 3 is 1, the iSetDirOut bit 7 to bit 0 is valid. Otherwise, the iSetDirOut bit is ignored // If bit 4 is 1, bits 23 to 16 of iSetDataOut are valid. Otherwise, it is ignored ULONG iSetDirOut, // To set the I/O direction, pin 0 corresponds to input and pin 1 corresponds to output. In parallel port mode, the default value is 0x000FC000. Refer to the bit description below ULONG iSetDataOut ); // Output data. If the I/O direction is output, then a clear 0 corresponds to pin output low level, and a position 1 corresponds to pin output high level, refer to the bit description below // Bits 7-0 correspond to the D7-D0 pins of CH341 // Bit 8 corresponds to the ERR# pin of CH341, bit 9 to the PEMP pin of CH341, bit 10 to the INT# pin of CH341, and bit 11 to the SLCT pin of CH341 // Bit 13 corresponds to the WAIT# pin of CH341, bit 14 to the DATAS#/READ# pin of CH341, and bit 15 to the ADDRS#/ADDR/ALE pin of CH341 // The following pins can only be output, irrespective of the I/O direction: bit 16 corresponds to set # for CH341, bit 17 corresponds to WRITE# for CH341, bit 18 corresponds to SCL for CH341, and bit 29 corresponds to SDA for CH341 BOOL WINAPI CH341Set_D5_D0( // Set the I/O direction of D5-D0 pins of CH341, and directly output data through THE D5-D0 pins of CH341. The efficiency is higher than that of CH341SetOutput /* ***** Use this API with care to prevent damage to the chip by changing the I/O direction to change the input pin to the output pin, resulting in short circuits with other output pins ***** */ ULONG iIndex, // Specify the CH341 device number ULONG iSetDirOut, // Set the I/O direction of each pin d5-D0. Pin 0 corresponds to input, pin 1 corresponds to output. In parallel port mode, the default value is 0x00 for all input ULONG iSetDataOut ); // Set the output data of each pin of D5-D0. If the I/O direction is output, then a clear 0 corresponds to pin output low level, and a position 1 corresponds to pin output high level // Bits 5-0 of the above data correspond to the D5-D0 pins of CH341 respectively BOOL WINAPI CH341StreamSPI3( // This API is invalid. Do not use it ULONG iIndex, ULONG iChipSelect, ULONG iLength, PVOID ioBuffer ); BOOL WINAPI CH341StreamSPI4( // SPI data stream processing, 4-line interface, clock line is DCK/D3 pin, output data line is DOUT/D5 pin, input data line is DIN/D7 pin, chip line is D0/D1/D2, speed is about 68K bytes /* SPI timing: DCK/D3 pin is clock output, default low level, DOUT/D5 pin is output during low level before clock rising edge, DIN/D7 pin is input during high level before clock falling edge */ ULONG iIndex, // Specify the CH341 device number ULONG iChipSelect, // Chip selection control. If bit 7 is 0, chip selection control is ignored. If bit 7 is 1, the parameter is effective: if bit 1 is 00/01/10, D0/D1/D2 pins are selected as low level effective chip selection respectively ULONG iLength, // Number of bytes of data to be transferred PVOID ioBuffer ); // Points to a buffer, places data to be written out from DOUT, and returns data to be read in from DIN BOOL WINAPI CH341StreamSPI5( // SPI data stream processing, 5-line interface, clock line is DCK/D3 pin, output data line is DOUT/D5 and DOUT2/D4 pin, input data line is DIN/D7 and DIN2/D6 pin, chip line is D0/D1/D2, speed is about 30K bytes *2 /* SPI timing: DCK/D3 pins are clock outputs and are low by default, DOUT/D5 and DOUT2/D4 pins are output during the low period before the rising edge of the clock, and DIN/D7 and DIN2/D6 pins are input during the high period before the falling edge of the clock */ ULONG iIndex, // Specify the CH341 device number ULONG iChipSelect, // Chip selection control. If bit 7 is 0, chip selection control is ignored. If bit 7 is 1, the parameter is effective: if bit 1 is 00/01/10, D0/D1/D2 pins are selected as low level effective chip selection respectively ULONG iLength, // Number of bytes of data to be transferred PVOID ioBuffer, // Points to a buffer, places data to be written out from DOUT, and returns data to be read in from DIN PVOID ioBuffer2 ); // Point to the second buffer, place the data to be written from DOUT2, and return the data to be read from DIN2 BOOL WINAPI CH341BitStreamSPI( // SPI bit data flow processing,4 line /5 line interface, clock line for DCK/D3 pin, output data line for DOUT/DOUT2 pin, input data line for DIN/DIN2 pin, chip line for D0/D1/D2, speed about 8K bit *2 ULONG iIndex, // Specify the CH341 device number ULONG iLength, // The number of bits to be transmitted at a time is a maximum of 896. It is recommended that the number not exceed 256 PVOID ioBuffer ); // Point to a buffer, place data to be written from DOUT/DOUT2/ d2-d0, and return data to be read from DIN/DIN2 /* SPI timing: DCK/D3 pins are clock outputs and are low by default, DOUT/D5 and DOUT2/D4 pins are output during the low period before the rising edge of the clock, and DIN/D7 and DIN2/D6 pins are input during the high period before the falling edge of the clock*/ /* One byte of the ioBuffer has 8 bits corresponding to d7-D0 pins. Bit 5 is output to DOUT, bit 4 to DOUT2, bit 2-0 to D2-d0, bit 7 is input from DIN, bit 6 is input from DIN2, bit 3 is ignored */ /* Before calling this API, CH341Set_D5_D0 should be called to set the I/O direction of the D5-D0 pins of CH341 and set the default level of the pins */ BOOL WINAPI CH341SetBufUpload( // Set internal buffered upload mode ULONG iIndex, // Specify the CH341 device number,0 corresponds to the first device ULONG iEnableOrClear ); // If the value is 0, the internal buffered upload mode is disabled and direct upload is used. If the value is not 0, the internal buffered upload mode is enabled and the existing data in the buffer is cleared // If internal buffered-upload mode is enabled, the CH341 driver creation thread automatically receives USB upload data to the internal buffer and clears the existing data in the buffer. The existing data in the buffer will be returned immediately when the application calls CH341ReadData LONG WINAPI CH341QueryBufUpload( // Query the number of existing data packets in the internal upload buffer. The number of data packets is returned successfully, or -1 is returned if an error occurs ULONG iIndex ); // Specify the CH341 device number,0 corresponds to the first device BOOL WINAPI CH341SetBufDownload( // Set the internal buffer down mode ULONG iIndex, // Specify the CH341 device number,0 corresponds to the first device ULONG iEnableOrClear ); // If the value is 0, the internal buffered downtransmission mode is disabled and direct downtransmission is used. If the value is not 0, the internal buffered downtransmission mode is enabled and the existing data in the buffer is cleared // If internal buffer-down mode is enabled, when an application calls CH341WriteData, it simply puts USB downpass data into an internal buffer and returns it immediately, while threads created by the CH341 driver automatically send it to completion LONG WINAPI CH341QueryBufDownload( // Query the number of remaining packets in the internal downtransmission buffer (that have not been sent). The number of successful packets is returned, and -1 is returned if an error occurs ULONG iIndex ); // Specify the CH341 device number,0 corresponds to the first device BOOL WINAPI CH341ResetInter( // Reset an interrupted data read operation ULONG iIndex ); // Specify the CH341 device number BOOL WINAPI CH341ResetRead( // Reset the data block read operation ULONG iIndex ); // Specify the CH341 device number BOOL WINAPI CH341ResetWrite( // Reset a block write operation ULONG iIndex ); // Specify the CH341 device number typedef VOID ( CALLBACK * mPCH341_NOTIFY_ROUTINE ) ( // Device event notification callback program ULONG iEventStatus ); // Device event and current status (defined downstream): 0= device removal event, 3= device insertion event #define CH341_DEVICE_ARRIVAL 3 // Device insertion event, already inserted #define CH341_DEVICE_REMOVE_PEND 1 // Device to be pulled out #define CH341_DEVICE_REMOVE 0 // The device is removed BOOL WINAPI CH341SetDeviceNotify( // Set up the device event notification procedure ULONG iIndex, // Specify the CH341 device number,0 corresponds to the first device PCHAR iDeviceID, // Optional argument pointing to a string specifying the ID of the device to be monitored, terminated with \0 mPCH341_NOTIFY_ROUTINE iNotifyRoutine ); // Specifies a device event callback that cancels event notification if NULL, or is called when an event is detected BOOL WINAPI CH341SetupSerial( // Set the serial port feature of the CH341. This API can only be used for CH341 chips that work in serial port mode ULONG iIndex, // Specify the CH341 device number,0 corresponds to the first device ULONG iParityMode, // Specifies the data verification mode of the CH341 serial port: NOPARITY/ODDPARITY/EVENPARITY/MARKPARITY/SPACEPARITY ULONG iBaudRate ); // Set the baud rate of the CH341 serial port. The value ranges from 50 to 3000000 /* The following apis can be used for CH341 chips that work in serial port mode. Other apis can only be used for CH341 chips that work in parallel port mode CH341OpenDevice CH341CloseDevice CH341SetupSerial CH341ReadData CH341WriteData CH341SetBufUpload CH341QueryBufUpload CH341SetBufDownload CH341QueryBufDownload CH341SetDeviceNotify CH341GetStatus // The above API is the primary API and the following API is the secondary API CH341GetVersion CH341DriverCommand CH341GetDrvVersion CH341ResetDevice CH341GetDeviceDescr CH341GetConfigDescr CH341SetIntRoutine CH341ReadInter CH341AbortInter CH341AbortRead CH341AbortWrite CH341ReadI2C CH341WriteI2C CH341SetExclusive CH341SetTimeout CH341GetDeviceName CH341GetVerIC CH341FlushBuffer CH341WriteRead CH341ResetInter CH341ResetRead CH341ResetWrite */ HANDLE WINAPI CH341OpenDeviceEx( // Turn on the CH341 device and return the handle ULONG iIndex ); // Specify the CH341 device number,0 corresponds to the first device to be inserted, and 1 corresponds to the second device to be inserted. To save device serial number resources, shut down the device after it is used up VOID WINAPI CH341CloseDeviceEx( // Close the CH341 ULONG iIndex ); // Specify the CH341 device number PCHAR WINAPI CH341GetDeviceNameEx( // Returns a buffer pointing to the CH341 device name, or NULL on error ULONG iIndex ); // Specify the CH341 device number,0 corresponds to the first device BOOL WINAPI CH341SetDeviceNotifyEx( // Set up the device event notification procedure ULONG iIndex, // Specify the CH341 device number,0 corresponds to the first device PCHAR iDeviceID, // Optional argument pointing to a string specifying the ID of the device to be monitored, terminated with \0 mPCH341_NOTIFY_ROUTINE iNotifyRoutine ); // Specifies a device event callback that cancels event notification if NULL, or is called when an event is detected #ifdef __cplusplus } #endif #endif // _CH341_DLL_H