HSDPA модемчик из китая и линукс.

Итак, я заставил его работать. Пришлось правда ставить винду параллельно, но не суть.
В общем эти модемы действуют так. Втыкаешь, и они определяются… как cdrom. С дровами. Под windows.
А уж дрова волшебной командой переключают модем в решим, где до него можно достучаться простым usbserial который есть в линухе с древних времен.
Для переключения придумали usb_modeswitch, но вот конфиг пришлось делать самому на основе снифа виндовых дров.
Вот оно:

########################################################
# 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

А вот собственно дамп, который я выцарапал с винды:


[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)

Теперь надо сказать usbserial'у, чтобы тот подцепил неизвестные ему до сего момента IDшники производителя и продукта.
modprobe usbserial vendor=0x05c6 product=0x0015
Оные опции лучше запихнуть куда-нибудь в конфиге, особенно если компьютер увешан этими usbserial конфертерами, как новогодняя елка.
Появится 3 усб девайса. Некоторые даже будут отвечать на AT команды.
Самое время настроить pppd/wvdial

SmartQ7 и CO2 лазер.

Готовим мой старенький сморчок для роли робомозга.
Для этой цели потребовался внутренний уарт. По счастью, с доступом к станку лазерной резки это просто. Спасибо Диме за помощь со станком.



На хедере содержаться пины:
Вход питания для зарядки батареи
3.3 вольта выход с регулятора
Земля (куда же без нее?)
RX/TX пины уарта.

Китайская поделка на InfoTM X220

Собственно свершилось. Ко мне дошел планшет на базе этого китайского чипа.
Помня большое количество мучений с SmartQ 7 я уже заготовил набор напильников, но оказалось, что китайцы в этот раз сделали все на удивление неплохо.
Итак, сначала самые основные пункты.
Тачскрин резистивный, но на удивление неплохой. нареканий особо нет, по клавиатуре не промахиваюсь, калибровка не сползает, при удержании стилуса на одном месте дребезг малозаметен.
GPS действительно есть и действительно работает. Внешняя антенка в комплекте пришлась кстати.
Видео SD и HD кушает очень неплохо, при помощи встроенного CCPlayer’a. Это поделие с «пакманом в наушниках» на значке не переводится на английский/русский но свое главное дело — играть фильмы делает. Разного рода HD кино я особо не гонял, еще предстоит, но SD играет на ура.
3D действительно есть, и действительно работает. Несколько скачанных с маркета игрушек завелись сразу.
Акселерометр тоже порадовал. aTilt3D на таком экране выглядит красиво и работает без нареканий и тормозов.
камера — обычный веб глаз, не думаю что говорить тут надо о ней особо.
Чувствительность микрофона могла бы быть и выше.
Динамики достаточно тихие, пока еще не смотрел решается ли эта проблема программно.
_ОЧЕНЬ_ порадовал USB. Оба порта не просто работают в 2.0 режиме, обеспечивая хорошую скорость как чтения, так и записи, но и еще выдают хороший ток. Планшет без проблем раскачал два внешний жесткий диска от одной батареи и перекопировал образ убунты с одного на другой. USB флешки/веники монтируются автоматом, если там fat, ext2/3 и все остальное не видит.

Теперь неприятные вещи и как с ними бороться.
Первое — это wowHome. Замена стандартному хоуму с «3д кубиком» для выбора приложений. Жрет около 40ка мегабайт памяти, и при установки LauncherPro или альтернативного хоума все равно запускается.
Судя по отрисовке, эта поделка не использует возможности 3д ускорителя, и рисует кубик через 2д — отсюда и тормоза.
Второе — «Живые обоины» не работают обычно как надо, если используют 3д. работают через раз, тормозят… в общем отключать. Благо не шибко большая потеря. \
Скайп не хочет работать нормально — звонит, а потом сразу call failed. Входящие звонки тоже не ловит — только текст.

Ну а теперь вооружимся напильником и доведем клиента до кондиции.
Сначала получаем права администратора при помощи Universal androot. проблем здесь никаких, все одной кнопкой. Далее через root explorer или командную строку ищем и переименоввываем/сносим wowHome.apk.
Это наконец прибьет китайский хоумскрин. Вместо него будет либо стандартный андройдовский хоум, либо тот, который поставите себе. Я влепил себе туда LauncherPro. Работает очень плавно, без замираний. Попутно это показало рисованную китайскую красавицу с светлоголубыми волосами.

Выглядит по любому лучше тормознутого WowHome. Сам девайс при этом разогнался, и по отзывчивости стал не слишком уступать моему Motorola Milestone.
Из прочего софта не помешает autorotate switcher, ибо лежать на боку и читать в альбомной ориентации экрана иначе не выйдет.
Но это уже на любителя.

Время работы. Погонять девайс еще предстоит, но за время просмотра 40-минутной серии мозгоразжижающего Fringe, который я скачал для тестов батарея села где-то на 40%.
Учитывая, что смотрел я его с внешнего жесткого диска при максимальной яркости подсветки вполне достойный результат. Посмотрим, как батарея будет деградировать со временем.
Антена WiFi немнго даже лучше майлстоуновской, соединение держит стабильно и проблем в стиле SmartQ7, от которых я избавлялся при помощи другой антенны, паяльника и великого русского языка не было. Сверху есть переключательль WiFi, что оказалось удобным. Подозреваю, что power management для адаптера они нормально не осилили, потому и вывели переключатель наружу.
Проверил — оказался прав. С программно выключенным вайфаем батарейка садиться немного быстрее.
Проводная сеть работает на ура, хотя ADSL я не тестил, ровно как и 3G.

Из прочих раздражающих мелочей — шипящий во время работы динамик и заметно пищащий при максимальной яркости экран.
Первое должен в теории вылечить фильтрующий кондер на питание усилка (Или DAC’a), но пока вскрывать и лезть внутро с паяльником не хочется.
Лекарств от второго я особо пока не знаю. К счастью, на максимальной яркости я обычно не работаю.

Linux на MT6235 КИТах.

Началось. Дружно говорим ребятам из проекта oscom-baseband спасибо. Я раньше думал, что мму в КИТах нет. Оказывается, в чипе MT6235 оно есть. И линух на нем подняли.
И это даже заработало на моем Е1000
Инструкции просты. Для начала берем телефон.

Находим внутренний уарт и подрубаем к своему любимому чипу уарт-в-усб.

Далее все по инструкциям отсюда: http://bb.osmocom.org/trac/wiki/SciphoneDreamG2

Из убута пашет nand, ram, mmc
Код инициализации PLLки жестко завесил мой аппарат, так что не вариант, увы. По крайней мере пока будем тормозить.

Но все же приятно, наконец увидеть:

/ # uname -a
Linux (none) 2.6.36-next-20101029+ #72 PREEMPT Wed Nov 17 14:10:39 CET 2010 armv5tejl GNU/Linux
/ # cat /proc/cpuinfo
Processor : ARM926EJ-S rev 5 (v5l)
BogoMIPS : 104.24
Features : swp half thumb fastmult edsp java
CPU implementer : 0x41
CPU architecture: 5TEJ
CPU variant : 0x0
CPU part : 0x926
CPU revision : 5

Hardware : E1000 Rachel
Revision : 0000
Serial : 0000000000000000
/ #

Я продублировал код scipfone и обозвал борду e1000-rachel. Большей частью потому, что потом будет и специфика, относительно моего аппарата.
Самое время фиксить баги, писать код… Блин, да я даже и не думал, что сие возможно будет.
Покурив даташит у меня потекли слюнки.
С 2d ускорителем, вайфаем, блютузом и тв…. Этой штукой можно будет на ура рулить радиуправляемыми модельками. Возможностей куча, железо архидешево.

Много DC движков, попытка номер раз.

Вместе с тов. Inky собрались и решили соорудить небольшой плоттер из подручных запчастей
Помимо прикидок что можно соорудить на коленке из имеющегося хлама, ампутации некоторых компонентов из старого писишнорго хлама соорудили и траванули платку многомоторного контроллера. В паре мест я накосячил конечно: пришлось орудовать провлочками, но тем не менее.
Вот она маленькая красавица:


Может рулить 6ю движками, в теории. Должна была рулить семью, но я прокосячил в одном месте.
Жаль конечно полностью не успели. Мне еще предстоит написаь код, а Inky закончить механику.

Китайская мобила + MakeProgress = Вольтметр питания УСБ

Собственно вожусь со своим сетапом для удаленной отладки. УСБ девайсов у меня много, 10портового хаба не хватает. Разумеется запитать все это дело, когда там заряжается планшет мобильник, питается несколько девборд и прч. проблемно. Надо бы знать, когда питалово проседает. По крайней мере пока я не поставлю более мощный адаптер питания.
В общем воспользовавшись АТ командой AT+EADC=1, православным башем, и плазмоидом MakeProgress получил примерно такое:

Китайская мобила подрубается к компу по блютуз последовательному порту, и еще работает как удаленная клавиатура. Весь софт я наваял на баше, исходник скрипта привожу ниже. Не слишком красиво, в идеале надо было делать демона на сях, но уж хрен с ним.
Аппаратный компорт остается свободен для аврки, которая управляет питанием всего.

at_daemon.sh

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#!/bin/bash
 
if [ -e /tmp/at_fifo ]; then
echo "Already ready."
cat /dev/rfcomm0 >> /tmp/at_fifo&
else
mkfifo /tmp/at_fifo
chmod 777 /tmp/at_fifo
echo "Configuring interface"
rfcomm bind rfcomm0 34:71:B9:53:66:01 10 
stty -F /dev/rfcomm0 115200 
echo "AT interface ready"
fi
 
#enable ADC & EKPD by default
 
./at_files/init.sh&
 
while true; do cat /tmp/at_fifo|while read line; do
#echo $line
CMD=`echo $line|cut -d" " -f1`
DATA=`echo $line|cut -d" " -f2| sed 's/.$//'`
case "$CMD" in
  "+EADC:")
  VBAT=`echo $DATA|cut -d"," -f1`
  VUSB=`echo $DATA|cut -d"," -f5`
  echo '{"minimum":0,"maximum":4.5,"value":'$VBAT'}' > /tmp/vbat
  echo '{"minimum":0,"maximum":6,"value":'$VUSB'}' > /tmp/vusb
  echo "VBAT=$VBAT; VUSB=$VUSB"
   ;;
  "+EKPDS:")
  KEYEVENT=`echo $DATA|cut -d"," -f1`
  KEYCODE=`echo $DATA|cut -d"," -f2`
  if [ $KEYEVENT -eq "1" ]; then
    echo $KEYCODE
    ./keymaps/e71.map $KEYCODE
    fi
  ;;
  "SEND")
  ATCMD=`echo $line|cut -d" " -f2`
  echo "$ATCMD" > /dev/rfcomm0
  echo "Sending CMD: $ATCMD"
  ;;
  "ERROR")
  echo "Bad stuff =("
  ;;
  "OK")
  echo "All fine"
  ;;
  *)
  echo $line
  ;;
 esac
done
done

init.sh
Высылает команды на включение вывода с ацп
AT() выдергиваем отсюда для своих нужд.

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
AT()
{
echo "SEND AT$1" > /tmp/at_fifo
}
sleep 5
#Since there's a bug/feature - a double command of the same thing just increases the poll frequency
AT "+EKPD=0"
AT "+EADC=0"
AT "+EKPD=1"
AT "+EADC=1"

e71.map
Пример мэппинга. В туду сделать его красивше, но это как-нибудь в следующий раз.
e71.map
A small and limited example of key mapping script. Yet to be remade into a better looking map using a more neat solution.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash -x
echo $1
 
case "$1" in
14)
  xdotool key Up
;;
15)
  xdotool key Down
;;
16)
  xdotool key Left
;;
17)
  xdotool key Right
;;

МейкПрогресс для этого пришлось немного хакнуть, он только в % отображал значение. Фичреквест отправил Никите Мельниченко, авось пофиксит к след. релизу.
P.S. Через TST-PS можно оказывается получать координаты нажатия на экран. Жаль в синий зуб не пробросишь…

madwimax + ap mode

Пришлось попотеть прежде чем заставить заработать субж на ноуте. По ходу модуь ath5k идущий с бубунтой 10.04 не умеет режима точки доступа и нужно ставить ath_pci. (Фанатики сча заорут про проприетарный hal и ненужность, бла бла.) Забавно, что снапшоты не заработали, и не хотел работать даже svn head. Все запускается, но не видят AP устройства, а сам лэптоп вайфай сетки.
Внезапно: modbrobe -r ath5k && modprobe ath_pci работать вообще никаким макаром не будет.Надо либо заблэклистить ath5k, и перезагрузиться, или


modprobe -r ath5k
переводим лэптоп в спячку
будим
modprobe ath_pci

Впрочим, виндофанаты могут сделать и ребут. Им не привыкать.
Ну а теперь самое главное скрипт, переключающий режимы wifi карточки между AP и STA

#!/bin/bash
WW=$1
if [ $WW == "ap" ]; then
ifconfig ath0 down
wlanconfig ath0 destroy
killall knetworkmanager
/etc/init.d/network-manager stop
wlanconfig ath0 create wlandev wifi0 wlanmode ap
#wlanconfig ath0 destroy
#wlanconfig ath0 create wlandev wifi0 wlanmode ap
#wlanconfig ath1 create wlandev wifi0 wlanmode sta nosbeacon
hostapd -B /etc/hostapd/anomalia.conf&
sleep 1
ifconfig ath0 192.168.0.1
/etc/init.d/dhcp3-server start
exit 0
fi
if [ "$WW" == "sta" ]; then
killall hostapd
ifconfig ath0 down
wlanconfig ath0 destroy
wlanconfig ath0 create wlandev wifi0 wlanmode sta nosbeacon
sleep 1
/etc/init.d/network-manager start
su necromant -c knetworkmanager&
/etc/init.d/dhcp3-server stop
sleep 1
exit 0
fi

./ap.sh ap прибивает network-manager & knetworkmanager
(Гномерам надо прибивать nm-applet)
./ap.sh sta возвращает sta режим.
Дешево, сердито, но работает.
Полный хавту писать было лень.

Где моя БСка, чувак?

Плохой сигнал йоты. Что делать? биквадрат самому позиционировать лень!
Но есть старый сканер, шаговый двигатель, attiny2313, uln2003a и немного свободного времени…

Дешевый и сердитый кондиционер.

Тут газенваген:
Freaking smoke!

Потому решил соорудить нечто, дабы моск не пропускал такты от перегрева…

2 ведра, вода, лед, насос и кулер от БП. Продуваем воздух через водяную камеру где разбрызгиваем воду (большое ведро) и вуоля!

Уже лучше. Эта малышка охладила воздух с 34 до 30… А потом кончился лед…
Впрочем в гроде сейчас хуже.

Леды!11

В общем работаю над автокрутилкой йотовской антенны. На прошлый выходных завел шаговое двигло на attiny2313 и uln2003a. Движок от хдд не прокатил — оказался 3хфазным бесколлекторным, который без лишнего геморроя не подключишь к простенькому контроллеру. Потому я использовал его вместо подшипника. Всю конструкцию оставил на даче на доработку, а попутно, уже дома сооружаю светодиодное оформление этого чуда инженерной мысли. Проблема в том, что пинов мало осталось свободных, а светодиодов навешать хочется много.
Но тут на помощь пришли регистры 74HCT273. Их мне отсыпали по 4ре рубля в честь распроджажи, в то время как сдвиговые были по десятке. Будучи человеком жадным, я соединил выход предыдущего со входом следующего, получил сдвиговый геристр. Вообще как пример в учебнике. Проверяем через LPT и обожемой! оно работает.
Ну все, теперь только закончить антенну….