X-Git-Url: https://git.gag.com/?p=fw%2Faltos;a=blobdiff_plain;f=libaltos%2Flibaltos.c;h=505b3147f0f286527f0f743479a61230d2a7cf3e;hp=d7b266cf08936f23abd1a18003b26c4cc0f9012e;hb=0f05b1996122b6c6bce81ca33e85c2a65c3ded18;hpb=65b512c890a3ccf487655b79305ab1cfcf49259c diff --git a/libaltos/libaltos.c b/libaltos/libaltos.c index d7b266cf..505b3147 100644 --- a/libaltos/libaltos.c +++ b/libaltos/libaltos.c @@ -148,6 +148,8 @@ altos_open(struct altos_device *device) return NULL; } cfmakeraw(&term); + cfsetospeed(&term, B9600); + cfsetispeed(&term, B9600); #ifdef USE_POLL term.c_cc[VMIN] = 1; term.c_cc[VTIME] = 0; @@ -604,6 +606,12 @@ altos_list_start(void) return devs; } +PUBLIC struct altos_list * +altos_ftdi_list_start(void) +{ + return altos_list_start(); +} + int altos_list_next(struct altos_list *list, struct altos_device *device) { @@ -783,6 +791,7 @@ no_file: struct altos_list { io_iterator_t iterator; + int ftdi; }; static int @@ -840,8 +849,21 @@ altos_list_start(void) int i; ret = IOServiceGetMatchingServices(kIOMasterPortDefault, matching_dictionary, &list->iterator); - if (ret != kIOReturnSuccess) + if (ret != kIOReturnSuccess) { + free(list); return NULL; + } + list->ftdi = 0; + return list; +} + +PUBLIC struct altos_list * +altos_ftdi_list_start(void) +{ + struct altos_list *list = altos_list_start(); + + if (list) + list->ftdi = 1; return list; } @@ -859,10 +881,15 @@ altos_list_next(struct altos_list *list, struct altos_device *device) if (!get_number (object, CFSTR(kUSBVendorID), &device->vendor) || !get_number (object, CFSTR(kUSBProductID), &device->product)) continue; - if (device->vendor != 0xfffe) - continue; - if (device->product < 0x000a || 0x0013 < device->product) - continue; + if (list->ftdi) { + if (device->vendor != 0x0403) + continue; + } else { + if (device->vendor != 0xfffe) + continue; + if (device->product < 0x000a || 0x0013 < device->product) + continue; + } if (get_string (object, CFSTR("IOCalloutDevice"), device->path, sizeof (device->path)) && get_string (object, CFSTR("USB Product Name"), device->name, sizeof (device->name)) && get_string (object, CFSTR("USB Serial Number"), serial_string, sizeof (serial_string))) { @@ -933,6 +960,7 @@ altos_bt_open(struct altos_bt_device *device) struct altos_list { HDEVINFO dev_info; int index; + int ftdi; }; #define USB_BUF_SIZE 64 @@ -983,6 +1011,26 @@ altos_list_start(void) return NULL; } list->index = 0; + list->ftdi = 0; + return list; +} + +PUBLIC struct altos_list * +altos_ftdi_list_start(void) +{ + struct altos_list *list = calloc(1, sizeof (struct altos_list)); + + if (!list) + return NULL; + list->dev_info = SetupDiGetClassDevs(NULL, "FTDIBUS", NULL, + DIGCF_ALLCLASSES|DIGCF_PRESENT); + if (list->dev_info == INVALID_HANDLE_VALUE) { + altos_set_last_windows_error(); + free(list); + return NULL; + } + list->index = 0; + list->ftdi = 1; return list; } @@ -1017,24 +1065,30 @@ altos_list_next(struct altos_list *list, struct altos_device *device) continue; } - /* Fetch symbolic name for this device and parse out - * the vid/pid/serial info */ - symbolic_len = sizeof(symbolic); - result = RegQueryValueEx(dev_key, "SymbolicName", NULL, NULL, - symbolic, &symbolic_len); - if (result != 0) { - altos_set_last_windows_error(); - printf("cannot find SymbolicName value\n"); - RegCloseKey(dev_key); - continue; + if (list->ftdi) { + vid = 0x0403; + pid = 0x6015; + serial = 0; + } else { + /* Fetch symbolic name for this device and parse out + * the vid/pid/serial info */ + symbolic_len = sizeof(symbolic); + result = RegQueryValueEx(dev_key, "SymbolicName", NULL, NULL, + symbolic, &symbolic_len); + if (result != 0) { + altos_set_last_windows_error(); + printf("cannot find SymbolicName value\n"); + RegCloseKey(dev_key); + continue; + } + vid = pid = serial = 0; + sscanf((char *) symbolic + sizeof("\\??\\USB#VID_") - 1, + "%04X", &vid); + sscanf((char *) symbolic + sizeof("\\??\\USB#VID_XXXX&PID_") - 1, + "%04X", &pid); + sscanf((char *) symbolic + sizeof("\\??\\USB#VID_XXXX&PID_XXXX#") - 1, + "%d", &serial); } - vid = pid = serial = 0; - sscanf((char *) symbolic + sizeof("\\??\\USB#VID_") - 1, - "%04X", &vid); - sscanf((char *) symbolic + sizeof("\\??\\USB#VID_XXXX&PID_") - 1, - "%04X", &pid); - sscanf((char *) symbolic + sizeof("\\??\\USB#VID_XXXX&PID_XXXX#") - 1, - "%d", &serial); /* Fetch the com port name */ port_len = sizeof (port); @@ -1201,6 +1255,7 @@ altos_open(struct altos_device *device) struct altos_file *file = calloc (1, sizeof (struct altos_file)); char full_name[64]; COMMTIMEOUTS timeouts; + DCB dcb; if (!file) return NULL; @@ -1226,6 +1281,11 @@ altos_open(struct altos_device *device) timeouts.WriteTotalTimeoutConstant = 0; SetCommTimeouts(file->handle, &timeouts); + if (GetCommState(file->handle, &dcb)) { + dcb.BaudRate = CBR_9600; + (void) SetCommState(file->handle, &dcb); + } + return file; }