首页 > 其他分享 >FT232使用libusb控制GPIO

FT232使用libusb控制GPIO

时间:2024-09-06 12:36:44浏览次数:7  
标签:FT nValue hPortUsb dev libusb FT232 GPIO BITMODE

FT232 使用官方驱动控制GPIO很简单

  1. 打开 FT_OpenEx, FT_SetBitMode(FT_BITMODE_ASYNC_BITBANG)
  2. 写 FT_Write
  3. 读 FT_Read

使用libusb方式

  1. 打开
//	libusb-win32 (v1.2.6.0)
BOOL	CHubGpio::InitLibusb()
{
	struct usb_interface_descriptor *setting;
	struct usb_bus		*bus;
	struct usb_device	*dev;
	usb_dev_handle		*hPortUsb;
	BOOL	bRetVal;
	int		i, nRetVal;
	CHAR	szPdt[256], szMft[256], szSN[256];
	int		nValue, nMask, nMode;

	if(m_hPortUsb)
		return TRUE;

	bRetVal = m_libusb.Init();
	if(bRetVal == FALSE)
		return FALSE;

	m_nIntfId = 0;
	m_nEndPointOut = 0;
	m_nEndPointIn = 0;
	m_libusb.find_busses();
	m_libusb.find_devices();
	for(bus = m_libusb.get_busses();
		bus;
		bus = bus->next
		)
	{
		for(dev = bus->devices;
			dev;
			dev = dev->next)
		{
			hPortUsb = m_libusb.open(dev);
			if(hPortUsb == NULL)
				continue;
			m_libusb.get_string_simple(hPortUsb, dev->descriptor.iManufacturer, szMft, sizeof(szMft));
			m_libusb.get_string_simple(hPortUsb, dev->descriptor.iProduct, szPdt, sizeof(szPdt));
			m_libusb.get_string_simple(hPortUsb, dev->descriptor.iSerialNumber, szSN, sizeof(szSN));

			ATLTRACE("usb_find_devices: %04X-%04X %s %s %s\r\n", dev->descriptor.idVendor, dev->descriptor.idProduct, szMft, szPdt, szSN);
			if(strcmp(szMft, "PTI") != 0)
			{
				m_libusb.close(hPortUsb);
				continue;
			}

			m_hPortUsb = hPortUsb;
			break;
		}
		if(m_hPortUsb)
			break;
	}
	if(m_hPortUsb == NULL || dev == NULL)
		return FALSE;

	if(dev->config == NULL || dev->config->_interface == NULL || dev->config->_interface->altsetting == NULL)
		return FALSE;

	setting = dev->config->_interface->altsetting;
	m_nIntfId = setting->bInterfaceNumber + 1;		//	self._index = self._interface.bInterfaceNumber+1
	m_nEndPointIn = 0;
	m_nEndPointOut = 0;
	for(i=0; i<setting->bNumEndpoints; i++)
	{
		nValue = setting->endpoint[i].bmAttributes;
		nValue = nValue & ENDPOINT_TRANSFER_TYPE_MASK;	//	ENDPOINT_TYPE_BULK

		nValue = setting->endpoint[i].bEndpointAddress;
		if(nValue & ENDPOINT_DIR_MASK)
		{
			m_nEndPointIn = nValue & ENDPOINT_ADDR_MASK;
			m_nEndPointIn = nValue;
		}
		else
		{
			m_nEndPointOut = nValue & ENDPOINT_ADDR_MASK;
			m_nEndPointOut = nValue;
		}
	}

	nMask = 0xff;
	nMode = FT_BITMODE_ASYNC_BITBANG;	//	FT_BITMODE_SYNC_BITBANG
//	nMode = FT_BITMODE_SYNC_BITBANG;	//	FT_BITMODE_SYNC_BITBANG
	nValue = (nMode << 8) | nMask;
	nRetVal = m_libusb.control_msg(m_hPortUsb, USB_TYPE_VENDOR|USB_RECIP_DEVICE|USB_ENDPOINT_OUT, SIO_REQ_SET_BITMODE, nValue, m_nIntfId, NULL, 0, 500);
	nRetVal = m_libusb.claim_interface(m_hPortUsb, 0);

	m_bFind = TRUE;
	m_bTypeFtdi = FALSE;
	return TRUE;
}
  1. 写入 interrupt_write
  2. 读取, 读取实际不是使用read, 而是control_msg
BOOL	CHubGpio::GetIo(BYTE &bValue, BOOL *pTypeFtdi)
{
	FT_STATUS	status;
	DWORD		dwCount;
	int			nRetVal;
	int			nMask, nMode, nValue;

	bValue = 0;
	if(pTypeFtdi)
		*pTypeFtdi = FALSE;

	if(m_hPort232)
	{
		if(pTypeFtdi)
			*pTypeFtdi = TRUE;
		status = m_Lib232.FT_Read(m_hPort232, &bValue, 1, &dwCount);
		if(status == FT_OK)
			return TRUE;

		return FALSE;
	}
	if(m_hPortUsb)
	{
		if(pTypeFtdi)
			*pTypeFtdi = FALSE;

		nMask = 0x00;
		nMode = FT_BITMODE_ASYNC_BITBANG;	//	FT_BITMODE_SYNC_BITBANG
		nValue = (nMode << 8) | nMask;
		nRetVal = m_libusb.control_msg(m_hPortUsb, USB_TYPE_VENDOR|USB_RECIP_DEVICE|USB_ENDPOINT_OUT, SIO_REQ_SET_BITMODE, nValue, m_nIntfId, NULL, 0, 500);

		nRetVal = m_libusb.control_msg(m_hPortUsb, USB_TYPE_VENDOR|USB_ENDPOINT_IN, SIO_REQ_READ_PINS, 0, m_nIntfId, (char *)&bValue, 1, 500);
		if(nRetVal == 1)
			return TRUE;

		return FALSE;
	}
	return FALSE;
}

标签:FT,nValue,hPortUsb,dev,libusb,FT232,GPIO,BITMODE
From: https://www.cnblogs.com/zzz3265/p/18400004

相关文章

  • GPIOMode_TypeDef 学习备注
    学习STM32——当需要用的GPIO引脚的时候往往要进行GPIO初始化,配置GPIO结构体函数。   GPIO初始化:   GPIO_InitTypeDefGPIO_InitStructure;              //定义结构体变量     GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;  ......
  • GPIO
    GPIO:通用型输入输出STC8位单片机的每个引脚都有四种工作模式,分别是工作模式PnM1PnM0说明准双向(弱上拉)00即可输入也可输出,灌电流可达20mA,拉电流为270~150uA推挽输出(强上拉)01可达20mA,要加限流电阻高阻输入10电流既不能流入,也不能流出,但可用于测电平......
  • STM32GPIO操作底层解析
    我们使用HAL和标准库时,常常忽略他两的底层,只知道怎么用不知其原理,其实是大忌,因为底层丢了代码的灵魂就丢了,对以后的Linux开发不利常用的指令函数:voidGPIO_WriteBit(GPIO_TypeDef*GPIOx,uint16_tGPIO_Pin,BitActionBitVal){/*Checktheparameters*/assert_p......
  • STM32 GPIO 寄存器的配置
    32位配置寄存器:GPIOx_CRL,GPIOx_CRH32位数据寄存器:GPIOx_IDR,GPIOx_ODR32位置位/复位寄存器:GPIOx_BSRR16位复位寄存器:GPIOx_BRR32位锁定寄存器:GPIOx_LCKRGPIO寄存器详解CRL和CRH控制IO口,是四个位控制一个口,所以要两个32位的来控制16个口CRL32位端口配置低寄存器(GPIOx_......
  • 零基础国产GD32单片机编程入门(一)GD32单片机GPIO输出Keil5工程创建含源码
    文章目录一.概要二.GD32单片机GPIO内部结构图三.GD32单片机GPIO输入输出信号流向四.GD32单片机GPIO引脚的复用以及重映射五.从零开始创建一个GD32F103C8T6单片机GPIO输出驱动LED灯例程六.工程源代码下载七.小结一.概要GPIO(generalporposeintputoutput):单片机通......
  • nvidia系列教程-AGX-Orin 确定gpio编号
    目录前言一、软件版本说明二、debugfs得到gpio三、gpio操作总结前言        NVIDIAJetsonAGXOrin是一款强大的嵌入式AI计算平台,适用于各种复杂的边缘计算任务。对于开发者来说,准确地控制和操作GPIO(通用输入输出)引脚是非常重要的。本文将详细介绍如......
  • 第6章 GPIO输出-使用固件库控制LED
    第六章GPIO输出—使用固件库控制LED1.硬件设计在开发板上面与LED的连接见图,这是一个RGB灯,里面由红蓝绿三个小灯构成,使用PWM控制时可以混合成256不同的颜色。2.软件设计为了使工程更加有条理和方便迁移,我们把LED灯控制相关的代码分别独立存储。在“工程模板”之上新建一个......
  • 基于STM32F407ZGT6芯片的GPIO工作模式
    目录4种输入模式4种输出模式输入模式模拟输入浮空输入上拉输入下拉输入输出模式推挽输出开漏输出复用推挽输出复用开漏输出4种输入模式(1)GPIO_Mode_IN_FLOATING浮空输入(2)GPIO_Mode_IPU上拉输入(3)GPIO_Mode_IPD下拉输入(4)GPIO_Mode_AIN模拟输入4种输出模......
  • Android libusb
    一、环境:配置NDK环境1、下载libusb源码:https://github.com/libusb/libusb/releases,如下图所示2、删除一些和Android平台无关的文件,删除后的文件如下图所示:思考问题:Android是怎么获取usb设备?如上图所示:连接adbshell,然后cd到/sys/bus/usb/devices/目录,命令ll可以看到里......
  • 【CUBEide】01 GPIO输入/输出
    一、GPIO功能概述1、八种工作模式(1)输入浮空:作为GPIO输入引脚,不使用上拉或下拉电阻;(2)输入上拉:作为输入引脚,使用内部上拉电阻,引脚外部无输入时读取的电平为高电平;(3)输入下拉:输入引脚,使用内部下拉电阻,引脚外部无输入时读取的引脚输入电平为低电平(4)模拟:作为GPIO模拟引脚,用于ADC......