mam oprogramowanie QT ktore wspolpracuje z urzadzeniem embedded . urzadzenie jest podlaczone do komputera kablem USB.
czy ktos moze walczyl z portem USB na tablecie z jablkiem? czy apple jest otwarte na urzadzenia zewnetrzne?
Hmm, akurat nie mam nic apple prócz iphona, niby mają wsparcie do usb.
Na linuxie od strony hosta to robisz przy pomocy np. libusb:
Iterujesz po PCI, tam potem wybierasz swój USB controller, płyty główne mają czasem 3 nawet, np. z przodu jest jeden z tyłu inny itp.
Potem jak wybierzesz, który usb controller to potem iterujesz po urządzeniach podłączonych do kontrolera.
Każde urządzenie ma coś ala adres ip.
I możesz im tam wysyłać control, bulk, isochronic wiadomości.
Podłączone urządzenie działa jako slave.
Teraz czy urządzenie też sam pisałeś?
Bo jak tak to będziesz wiedział jak przesyłasz dane.
Libusb na linuxie czy windowsie podobnie obsługa wygląda, ja kiedyś proste urządzenie low level usb robiłem to taką komunikację łatwo nawiązałem, windows i linux, to bez problemu.
Apple ma jakiś swój interface, ale jest podobny iterujesz po PCI -> USB -> Devices, potem komunikujesz się jak zrobione jest po drugiej stronie.
Najprostsza komunikacja jest control msg, ale tam dużo bajtów nie prześlesz kilka.
Też co chcesz przesłać z embedded urządzenia, Apple ma ten swój USBBOOK ma tam jakąś dokumentacje, może chatGPT ci coś doradzi jak zacząć.
Ja sam preferuję linuxa, maca nawet nie mam tylko wirtualke, ale obsługa protokołu jest prawie identyczna wszędzie, też dużo jest abstrakcji sam nie rozumiem tego protokołu w 100%, zawsze jakieś są nieścisłości, zawsze możesz wireshark z usb snifferem uruchomić podsłuchać coś i popatrzeć jak inne się komunikują czy też twoja aplikacja, zawsze to jakiś punkt zaczepienia do szukania błędów jakby coś nie działało.
Moja komunikacja mniej więcej tak wyglądała:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <usb.h>
#define USB_LED_OFF 0
#define USB_LED_ON 1
#define USB_DATA_OUT 2
#define USB_DATA_WRITE 3
#define USB_DATA_IN 4
static int usbGetDescriptorString(usb_dev_handle *dev, int index, int langid,
char *buf, int buflen)
{
char buffer[256];
int rval, i;
rval = usb_control_msg(dev,
USB_TYPE_STANDARD | USB_RECIP_DEVICE | USB_ENDPOINT_IN,
USB_REQ_GET_DESCRIPTOR, (USB_DT_STRING << 8) + index, langid,
buffer, sizeof(buffer), 1000);
if (rval < 0)
return rval;
if ((unsigned char)buffer[0] < rval)
rval = (unsigned char)buffer[0];
if (buffer[1] != USB_DT_STRING)
return 0;
rval /= 2;
for (i = 1; i < rval && i < buflen; i++)
{
if (buffer[2 * i + 1] == 0)
buf[i - 1] = buffer[2 * i];
else
buf[i - 1] = '?';
}
buf[i - 1] = 0;
return i - 1;
}
static usb_dev_handle *usbOpenDevice(int vendor, char *vendorName,
int product, char *productName)
{
struct usb_bus *bus;
struct usb_device *dev;
char devVendor[256], devProduct[256];
usb_dev_handle *handle = NULL;
usb_init();
usb_find_busses();
usb_find_devices();
printf("ok\n");
for (bus = usb_get_busses(); bus; bus = bus->next)
{
for (dev = bus->devices; dev; dev = dev->next)
{
if (dev->descriptor.idVendor != vendor || dev->descriptor.idProduct != product)
continue;
if (!(handle = usb_open(dev)))
{
fprintf(stderr, "Warning: cannot open USB device: %s\n", usb_strerror());
continue;
}
if (usbGetDescriptorString(handle, dev->descriptor.iManufacturer, 0x0409, devVendor, sizeof(devVendor)) < 0)
{
fprintf(stderr, "Warning: cannot query manufacture for device: %s\n", usb_strerror());
usb_close(handle);
continue;
}
if (usbGetDescriptorString(handle, dev->descriptor.iProduct, 0x0409, devProduct, sizeof(devVendor)) < 0)
{
fprintf(stderr, "Warning: cannot query product for device: %s\n", usb_strerror());
usb_close(handle);
continue;
}
if (strcmp(devVendor, vendorName) == 0 && strcmp(devProduct, productName) == 0)
return handle;
else
usb_close(handle);
}
}
return NULL;
}
int main(int argc, char **argv)
{
usb_dev_handle *handle = NULL;
int nBytes = 0;
char buffer[256];
if (argc < 2)
{
printf("Usage:\n");
printf("usbtext.exe on\n");
printf("usbtext.exe off\n");
printf("usbtext.exe out\n");
printf("usbtext.exe write\n");
printf("usbtext.exe in <string>\n");
exit(1);
}
handle = usbOpenDevice(0x16C0, "name", 0x05DC, "USB");
if (handle == NULL)
{
fprintf(stderr, "Could not find USB device!\n");
exit(1);
}
if (strcmp(argv[1], "on") == 0)
{
nBytes = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN,
USB_LED_ON, 0, 0, (char *)buffer, sizeof(buffer), 5000);
}
else if (strcmp(argv[1], "off") == 0)
{
nBytes = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN,
USB_LED_OFF, 0, 0, (char *)buffer, sizeof(buffer), 5000);
}
else if (strcmp(argv[1], "out") == 0)
{
nBytes = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN,
USB_DATA_OUT, 0, 0, (char *)buffer, sizeof(buffer), 5000);
printf("Got %d bytes: %s\n", nBytes, buffer);
}
else if (strcmp(argv[1], "write") == 0)
{
nBytes = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_IN,
USB_DATA_WRITE, 'T' + ('E' << 8), 'S' + ('T' << 8),
(char *)buffer, sizeof(buffer), 5000);
}
else if (strcmp(argv[1], "in") == 0)
{
nBytes = usb_control_msg(handle, USB_TYPE_VENDOR | USB_RECIP_DEVICE | USB_ENDPOINT_OUT,
USB_DATA_IN, 0, 0, argv[2], strlen(argv[2]) + 1, 5000);
}
if (nBytes < 0)
fprintf(stderr, "USB error: %s\n", usb_strerror());
usb_close(handle);
return 0;
}
Tylko control_msg, bulk jest podobnie do tego, ten kod zapalał diode na jakimś tam embedded mikrokontrolerze po usb, taki hello world przykład jak zrobić.
Zarejestruj się i dołącz do największej społeczności programistów w Polsce.
Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.