mpx on serial port

2009. 5. 31. 04:22 from 컴퓨터/Linux
멀티포인트 프로젝트를 시작한지 벌써 두달이..

다시 되새겨보면, 임베디드 보드에서 멀티 좌표 정보를 보내주고, USB를 통해 리눅스 디바이스 드라이버를 만드는 것이 최종 목적이다.
하지만 현재 임베디드 보드 상에서 멀티 좌표 정보를 보내줄 수 있는 형편이 아니다. 문제로는 보드 상에서 영상처리를 위해 제공되는 라이브러리나 드라이버 등을 고려해서 제한적인 웹캠만 가능하기 때문이다... ln2440의 r1.4 lcd를 이용해서 임베디드 리눅스를 탑재해서 하려고 했으나, 결국 해당 lcd에 대한 리눅스 디바이스 드라이버가 존재하지 않아서 포기! (제조사에서 제공을 안해줌).
그리고, smdk2440 보드에서 임베디드 리눅스를 포팅하고 하고 있는데, 웹캠 드라이버가 적재되었지만, 해당 qt 버전과 gcc 컴파일러 버전이 너무 낮아서 현재 설치된 서버용 리눅스에서 가동이 안된다는 점.. 아무튼 어려움이 많았다.

그런 상황에서 일단, ln2440 보드에 winCE를 탑재하고나서 로지텍Pro5000 웹캠을 기다리는 중이다... 일단은 winCE에서 lcd에 터치를 하면, 그 좌표 정보를 서버용 리눅스에 전송하게 하였고(강세욱 담당), 전송받은 데이터를 리눅스 드라이버단에서 처리하여 터치스크린 이벤트로 전달하여 mpx기반의 X-window에서 두개 이상의 좌표로 인식하게 하는 것으로 마무리를 지었다. 영상처리를 추가해야 진짜 멀티 포인트인데...

암튼 현 상황은 아래와 같다.



뭐니뭐니해도 임베디드 보드에서 보내는 시리얼 데이터를 가동되는 리눅스 상에서 인터럽트로 처리하는 것이 중요하다. 물론, 터치 스크린 드라이버는 기존 리눅스에 있는 시리얼 기반의 터치 스크린 드라이버를 참조해서, 최대한 비슷하게 구현하였다. (0x80의 의미는 몇년이 지나도 잊혀지지 않을 만큼 나에게 충격을 주었다.. 시리얼 기반이라 0x00이 전송이 불가능하다는 거.. 이걸 어찌 알고 0x80으로 미리 선수를 썼는지..암튼.. 존경스러운 전세계 해커들..)

실행 방법을 까먹을 듯하여 정리해본다.

1) 터치 스크린용 이벤트 드라이버를 생성하는 시리얼 디바이스 드라이버 적재

# insmod uv_mtd.ko
# ./inputattach --uv_mtd /dev/ttyS0 &
# dmesg
May 31 11:20:22 mola_server uv_mtd_init
May 31 11:20:27 mola_server serio: Serial port ttyS0
May 31 11:20:27 mola_server uv_mtd_connect
May 31 11:20:27 mola_server uv_mtd[0] ttyS0/serio0/input0
May 31 11:20:27 mola_server uv_mtd[1] ttyS0/serio0/input1
May 31 11:20:27 mola_server input: UV Serial Multi-TouchScreen #1 as /class/input/input8
May 31 11:20:27 mola_server input: UV Serial Multi-TouchScreen #2 as /class/input/input9


2) 임베디드 보드에서 시리얼로 좌표값을 보내는 프로그램 실행 후 터치 테스트

# dmesg
uv_mtd->count = 2
uv_mtd->length = 13
0 input_report_abs(uv_mtd->dev, ABS_X, 543)
0 input_report_abs(uv_mtd->dev, ABS_Y, 176)
0 input_report_key(uv_mtd->dev, BTN_TOUCH, 0)
1 input_report_abs(uv_mtd->dev, ABS_X, 553)
1 input_report_abs(uv_mtd->dev, ABS_Y, 176)
1 input_report_key(uv_mtd->dev, BTN_TOUCH, 0)

3) X-server 가동

ssh1# ./start_xserver
ssh2# ./start_xclient
ssh3# ./start_mpwm
ssh4# xterm &
ssh4# xinput --list --short
"Virtual core pointer"  id=0    [XPointer]
"Virtual core keyboard" id=1    [XKeyboard]
"Virtual core Xtst pointer"     id=2    [XExtensionPointer]
"Virtual core Xtst keyboard"    id=3    [XExtensionKeyboard]
"Mouse0"        id=4    [XExtensionPointer]
"Mouse1"        id=5    [XExtensionPointer]
"Keyboard0"     id=6    [XExtensionKeyboard]
"<default pointer>"     id=7    [XExtensionPointer]
# xinput --create-master "foobar1"
# xinput --reattach "Mouse0" "foobar1 pointer"
# xinput --create-master "foobar2"
# xinput --reattach "Mouse1" "foobar2 pointer"
# xinput --list --short
"Virtual core pointer"  id=0    [XPointer]
"Virtual core keyboard" id=1    [XKeyboard]
"Virtual core Xtst pointer"     id=2    [XExtensionPointer]
"Virtual core Xtst keyboard"    id=3    [XExtensionKeyboard]
"Mouse0"        id=4    [XExtensionPointer]
"Mouse1"        id=5    [XExtensionPointer]
"Keyboard0"     id=6    [XExtensionKeyboard]
"<default pointer>"     id=7    [XExtensionPointer]
"foobar1 pointer"       id=8    [XPointer]
"foobar1 keyboard"      id=9    [XKeyboard]
"foobar1 Xtst pointer"  id=10   [XExtensionPointer]
"foobar1 Xtst keyboard" id=11   [XExtensionKeyboard]
"foobar2 pointer"       id=12   [XPointer]
"foobar2 keyboard"      id=13   [XKeyboard]
"foobar2 Xtst pointer"  id=14   [XExtensionPointer]
"foobar2 Xtst keyboard" id=15   [XExtensionKeyboard]

4) 추가적인 설정 사항 (Xorg.conf)

Section "ServerLayout"
        Identifier     "X.org Configured"
        Screen      0  "Screen0" 0 0
        InputDevice    "Mouse0" "SendCoreEvents"     <- 중요
        InputDevice    "Mouse1" "SendCoreEvents"     <- 중요
        InputDevice    "Keyboard0" "CoreKeyboard"
        Option         "AllowEmptyInput" "off"
        Option         "AutoAddDevices" "off"
EndSection
...........중략..........
Section "InputDevice"
        Identifier  "Mouse0"
        Driver      "evdev"
        Option      "Protocol" "usb"
        Option      "Device" "/dev/input/event6"       <- 위에 적재된 모듈에 의해 생성된 event 파일 #1
        Option      "ZAxisMapping" "4 5"
EndSection
Section "InputDevice"
        Identifier  "Mouse1"
        Driver      "evdev"
        Option      "Protocol" "usb"
        Option      "Device" "/dev/input/event7"       <- 위에 적재된 모듈에 의해 생성된 event 파일 #2
        Option      "ZAxisMapping" "4 5"
EndSection



p.s. 시리얼 디바이스 드라이버를 개인적으로 꼭 정리하고 싶다. 너무나 고생한 걸 생각하면... ㅡ.ㅜ
Posted by wbhacker :



너무나 돌아온 느낌이다. 시리얼 통신으로 터치스크린 이벤트 좌표값을 가져오기 위해서 구현하는 것인데... 원래는 USB로 할 예정이지만, 그 전에 시리얼로 한번 해보는 것이다. 특별한 설정 없이도 되는 줄 알고.. 하지만, 시리얼 디바이스 드라이버 구현보다는, 연결에 어려움이 꽤 있었다.

우선 kernel의 driver/input/touchscreen/mtouch.c 파일의 내용을 수정해서 새로운 uv_mtd 장치에 대한 시리얼 디바이스 드라이버를 작성하였다.

static int __init mtouch_init(void)
{
        return serio_register_driver(&mtouch_drv);
}

static void __exit mtouch_exit(void)
{
        serio_unregister_driver(&mtouch_drv);
}

module_init(mtouch_init);
module_exit(mtouch_exit);




위 소스는 모듈의 등록과 해제를 담당하는 루틴으로, 보면 insmod 해당모듈.ko를 하게 되면, 그냥 serio_register_driver이 호출되고, 드라이버가 새로이 등록되버린 상태로 가만히 있게 된다.

static irqreturn_t mtouch_interrupt(struct serio *serio,
                unsigned char data, unsigned int flags)
{
        struct mtouch* mtouch = serio_get_drvdata(serio);

        mtouch->data[mtouch->idx] = data;

        if (MTOUCH_FORMAT_TABLET_STATUS_BIT & mtouch->data[0])
                mtouch_process_format_tablet(mtouch);
        else if (MTOUCH_RESPONSE_BEGIN_BYTE == mtouch->data[0])
                mtouch_process_response(mtouch);
        else
                printk(KERN_DEBUG "mtouch.c: unknown/unsynchronized data from device, byte %x\n",mtouch->data[0]);

        return IRQ_HANDLED;
}



위 루틴은 해당 드라이버의 인터럽트 처리 부분이다. 즉, 시리얼 포트(ttyS0)를 통해 데이터가 들어오면, 위 루틴에서 처리를 담당하는 것이다. 이 말은, 데이터가 들어오게 되면 무조건 인터럽트가 걸리게 된다는 것으로, 이 함수에 들어와야 정상이다.. 하지만, 단순히 모듈을 적재하는 것으로 인터럽트를 연결하진 못했다. 이 전에 인터럽트 자체가 등록이 되지 않은 상황이었다. ㅡ.ㅜ

static int mtouch_connect(struct serio *serio, struct serio_driver *drv)
{
        struct mtouch *mtouch;
        struct input_dev *input_dev;
        int err;

        mtouch = kzalloc(sizeof(struct mtouch), GFP_KERNEL);
        input_dev = input_allocate_device();
        if (!mtouch || !input_dev) {
                err = -ENOMEM;
                goto fail1;
        }

        mtouch->serio = serio;
        mtouch->dev = input_dev;
        snprintf(mtouch->phys, sizeof(mtouch->phys), "%s/input0", serio->phys);

        input_dev->name = "MicroTouch Serial TouchScreen";
        input_dev->phys = mtouch->phys;
        input_dev->id.bustype = BUS_RS232;
        input_dev->id.vendor = SERIO_MICROTOUCH;
        input_dev->id.product = 0;
        input_dev->id.version = 0x0100;
        input_dev->dev.parent = &serio->dev;
        input_dev->evbit[0] = BIT_MASK(EV_KEY) | BIT_MASK(EV_ABS);
        input_dev->keybit[BIT_WORD(BTN_TOUCH)] = BIT_MASK(BTN_TOUCH);
        input_set_abs_params(mtouch->dev, ABS_X, MTOUCH_MIN_XC, MTOUCH_MAX_XC, 0, 0);
        input_set_abs_params(mtouch->dev, ABS_Y, MTOUCH_MIN_YC, MTOUCH_MAX_YC, 0, 0);

        serio_set_drvdata(serio, mtouch);

        err = serio_open(serio, drv);
        if (err)
                goto fail2;

        err = input_register_device(mtouch->dev);
        if (err)
                goto fail3;

        return 0;

 fail3: serio_close(serio);
 fail2: serio_set_drvdata(serio, NULL);
 fail1: input_free_device(input_dev);
        kfree(mtouch);
        return err;
}



우선 인터럽트를 등록하는 위 connect 함수가 호출되어야 한다. 하지만, 이 함수 역시 모듈 적재만으론 되지 않았다. 솔직히 이 문제를 해결하기 위해 약 3일간 밤낮없이 고생한 것 같다. 구글에 검색을 해봐도 이 문제에 봉착한 경우만 있지, 해결 방법에 대해선 별다른 말이 없었기 때문이다. 그 과정에서 알게 된 것이 setserial과 inputattach 프로그램 뿐이었고, 이것에 대한 자세한 설명도 없는 상황이었다.

/*
 * The serio driver structure.
 */

static struct serio_device_id mtouch_serio_ids[] = {
        {
                .type   = SERIO_RS232,
                .proto  = SERIO_MICROTOUCH,
                .id     = SERIO_ANY,
                .extra  = SERIO_ANY,
        },
        { 0 }
};

MODULE_DEVICE_TABLE(serio, mtouch_serio_ids);

static struct serio_driver mtouch_drv = {
        .driver         = {
                .name   = "mtouch",
        },
        .description    = DRIVER_DESC,
        .id_table       = mtouch_serio_ids,
        .interrupt      = mtouch_interrupt,
        .connect        = mtouch_connect,
        .disconnect     = mtouch_disconnect,
};



위 소스와 같이 mtouch_drv는 mtouch_init 함수에 의해서 시리얼 디바이스 드라이버로 등록이 되지만, 실제로 .connect로 정의된 mtouch_connect 함수는 호출이 되지 않는 문제...

결국은, 구글 검색의 힘(해커들의 질의응답... 검색어는 "lagacy serial driver .connect")으로 해결할 수 있었다.

- 참고사이트1 : http://kerneltrap.org/mailarchive/linux-kernel-mentors/2007/12/5/477437
- 참고사이트2 : http://lkml.org/lkml/2007/6/19/254 - Writing a driver for a legacy serial device
- 참고사이트3 : http://lkml.indiana.edu/hypermail/linux/kernel/0706.2/1755.html

The problem is that taos_connect is never called. I suppose that I need
different values for .type, .proto or .id, except that I just don't
know what to put there. I tried a few random values without success.
What's the trick?


참고로 위 질문에서 나의 문제와 똑같다는 것을 느끼게 되었다. 이 never called라는 메시지가 정말 반가웠다 ㅡ.ㅜ
해당 글의 쓰레드를 조금 추적해서 들어가면 inputattach.c 소스를 구할 수 있고(http://linuxconsole.cvs.sourceforge.net/viewvc/*checkout*/linuxconsole/ruby/utils/inputattach.c), 이 프로그램에 새로운 시리얼 디바이스의 속성을 지정하고, 실행하면 해당 시리얼 디바이스 드라이버와 연결된다는 것을 알게 되었다.
inputattach를 실제 실행하면, 키보드 입력을 받게 되어 있어서 어떻게 사용하는지 조금 난해했었다.

kernel/Documentation/input/joystick.txt 문서에서 inputattach -xxx /dev/tts/X & 를 보고, 이렇게 하니 잘 되었다;;

May 30 09:55:29 mola_server uv_mtd_init
May 30 09:55:59 mola_server serio: Serial port ttyS0
May 30 09:55:59 mola_server uv_mtd_connect
May 30 09:55:59 mola_server uv_mtd ttyS0/serio0/input0
May 30 09:55:59 mola_server input: UV Serial Multi-TouchScreen as /class/input/input13
May 30 09:56:12 mola_server uv_mtd_interrupt
May 30 09:56:12 mola_server uv_mtd unknown/unsynchronized data from device, byte 53
May 30 09:56:12 mola_server uv_mtd_interrupt
May 30 09:56:12 mola_server uv_mtd unknown/unsynchronized data from device, byte 63
May 30 09:56:12 mola_server uv_mtd_interrupt
May 30 09:56:12 mola_server uv_mtd unknown/unsynchronized data from device, byte 72



위 메시지는 커널의 메시지이며, insmod uv_mtd.ko를 하고 ./inputattach --uv_mtd /dev/ttyS0 & 를 한 후, 시리얼을 통해 데이터를 보낸 상태이다. 아직 인터럽트에서 제대로 처리를 하지 않아 위 메시지가 나왔지만, 인터럽트 내에 제대로 진입한 것을 볼 수 있다.;;

p.s.#1 이거 안되면 드라이버단에서 sys_open( /dev/ttyS0 )을 해서 처리하려고 했었다..
         장치에서 값이 들어오든 안들어오든 무조건 blocking된 상태에서 말이다.;;; 그래도 다행이다. 드라이버 단에서 되서~
p.s.#2 앞으로는 이벤트 드라이버와 연결해서 시리얼에서 온 데이터를 이벤트화 하면 된다.
         (이벤트 드라이버는 이미 테스트 종료 상태 ^^;;)

Posted by wbhacker :
얼마전에 임베디드 공모대전 부상으로 받은 LN2440SBC 보드에 리눅스를 포팅한 적이 있다.
그런데, LCD에 펭귄 로고가 나오지 않았다. 그래서 펌웨어 테스트도 해보고... 등등 시도를 해봤었지만, 결국 안되었다.

그 이유를 아이씨뱅크(주)에 직접 전화해서 엔지니어를 통해 알아보니, LP35 R1.4 버전을 사용하고 있는 상황이라 CD 내에 있는 모든 버전은 아마 R1.2에 대한 것이라고 응답을 받았다. 그리고, R1.4 버전의 펌웨어를 이메일로 전달받은 상황이다. 혹시나해서 리눅스용이나 윈CE용 디바이스 드라이버를 요청해보았다.

이에 대한 응답으로 윈CE용 EBOOT 파일만 전달받은 상태이며, 그 외 리눅스에 대한 드라이버는 CLabsys에서 보내주지 않았다고 한다.
그래서 또, CLabsys 쪽에 전화를 해서, 알아보았다. 결국 리눅스용 디바이스 드라이버는 지원하지 않는단다...

좀 이해가 되지 않는다. 디바이스를 만들어놓고 드라이버가 없다는 것이... 뭐 그래도 모든 운영체제에 대해 드라이버를 제공해야 할 의무는 없으니... 그럼 CD 내에 있는 LN2440SBC 보드용 리눅스 커널은 테스트용이란 말인가?

LP35 R1.2버전과 R1.4버전의 차이점을 분석하고 보드용 리눅스 커널을 수정하는 수 밖에 별 방법이 없는 것 같다.
Posted by wbhacker :

SMDK2440을 2년전에 다뤄보고 안 다뤄봤다. 그래서 자료도 있는 줄 알았는데, 어딘가에 감춰져 있었다.;; 여기저기 문의를 하고, 검색해보고 결국은 리눅스 커널을 포팅하고 부팅하는 데 성공하였다. 나중에 똑같은 실수를 안하기 위해 이렇게 기록한다.

SMDK2440에 리눅스 커널을 포팅하기 위해서는 기본적으로 SMDK2440에서 사용할 수 있는 부트로더(u-boot)가 필요하게 된다. 그리고, 커널 이미지 또한 필요하게 되며, 부팅하고 나서 파일시스템으로 사용할 Root File System(JFFS2나 YAFFS)이 필요하다. 일단, u-boot 이미지, 커널 이미지, 파일시스템 이미지는 있는 것으로 가정하고 보드 자체에 커널을 심고, 부팅하는 과정을 기술한다.
(나중에 qplus를 이용한 커널 이미지, 파일시스템 이미지 제작을 추가로 포스팅 할 예정임)

우선 SMDK2440 보드를 준비하고, 숫놈-암놈인 시리얼 케이블, USB 케이블, CD(없으면 주변에서 구해야 함. 인터넷에선 찾기가 여간 어려움...), tftpd 서버를 가동하고 있는 리눅스 서버가 필요하다.

1. DNW에서 S3C2440A USB Downloader 나오게 하는 방법
 - 시리얼쪽 점퍼 설정 (J17,J19 : 1-2, J16,J18 : 2-3) - 전원쪽 시리얼 포트(UART1) 사용
 - AMD boot mode 사용 (J1 : 1-2, J2 : 2-3, J3 : 2-3, J4 : 1-2)
 - DNW 실행한 상태에서 COM1,115200bps 환경
 - 전원인가 하면, 메시지 나옴

+---------------------------------------------+
| S3C2440A USB Downloader ver R0.03 2004 Jan  |
+---------------------------------------------+
FCLK=296.4MHz,DMA mode
USB: IN_ENDPOINT:1 OUT_ENDPOINT:3
FORMAT: <ADDR(DATA):4>+<SIZE(n+10):4>+<DATA:n>+<CS:2>
NOTE: 1. Power off/on or press the reset button for 1 sec
   in order to get a valid USB device address.
   2. For additional menu, Press any key.

USB host is not connected yet.

###### Select Menu ######
 [0] Download & Run
 [1] Download Only
 [2] Test SDRAM
 [3] Change The Console UART Ch.
 [4] Clear unused area in SDRAM


2. USB 드라이버 설치
 - 위 상태에서 USB 케이블을 컴퓨터에 연결하고 전원을 인가하면, 새 하드웨어 장치가 나옴
 - CD에서 USB Driver/DNW/secbulk.inf와 .sys 파일을 windows/system32/drivers에 복사한 후
 - 장치 드라이버를 위 경로에 주면 자동으로 설치됨

3. u-boot 이미지를 NAND에 쓰기
 - DNS-Configuration-Option에서 USB Port 주소를 0x30100000으로 설정함
 - 위에서 나오는 메뉴에서 1번 선택후 0x30100000 주소 친 후
 - USB Port-Transmit 선택후, u-boot-smdk2440-v.0.2.bin 선택하면 전송됨
 - Option에서 0x30000000 주소로 수정한 후
 - 초기 메뉴에서 0번 선택, USB Port-Transmit 선택후, 2440test.bin 선택하면 전송됨

+---------------------------------------------+
| S3C2440A Firmware-Test ver 0.03 Jan 2004.   |
+---------------------------------------------+
[CPU ID=32440001h]
[Core voltage: 1.20V]
[XTAL in = 16.9344]
[Fclk:Hclk:Pclk]=[296.4:98.8:49.4]Mhz
[Uclk=48.0Mhz]

[rSTATUS2=0x1]
[rSTATUS3=0x0]
[rSTATUS4=0x0]
[rSRCPND=0x2000000]
[rINTPND=0x0]


 0:User Test        1:Manual Reg. Set  2:PCMCIA test      3:Stepping stone 
 4:Nand test        5:Program Flash    6:DMA test         7:Interrupt      
 8:Power/Clk        9:Lcd test        10:Camera test     11:SPI Test       
12:IIC Test        13:RTC Test        14:IrDA Test       15:SD test        
16:ADC test        17:ADC TS test     18:Timer test      19:IIS test       
20:AC97 Test    21:Uart Test      

Select the function to test : 



 - 위 메뉴에서 4번 선택, 그리고 SMC는 Normal이므로 1번 선택

Select the function to test : 4

Nand test
Select Nand flash type, Normal(1)/Advanced(2) : 1
K9S1208 Nand flash test start.
 0:Read ID          1:Nand reset       2:Block erase      3:Page read      
 4:Page write       5:Nand R/W test    6:Check Badblock   7:Nand Block lock
 8:Soft Unlock      9:K9S1208 Program 



 - 위 메뉴에서 9번 선택

Select(-1 to exit): 9

[SMC(K9S1208V0M) NAND Flash writing program]
The program buffer: 0x30100000~0x31ffffff

Source size:0h~0h

Available target block number: 0~4095
Input target block number:0
Input program file size(bytes): 107100
File:107100[6-block,17-page,92-bytes].
.......

 0:Read ID          1:Nand reset       2:Block erase      3:Page read      
 4:Page write       5:Nand R/W test    6:Check Badblock   7:Nand Block lock
 8:Soft Unlock      9:K9S1208 Program



 - 위 화면과 같이 0번 블럭을 입력하고, 바이트수는 u-boot의 실제 크기를 적으면 된다.
 - 점퍼를 Nand boot mode로 설정(J1,J2,J3,J4 : 모두 2-3, J)
 - 시리얼 케이블은 UART0 (전원쪽에서 먼 UART)로 바꿔 끼움
 - 전원 인가하면 아래와 같은 화면 나옴

U-Boot 1.0.0 (Sep  6 2006 - 15:29:06)
U-Boot code: 33E00000 -> 33E1A25C  BSS: -> 33E1DBBC

IRQ Stack: 33e3ebb8

FIQ Stack: 33e3fbb8

DRAM Configuration:

Bank #0: 30000000 64 MB

NAND:64 MB

*** Warning - bad CRC, using default environment
In:    serial

Out:   serial

Err:   serial

Hit any key to stop autoboot:  0

## Booting image at 33000000 ...

Bad Magic Number

SMDK2440 #




4. 파티션 정보 확인 및 u-boot 환경 변수 설정 (특히 네트워크 부분)
 - NAND Flash Memory Partitions를 보면, 0x00000000에서 0x00020000만큼의 크기가 Bootloader(U-boot)로 잡혀있다.
   그리고, 0x00020000부터 0x00010000 만큼 ConfigArea,
   0x00030000(0xC 블럭)에서부터 0x001D0000 크기만큼의 Kernel 공간,
   0x00200000(0x80 블럭)에서부터 0x03000000 크기만큼의 Root File System 공간,
   0x03200000(0xC80 블럭)에서부터 0x00E00000 크기만큼의 User Area 공간이 각각 할당되어 있다.
   Tip) 해당 주소를 0x4000으로 나누면 블럭수가 나옴
 - 이 상태에서 NAND Flash Memory에 U-boot(생략 가능한 것으로 보임), 리눅스 커널, 램디스크 등을 올려야 한다.
   하지만, 이 전에 네트워크 설정을 해주어야 한다.
 - printenv로 먼저 현재의 ip주소와 서버ip 주소 등을 살펴보고 잘못 설정되어 있을 경우,
   # setenv ipaddr 해당IP 식으로 설정한다.
   단, serverip로 설정된 IP에 리눅스 서버가 가동중이어야 하며, TFTPD가 설치되어 있는 상태여야
   tftp를 통해 커널 및 램디스크 이미지를 다운받을 수 있게 된다.
   아래에서 xxx로 표시된 곳에 수식을 설정하고 saveenv 하면 저장된다.

SMDK2440 # printenv
bootdelay=1
baudrate=115200
ethaddr=08:00:3e:26:0a:5b
netmask=255.255.255.0
ipaddr=xxx.xxx.xx.xxx
serverip=xxx.xxx.xx.xxx
gatewayip=xxx.xxx.xx.x
bootargs=root=/dev/mtdblock2 rw rootfstype=jffs2 console=ttyS0,115200 mem=64M
bootcmd=nandr 0xc 0x1d0000 0x33000000; bootm 33000000
stdin=serial
stdout=serial
stderr=serial


5. 부트로더를 NAND Write하기

SMDK2440 # tftp 31000000 u-boot-smdk2440-V.0.2.bin
SMDK2440 # nande 0x0 0x20000 <- 위에서 Bootloader 시작 블럭값과 크기
SMDK2440 # nandw 0x0 다운받은사이즈 0x31000000

6. Kernel NAND Write하기

SMDK2440 # tftp 31000000 smdk2440-kernel
SMDK2440 # nande 0xc 0x1d0000 <- 위에서 Kernel 시작 블럭값과 크기
SMDK2440 # nandw 0xc 다운받은사이즈 0x31000000

7. Root File System(JFFS2) NAND Write하기

SMDK2440 # tftp 31000000 smdk2440.img
SMDK2440 # nande 0x80 0x3000000 <- 위에서 Root File System 시작 블럭값과 크기
SMDK2440 # nandw 0x80 다운받은사이즈 0x31000000

8. 자동 부팅을 위한 마지막 설정

SMDK2440 # printenv <- bootargs, bootcmd 등이 제대로 설정되어 있는지 확인한다.
SMDK2440 # setenv bootargs root=/dev/mtdblock2 rw rootfstype=jffs2 console=ttyS0,115200 mem=64M
SMDK2440 # setenv bootcmd nandr 0xc 0x1d0000 0x33000000\; bootm 33000000
SMDK2440 # saveenv


9. 리셋해서, 매직넘버 체크를 넘어가면 제대로 부팅이 될 것이다.
 - 매직넘버 체크에서 걸릴 경우, 위 주소가 맞지 않는 경우이다.

추가사항으로 로지텍 Pro4000 웹캠을 설치해야 한다. ㅡ.ㅜ;

Posted by wbhacker :

현재 사용하고 있는 상태는 리눅스 데스크탑 1대, 윈도우 XP 데스크탑 1대 그리고 윈도우 XP 노트북 1대.
하지만, 이리저리 옮겨가며 키보드, 마우스를 사용하긴 여긴 힘든게 아니다 ㅡ.ㅜ
또한, 데스크탑 2대는 키보드, 마우스, 모니터 각 1대로 그냥 여기 꼽았다, 뺐다 쓰고 있는 상황이다.
이전에는 키보드,마우스,모니터 공유기(?)가 있어서 사용가능했었는데, 필요 없어서 누구 줘버렸었다 ㅡ.ㅜ;

윈도우 XP 두대는 Synergy(http://synergy.sf.net 에서 Open Source로 진행 중인 프로젝트이다, http://synergy2.sourceforge.net 인 것 같다.)를 이용해서 공유는 해봤었다.
어느 날인가 이 Synergy가 리눅스에서도 지원되는지는 잘 몰랐었는데, 소스포지닷넷(sf.net)에서 지원하는 것보면 거의 리눅스용인데... 생각하면서 살펴보니, 리눅스에서도 지원한 걸 봤던 기억이 난다.

리눅스는 아직 해보지 않았었다. 하지만, 생각보다 간단했다 ㅎㅎ

일단은 리눅스가 어떤 리눅스인지에 따라 설치 방법이 달라지겠지만, Synergy 리눅스용 프로그램을 어떻게 구해보면 금방 가능해진다.
원래는 위 사이트에서 다운로드가 되어야하는데, 어찌된 영문인지 다운로드 페이지가 뜨질 않았다. ㅡ.ㅜ
하는 수 없이.. 젠투(Gentoo) 리눅스를 사용하고 있는 상황이라 emerge 패키지 시스템을 사용해서 설치하는 수 밖에..

# emerge -s synergy
Searching...
[ Results for search key : synergy ]
[ Applications found : 1 ]

*  x11-misc/synergy
      Latest version available: 1.3.1
      Latest version installed: 1.3.1
      Size of files: 774 kB
      Homepage:      http://synergy2.sourceforge.net/
      Description:   Lets you easily share a single mouse and keyboard between multiple computers.
      License:       GPL-2

패키지가 있어서 다행이다. 설치는 아주 간단하다.

# emerge synergy

그러면 /usr/bin 폴더에 synergyc와 synergys 파일이 생성되게 되는데, 이 파일이 각각 클라이언트와 서버 역할을 할 수 있도록 한다.
일단, 도움말을 보고..

# synergyc --help
Usage: synergyc [--daemon|--no-daemon] [--debug <level>] [--display <display>] [--name <screen-name>] [--restart|--no-restart] <server-address>

Start the synergy mouse/keyboard sharing server.

  -d, --debug <level>      filter out log messages with priorty below level.
                           level may be: FATAL, ERROR, WARNING, NOTE, INFO,
                           DEBUG, DEBUG1, DEBUG2.
      --display <display>  connect to the X server at <display>
  -f, --no-daemon          run the client in the foreground.
*     --daemon             run the client as a daemon.
  -n, --name <screen-name> use screen-name instead the hostname to identify
                           ourself to the server.
  -1, --no-restart         do not try to restart the client if it fails for
                           some reason.
*     --restart            restart the client automatically if it fails.
  -h, --help               display this help and exit.
      --version            display version information and exit.

* marks defaults.

The server address is of the form: [<hostname>][:<port>].  The hostname
must be the address or hostname of the server.  The port overrides the
default port, 24800.

Where log messages go depends on the platform and whether or not the
client is running as a daemon.

이미 노트북을 서버로 사용해서 키보드, 마우스를 사용하고 있으니, 리눅스에선 클라이언트로 해서 노트북에 접속하면 된다.

# synergyc --no-daemon --display localhost:1 --name desktop-linux 서버IP주소
INFO: synergyc.cpp,716: Synergy client 1.3.1 on Linux 2.6.27-gentoo-r10 #1 SMP Fri Apr 17 12:14:01 KST 2009 i686
DEBUG: CXWindowsScreen.cpp,841: XOpenDisplay("localhost:1")
DEBUG: CXWindowsScreenSaver.cpp,339: xscreensaver window: 0x00000000
DEBUG: CXWindowsScreen.cpp,111: screen shape: 0,0 1280x1024
DEBUG: CXWindowsScreen.cpp,112: window is 0x00600004
DEBUG: CScreen.cpp,38: opened display
NOTE: synergyc.cpp,330: started client
DEBUG: CXWindowsClipboard.cpp,313: open clipboard 0
DEBUG: CXWindowsClipboard.cpp,266: empty clipboard 0
DEBUG: CXWindowsClipboard.cpp,289: grabbed clipboard 0
DEBUG: CXWindowsClipboard.cpp,348: close clipboard 0
DEBUG: CXWindowsClipboard.cpp,313: open clipboard 1
DEBUG: CXWindowsClipboard.cpp,266: empty clipboard 1
DEBUG: CXWindowsClipboard.cpp,289: grabbed clipboard 1
DEBUG: CXWindowsClipboard.cpp,348: close clipboard 1
NOTE: synergyc.cpp,247: connected to server
INFO: CScreen.cpp,98: entering screen
DEBUG: CServerProxy.cpp,523: recv clipboard 0 size=1328
DEBUG: CXWindowsClipboard.cpp,313: open clipboard 0
DEBUG: CXWindowsClipboard.cpp,266: empty clipboard 0
DEBUG: CXWindowsClipboard.cpp,289: grabbed clipboard 0
DEBUG: CXWindowsClipboard.cpp,300: add 1316 bytes to clipboard 0 format: 0
DEBUG: CXWindowsClipboard.cpp,348: close clipboard 0
DEBUG: CServerProxy.cpp,523: recv clipboard 1 size=1328
DEBUG: CXWindowsClipboard.cpp,313: open clipboard 1
DEBUG: CXWindowsClipboard.cpp,266: empty clipboard 1
DEBUG: CXWindowsClipboard.cpp,289: grabbed clipboard 1
DEBUG: CXWindowsClipboard.cpp,300: add 1316 bytes to clipboard 1 format: 0
DEBUG: CXWindowsClipboard.cpp,348: close clipboard 1
INFO: CScreen.cpp,116: leaving screen

간단히 synergy 서버 역할을 하고 있는 노트북에선 아래와 같은 설정만 해놓으면 된다.
나 같은 경우에는 노트북이 오른쪽에 있고, 리눅스 데스크탑이 왼쪽에 있는 상황. 그리고 XP 데스크탑이 위쪽에 있는 것으로 설정하였다.
즉, 리눅스 데스크탑에서 화면 오른쪽으로 이동하면, 노트북 화면으로 이동되는 것이다.
 - desktop : 윈도우 XP 데스크탑 (시너지 클라이언트)
 - desktop-linux : Gentoo Linux 데스크탑 (시너지 클라이언트)
 - notebook : 윈도우 XP 노트북로 여기에 연결되어 있는 키보드와 마우스 사용함 (시너지 서버)


이렇게 서버에서 설정된 상황에서 리눅스에서 시너지 클라이언트(synergyc)로 접속하면 된다.

리눅스 상에선 X 윈도 화면이 나오는 디스플레이 번호를 잘 부여해야 한다.

나의 경우에는 ./start_xserver 실행하여 Xserver를 실행하고, 다른 ssh 화면에서 ./start_xclient 실행하여 Xclient를 실행하고, 또 다른 ssh 화면에서 ./start_mpwm 실행하여 mpwm(윈도우 매니저)를 실행한다. 그리고 또 다른 ssh 화면에서 디스플레이 화면을 1번으로 설정하고, xterm을 띄운다. 이러면, 리눅스 상에 있는 모니터엔 디스플레이 화면 1을 사용하는 Xwindow가 띄워진 상태가 된다. 이 상태에서 위에서 적힌 synergyc를 실행해야 해당 디스플레이 화면에 마우스 포인터가 나오게 되는 것이다.

참고를 위해 바로 위에서 사용한 쉘 스크립트를 적어본다.

# vim start_xserver.sh

#!/bin/bash

export LD_LIBRARY_PATH=/root/xorg/lib
/root/xorg/bin/xinit -- /root/xorg/bin/Xorg -verbose 6 -config mpx.xorg.conf



# vim start_xclient.sh

#!/bin/bash

export LD_LIBRARY_PATH=/root/xorg/lib
/root/xorg/bin/Xorg -ac -config mpx.xorg.conf :1



# vim start_mpwm.sh

#!/bin/bash

export LD_LIBRARY_PATH=/root/xorg/lib
export DISPLAY=localhost:1
/root/xorg/bin/mpwm



# vim c.sh

#!/bin/bash

export PATH=/root/xorg/bin:$PATH
export LD_LIBRARY_PATH=/root/xorg/lib
export DISPLAY=localhost:1



위에 있는 c.sh를 이용해 source c.sh로 실행하여, 현재 쉘 환경에 적용한 후, xerm을 실행하면 된다.

Posted by wbhacker :