LIB libusb

13 de julho de 2021 Off Por Marcelo Martins

Quem tem um PC, sabe que praticamente qualquer dispositivo atualmente esta conectado na USB.

Os dispositivos USB são cada vez mais populares, por sua praticidade e simplicidade.

O desenvolvimento e integração no linux, sempre foi um caminho tortuoso, neste post estarei desvendando um pouco de como funciona o desenvolvimento e o caminho a ser traçado.

O projeto libusb, é uma lib desenvolvida em C, para Linux, ela permite utilizar o protocolo USB da versão 1.0 até a 3.1.

O site do projeto pode ser visto:

https://libusb.info/

O git do projeto pode ser baixado facilmente através do seguinte repositório:

https://github.com/libusb/libusb/releases

Instalação no linux

A instalação da libusb pode ser feita de duas formas:

  1. Compilação do fonte através da baixa e compilação manual.
  2. Baixar os pacotes no linux

Estaremos tratando aqui, do segundo método, pois é o mais prático e direto.

Existem dois pacotes da lib usb:

  1. Uma uso e distribuição (libusb-1.0-0), não permite compilar.
  2. Lib destinada ao desenvolvimento e compilação. (libusb-1.0-0-dev)

Desenvolvimento em C

Para desenvolver em C, primeiramente precisaremos instalar as seguintes dependencias.

apt install libusb-1.0-0-dev libusb-1.0-0

Dependências para compilação

O pacote -dev, incluirá na pasta /usr/local/include os headers que permitem a compilação da lib.

No projeto fonte: https://github.com/libusb/libusb/archive/refs/tags/v1.0.24.zip

Você encontra uma pasta com uma série de fontes, exemplos (exemples).

Entre os exemplos estão o listdevs.c, que vemos no código abaixo:

/*
 * libusb example program to list devices on the bus
 * Copyright © 2007 Daniel Drake <dsd@gentoo.org>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#include <stdio.h>

#include "libusb.h"

static void print_devs(libusb_device **devs)
{
	libusb_device *dev;
	int i = 0, j = 0;
	uint8_t path[8];

	while ((dev = devs[i++]) != NULL) {
		struct libusb_device_descriptor desc;
		int r = libusb_get_device_descriptor(dev, &desc);
		if (r < 0) {
			fprintf(stderr, "failed to get device descriptor");
			return;
		}

		printf("%04x:%04x (bus %d, device %d)",
			desc.idVendor, desc.idProduct,
			libusb_get_bus_number(dev), libusb_get_device_address(dev));

		r = libusb_get_port_numbers(dev, path, sizeof(path));
		if (r > 0) {
			printf(" path: %d", path[0]);
			for (j = 1; j < r; j++)
				printf(".%d", path[j]);
		}
		printf("\n");
	}
}

int main(void)
{
	libusb_device **devs;
	int r;
	ssize_t cnt;

	r = libusb_init(NULL);
	if (r < 0)
		return r;

	cnt = libusb_get_device_list(NULL, &devs);
	if (cnt < 0){
		libusb_exit(NULL);
		return (int) cnt;
	}

	print_devs(devs);
	libusb_free_device_list(devs, 1);

	libusb_exit(NULL);
	return 0;
}

No código acima, irei apresentar apenas alguns poucos pontos, que acredito serem chaves para o entendimento desta api.

O include #include “libusb.h”, permite usar a api do c, este é um passo importante que apesar de notório, achei bom comentar.

A criação da variavel dev, conforme segue:

libusb_device *dev;

É importante, pois este, guardará as informações dos dispositivos.

A chamada da função libusb_get_device_descriptor, coleta as informações do device alvo. Lembrando que dispositivos usb no linux

int r = libusb_get_device_descriptor(dev, &desc);

O dispositivo e suas propriedades, podem ser visualizados, através da chamada de suas propriedades, como segue desc.idVendor .

Por fim, a listagem dos dispositivos conectados, pode ser obtida, pela função:

cnt = libusb_get_device_list(NULL, &devs);

Podemos notar a simplicidade desta api.

Espero ter ajudado a entender um pouco mais sobre USB e acesso a dispositivos.