2010년 8월 1일 일요일

Ubuntu에서 T-Login(HSDPA) 사용하기...

Ubuntu에서 T-Login을 사용하여 보자.


Ubuntu는 10.04, kernel 2.6.32-24이며 T-Login은 LG Innotek에 LM-629HUL 모델입니다.

기존에 IM-H100 (C-Motech) 모델의 경우 USB로 연결하면 /dev/ttyACM0로 연결이되기 때문에 kppp나 gnome-ppp에서 modem설정에서 ttyACM0로 설정을 하면 동작 됩니다.

하지만 C-Motech의 CHU-628S나 LG Innotek의 LM-629HUL의 경우 usb-modeswitch를 통해 mode를 변경해 줘야 합니다.


usb-modeswitch 1.1.3


libusb-0.1.12

컴파일하여 설치 합니다.

usb를 연결 후 lsusb 실행하면 아래와 같이 17d4:1004가 생깁니다.

codewalker@codewalker-desktop:~$ lsusb
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 004: ID 0603:00f2 Novatek Microelectronics Corp.
Bus 004 Device 003: ID 045e:0040 Microsoft Corp. Wheel Mouse Optical
Bus 004 Device 002: ID 0ac8:301b Z-Star Microelectronics Corp. ZC0301 Webcam
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 003: ID 1d74:1004
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
codewalker@codewalker-desktop:~$

Window에서도 PID가 1004로 붙고 driver 설치 후 PID가 00c9으로 변경되는 것을 확인 할 수 있습니다. 아마도 linux에서도 정상 동작 시키려면 1004가 00c9이 되면 되겠죠.
그래서 usb-modeswitch가 필요한 것입니다.

하지만 usb-modeswitch-data-20100707.tar.bz2 여기에는 LM-629HUL 모델 script가 없습니다.

usb-modeswitch-data-20100707를 설치 하셨다면 /etc/usb_modeswitch.d/에 1d74:1004로 아래의 파일을 만듭니다.

########################################################
# LG Innotek LM-629HUL

DefaultVendor=0x1d74
DefaultProduct=0x1004

TargetClass=0xff

CheckSuccess=20

MessageContent="55534243b82e238c240000008000081c020000000000000000000000000000"

위에 값을 어떻게 찾을 것인가가 최대의 문제 였습니다.

C-Motech CHU-629S가 제일 비슷하다고 판단하였습니다.

16d8:700a를 복사 하였고 DefaultVendor와 DefaultProduct는 lsusb의 값이 1d74그리고 1004를 입력 한다.

TargetClass의 경우 필요한지 판단할 수 없지만 Windows에서 드라이버 등록 정보를 보면 Class가 0xff로 되어 있는 부분을 확인 할 수 있다.

그리고 MessageContent 이 값은 usb-modeswitch의 설명 처럼 SniffUSB를 이용하여 logging을 할 수 있지만 plug/unplug를 해도 엄청난 line의 log가 생깁니다.

일단 UsbSnoop.log을 봅시다.

어떤 값을 MessageContent에 넣어야 할지 판단이 되지 않는다.


위에 사이트에 보면 IRP_MN_SURPRISE_REMOVAL를 검색해 보면 될거란 힌트를 얻을 수 있습니다.

아래의 log는 연결하고자 하는 pc에서 얻는 값이다.

[2577207 ms] <<<>
-- URB_FUNCTION_SELECT_INTERFACE:
ConfigurationHandle = 0x892e6698
Interface: Length = 56
Interface: InterfaceNumber = 0
Interface: AlternateSetting = 0
Interface: Class = 0x00000008
Interface: SubClass = 0x00000006
Interface: Protocol = 0x00000050
Interface: InterfaceHandle = 8911d440
Interface: NumberOfPipes = 2
Interface: Pipes[0] : MaximumPacketSize = 0x00000200
Interface: Pipes[0] : EndpointAddress = 0x00000001
Interface: Pipes[0] : Interval = 0x00000000
Interface: Pipes[0] : PipeType = 0x00000002 (UsbdPipeTypeBulk)
Interface: Pipes[0] : PipeHandle = 0x8911d45c
Interface: Pipes[0] : MaxTransferSize = 0x00001000
Interface: Pipes[0] : PipeFlags = 0x00000000
Interface: Pipes[1] : MaximumPacketSize = 0x00000200
Interface: Pipes[1] : EndpointAddress = 0x00000081
Interface: Pipes[1] : Interval = 0x00000000
Interface: Pipes[1] : PipeType = 0x00000002 (UsbdPipeTypeBulk)
Interface: Pipes[1] : PipeHandle = 0x8911d47c
Interface: Pipes[1] : MaxTransferSize = 0x00001000
Interface: Pipes[1] : PipeFlags = 0x00000000
[2577207 ms] UsbSnoop - FilterDispatchAny(adb9cfd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL
[2577207 ms] UsbSnoop - FdoHookDispatchInternalIoctl(adb9d1ea) : fdo=88fcbc08, Irp=8924c678, IRQL=0
[2577207 ms] >>> URB 6 going down >>>
-- URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:
PipeHandle = 8911d45c
TransferFlags = 00000002 (USBD_TRANSFER_DIRECTION_OUT, USBD_SHORT_TRANSFER_OK)
TransferBufferLength = 0000001f
TransferBuffer = b8513990
TransferBufferMDL = 00000000
00000000: 55 53 42 43 b8 2e 23 8c 24 00 00 00 80 00 08 1c
00000010: 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00
UrbLink = 00000000
[2577209 ms] UsbSnoop - MyInternalIOCTLCompletion(adb9d126) : fido=00000000, Irp=8924c678, Context=8910a008, IRQL=2
[2577209 ms] <<<>
-- URB_FUNCTION_BULK_OR_INTERRUPT_TRANSFER:
PipeHandle = 8911d45c
TransferFlags = 00000002 (USBD_TRANSFER_DIRECTION_OUT, USBD_SHORT_TRANSFER_OK)
TransferBufferLength = 0000001f
TransferBuffer = b8513990
TransferBufferMDL = 8a32bcc8
UrbLink = 00000000
[2577209 ms] UsbSnoop - FilterDispatchPnp(adba145c) : IRP_MJ_PNP (IRP_MN_QUERY_CAPABILITIES)
[2577209 ms] UsbSnoop - FdoHookDispatchPnp(adba145c) : IRP_MJ_PNP (IRP_MN_QUERY_CAPABILITIES)
[2577209 ms] UsbSnoop - FilterDispatchPnp(adba145c) : IRP_MJ_PNP (IRP_MN_QUERY_PNP_DEVICE_STATE)
[2577209 ms] UsbSnoop - FdoHookDispatchPnp(adba145c) : IRP_MJ_PNP (IRP_MN_QUERY_PNP_DEVICE_STATE)
[2577209 ms] UsbSnoop - FilterDispatchPnp(adba145c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS)
[2577209 ms] UsbSnoop - FdoHookDispatchPnp(adba145c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS)
[2577213 ms] UsbSnoop - FilterDispatchPnp(adba145c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS)
[2577213 ms] UsbSnoop - FdoHookDispatchPnp(adba145c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS)
[2577213 ms] UsbSnoop - FilterDispatchPnp(adba145c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS)
[2577213 ms] UsbSnoop - FdoHookDispatchPnp(adba145c) : IRP_MJ_PNP (IRP_MN_QUERY_DEVICE_RELATIONS)
[2577213 ms] UsbSnoop - FilterDispatchPnp(adba145c) : IRP_MJ_PNP (IRP_MN_SURPRISE_REMOVAL)
[2577213 ms] UsbSnoop - FdoHookDispatchPnp(adba145c) : IRP_MJ_PNP (IRP_MN_SURPRISE_REMOVAL)
[2577243 ms] UsbSnoop - FilterDispatchPnp(adba145c) : IRP_MJ_PNP (IRP_MN_REMOVE_DEVICE)
[2577818 ms] UsbSnoop - FilterAddDevice(adba1748) : DriverObject 890f2950, pdo 893516b8
[2577818 ms] UsbSnoop - FilterDispatchPnp(adba145c) : IRP_MJ_PNP (IRP_MN_QUERY_LEGACY_BUS_INFORMATION)
[2577818 ms] UsbSnoop - FdoHookDispatchPnp(adba145c) : IRP_MJ_PNP (IRP_MN_QUERY_LEGACY_BUS_INFORMATION)
[2577818 ms] UsbSnoop - FilterDispatchPnp(adba145c) : IRP_MJ_PNP (IRP_MN_QUERY_RESOURCE_REQUIREMENTS)
[2577818 ms] UsbSnoop - FdoHookDispatchPnp(adba145c) : IRP_MJ_PNP (IRP_MN_QUERY_RESOURCE_REQUIREMENTS)
[2577818 ms] UsbSnoop - FilterDispatchPnp(adba145c) : IRP_MJ_PNP (IRP_MN_FILTER_RESOURCE_REQUIREMENTS)
[2577818 ms] UsbSnoop - FdoHookDispatchPnp(adba145c) : IRP_MJ_PNP (IRP_MN_FILTER_RESOURCE_REQUIREMENTS)
[2577818 ms] UsbSnoop - FilterDispatchPnp(adba145c) : IRP_MJ_PNP (IRP_MN_START_DEVICE)
[2577818 ms] UsbSnoop - FdoHookDispatchPnp(adba145c) : IRP_MJ_PNP (IRP_MN_START_DEVICE)
[2577819 ms] UsbSnoop - FilterDispatchAny(adb9cfd2) : IRP_MJ_SYSTEM_CONTROL
[2577822 ms] UsbSnoop - FilterDispatchAny(adb9cfd2) : IRP_MJ_INTERNAL_DEVICE_CONTROL
[2577822 ms] UsbSnoop - FdoHookDispatchInternalIoctl(adb9d1ea) : fdo=8a283890, Irp=890ce4d0, IRQL=0
[2577822 ms] >>> URB 1 going down >>>
-- URB_FUNCTION_GET_DESCRIPTOR_FROM_DEVICE:

#sudo usb_modeswitch -W -c /etc/usb_modeswitch.d/1d74:1004

codewalker@codewalker-desktop:~$ lsusb
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 004: ID 0603:00f2 Novatek Microelectronics Corp.
Bus 004 Device 003: ID 045e:0040 Microsoft Corp. Wheel Mouse Optical
Bus 004 Device 002: ID 0ac8:301b Z-Star Microelectronics Corp. ZC0301 Webcam
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 008: ID 1d74:00c9
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
codewalker@codewalker-desktop:~$

위와 같이 Product id가 바뀌어 있다.

이제 usbserial 드라이버를 올릴 차례입니다.

sudo lsmod usbserial vendor=0x1d74 product=0x00c9

그럼 /dev/ttyUSB 노드가 생성됩니다.

그후 kppp

오늘은 피곤해서 여기까지 낼 다시 작성하겠습니다.
댓글 쓰기