2013년 8월 11일 일요일

GTK+-3.0과 OpenGL을 같이 사용할 수 있는 방법

GTK+-2.x 버전에서는 gtkglext이라는 것이 있어서 사용하기 편했는데

GTK+-3.0을 위한 gtkglext3은 아직 개발 중에 있다.

하지만, 3가지 정도의 회피 방법이 있다.

1. 아직 개발 중인 gtkglext3을 따로 얻어서 사용하는 방법

https://github.com/tdz/gtkglext

조금 불편하고 불안정 하지만 가장 손쉬운 방법이 아닌가 싶다.

사용 방법은 다음과 같다. 우선 소스코드를 다운 받고

기본적으로 libgtk-3.0-dev, libgtk-3.0-doc, gtk-doc-tools 등의 패키지가 설치 되어 있어야 한다.

그럼 다운 로드한 gtkglext의 디렉토리로 이동하자.

# cd ~/gtkglext-VERSION

README 파일을 읽어 보면 autogen.sh 스크립트를 이용해서 설치할 것을 권고한다.

하지만, bootstrap을 이용해서 설치용 스크립트를 생성하자.

# env ACLOCAL_FLAGS='-I /pkgconfig/share/aclocal -I /gtk/share/aclocal' ./bootstrap --prefix=${HOME}/gtkglext --enable-debug=yes

기본적인 준비는 갖추어 졌다. 다음과 같이 설정하고, 컴파일하고 설치하면 된다.

# ./configure
# make
# make install

마지막으로 /usr/local/include에서 잘 설치가 되어 있는지 확인하자.

참조 문서 : http://spectrum3d.sourceforge.net/documentation.html

2. OpenGL을 지원하는 libsdl을 사용하여 GTK+에 심어 넣는 방법.

이 방법은 두 종류의 용도가 겹치는 이종 라이브러리를 결합해야 하기 때문에 코드가 지져분해진다.

사용 예는 Gtk+-2.x 버전에 libsdl을 사용하는 방법이긴 하지만 거의 동일할 것으로 여겨진다.

출처 : http://sdl.5483.n7.nabble.com/SDL-WINDOWID-embedding-SDL-into-gtkmm-td13354.html

 #include <gtk/gtk.h>   
 #include <SDL.h>   
   
 /*   
  * GTK+ SDL Window reparenting test   
  * written by Mikael Eriksson <[hidden email]>   
  *   
  * Compile with:   
  * cc -g -o gtk-sdl-test gtk-sdl-test.c `pkg-config --cflags --libs gtk+-2.0 sdl`   
  */   
   
 gboolean do_sdl_stuff( gpointer data ) {   
     SDL_Event event;   
     SDL_Surface *display = data;   
   
     while ( SDL_PollEvent( &event ) ) {   
         /* Handle quit event, not sure if this will ever appear */   
         if ( event.type == SDL_QUIT ) return FALSE;   
         /* Handle clear userevent */   
         if ( event.type == SDL_USEREVENT && event.user.code == 0 ) {   
             SDL_FillRect( display, NULL, 0 );   
             SDL_Flip( display );   
         }   
         /* Handle draw rect userevent */   
         if ( event.type == SDL_USEREVENT && event.user.code == 1 ) {   
             SDL_Rect rect;   
               
             rect.x = rand() % 320;   
             rect.y = rand() % 240;   
             rect.w = rand() % 100 + 10;   
             rect.h = rand() % 100 + 10;   
   
             printf( "%ux%u+%u+%u\n", rect.w, rect.h, rect.x, rect.y );   
   
             SDL_FillRect( display, &rect, SDL_MapRGB( display->format, rand()%255, rand()%255, rand()%255 ) );   
             SDL_Flip( display );   
         }   
     }   
   
     return TRUE;   
 }   
   
 void button_clicked( GtkButton *button, gpointer data ) {   
     /* Put draw rect userevent on queue */   
     SDL_Event event;   
     event.type = SDL_USEREVENT;   
     event.user.code = 1;   
     SDL_PushEvent( &event );   
 }   
   
 void clear(void) {   
     /* Put clear userevent on queue */   
     SDL_Event event;   
     event.type = SDL_USEREVENT;   
     event.user.code = 0;   
     SDL_PushEvent( &event );   
 }   
   
 int main( int argc, char **argv ) {   
     GtkWidget *window, *sock, *box, *button;   
     char winhack[1024];   
     SDL_Surface *display;   
   
     gtk_init( &argc, &argv );   
   
     /* Create widgets */   
     window = gtk_window_new( GTK_WINDOW_TOPLEVEL );   
     sock = gtk_socket_new();   
     box = gtk_vbox_new( FALSE, 0 );   
     button = gtk_button_new_with_label( "Press me!" );   
   
     /* Setup socket widget */   
     gtk_widget_set_size_request( sock, 320, 240 );   
     gtk_box_pack_start( GTK_BOX(box), sock, TRUE, FALSE, 0 );   
   
     /* Setup button */   
     gtk_container_set_border_width( GTK_CONTAINER(button), 5 );   
     g_signal_connect( G_OBJECT(button), "clicked", G_CALLBACK(button_clicked), display );   
     gtk_box_pack_start( GTK_BOX(box), button, FALSE, FALSE, 0 );   
   
     /* Setup window */   
     gtk_container_add( GTK_CONTAINER(window), box );   
     g_signal_connect( G_OBJECT(window), "delete-event", G_CALLBACK(gtk_main_quit), NULL );   
     gtk_widget_show_all( window );   
   
     /* Make SDL windows appear inside socket window */   
     snprintf( winhack, sizeof winhack, "SDL_WINDOWID=%i", gtk_socket_get_id( GTK_SOCKET(sock) ) );   
     SDL_putenv( winhack );   
   
     /* Init SDL */   
     if ( SDL_Init( SDL_INIT_VIDEO ) < 0 ) {   
         fprintf( stderr, "%s.\n", SDL_GetError() );   
         return EXIT_FAILURE;   
     }   
   
     /* Create SDL window */   
     if ( !( display = SDL_SetVideoMode( 320, 240, 0, 0 ) ) ) {   
         fprintf( stderr, "%s.\n", SDL_GetError() );   
         return EXIT_FAILURE;   
     }   
   
     /* Clear the SDL window */   
     clear();   
   
     /* Setup SDL event handlig timer */   
     g_timeout_add( 100, do_sdl_stuff, display );   
   
     /* Start main loop */   
     gtk_main();   
   
     return 0;   
 }   

3. 마지막으로 새로운 Gtk+-3.0 을 위한 opengl binding을 새로 만드는 방법.

이 방법도 이미 구현되어져 있다. 조금만 시간이 많다면 시도해 볼만한 방법이 있다.

https://github.com/andrepiske/tegtkgl

위의 링크를 찾아 가보면 소스 코드를 받아 볼 수 있다.

그리고 마지막으로 위의 두 가지의 방법을 사용한 예로 spectrum3D라는 프로젝트가 있다.

http://spectrum3d.sourceforge.net/

마찬가지로 시간이 많다면 살펴보고 시도해 볼만 하다.

무엇보다도 gtkglext이 debian 패키지로 빨리 나오길 바란다.

2013년 8월 10일 토요일

[번역] Arduino를 Arm 개발 보드를 위한 Jtag 프로그래머로 사용하기

아쉽게도 Jtag 장비가 없지만, Arduino 보드와 Netduino 보드는 가지고 있다.

Netduino 가 제공하는 개발 환경도 좋지만, 지금은 펌웨어를 직접 개발해야 하는 상황인지라,

기존에 있던 펌웨어를 지우고 새로운 펌웨어를 Flash 메모리에 써어 넣어야 한다.

그래서 Arduino 보드를 Jtag 프로그래머로 사용하면 가능할 것 같아 찾아 보았다.

하지만, 세 가지의 문제점이 있다고 이야기 되고 있다.

첫째는 Arduino 보드의 I/O 전압과 Arm 보드의 Jtag 핀의 전압 차이이다.

이 문제는 간단히 전압 강하용 저항을 삽입하거나 Level Converter용 IC를 사용하는  있다.

구체적으로 이야기 하자면 대부분의 Arduino 보드는 5V TTL 호환 I/O를 구성되어 있고

Arm 보드의 핀은 3.3V, 혹은 1.8V에서 동작한다.

언듯 생각해 보아도 5V에서 3.3V혹은 1.8V로의 전압 하강은

간단히 저항으로 해결될 수 있는 부분이지만,

3.3V 혹은 1.8V의 전압을 5V로 전압 상승하는 부분은 저항으로 해결 될 수 없다.

이 부분에 대한 해결책으로 아무래도 양방향성 전압 변환기를 사용하는 것 밖에 없는 것 같다.

고속의 신호를 스위칭 할 수 있는 MOSFET을 이용하거나

NC7SZ384 - http://www.fairchildsemi.com/pf/NC/NC7SZ384.html

I2C 신호선의 Level 변환에 사용되는 IC등을 사용하는 것이다.

LTC4300A-2 http://www.linear.com/pc/productDetail.jsp?navId=H0,C1,C1007,C1070,P2296

PCA9306  http://focus.ti.com/docs/prod/folders/print/pca9306.html

둘째는 전송 속도에 관한 문제이다.

Arduino 보드는 PC와 시리얼로 연결된다.

그래서 아마도 115200bps이상의 속도는 나오지 못할 것이다.

결과적으로 Arduino 보드를 이용하면 디버깅은 조금 느릴 것이다.

하지만, 업로드와 플레시 메모리 쓰기 정도에는 적절할 것이다.

셋째는 구현 소프트 웨어 이다.

대부분의 Jtag 동글은 USB 전송 위에 SPI 인터페이스 형태로 구현된다.

그 이외의 나머지 부분은 PC상의 소프트웨어에서 구현된다.

대표적인 것들이 OpenOCD와 URJTag등이다.

위와 같은 사항을 염두해 둔다면

문제가 되는 것은 Arduino 보드의 펌웨어를 작성하는 것이다.

이것도 이미 구현되어 있다.




https://github.com/zoobab/tjtag-arduino

위의 링크에 가면 Arduino를 위한 소프트웨어와 PC에서 사용할 수 있는

소프트웨어를 다운로드 받을 수 있다.

하지만, 실제로 프로그램을 실행한 결과 모든 Arm 플렛폼과 메모리를 지원하는 것은 아닌것 같다.

지원하는 플렛폼은

    { 0x0471017F, 5, "Broadcom BCM4702 Rev 1 CPU" },
    { 0x9470417F, 8, "Broadcom BCM4704 KPBG Rev 9 CPU"},      // Tornado  WRT150N
    { 0x0470417F, 8, "Broadcom BCM4704 Rev 8 CPU" },          // BCM4704 chip (used in the WRTSL54GS units)
    { 0x1471217F, 8, "Broadcom BCM4712 Rev 1 CPU" },
    { 0x2471217F, 8, "Broadcom BCM4712 Rev 2 CPU" },
    { 0x1471617F, 8, "Broadcom BCM4716 Rev 1 CPU" },          // Eko BCM4718A1KFBG
    { 0x0478517F, 8, "Broadcom BCM4785 Rev 1 CPU" },          // Tornado WRT350N
    { 0x0535017F, 8, "Broadcom BCM5350 Rev 1 CPU" },
    { 0x0535217F, 8, "Broadcom BCM5352 Rev 1 CPU" },
    { 0x1535417F, 8, "Broadcom BCM5354 KFBG Rev 1 CPU" },     // Tornado - WRT54G GV8/GSV7
    { 0x2535417F, 8, "Broadcom BCM5354 KFBG Rev 2 CPU" },     // Tornado - Gv8/GSv7
    { 0x3535417F, 8, "Broadcom BCM5354 KFBG Rev 3 CPU" },     // Tornado - WRG54G2
    { 0x0334517F, 5, "Broadcom BCM3345 KPB Rev 1 CPU" },      // Eko QAMLink  BCM3345 KPB SB4200
    { 0x0536517F, 8, "Broadcom BCM5365 Rev 1 CPU" },          // BCM5365 Not Completely Verified Yet
    { 0x1536517F, 8, "Broadcom BCM5365 Rev 1 CPU" },          // Eko....ASUS WL 500 G Deluxe
    { 0x0634517F, 5, "Broadcom BCM6345 Rev 1 CPU" },          // BCM6345 Not Completely Verified Yet
    { 0x0634817F, 5, "Broadcom BCM6348 Rev 1 CPU" },
    { 0x0633817F, 5, "Broadcom BCM6338 Rev 1 CPU" },  // Speedtouch
    { 0x0635817F, 5, "Broadcom BCM6358 Rev 1 CPU" },          // brjtag Fully Tested
    { 0x0636817F, 5, "Broadcom BCM6368 Rev 1 CPU" },          // brjtag
    { 0x1432117F, 5, "Broadcom BCM4321 RADIO STOP" },         // Radio JP3 on a WRT300N V1.1
    { 0x3432117F, 5, "Broadcom BCM4321L RADIO STOP"},         // EKO Radio on WRT300n
    { 0x0000100F, 5, "TI AR7WRD TNETD7300GDU Rev 1 CPU" },    // TI AR7WRD Only Partially Verified
    { 0x102002E1, 5, "BRECIS MSP2007-CA-A1 CPU" },            // BRECIS chip - Not Completely Verified Yet
    { 0x0B52D02F, 5, "TI TNETV1060GDW CPU" },                 // Fox WRTP54G
    { 0x00217067, 5, "Linkstation 2 with RISC K4C chip" },    // Not verified
    { 0x00000001, 5, "Atheros AR531X/231X CPU" },             // WHR-HP-AG108
    { 0x19277013, 7, "XScale IXP42X 266mhz" },                // GW2348-2 Eko Gateworks Avila GW234X (IXP42X 266MHz) BE
    { 0x19275013, 7, "XScale IXP42X 400mhz" },
    { 0x19274013, 7, "XScale IXP42X 533mhz" },
    { 0x10940027, 4, "ARM 940T"}, // Eko  Linksys BEFSX41
    { 0x07926041, 4, "Marvell Feroceon 88F5181" },
    { 0x1438000D, 5, "LX4380"},

이다. 대부분이 Broadcom의 씨피유이다.

지원하는 메모리는 다음과 같다.

  /* AMD, Spansion */
    { 0x00C2, 0x22DA, size1MB, CMD_TYPE_AMD, "MX29LV800BTC 512kx16 TopB  (1MB)"   ,15,size32K,    1,size16K,    2,size4K,   1,size8K  },
    { 0x00C2, 0x225B, size1MB, CMD_TYPE_AMD, "MX29LV800BTC 512kx16 BotB  (1MB)"   ,1,size8K,      2,size4K,     1,size16K,  15,size32K },

    { 0x0001, 0x2249, size2MB, CMD_TYPE_AMD, "AMD 29lv160DB 1Mx16 BotB   (2MB)"   ,1,size16K,    2,size8K,     1,size32K,  31,size64K }, /* bypass */
    { 0x0001, 0x22c4, size2MB, CMD_TYPE_AMD, "AMD 29lv160DT 1Mx16 TopB   (2MB)"   ,31,size64K,   1,size32K,    2,size8K,   1,size16K  },
    { 0x007F, 0x2249, size2MB, CMD_TYPE_AMD, "EON EN29LV160A 1Mx16 BotB  (2MB)"   ,1,size16K,    2,size8K,     1,size32K,  31,size64K }, /* bypass */
    { 0x007F, 0x22C4, size2MB, CMD_TYPE_AMD, "EON EN29LV160A 1Mx16 TopB  (2MB)"   ,31,size64K,   1,size32K,    2,size8K,   1,size16K  },
    { 0x0004, 0x2249, size2MB, CMD_TYPE_AMD, "MBM29LV160B 1Mx16 BotB     (2MB)"   ,1,size16K,    2,size8K,     1,size32K,  31,size64K },
    { 0x0004, 0x22c4, size2MB, CMD_TYPE_AMD, "MBM29LV160T 1Mx16 TopB     (2MB)"   ,31,size64K,   1,size32K,    2,size8K,   1,size16K  },
    { 0x00C2, 0x2249, size2MB, CMD_TYPE_AMD, "MX29LV160CB 1Mx16 BotB     (2MB)"   ,1,size16K,    2,size8K,     1,size32K,  31,size64K },
    { 0x00C2, 0x22c4, size2MB, CMD_TYPE_AMD, "MX29LV160CT 1Mx16 TopB     (2MB)"   ,31,size64K,   1,size32K,    2,size8K,   1,size16K  },
    { 0x00EC, 0x2275, size2MB, CMD_TYPE_AMD, "K8D1716UTC  1Mx16 TopB     (2MB)"   ,31,size64K,    8,size8K,     0,0,        0,0        },
    { 0x00EC, 0x2277, size2MB, CMD_TYPE_AMD, "K8D1716UBC  1Mx16 BotB     (2MB)"   ,8,size8K,      31,size64K,   0,0,        0,0        }, /* bypass */
    { 0x0020, 0x2249, size2MB, CMD_TYPE_AMD, "ST M29W160EB 1Mx16 BotB    (2MB)"   ,1,size16K,    2,size8K,     1,size32K,  31,size64K },
    { 0x0020, 0x22c4, size2MB, CMD_TYPE_AMD, "ST M29W160ET 1Mx16 TopB    (2MB)"   ,31,size64K,   1,size32K,    2,size8K,   1,size16K  },
    { 0x00C2, 0x0014, size2MB, CMD_TYPE_SPI, "Macronix MX25L160A         (2MB) Serial"   ,32,size64K,   0,0,          0,0,        0,0        }, /* new */
    { 0x001f, 0x2600, size2MB, CMD_TYPE_SPI, "Atmel AT45DB161B           (2MB) Serial"   ,512,sizeA4K,   0,0,          0,0,        0,0        }, /* new */
    { 0x0040, 0x0000, size2MB, CMD_TYPE_SPI, "Atmel AT45DB161B           (2MB) Serial"   ,512,sizeA4K,   0,0,          0,0,        0,0        }, /* new */

    { 0x00EC, 0x22A0, size4MB, CMD_TYPE_AMD, "K8D3216UTC  2Mx16 TopB     (4MB)"   ,63,size64K,    8,size8K,     0,0,        0,0        },
    { 0x00EC, 0x22A2, size4MB, CMD_TYPE_AMD, "K8D3216UBC  2Mx16 BotB     (4MB)"   ,8,size8K,      63,size64K,   0,0,        0,0        },

    { 0x00C2, 0x2015, size2MB, CMD_TYPE_SPI, "Macronix MX25L1605D        (2MB) Serial"   ,32,size64K,    0,0,          0,0,        0,0 }, /* new */
    { 0x00C2, 0x2016, size4MB, CMD_TYPE_SPI, "Macronix MX25L3205D        (4MB) Serial"   ,64,size64K,    0,0,          0,0,        0,0 }, /* new */
    { 0x00C2, 0x2017, size8MB, CMD_TYPE_SPI, "Macronix MX25L6405D        (8MB) Serial"   ,128,size64K,   0,0,          0,0,        0,0 }, /* new */


    { 0x0020, 0x2015, size2MB, CMD_TYPE_SPI, "STMicro M25P16             (2MB) Serial"   ,32,size64K,   0,0, 0,0, 0,0 }, /* new */
    { 0x0020, 0x2016, size4MB, CMD_TYPE_SPI, "STMicro M25P32             (4MB) Serial"   ,64,size64K,   0,0, 0,0, 0,0 }, /* new */
    { 0x0020, 0x2017, size8MB, CMD_TYPE_SPI, "STMicro M25P64             (8MB) Serial"   ,128,size64K,  0,0, 0,0, 0,0 }, /* new */
    { 0x0020, 0x2018, size16MB, CMD_TYPE_SPI, "STMicro M25P128           (16MB) Serial"  ,32,size256K,  0,0, 0,0, 0,0 }, /* new */


    { 0x0001, 0x2200, size4MB, CMD_TYPE_AMD, "AMD 29lv320MB 2Mx16 BotB   (4MB)"   ,8,size8K,     63,size64K,   0,0,        0,0        },
    { 0x0001, 0x227E, size4MB, CMD_TYPE_AMD, "AMD 29lv320MT 2Mx16 TopB   (4MB)"   ,63,size64K,   8,size8K,     0,0,        0,0        },
    { 0x0001, 0x2201, size4MB, CMD_TYPE_AMD, "AMD 29lv320MT 2Mx16 TopB   (4MB)"   ,63,size64K,   8,size8K,     0,0,        0,0        },
    { 0x0098, 0x009C, size4MB, CMD_TYPE_AMD, "TC58FVB321 2Mx16 BotB      (4MB)"   ,1,size16K,    2,size8K,     1,size32K,  63,size64K },
    { 0x0098, 0x009A, size4MB, CMD_TYPE_AMD, "TC58FVT321 2Mx16 TopB      (4MB)"   ,63,size64K,   1,size32K,    2,size8K,   1,size16K  },
    { 0x001F, 0x00C0, size4MB, CMD_TYPE_AMD, "AT49BV/LV16X 2Mx16 BotB    (4MB)"   ,8,size8K,     63,size64K,   0,0,        0,0        },
    { 0x001F, 0x00C2, size4MB, CMD_TYPE_AMD, "AT49BV/LV16XT 2Mx16 TopB   (4MB)"   ,63,size64K,   8,size8K,     0,0,        0,0        },
    { 0x0004, 0x2253, size4MB, CMD_TYPE_AMD, "MBM29DL323BE 2Mx16 BotB    (4MB)"   ,8,size8K,     63,size64K,   0,0,        0,0        },
    { 0x0004, 0x2250, size4MB, CMD_TYPE_AMD, "MBM29DL323TE 2Mx16 TopB    (4MB)"   ,63,size64K,   8,size8K,     0,0,        0,0        },
    { 0x0001, 0x22f9, size4MB, CMD_TYPE_AMD, "AMD 29lv320DB 2Mx16 BotB   (4MB)"   ,8,size8K,     63,size64K,   0,0,        0,0        },
    { 0x0001, 0x22f6, size4MB, CMD_TYPE_AMD, "AMD 29lv320DT 2Mx16 TopB   (4MB)"   ,63,size64K,   8,size8K,     0,0,        0,0        },
    { 0x0004, 0x22F9, size4MB, CMD_TYPE_AMD, "MBM29LV320BE 2Mx16 BotB    (4MB)"   ,1,size16K,    2,size8K,     1,size32K,  63,size64K },
    { 0x0004, 0x22F6, size4MB, CMD_TYPE_AMD, "MBM29LV320TE 2Mx16 TopB    (4MB)"   ,63,size64K,   1,size32K,    2,size8K,   1,size16K  },
    { 0x00C2, 0x22A8, size4MB, CMD_TYPE_AMD, "MX29LV320B 2Mx16 BotB      (4MB)"   ,8,size8K,     63,size64K,   0,0,        0,0        },
    { 0x00C2, 0x00A8, size4MB, CMD_TYPE_AMD, "MX29LV320B 2Mx16 BotB      (4MB)"   ,8,size8K,     63,size64K,   0,0,        0,0        },
    { 0x00C2, 0x00A7, size4MB, CMD_TYPE_AMD, "MX29LV320T 2Mx16 TopB      (4MB)"   ,63,size64K,   8,size8K,     0,0,        0,0        },
    { 0x00C2, 0x22A7, size4MB, CMD_TYPE_AMD, "MX29LV320T 2Mx16 TopB      (4MB)"   ,63,size64K,   8,size8K,     0,0,        0,0        },
    { 0x0020, 0x22CB, size4MB, CMD_TYPE_AMD, "ST 29w320DB 2Mx16 BotB     (4MB)"   ,1,size16K,    2,size8K,     1,size32K,  63,size64K },
    { 0x0020, 0x22CA, size4MB, CMD_TYPE_AMD, "ST 29w320DT 2Mx16 TopB     (4MB)"   ,63,size64K,   1,size32K,    2,size8K,   1,size16K  },

    { 0x00C2, 0x22C9, size16MB, CMD_TYPE_AMD, "MX29LV640B 4Mx16 TopB     (16MB)"  ,127,size64K,  8,size8K,      0,0,        0,0        },
    { 0x00C2, 0x22CB, size16MB, CMD_TYPE_AMD, "MX29LV640B 4Mx16 BotB     (16MB)"  ,8,size8K,     127,size64K,   0,0,        0,0        },


    { 0x00DA, 0x22BA, size4MB, CMD_TYPE_AMD, "W19B(L)320ST   2Mx16 TopB  (4MB)"   ,63,size64K,   8,size8K,     0,0,        0,0        }, /* new */
    { 0x00DA, 0x222A, size4MB, CMD_TYPE_AMD, "W19B(L)320SB   2Mx16 BotB  (4MB)"   ,8,size8K,   63,size64K,     0,0,        0,0        }, /* new */
    { 0x22DA, 0x222A, size4MB, CMD_TYPE_AMD, "W19B(L)320SB   2Mx16 BotB  (4MB)"   ,8,size8K,   63,size64K,     0,0,        0,0        },

    { 0x0020, 0x225C, size4MB, CMD_TYPE_AMD, "M29DW324DT 2Mx16 TopB      (4MB)"   ,63,size64K,   8,size8K,     0,0,        0,0        }, /* new */
    { 0x0020, 0x225D, size4MB, CMD_TYPE_AMD, "M29DW324DB 2Mx16 BotB      (4MB)"   ,8,size8K,   63,size64K,     0,0,        0,0        }, /* new */

    { 0x0098, 0x0057, size8MB, CMD_TYPE_AMD, "TC58FVM6T2A  4Mx16 TopB    (8MB)"   ,127,size64K,   8,size8K,     0,0,        0,0       }, /* new */
    { 0x0098, 0x0058, size8MB, CMD_TYPE_AMD, "TC58FVM6B2A  4Mx16 BopB    (8MB)"   ,8,size8K,   127,size64K,     0,0,        0,0       }, /* new */

    { 0x00EC, 0x22E0, size8MB, CMD_TYPE_AMD, "K8D6316UTM  4Mx16 TopB     (8MB)"   ,127,size64K,    8,size8K,     0,0,        0,0        }, /* new */
    { 0x00EC, 0x22E2, size8MB, CMD_TYPE_AMD, "K8D6316UBM  4Mx16 BotB     (8MB)"   ,8,size8K,      127,size64K,   0,0,        0,0        }, /* new */

    /* BSC */
    { 0x0089, 0x8891, size2MB, CMD_TYPE_BSC, "Intel 28F160B3 1Mx16 BotB  (2MB)"   ,8,size8K,     31,size64K,   0,0,        0,0        },
    { 0x0089, 0x8890, size2MB, CMD_TYPE_BSC, "Intel 28F160B3 1Mx16 TopB  (2MB)"   ,31,size64K,   8,size8K,     0,0,        0,0        },
    { 0x0089, 0x88C3, size2MB, CMD_TYPE_BSC, "Intel 28F160C3 1Mx16 BotB  (2MB)"   ,8,size8K,     31,size64K,   0,0,        0,0        },
    { 0x0089, 0x88C2, size2MB, CMD_TYPE_BSC, "Intel 28F160C3 1Mx16 TopB  (2MB)"   ,31,size64K,   8,size8K,     0,0,        0,0        },

    { 0x0089, 0x8897, size4MB, CMD_TYPE_BSC, "Intel 28F320B3 2Mx16 BotB  (4MB)"   ,8,size8K,     63,size64K,   0,0,        0,0        },
    { 0x0089, 0x8896, size4MB, CMD_TYPE_BSC, "Intel 28F320B3 2Mx16 TopB  (4MB)"   ,63,size64K,   8,size8K,     0,0,        0,0        },
    { 0x0089, 0x88C5, size4MB, CMD_TYPE_BSC, "Intel 28F320C3 2Mx16 BotB  (4MB)"   ,8,size8K,     63,size64K,   0,0,        0,0        },
    { 0x0089, 0x88C4, size4MB, CMD_TYPE_BSC, "Intel 28F320C3 2Mx16 TopB  (4MB)"   ,63,size64K,   8,size8K,     0,0,        0,0        },
    { 0x00b0, 0x00e3, size4MB, CMD_TYPE_BSC, "Sharp 28F320BJE 2Mx16 BotB (4MB)"   ,8,size8K,     63,size64K,   0,0,        0,0        },

    { 0x0089, 0x8899, size8MB, CMD_TYPE_BSC, "Intel 28F640B3 4Mx16 BotB  (8MB)"   ,8,size8K,     127,size64K,  0,0,        0,0        },
    { 0x0089, 0x8898, size8MB, CMD_TYPE_BSC, "Intel 28F640B3 4Mx16 TopB  (8MB)"   ,127,size64K,  8,size8K,     0,0,        0,0        },
    { 0x0089, 0x88CD, size8MB, CMD_TYPE_BSC, "Intel 28F640C3 4Mx16 BotB  (8MB)"   ,8,size8K,     127,size64K,  0,0,        0,0        },
    { 0x0089, 0x88CC, size8MB, CMD_TYPE_BSC, "Intel 28F640C3 4Mx16 TopB  (8MB)"   ,127,size64K,  8,size8K,     0,0,        0,0        },

    /* SCS */
    { 0x00b0, 0x00d0, size2MB, CMD_TYPE_SCS, "Intel 28F160S3/5 1Mx16     (2MB)"   ,32,size64K,   0,0,          0,0,        0,0        },

    { 0x0089, 0x0016, size4MB, CMD_TYPE_SCS, "Intel 28F320J3 2Mx16       (4MB)"   ,32,size128K,  0,0,          0,0,        0,0        },
    { 0x0089, 0x0014, size4MB, CMD_TYPE_SCS, "Intel 28F320J5 2Mx16       (4MB)"   ,32,size128K,  0,0,          0,0,        0,0        },
    { 0x00b0, 0x00d4, size4MB, CMD_TYPE_SCS, "Intel 28F320S3/5 2Mx16     (4MB)"   ,64,size64K,   0,0,          0,0,        0,0        },

    { 0x0089, 0x0017, size8MB, CMD_TYPE_SCS, "Intel 28F640J3 4Mx16       (8MB)"   ,64,size128K,  0,0,          0,0,        0,0        },
    { 0x0089, 0x0015, size8MB, CMD_TYPE_SCS, "Intel 28F640J5 4Mx16       (8MB)"   ,64,size128K,  0,0,          0,0,        0,0        },

    { 0x0089, 0x0018, size16MB, CMD_TYPE_SCS, "Intel 28F128J3 8Mx16      (16MB)"  ,128,size128K, 0,0,          0,0,        0,0        },

    /* SST */

    { 0x00BF, 0x234B, size2MB, CMD_TYPE_SST, "SST39VF1601 1Mx16 BotB     (2MB)"   ,8,size8K,    31,size64K,          0,0,        0,0        },
    { 0x00BF, 0x234A, size2MB, CMD_TYPE_SST, "SST39VF1602 1Mx16 TopB     (2MB)"   ,31,size64K,    8,size8K,          0,0,        0,0        },

    { 0x00BF, 0x235B, size4MB, CMD_TYPE_SST, "SST39VF3201 2Mx16 BotB     (4MB)"   ,8,size8K,   63,size64K,          0,0,        0,0        },
    { 0x00BF, 0x235A, size4MB, CMD_TYPE_SST, "SST39VF3202 2Mx16 TopB     (4MB)"   ,63,size64K,   8,size8K,          0,0,        0,0        },

    { 0x00BF, 0x236B, size8MB, CMD_TYPE_SST, "SST39VF6401 4Mx16 BotB     (8MB)"   ,8,size8K,   127,size64K,          0,0,        0,0        },
    { 0x00BF, 0x236A, size8MB, CMD_TYPE_SST, "SST39VF6402 4Mx16 TopB     (8MB)"   ,127,size64K,   8,size8K,          0,0,        0,0        },
    { 0x00BF, 0x236D, size8MB, CMD_TYPE_SST, "SST39VF6401B 4Mx16 BotB    (8MB)"   ,8,size8K,   127,size64K,          0,0,        0,0        },
    { 0x00BF, 0x236C, size8MB, CMD_TYPE_SST, "SST39VF6402B 4Mx16 TopB    (8MB)"   ,127,size64K,   8,size8K,          0,0,        0,0        },

//  See Spansion hack details for reasoning for the unusual vendid
    { 0x017E, 0x1A00, size4MB, CMD_TYPE_AMD, "Spansion S29GL032M BotB    (4MB)"   ,8,size8K,     63,size64K,   0,0,        0,0        },
    { 0x017E, 0x1A01, size4MB, CMD_TYPE_AMD, "Spansion S29GL032M TopB    (4MB)"   ,63,size64K,     8,size8K,   0,0,        0,0        },
    { 0x017E, 0x1000, size8MB, CMD_TYPE_AMD, "Spansion S29GL064M BotB    (8MB)"   ,8,size8K,     127,size64K,   0,0,        0,0        },
    { 0x017E, 0x1001, size8MB, CMD_TYPE_AMD, "Spansion S29GL064M TopB    (8MB)"   ,127,size64K,     8,size8K,   0,0,        0,0        },

    { 0x017E, 0x2101, size16MB, CMD_TYPE_AMD, "Spansion S29GL128P U      (16MB)"   ,128,size128K,     0,0,   0,0,        0,0        },
    { 0x017E, 0x1200, size16MB, CMD_TYPE_AMD, "Spansion S29GL128M U      (16MB)"   ,128,size128K,   0,0,      0,0,        0,0         },
    { 0x017E, 0x2201, size32MB, CMD_TYPE_AMD, "Spansion S29GL256P U      (32MB)"   ,256,size128K,     0,0,   0,0,        0,0        },
    { 0x017E, 0x2301, size64MB, CMD_TYPE_AMD, "Spansion S29GL512P U      (64MB)"   ,512,size128K,     0,0,   0,0,        0,0        },
    { 0x017E, 0x2801, size128MB, CMD_TYPE_AMD, "Spansion S29GL01GP U     (128MB)"   ,1024,size128K,     0,0,   0,0,        0,0        },

    { 0x0001, 0x0214, size2MB, CMD_TYPE_SPI, "Spansion S25FL016A         (2MB) Serial"   ,32,size64K,   0,0,          0,0,        0,0        }, /* new */
    { 0x0001, 0x0215, size4MB, CMD_TYPE_SPI, "Spansion S25FL032A         (4MB) Serial"   ,64,size64K,   0,0,          0,0,        0,0        }, /* new */
    { 0x0001, 0x0216, size8MB, CMD_TYPE_SPI, "Spansion S25FL064A         (8MB) Serial"   ,128,size64K,  0,0,          0,0,        0,0        }, /* new */


// Winbond 3-stage ID chips
    { 0xDA7E, 0x0A00, size4MB, CMD_TYPE_AMD, "Winbond W19B320AB BotB     (4MB)"   ,8,size8K,     63,size64K,   0,0,        0,0        },
    { 0xDA7E, 0x0A01, size4MB, CMD_TYPE_AMD, "Winbond W19B320AT TopB     (4MB)"   ,63,size64K,     8,size8K,   0,0,        0,0        },
    { 0x00EF, 0x3016, size4MB, CMD_TYPE_SPI, "Winbond W25X32             (4MB) Serial"   ,64,size64K,   0,0,          0,0,        0,0        }, /* new */
    { 0x00EF, 0x3017, size8MB, CMD_TYPE_SPI, "Winbond W25X64             (8MB) Serial"   ,128,size64K,   0,0,          0,0,        0,0        }, /* new */
// EON
    { 0x007f, 0x22F9, size4MB, CMD_TYPE_AMD, "EON EN29LV320 2Mx16 BotB   (4MB)"   ,8,size8K,    63,size64K,     0,0,  0,0 }, /* wrt54gl v1.1 */
    { 0x007f, 0x22F6, size4MB, CMD_TYPE_AMD, "EON EN29LV320 2Mx16 TopB   (4MB)"   ,63,size64K,  8,size8K,    0,0,   0,0  }, /* bypass */
    { 0x007F, 0x22C9, size8MB, CMD_TYPE_AMD, "EON EN29LV640 4Mx16 TopB   (8MB)"   ,127,size64K, 8,size8K,   0,0,        0,0        }, /* bypass */
    { 0x007F, 0x22Cb, size8MB, CMD_TYPE_AMD, "EON EN29LV640 4Mx16 BotB   (8MB)"   ,8,size8K,    127,size64K,   0,0,        0,0        }, /* bypass */
// Atmel
    { 0x001F, 0x00C8, size4MB, CMD_TYPE_AMD, "AT49BV322A 2Mx16 BotB      (4MB)"   ,8,size8K,     63,size64K,   0,0,        0,0        },
    { 0x001F, 0x00C9, size4MB, CMD_TYPE_AMD, "AT49BV322A(T) 2Mx16 TopB   (4MB)"   ,63,size64K,     8,size8K,   0,0,        0,0        },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }

결론적으로 내가 가지고 있는 Netduino Plus 2에는 사용할 수 없다.

뭐 소스코드를 수정하는 방법이 있겠지만, 너무 노력이 많이 들어 간다.

아쉽지만, Jtag 장비를 하나 사야 겠다.

출처 :

http://www.dd-wrt.com/phpBB2/viewtopic.php?p=435578&sid=0c7c7b114dc7239be2620514cecbe2d8

http://electronics.stackexchange.com/questions/9258/is-it-possible-to-make-a-jtag-interface-with-an-arduino

https://github.com/zoobab/tjtag-arduino

http://electronics.stackexchange.com/questions/708/i2c-3-3-to-5-0-v-conversion

2013년 8월 7일 수요일

통근을 위해 고려 중인 자전거

바람을 가르는 카본 자전거까지는 필요없는데

그져 경쾌한 운전이 가능하고 물받이가 달린 통근형 자전거를 알아 보고 있다.

그래서 요즘 살펴 보고 있는 두 개의 모델이 있다.

Surly의 Cross Check와 Masi의 Masi Speciale Commuter


출처 : http://gallery.roaringmousecycles.com/albums/customer-road/Matts_Surly_Cross_Check.jpg



Novara Verita Bike - 2013
$1299.00

출처 : http://www.rei.com/product/837485/novara-verita-bike-2013

문제는 가격이다.

그리고 문제는 구동계이다. 아무래도 평야에서 느긋하게 운행할 것이 아니기 때문에

최소한 최신 소라 변속기 정도는 사용해 주어야 할 것 같다.

1. 소라 변속기.

2. 물받이.

위의 두 가지는 추가적으로 구매해야 할 것 같다.

혹은 아니면 프레임만 구매해서 새로 조립하는 방법도 고려해 보아야 겠다.

현재 공구가 없지만 허브랑 카셋만 쪼이는 공구만 있으면 문제 없을 것 같다.

프레임을 고른다면 Surly사의 Long Haul Trucker의 프레임이 정답인 것 같다.

물받이를 설치하고도 각종 캐리어를 설치할 수 있는 나사 구멍을 제공한다.

그리고 다양한 두께의 타이어를 선택하여 설치할 수 있다.

무엇보다 지오메트리가  Cross Check보다 Long Haul Trucker가 멋있다.



좀더 찾아 본 결과 거의 같은 구성과 지오메트리를 갖는 약간 저렴한 프레임도 있다.




뭐 그래봐야 $30~$40달러 이니 Surly 딱지 값으로 괜찮다고 생각할 수 도 있다.