Necromant’s MultiDrop UART: The software.

Well, there were quite a few bugs in the device and it looks like the baseboard is going to redesigned, although it will still be compatible with all the extension ‘shields’.
It looked like the transistors gave a .2 volts voltage drop, and the diodes dropped 0.1 more, turning regulated 3.3 into 3.0 volts, so sot-23 mosfets are already on the way.
Meanwhile, I started to write some software. This resulted into a dumb commandline utility called muart-ctl.
And… A KDE4 Plasmoid, that acts as a frontend.

Here goes the obligatory screenshot:
And the full shot of the desktop:

Profile management is not yet ready, and there are still some issues in the electronics, that need further addressing (And a new PCB!), but nevertheless it works.
The plasmoid is written in javascript, which was kind of pain. The bindings are not well documented, so I had to do quite a lot of guessing. Nevertheless, as for my first javascript project it all went fine. Lots of thanks to Nikita Melnichenko, for the plasmoid ‘makeprogress’. I tore that one apart and used as a reference.

Necromant’s MultiDrop UART: The Baseboard

I work with a lot of different embedded boards. Most of them have linux istalled. And what do these have in common? Yep. UART. The thing you use to debug them, send uboot parameters and etc. When there are a plenty of boards around, you tend to have a pile of usb<-->uart chips around, your /dev/ becomes a mess (Is that ttyUSB0 or ttyUSB1?) that even udev cannot sort out (Damn, I’ve swapped that out, so it’s not /dev/armboard1)…
And the worst is the difference in logic levels. I have a couple of exotic boards that require 2.5 volts. Something few uart bridges can handle out of the box.
So I had a quick look at what I had around. Since I mostly work with one board at a time…
1. I grabbed an ft232rl
2. Some buffers and shift registers
3. Some POTs and ams1117 voltage regulators
4. Lottsa coffee

The idea was simple as hell. MUX the UART and select the channel you want to work with a small command line utility. FT232RL has the CBUS pins that can be used in bitbang mode. e.g. You can use them as GPIO. 4 GPIO are quite enough for 2 shift registers.
Each shift register has clk and data pins, which you can use to serially input the data, and 8 pins of parallel output, which are used to actually cotrol hardware.
So, my FT232RL got 2 shift registers.
One selects the power channel, the other selects the adress of the UART outlet to use.
Forthe power circuit, I had no mosfets around (huge 10 Amps thingies do not count), so I made use of some PNP transistors in digital switch mode. After the switch there goes a linear stabilizer – AMS1117, adjustable version, which is adjusted by a POT. And after that through a Schottky diode (Is it really required?) it goes to VCCIO power net.
So we have 7 power channels. 3.3, 5 volts and 5 adjustable channels. The voltage can be anything fro 2 to 5 volts so that gives us some freedom of choice
The baseboard has 2 pin arrays that will be used to connect arduino-like shields with buffers and outputs. One has the address selection shift register outputs, that will be connected to ‘/inhibit’ pins of the buffers on the shields, one has the actual outputs of FT232RL serial port.
So I set off to work and after one wasted day of my life I got a baseboard ready. There it is, my little thingie:

.
There were a few bugs though. I had a wrong kicad footprint that resulted in the need of turning all the sot-23 transistors over. And the Schottkey diodes were a bit smaller, so I had to bend the contacts a bit. I also made a small mistake: Since the shift registers are powered via the VCCIO voltage, disabling all power to this net results in inability to supply any voltage again unless you short VCCIO to some voltage and then turn on the correct transistor. So I sacrificed one adjustable channel and made it always output 2 volts of ‘standby’ to the VCCIO net.
Next weekend I’m gonna make some shields and finally publish all the fixed circuits and layouts.
Btw, that’s plain press’n’peel method I used to make the board.

Creating .libs for kicad/eeschema semiautomatically

Well, everyone has to eventually make one. Since we have a cool online utility from C. Rohrbacher http://kicad.rohrbacher.net/quicklib.php This is quite simple. Just fill in all the pins, orient them and you are ready to go…
But if there are over 200 pins,this is getting tiresome. When I was making a lib for at91rm9200 I got tired at 30th pin. And there are 208 of them and it’s quite easy to screw up… So I got a nice idea. Unfortunately, I didn’t find C. Rohrbacher’s email on his site, as well as I saw no sources of the utility. So, it was time for a hackish solution.

We’ll need:

bash (Oh, yeah!)
xdotool
okular (Any other PDF viewr thatcan select text will do)

Step one.
Open the datasheet, find the pin list, select the pins:

Step two.
Copypaste them into a blank file. They should be strictly ordered

Step three
Now a little black magic. Save the following bash script somewhere:

#!/bin/bash
write_pin()
{
xdotool type "$1"
xdotool key Tab Tab Tab Tab Tab Tab
}
 
if [ $# -lt 1 ]; then
  echo "Usage: fill-pins filename"
  exit
fi
 
echo "Starting in 5 seconds..."
sleep 5
 
cat $1|while read line; do
  write_pin "$line"
done

chmod+x, And give it the file with pins you’ve madeearlier. You have 5 seconds to open the browser on page withpins and select PIN1.
The script will do everything by itself. Just relax – it looks pretty funny

And by the way, kill all instances of skype, icq, kopete, irc – these things tend to steal focus from the browser and screw thing up.

Готовим фотошаблоны печаток из kicad’a при помощи latex

Если вы начинали со Sprint Layout, то наверное помните диалог печати, который позволяет совместить на листе сколько-то копий одной и той же платы. К сожалению, одной единственной, или одного и того же слоя.
В kicad’е нет и этого. Если плата здоровая, а изготавливать с первого раза уже получается почти всегда, то это нормально. Но если вдруг надо изготовить сразу пачку мелких плат, или отпечатать сразу два слоя рядом… В общем, облом.
Посему, начал я думать над каким-нибудь костылем. kicad отлично выводит как в gerber (для производства) так и в postscript (для кустарного производства). Последнее-то мне и приглянулось.
Рамку смело выкидываем в реактор, она нам не понадобится.
После выведения в postscript мы имеем несколько .ps файликов, с каждым слоем. Каждый занимает A4 страницу.
Первым делом надо их перегнать во что-то удобоваримое. Сначала я перегнал их в png imagemagic’ом и увидел здоровенный холст на страницу размером. Не вариант, ибо bounding box оно не считает, и картинка выйдет во весь лист. На помощь пришла маленькая утилитка ps2eps. Она создает векторное eps изображение из постсрипта и обсчитывает тот самый bounding box. Иными словами, в LaTeX документ можно будет эту картинку воткнуть тупо при помощи заклинания

\includegraphics[scale=1]{jtagice-1.eps}

И это будет гарантировать масштаб 1:1, то есть если это статья для журнала, то читатели вашей научной статьи смогут ксерануть страничку на глянец и сразу сделать плату для своего домашнего реактора.

Теперь, остается только автоматизировать процесс.
Немного покумекав, я соорудил вот такой костыль.
В виде аргументов скармливаем:
1. Как обозвать проект в первой и единственной строчки текста.
2. Сколько раз изпользовать каждый из файлов
3. Сами файлики. Много их…

Скрипт требует наличие LaTeX’a, а в конце запускает окуляр. Последние строчки скрипта можно подкрутить по вкусу, но смысл изменится врядли. В идеале, конечно, можно было подкрутить оформление. Была мысля соорудить рамку по ЕСКД ради прикола, но она много места на листе занимает, так что отправилась она прямиком в реактор.

#!/bin/bash
# This program is free software. It comes without any warranty, to
# the extent permitted by applicable law. You can redistribute it
# and/or modify it under the terms of the Do What The Fuck You Want
# To Public License, Version 2, as published by Sam Hocevar. See
# http://sam.zoy.org/wtfpl/COPYING for more detail
 
usage()
{
echo "mkpcb.  (c) 2011, Necromant"
echo "Generate a printable document out of several postscript images. "
echo "usage: mkpcb project_name n file1.ps file2.ps ..."
echo "where n is the number of times to use each file"
echo "Great for exporting PCBs from kicad for batch printout"
}
 
if [ "$#" -lt "3" ]; then
echo "Need moar args"
usage
exit 1
fi
 
if [ "$1" == "--help" ]; then
usage
exit 1
fi
 
gen_latex()
{
cat << EOF
\documentclass[a4paper,14pt]{report} %размер бумаги устанавливаем А4, шрифт 12пунктов
\usepackage[T2A]{fontenc}
\usepackage{extsizes}
\usepackage{listings}
\usepackage{longtable}
\usepackage{courier}
\usepackage{tabularx}
\usepackage{framed}
\usepackage[utf8]{inputenc}%включаем свою кодировку: koi8-r или utf8 в UNIX, cp1251 в Windows
\usepackage[english,russian]{babel}%используем русский и английский языки с переносами
\usepackage{amssymb,amsfonts,amsmath,mathtext,cite,enumerate,float} %подключаем нужные пакеты расширений
\usepackage[dvips]{graphicx} %хотим вставлять в диплом рисунки?
\graphicspath{{data/images}}%путь к рисункам
 
 
\makeatletter
\renewcommand{\@biblabel}[1]{#1.} % Заменяем библиографию с квадратных скобок на точку:
\makeatother
 
%\usepackage{geometry} % Меняем поля страницы
%\geometry{left=2cm}% левое поле
%\geometry{right=1.5cm}% правое поле
%\geometry{top=1cm}% верхнее поле
%\geometry{bottom=2cm}% нижнее поле
\usepackage[a4paper,left=30mm,right=15mm,top=25mm,bottom=25mm]{geometry}
 
\renewcommand{\theenumi}{\arabic{enumi}}% Меняем везде перечисления на цифра.цифра
\renewcommand{\labelenumi}{\arabic{enumi}}% Меняем везде перечисления на цифра.цифра
\renewcommand{\theenumii}{.\arabic{enumii}}% Меняем везде перечисления на цифра.цифра
\renewcommand{\labelenumii}{\arabic{enumi}.\arabic{enumii}.}% Меняем везде перечисления на цифра.цифра
\renewcommand{\theenumiii}{.\arabic{enumiii}}% Меняем везде перечисления на цифра.цифра
\renewcommand{\labelenumiii}{\arabic{enumi}.\arabic{enumii}.\arabic{enumiii}.}% Меняем везде перечисления на цифра.цифра
\renewcommand{\lstlistingname}{Листинг \No}
\renewcommand{\baselinestretch}{1.25}
 
%\addtocounter{chapter}{0} % не хочу нумеровать главы
%\setcounter{secnumdepth}{-1} % глубина оглавления
 
 
 
 
 
 
\begin{document}
EOF
echo "Plots for Project $1 ($2 pieces each)\\"
echo ""
echo ""
COUNT=$2
shift
shift
 
ps2eps $*
 
while [ "$COUNT" -gt "0" ]; do
for plot in $*; do
echo "\includegraphics[scale=1]{`basename $plot .ps`.eps}"
let COUNT-=1
#\includegraphics[scale=1]{2.eps}  
 
#%\includegraphics[scale=1]{jtagice-1.eps}  
#%\includegraphics[scale=1]{jtagice-1.eps}  
done 
done
 
echo "\end{document}"
}
 
 
gen_latex $* > output.tex
latex output.tex
okular output.dvi

USB Sniffo dongle

Well, another weekend, and another project. This time, once I got to my lab, I had to debug a DIY usb dongle (avr based, stuffed with vusb framework). And… Well, things didn’t work out of the box this time and I got a bunch of glitches.

So, I decided to finally make a dongle for sniffing usb transactions. The idea was flying around for some time, and it seems to me someone has already done something similar at HaD. Well, I was too lazy to search.
It was a pretty simple one – just 2 ports, some pins for easy oscilloscope access and three leds, activated via a jumper. One for power line, and 2 for D+ D- lines.


This time, as recommended by a friend of mine I didn’t remove the toner (Thanks, Inky!). Once the thing was ready, I applied some urethane spray, so that the whole thing would last longer.

As usual here go the kicad schematics and pcb layout files, including ready to pring PostScript, if you’re gonna make one for yourself: sniffo.tar.gz

A bit of necromancy: resurrecting an HSDPA modem

Well, to make the long story short – it’s dead. I was setting up my router with OpenWrt to share the internet, and connected the wrong power supply unit that provided 7.5 instead of 5 volts. The router is ok – there’s a good stepdown converter onboard, while the usb host is directly powered by what comes from power supply. So, that’s 2.5 volts overvoltage.
So, the modem got totally screwed: Blink and it’s dead. So I took the screwdriver and disassembled it.

By the way, the modem usually acts a bit weird. If it’s ledt disconnected for a long time, once you connect it to your laptop, the laptop just gets turned off via usb short-circuit protection. My guess was, that that happened because of the big inrush current into some capacitors out there.
And the guess was correct. The 5V usb supply are connected to two 6V 470uF caps connected in parallel (almost 1000uF!), then it goes into an unknown noname IC, and after that – into an LC filter consisting of 2х470uF 6V caps + 2 tantalum caps (value unknown, all caps are connected in parallel). AFAIK that is done because GSM modules do consume a lot of current while sending out bursts of data.
Whe I plugged the modem in the usb the multimeter showed 0 volts at the output of that unknown stepdown.
“It’s dead, Luke”
Let’s hope that the main SoC is still alive. Since no datasheets were found on the stepdown, I decided to guess the output voltage. My guess was 3.3, but I wanted to be sure. The chipset is Qualcom, with ARM core inside, so that could be anything from 1.2 volts, AFAIK. So I hacked another project, I called “The dropper“, to guess the correct voltage. At 3.3 volts the modem came back to life.
So I glued a 3.3 linear voltage regulator to the PCB:

Connected that with 0.3mm coated wires, so that it would fit in the original casing and no mod would be visible.
It worked for 15 seconds before the voltage regulator was shut down by overheat protection. Looks like the current was too big for it to handle.
So I said “goodbye” to preserving the original look, drilled the case, attached a powerful 3.3 volt stepdown, and assembled it. You know, who cares about design when the whole thing is going to work in the attic for the time being?. The result looks somewhat like that:

I removed one of the 470uF caps at the input, so that it will not bug me any more while I’m debugging the software stack on the laptop.
Once assembled, the modem connected to the network, completed a ping test. So, I guess it can be called a success.

the_dropper

I urgently needed a small device, to produce me a number of fixed voltages (mostly below 3.3 volts). I was a bit too lazy to do the step-down, so I resorted to lowdrops. You know, the guy who borrowed my L-meter for a ‘week or so’ still didn’t return that, and I do not feel myself comfortable winding inductance for 38063 with no measurements.

So, it’s dumb. I took a bunch AMS1117 (adjustables, fixed 3.3 and fixed 2.5), a bucnch of SMD resistors, and a LED. For calculation of resistor value any LM317 calc does the job fine.The LED has a 470 Оhm resistor.
I didn’t have any variable resistors, so I didn’t put any here.

The circuit is somewhat like that:
I was a bit in a hurry to fill in resistor values.

Here goes the 3d PCB model:

And the resulting device:

I added a power cord and a sticker with voltages.

And here goes the kicad project: lowdropper.tar.gz

Remote-flashing an AVR board from an ARM

Okay, I admit it, we’re building something quite big this time. And robotic. So big, that it needs some embedded brains of the ARM scale (SmartQ7) and a microcontroller, that does all the dirty work (e.g. controls motors, gathers data from sensors and feeds that stuff to an ARM for processing.) However, disconnecting the micro for flashing, or running around with an ISP programmer is not an option.this thing moves pretty much.
Continue reading “Remote-flashing an AVR board from an ARM”

A bit of Necromancy: resurrecting a TRENDnet router

I got this one for free from a friend a long time ago.Looks from inside like it had been used in a bucket of water a wet environment.
I just needed a router urgently and was a bit too lazy to run out to get a new one, so I decided to fix this one.
The symptoms are quite interesting: works, but lots of lag, instable signal, after some time of usage the speed drops to 10kbytes/sec over wireless. Wired works more or less fine.
While the soldering iron was heating up, I took apart this thing and powered it on . A GS1117 linear regulator heated up till it was too hot to touch, the shield above the RF part was corroded, a 47uF capacitor got 100% dead.
The first thing I’ve done – I secured the shielding with a bit of copper:

Then I replaced the dead 47uF cap:

And, finally the regulator.
It gets a 3.3v input, and should give 1.8 volts out… But that measures like 1.56
Either something it powers got too hungry with age… or the regulator died. GS1117 and 1.8 volts. Something I don’t have around. Luckily, I had AMS1117 I just got from china. Same thing – different vendor. Even the pinouts are the same and package. But I only had 3.3 volts, 5 volts and adjustables. To adjust those you have to put 2 resistors: One between the ADJ and GND, one between ADJ and out.
The math is the same as for LM317, so I used 220 Ohm & 120 Ohm,I had around in SMD 0603 package.
Now I had to turn on my soldering ninja skills. I bent the ADJ pin to hook a resistor there, воткнул резюк:

Then soldered both of them.

I got steady 1.9 volts output, that theoretically should not exceed absolute maximum ratings, should it?

Anyway, that worked. Web interface rendered a lot faster, no more lags or loss of pings or speed drops. Signal could be better, and something tells me I should have replaced the rest of the caps, but I only had one around.
I also soldered in the pins for JTAG and UART. I wonder if I find the time to play with this one some time later. Enough necromancy for today.

Chinese HSDPA modem & linux support

Okay, I hacked it to work.
So, what was the problem?
These damned modems by default show up as a mass_storage. As a cdrom actually. Which contains drivers. For windows.
Afterwards they are switched into a regular modem mode, which linux can make use of.
To do the switch in linux we need usb-modeswitch. A nice utility that handles the task. And some sniffed data filled into the config file.
Here it is:

########################################################
# HSDPA USB modem from dealextreme
# http://www.dealextreme.com/details.dx/sku.47013
# By Andrew 'Necromant' Andrianov

DefaultVendor= 0x05c6
DefaultProduct=0x2000

TargetVendor= 0x05c6
TargetProduct= 0x0015

# This modem doesn't react fast - it pauses for some 30-40 seconds
CheckSuccess=40

MessageEndpoint=0x08
MessageContent="5553424368032c882400000080000612000000240000000000000000000000"
# Nothing will work until you read the response from device
NeedResponse=1

I obtained it looking at this dump I grabbed from windoze via usbsnoop:

[231 ms] UsbSnoop - FilterAddDevice(a6b42748) : DriverObject 898c1408, pdo 88b88b30
[232 ms] UsbSnoop - FilterDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_QUERY_LEGACY_BUS_INFORMATION)
[232 ms] UsbSnoop - FdoHookDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_QUERY_LEGACY_BUS_INFORMATION)
[232 ms] UsbSnoop - FilterDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_QUERY_RESOURCE_REQUIREMENTS)
[233 ms] UsbSnoop - FdoHookDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_QUERY_RESOURCE_REQUIREMENTS)
[233 ms] UsbSnoop - FilterDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_FILTER_RESOURCE_REQUIREMENTS)
[233 ms] UsbSnoop - FdoHookDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_FILTER_RESOURCE_REQUIREMENTS)
[233 ms] UsbSnoop - FilterDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_START_DEVICE)
[233 ms] UsbSnoop - FdoHookDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_START_DEVICE)
[233 ms] UsbSnoop - FilterDispatchAny(a6b3dfd2) : IRP_MJ_SYSTEM_CONTROL
[234 ms] UsbSnoop - FilterDispatchAny(a6b3dfd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL
[234 ms] UsbSnoop - FdoHookDispatchInternalIoctl(a6b3e1ea) : fdo=8837b020, Irp=882c0368, IRQL=0
[234 ms] >>> URB 1 going down >>>
-- URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
TransferBufferLength = 00000012
TransferBuffer = 883c3e50
TransferBufferMDL = 00000000
Index = 00000000
DescriptorType = 00000001 (USB_DEVICE_DESCRIPTOR_TYPE)
LanguageId = 00000000
[237 ms] UsbSnoop - MyInternalIOCTLCompletion(a6b3e126) : fido=00000000, Irp=882c0368, Context=885ea8d0, IRQL=2
[237 ms] <<< URB 1 coming back <<< -- URB_FUNCTION_CONTROL_TRANSFER: PipeHandle = 8851a600 TransferFlags = 0000000b (USBD_TRANSFER_DIRECTION_IN, USBD_SHORT_TRANSFER_OK) TransferBufferLength = 00000012 TransferBuffer = 883c3e50 TransferBufferMDL = 897ae7b8 00000000: 12 01 10 01 00 00 00 40 c6 05 00 20 00 00 01 02 00000010: 00 01 UrbLink = 00000000 SetupPacket = 00000000: 80 06 00 01 00 00 12 00 [237 ms] UsbSnoop - FilterDispatchAny(a6b3dfd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL [237 ms] UsbSnoop - FdoHookDispatchInternalIoctl(a6b3e1ea) : fdo=8837b020, Irp=882c0368, IRQL=0 [238 ms] >>> URB 2 going down >>>
-- URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
TransferBufferLength = 00000009
TransferBuffer = 89887a68
TransferBufferMDL = 00000000
Index = 00000000
DescriptorType = 00000002 (USB_CONFIGURATION_DESCRIPTOR_TYPE)
LanguageId = 00000000
[241 ms] UsbSnoop - MyInternalIOCTLCompletion(a6b3e126) : fido=00000000, Irp=882c0368, Context=885ea8d0, IRQL=2
[241 ms] <<< URB 2 coming back <<< -- URB_FUNCTION_CONTROL_TRANSFER: PipeHandle = 8851a600 TransferFlags = 0000000b (USBD_TRANSFER_DIRECTION_IN, USBD_SHORT_TRANSFER_OK) TransferBufferLength = 00000009 TransferBuffer = 89887a68 TransferBufferMDL = 897ae7b8 00000000: 09 02 20 00 01 01 00 a0 fa UrbLink = 00000000 SetupPacket = 00000000: 80 06 00 02 00 00 09 00 [241 ms] UsbSnoop - FilterDispatchAny(a6b3dfd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL [241 ms] UsbSnoop - FdoHookDispatchInternalIoctl(a6b3e1ea) : fdo=8837b020, Irp=882c0368, IRQL=0 [242 ms] >>> URB 3 going down >>>
-- URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:
TransferBufferLength = 00000020
TransferBuffer = 8986bcb8
TransferBufferMDL = 00000000
Index = 00000000
DescriptorType = 00000002 (USB_CONFIGURATION_DESCRIPTOR_TYPE)
LanguageId = 00000000
[245 ms] UsbSnoop - MyInternalIOCTLCompletion(a6b3e126) : fido=00000000, Irp=882c0368, Context=885ea8d0, IRQL=2
[245 ms] <<< URB 3 coming back <<< -- URB_FUNCTION_CONTROL_TRANSFER: PipeHandle = 8851a600 TransferFlags = 0000000b (USBD_TRANSFER_DIRECTION_IN, USBD_SHORT_TRANSFER_OK) TransferBufferLength = 00000020 TransferBuffer = 8986bcb8 TransferBufferMDL = 897ae7b8 00000000: 09 02 20 00 01 01 00 a0 fa 09 04 00 00 02 08 06 00000010: 50 00 07 05 87 02 40 00 00 07 05 08 02 40 00 00 UrbLink = 00000000 SetupPacket = 00000000: 80 06 00 02 00 00 20 00 [245 ms] UsbSnoop - FilterDispatchAny(a6b3dfd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL [245 ms] UsbSnoop - FdoHookDispatchInternalIoctl(a6b3e1ea) : fdo=8837b020, Irp=882c0368, IRQL=0 [246 ms] >>> URB 4 going down >>>
-- URB_FUNCTION_SELECT_CONFIGURATION:
ConfigurationDescriptor = 0x8986bcb8 (configure)
ConfigurationDescriptor : bLength = 9
ConfigurationDescriptor : bDescriptorType = 0x00000002
ConfigurationDescriptor : wTotalLength = 0x00000020
ConfigurationDescriptor : bNumInterfaces = 0x00000001
ConfigurationDescriptor : bConfigurationValue = 0x00000001
ConfigurationDescriptor : iConfiguration = 0x00000000
ConfigurationDescriptor : bmAttributes = 0x000000a0
ConfigurationDescriptor : MaxPower = 0x000000fa
ConfigurationHandle = 0x00000000
Interface[0]: Length = 56
Interface[0]: InterfaceNumber = 0
Interface[0]: AlternateSetting = 0
[306 ms] UsbSnoop - MyInternalIOCTLCompletion(a6b3e126) : fido=00000000, Irp=882c0368, Context=885ea8d0, IRQL=0
[306 ms] <<< URB 4 coming back <<< -- URB_FUNCTION_SELECT_CONFIGURATION: ConfigurationDescriptor = 0x8986bcb8 (configure) ConfigurationDescriptor : bLength = 9 ConfigurationDescriptor : bDescriptorType = 0x00000002 ConfigurationDescriptor : wTotalLength = 0x00000020 ConfigurationDescriptor : bNumInterfaces = 0x00000001 ConfigurationDescriptor : bConfigurationValue = 0x00000001 ConfigurationDescriptor : iConfiguration = 0x00000000 ConfigurationDescriptor : bmAttributes = 0x000000a0 ConfigurationDescriptor : MaxPower = 0x000000fa ConfigurationHandle = 0x88b188c0 Interface[0]: Length = 56 Interface[0]: InterfaceNumber = 0 Interface[0]: AlternateSetting = 0 Interface[0]: Class = 0x00000008 Interface[0]: SubClass = 0x00000006 Interface[0]: Protocol = 0x00000050 Interface[0]: InterfaceHandle = 0x899ddae0 Interface[0]: NumberOfPipes = 2 Interface[0]: Pipes[0] : MaximumPacketSize = 0x00000040 Interface[0]: Pipes[0] : EndpointAddress = 0x00000087 Interface[0]: Pipes[0] : Interval = 0x00000000 Interface[0]: Pipes[0] : PipeType = 0x00000002 (UsbdPipeTypeBulk) Interface[0]: Pipes[0] : PipeHandle = 0x899ddafc Interface[0]: Pipes[0] : MaxTransferSize = 0x00001000 Interface[0]: Pipes[0] : PipeFlags = 0x00000000 Interface[0]: Pipes[1] : MaximumPacketSize = 0x00000040 Interface[0]: Pipes[1] : EndpointAddress = 0x00000008 Interface[0]: Pipes[1] : Interval = 0x00000000 Interface[0]: Pipes[1] : PipeType = 0x00000002 (UsbdPipeTypeBulk) Interface[0]: Pipes[1] : PipeHandle = 0x899ddb1c Interface[0]: Pipes[1] : MaxTransferSize = 0x00001000 Interface[0]: Pipes[1] : PipeFlags = 0x00000000 [306 ms] UsbSnoop - FilterDispatchAny(a6b3dfd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL [306 ms] UsbSnoop - FdoHookDispatchInternalIoctl(a6b3e1ea) : fdo=8837b020, Irp=882c0368, IRQL=0 [306 ms] >>> URB 5 going down >>>
-- URB_FUNCTION_SELECT_INTERFACE:
ConfigurationHandle = 0x88b188c0
Interface: Length = 56
Interface: InterfaceNumber = 0
Interface: AlternateSetting = 0
Interface: Class = 0x00000008
Interface: SubClass = 0x00000006
Interface: Protocol = 0x00000050
Interface: InterfaceHandle = 899ddae0
Interface: NumberOfPipes = 2
[369 ms] UsbSnoop - MyInternalIOCTLCompletion(a6b3e126) : fido=00000000, Irp=882c0368, Context=885ea8d0, IRQL=0
[369 ms] <<< URB 5 coming back <<< -- URB_FUNCTION_SELECT_INTERFACE: ConfigurationHandle = 0x88b188c0 Interface: Length = 56 Interface: InterfaceNumber = 0 Interface: AlternateSetting = 0 Interface: Class = 0x00000008 Interface: SubClass = 0x00000006 Interface: Protocol = 0x00000050 Interface: InterfaceHandle = 8852c5b8 Interface: NumberOfPipes = 2 Interface: Pipes[0] : MaximumPacketSize = 0x00000040 Interface: Pipes[0] : EndpointAddress = 0x00000087 Interface: Pipes[0] : Interval = 0x00000000 Interface: Pipes[0] : PipeType = 0x00000002 (UsbdPipeTypeBulk) Interface: Pipes[0] : PipeHandle = 0x8852c5d4 Interface: Pipes[0] : MaxTransferSize = 0x00010000 Interface: Pipes[0] : PipeFlags = 0x00000000 Interface: Pipes[1] : MaximumPacketSize = 0x00000040 Interface: Pipes[1] : EndpointAddress = 0x00000008 Interface: Pipes[1] : Interval = 0x00000000 Interface: Pipes[1] : PipeType = 0x00000002 (UsbdPipeTypeBulk) Interface: Pipes[1] : PipeHandle = 0x8852c5f4 Interface: Pipes[1] : MaxTransferSize = 0x00010000 Interface: Pipes[1] : PipeFlags = 0x00000000 [369 ms] UsbSnoop - FilterDispatchAny(a6b3dfd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL [369 ms] UsbSnoop - FdoHookDispatchInternalIoctl(a6b3e1ea) : fdo=8837b020, Irp=882c0368, IRQL=0 [369 ms] >>> URB 6 going down >>>
-- URB_FUNCTION_CLASS_INTERFACE:
TransferFlags = 00000001 (USBD_TRANSFER_DIRECTION_IN, ~USBD_SHORT_TRANSFER_OK)
TransferBufferLength = 00000001
TransferBuffer = 884f7e60
TransferBufferMDL = 00000000
UrbLink = 00000000
RequestTypeReservedBits = 00000000
Request = 000000fe
Value = 00000000
Index = 00000000
[372 ms] UsbSnoop - MyInternalIOCTLCompletion(a6b3e126) : fido=00000000, Irp=882c0368, Context=885ea8d0, IRQL=2
[372 ms] <<< URB 6 coming back <<< -- URB_FUNCTION_CONTROL_TRANSFER: PipeHandle = 8851a600 TransferFlags = 0000000b (USBD_TRANSFER_DIRECTION_IN, USBD_SHORT_TRANSFER_OK) TransferBufferLength = 00000001 TransferBuffer = 884f7e60 TransferBufferMDL = 88369240 00000000: 00 UrbLink = 00000000 SetupPacket = 00000000: a1 fe 00 00 00 00 01 00 [373 ms] UsbSnoop - FilterDispatchAny(a6b3dfd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL [373 ms] UsbSnoop - FdoHookDispatchInternalIoctl(a6b3e1ea) : fdo=8837b020, Irp=882c0368, IRQL=2 [373 ms] >>> URB 7 going down >>>
-- URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:
PipeHandle = 8852c5f4 [endpoint 0x00000008]
TransferFlags = 00000000 (USBD_TRANSFER_DIRECTION_OUT, ~USBD_SHORT_TRANSFER_OK)
TransferBufferLength = 0000001f
TransferBuffer = 882567a0
TransferBufferMDL = 00000000
00000000: 55 53 42 43 68 03 2c 88 24 00 00 00 80 00 06 12
00000010: 00 00 00 24 00 00 00 00 00 00 00 00 00 00 00
UrbLink = 00000000
[374 ms] UsbSnoop - MyInternalIOCTLCompletion(a6b3e126) : fido=8836abf8, Irp=882c0368, Context=885ea8d0, IRQL=2
[374 ms] <<< URB 7 coming back <<< -- URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: PipeHandle = 8852c5f4 [endpoint 0x00000008] TransferFlags = 00000000 (USBD_TRANSFER_DIRECTION_OUT, ~USBD_SHORT_TRANSFER_OK) TransferBufferLength = 0000001f TransferBuffer = 882567a0 TransferBufferMDL = 89854dd0 UrbLink = 00000000 [374 ms] UsbSnoop - FilterDispatchAny(a6b3dfd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL [374 ms] UsbSnoop - FdoHookDispatchInternalIoctl(a6b3e1ea) : fdo=8837b020, Irp=882c0368, IRQL=2 [375 ms] >>> URB 8 going down >>>
-- URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:
PipeHandle = 8852c5d4 [endpoint 0x00000087]
TransferFlags = 00000002 (USBD_TRANSFER_DIRECTION_OUT, USBD_SHORT_TRANSFER_OK)
TransferBufferLength = 00000024
TransferBuffer = 00000000
TransferBufferMDL = 88369240
00000000: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00000020: 00 00 00 00
UrbLink = 00000000
[376 ms] UsbSnoop - MyInternalIOCTLCompletion(a6b3e126) : fido=8836abf8, Irp=882c0368, Context=885ea8d0, IRQL=2
[376 ms] <<< URB 8 coming back <<< -- URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: PipeHandle = 8852c5d4 [endpoint 0x00000087] TransferFlags = 00000003 (USBD_TRANSFER_DIRECTION_IN, USBD_SHORT_TRANSFER_OK) TransferBufferLength = 00000024 TransferBuffer = 00000000 TransferBufferMDL = 88369240 00000000: 05 80 02 00 33 00 00 00 42 4d 43 20 43 6f 72 70 00000010: 55 53 42 20 53 74 6f 72 61 67 65 20 20 20 20 20 00000020: 32 2e 33 31 UrbLink = 00000000 [376 ms] UsbSnoop - FilterDispatchAny(a6b3dfd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL [376 ms] UsbSnoop - FdoHookDispatchInternalIoctl(a6b3e1ea) : fdo=8837b020, Irp=882c0368, IRQL=2 [377 ms] >>> URB 9 going down >>>
-- URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:
PipeHandle = 8852c5d4 [endpoint 0x00000087]
TransferFlags = 00000000 (USBD_TRANSFER_DIRECTION_OUT, ~USBD_SHORT_TRANSFER_OK)
TransferBufferLength = 0000000d
TransferBuffer = 882567a0
TransferBufferMDL = 00000000
00000000: 55 53 42 43 68 03 2c 88 24 00 00 00 80
UrbLink = 00000000
[378 ms] UsbSnoop - MyInternalIOCTLCompletion(a6b3e126) : fido=8836abf8, Irp=882c0368, Context=885ea8d0, IRQL=2
[378 ms] <<< URB 9 coming back <<< -- URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER: PipeHandle = 8852c5d4 [endpoint 0x00000087] TransferFlags = 00000001 (USBD_TRANSFER_DIRECTION_IN, ~USBD_SHORT_TRANSFER_OK) TransferBufferLength = 0000000d TransferBuffer = 882567a0 TransferBufferMDL = 89854dd0 00000000: 55 53 42 53 68 03 2c 88 00 00 00 00 00 UrbLink = 00000000 [378 ms] UsbSnoop - FilterDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_QUERY_INTERFACE) [379 ms] UsbSnoop - FilterDispatchPnp: Query for Bus interface for USB Function Drivers. [379 ms] InterfaceType: USB_BUS_INTERFACE_USBDI_GUID [379 ms] UsbSnoop - FdoHookDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_QUERY_INTERFACE) [379 ms] UsbSnoop - FdoHookDispatchPnp: Query for Bus interface for USB Function Drivers. [379 ms] InterfaceType: USB_BUS_INTERFACE_USBDI_GUID [380 ms] UsbSnoop - FilterDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_QUERY_CAPABILITIES) [380 ms] UsbSnoop - FdoHookDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_QUERY_CAPABILITIES) [380 ms] UsbSnoop - FilterDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_QUERY_PNP_DEVICE_STATE) [380 ms] UsbSnoop - FdoHookDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_QUERY_PNP_DEVICE_STATE) [380 ms] UsbSnoop - FilterDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS) [380 ms] UsbSnoop - FdoHookDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS) [380 ms] UsbSnoop - FilterDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_QUERY_CAPABILITIES) [380 ms] UsbSnoop - FdoHookDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_QUERY_CAPABILITIES) [3820 ms] UsbSnoop - FilterDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_QUERY_CAPABILITIES) [3820 ms] UsbSnoop - FdoHookDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_QUERY_CAPABILITIES) [30999 ms] UsbSnoop - FilterDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS) [30999 ms] UsbSnoop - FdoHookDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS) [30999 ms] UsbSnoop - FilterDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS) [30999 ms] UsbSnoop - FdoHookDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS) [30999 ms] UsbSnoop - FilterDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_SURPRISE_REMOVAL) [30999 ms] UsbSnoop - FdoHookDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_SURPRISE_REMOVAL) [31030 ms] UsbSnoop - FilterDispatchPnp(a6b4245c) : IRP_MJ_PNP (IRP_MN_REMOVE_DEVICE)

The resulting device can be accessed via usbserial module.
just give it a hint: vendor=0x05c6 product=0x0015
If you have usbserial - you'll have to unload it first and supply it some arguments.
e.g. modprobe -r usbserial
modprobe usbserial vendor=0x05c6 product=0x0015

You'll get 3 new ttyUSB's now.
Now you can setup ppp and it will (hopefully) work.