2010년 8월 18일 수요일

odroid에 T-Login(LM-629HUL) 사용하기

이전에 HSDPA USB Modem(LM-629HUL )을 linux에서 사용하기 위한 내용을 posting 하였습니다.
linux에 먼저 작업한 이유는 odroid-t에 t-login을 사용하기 위해서 입니다.

그래서 이번 내용은 이전에 올렸던 linux 작업했던 내용을 이어서 android에 HSDPA USB Modem porting 방법을 posting합니다.

x86 usb-modeswitch는 libusb-0.1 버전을 사용하였습니다.
하지만 libusb android를 검색하면 libusb-1.0 버전이 있습니다.
그리고 libusb-1.0에 libusb-0.1버전을 사용할 수 있는 libusb-compat가 있습니다.
둘다 android용으로 library가 존재 합니다.
하지만 external에 넣고 빌드 하여 libusb.so와 libusb-compat.so를 만들어지만 dynamic link가 되지 않아서 configure에 --enable-static을 둘다 주고 usb_modeswitch도 static으로 만듭니다.
usbutils 역시 동일하게 static으로 만들면 lsusb를 통하여 usb mode switch가 되었는지 확인이 가능합니다.

여기서부터 추가
external 밑에 아래 세 폴더를 복사 합니다.
monaka-libusb-android-b35de21
monaka-libusb-compat-android-85dc44d
usb-modeswitch-1.1.3

monaka는 Android.mk가 있습니다.

usb-modeswitch-1.1.3에 Android.mk는 아래와 같습니다.

1 ifeq ($(TARGET_ARCH),arm)
2
3 LOCAL_PATH:= $(call my-dir)
4 include $(CLEAR_VARS)
5
6 LOCAL_SRC_FILES:= \
7 usb_modeswitch.c
8
9 LOCAL_SHARED_LIBRARIES := \
10 libusb-compat libusb
11
12 LOCAL_C_INCLUDES := \
13 $(LOCAL_PATH)/include
14
15 LOCAL_CFLAGS := \
16 -Iexternal/monaka-libusb-compat-android-85dc44d/libusb -pthread -rt
17
18 LOCAL_MODULE:= usb_modeswitch
19
20 include $(BUILD_EXECUTABLE)
21
22 endif

이렇게 추가하면 odroidt-img/system/bin/usb_modeswitch와 odroidt-img/system/lib/libusb.so, libusb-compat.so가 생깁니다.

그리고 추가로 external/monaka-libusb-android-b35de21/examples을 컴파일 하면 lsusb가 생깁니다.
Android.mk는 아래와 같습니다.

1 ifeq ($(TARGET_ARCH),arm)
2
3 LOCAL_PATH:= $(call my-dir)
4
5 include $(CLEAR_VARS)
6
7 LOCAL_SRC_FILES:= \
8 lsusb.c
9
10 LOCAL_C_INCLUDES += $(LOCAL_PATH)/android \
11 external/monaka-libusb-android-b35de21
12
13 LOCAL_SHARED_LIBRARIES := \
14 libusb
15
16 LOCAL_CFLAGS := \
17 -pthread -rt
18
19 LOCAL_MODULE:= lsusb
20
21 include $(BUILD_EXECUTABLE)
22
23 endif

이렇게 위에서 언급한 static문제는 해결 되었습니다.
추가 끝

다음 단계로 커널에 usb file system이 올라 가야 합니다. kernel에 usb file system을 추가 하시고
odroid-t는 ramdisk를 사용함으로 vendor/sec/android/conf/init_ramdisk.rc 파일에 usbfs를 mount하도록 추가 합니다.

mount usbfs none /proc/bus/usb

다음 부터는 아래 주소에 있는 x86 emulator에서 HSDPA를 연결한 내용을 참고하였습니다.

내용을 간략하게 설명하면 host linux에 modem을 연결하면 ttyUSB가 생성되고 여기서 command port인 ttyUSB3을 android의 ttyS1으로 연결한다는 내용입니다.

vendor/sec/odroidt/system.prop 파일을 아래와 같이 수정 합니다.

1 #
2 # system.prop for odroidt
3 #
4
5 rild.libpath=/system/lib/libreference-ril.so
6 #codewalker
7 #rild.libargs=-d /dev/ttyS0
8 rild.libargs=-d /dev/ttyUSB3
9 ro.sf.lcd_density=240

다음에 linux atdt sk라고 검색하면 HSDPA를 PPP에서 동작 하도록 하는 내용이 있습니다.
이 부분은 x86에서 가져온 chat이 있다면 desktop과 동일하게 처리 되는 부분입니다.

아래 사이트에 가면 ppp에 관한 내용이 있고 HSDAP USB modem에 AT command로 connection하는 내용이 있습니다.


usb_modeswitch를 통해 usb modem을 storage card에서 modem으로 변경 해줍니다.
insmod /modules/usbserial.ko 'vendor=0x1d74 product=0x00c9'으로 ttyUSB 노드를 생성해 줍니다.
여기서 따옴표를 주지 않으면 두번째 parameter product인자가 제대로 넘어가지 않습니다.
ppp call gprs를 호출 하면 t-login 모뎀이 녹색으로 바뀌면서 동작합니다.

지금은 간략하게 작성하였고 차후에 추가 보강하겠습니다.

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

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