Ahoy, I've been working hard on a basic implementation of a userspace driver for the WCH341. Would you mind offering some advice for where I may have gone astray?
I've got the device/interface endpoints setup correctly. That is, _usbDevice and _usbInterface have been initialized properly. I can't configure the device to get write/read to work. My application is very simple, send one "W\n" and receive a basic string response from the serial device (9600 baud). I'm modeling this after http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/drivers/usb/serial/ch341.c Here is my home grown way to set control. -(void)sendControlRequest:(int)requestValue inDirection:(int)direction withValue:(int)bufferValue atIndex:(int)index bufferSize:(int)size { NSLog(@"-START--------"); IOReturn kr; int writeBuffer[size]; writeBuffer[0] = bufferValue; // Status Request USBDeviceAddress deviceAddress; IOUSBDevRequest request; kr = (*_usbDevice)->GetDeviceAddress(_usbDevice, &deviceAddress); request.bmRequestType = USBmakebmRequestType(direction, kUSBVendor, kUSBDevice); request.bRequest = requestValue; request.wValue = deviceAddress; request.wIndex = index; request.wLength = size; request.pData = &writeBuffer; kr = (*_usbDevice)->DeviceRequest(_usbDevice, &request); if (kr == kIOReturnSuccess) { NSLog(@"Success - Bytes are %x and %x", writeBuffer[0], writeBuffer[1]); }else if ( kr == kIOReturnOverrun) { NSLog(@"Device request failed: overrun"); }else { NSLog(@"WriteToDevice reset returned err 0x%x\n", kr); } NSLog(@"-END--------"); } … Then later, I set up the register/values from http://tomoyo.sourceforge.jp/cgi-bin/lxr/source/drivers/usb/serial/ch341.c… // ch341_control_in(dev, 0x5f, 0, 0, buffer, size); [self sendControlRequest:0x5f inDirection:kUSBIn withValue:0 atIndex:0 bufferSize:2]; // ch341_control_out(dev, 0xa1, 0, 0); [self sendControlRequest:0xa1 inDirection:kUSBOut withValue:0 atIndex:0 bufferSize:2]; // ch341_control_out(dev, 0x9a, 0x1312, a); [self sendControlRequest:0x9a inDirection:kUSBOut withValue:0x1312 atIndex:[self calculateBaudrate] bufferSize:2]; // ch341_control_in(dev, 0x95, 0x2518, 0, buffer, size); [self sendControlRequest:0x5f inDirection:kUSBIn withValue:0 atIndex:0 bufferSize:2]; // ch341_control_out(dev, 0x9a, 0x2518, 0x0050); [self sendControlRequest:0x9a inDirection:kUSBOut withValue:0x2518 atIndex:0x0050 bufferSize:2]; // STATUS - EXPECT 0xff 0xee [self sendControlRequest:0x95 inDirection:kUSBIn withValue:0x0706 atIndex:0 bufferSize:2]; // ch341_control_out(dev, 0xa1, 0x501f, 0xd90a); [self sendControlRequest:0xa1 inDirection:kUSBOut withValue:0x501f atIndex:0xd90a bufferSize:2]; // ch341_control_out(dev, 0x9a, 0x1312, a); [self sendControlRequest:0x9a inDirection:kUSBOut withValue:0x1312 atIndex:[self calculateBaudrate] bufferSize:2]; // ch341_control_out(dev, 0xa4, ~(CH341_BIT_RTS | CH341_BIT_DTR), 0); [self sendControlRequest:0xa4 inDirection:kUSBOut withValue:~(CH341_BIT_RTS | CH341_BIT_DTR) atIndex:0 bufferSize:2]; Then I write to pipe 2 using... kr = (*_usbInterface)->WritePipe(_usbInterface, 2, (void *) [stringToPrint UTF8String], (UInt32) strlen([stringToPrint UTF8String]) ); 2013-04-17 18:18:39.578 Balance[526:303] Attached Modem Device: USB2.0-Ser! 2013-04-17 18:18:39.580 Balance[526:303] Warning Nil - Vendor: (null) Product: USB2.0-Ser! 2013-04-17 18:18:39.585 Balance[526:303] device pointer before: 0 2013-04-17 18:18:39.586 Balance[526:303] device pointer after: 71304080 2013-04-17 18:18:39.586 Balance[526:303] Found device (vendor = 6790, product = 29987) 2013-04-17 18:18:39.586 Balance[526:303] Iterating a USB interface 2013-04-17 18:18:39.587 Balance[526:303] Interface class 255, subclass 1 2013-04-17 18:18:39.588 Balance[526:303] Interface has 3 endpoints 2013-04-17 18:18:39.588 Balance[526:303] PipeRef 1: 2013-04-17 18:18:39.588 Balance[526:303] direction in, 2013-04-17 18:18:39.588 Balance[526:303] transfer type bulk, maxPacketSize 32 2013-04-17 18:18:39.589 Balance[526:303] PipeRef 2: 2013-04-17 18:18:39.589 Balance[526:303] direction out, 2013-04-17 18:18:39.589 Balance[526:303] transfer type bulk, maxPacketSize 32 2013-04-17 18:18:39.590 Balance[526:303] PipeRef 3: 2013-04-17 18:18:39.590 Balance[526:303] direction in, 2013-04-17 18:18:39.590 Balance[526:303] transfer type interrupt, maxPacketSize 8 2013-04-17 18:18:49.082 Balance[526:303] Wrote "W " (2 bytes) to bulk endpoint And try to read from pipe 1 using… result = (*_usbInterface)->ReadPipeAsyncTO(_usbInterface, 1, readBuffer, numBytesRead, 500, 1000, USBDeviceReadCompletionCallback, (__bridge void *)(self)); But that yields... 2013-04-17 18:18:49.082 Balance[526:303] started async read 2013-04-17 18:18:50.526 Balance[526:303] usb read timeout Thoughts? Caylan _______________________________________________ Cocoa-dev mailing list (Cocoa-dev@lists.apple.com) Please do not post admin requests or moderator comments to the list. Contact the moderators at cocoa-dev-admins(at)lists.apple.com Help/Unsubscribe/Update your Subscription: https://lists.apple.com/mailman/options/cocoa-dev/archive%40mail-archive.com This email sent to arch...@mail-archive.com