Date: Tue, 18 Sep 2012 20:53:36 +0000 (UTC) From: Max Brazhnikov <makc@FreeBSD.org> To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r304462 - in head/comms: . ge-x2212 ge-x2212/files Message-ID: <201209182053.q8IKra0c060611@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: makc Date: Tue Sep 18 20:53:36 2012 New Revision: 304462 URL: http://svn.freebsd.org/changeset/ports/304462 Log: Add new port comms/ge-x2212: EEPROM programmer for GE Phoenix SX Radios WWW: http://members.shaw.ca/swstuff/phoenix2212.html PR: ports/169090 Submitted by: Stephen Hurd <shurd at sasktel.net> Added: head/comms/ge-x2212/ head/comms/ge-x2212/Makefile (contents, props changed) head/comms/ge-x2212/distinfo (contents, props changed) head/comms/ge-x2212/files/ head/comms/ge-x2212/files/patch-src__callbacks.c (contents, props changed) head/comms/ge-x2212/files/patch-src__callbacks.h (contents, props changed) head/comms/ge-x2212/files/patch-src__interface.c (contents, props changed) head/comms/ge-x2212/files/patch-src__main.c (contents, props changed) head/comms/ge-x2212/files/schematic.txt (contents, props changed) head/comms/ge-x2212/pkg-descr (contents, props changed) Modified: head/comms/Makefile (contents, props changed) Modified: head/comms/Makefile ============================================================================== --- head/comms/Makefile Tue Sep 18 20:53:20 2012 (r304461) +++ head/comms/Makefile Tue Sep 18 20:53:36 2012 (r304462) @@ -39,6 +39,7 @@ SUBDIR += gammu-devel SUBDIR += garmin-utils SUBDIR += geoid + SUBDIR += ge-x2212 SUBDIR += ghfaxviewer SUBDIR += gkermit SUBDIR += gmfsk Added: head/comms/ge-x2212/Makefile ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/comms/ge-x2212/Makefile Tue Sep 18 20:53:36 2012 (r304462) @@ -0,0 +1,28 @@ +# $FreeBSD$ + +PORTNAME= ge-x2212 +PORTVERSION= 0.0.2010.09.15 +CATEGORIES= comms hamradio +MASTER_SITES= http://members.shaw.ca/swstuff/ \ + LOCAL/makc +DISTNAME= ${PORTNAME}-2-15sept2010 + +MAINTAINER= shurd@sasktel.net +COMMENT= EEPROM programmer for GE Phoenix SX Radios + +USE_GNOME= libgnomeui +GNU_CONFIGURE= yes +WRKSRC= ${WRKDIR}/${PORTNAME}-2 + +PLIST_FILES= bin/ge-x2212-2 +PORTDOCS= schematic.txt + +.include <bsd.port.options.mk> + +post-install: +.if ${PORT_OPTIONS:MDOCS} + ${MKDIR} ${DOCSDIR} + ${INSTALL_DATA} ${FILESDIR}/schematic.txt ${DOCSDIR} +.endif + +.include <bsd.port.mk> Added: head/comms/ge-x2212/distinfo ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/comms/ge-x2212/distinfo Tue Sep 18 20:53:36 2012 (r304462) @@ -0,0 +1,2 @@ +SHA256 (ge-x2212-2-15sept2010.tar.gz) = c1f11a29c32c7b115e178efce0da8564dff3bb5bc154bbb0c68814ea0e0a908b +SIZE (ge-x2212-2-15sept2010.tar.gz) = 225098 Added: head/comms/ge-x2212/files/patch-src__callbacks.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/comms/ge-x2212/files/patch-src__callbacks.c Tue Sep 18 20:53:36 2012 (r304462) @@ -0,0 +1,330 @@ +--- ./src/callbacks.c.orig 2010-09-16 00:10:17.000000000 +0000 ++++ ./src/callbacks.c 2012-09-18 15:29:36.554081126 +0000 +@@ -9,6 +9,11 @@ + #include "interface.h" + #include "support.h" + ++#ifdef USE_PPI_DEV ++#include <dev/ppbus/ppi.h> ++#include <dev/ppbus/ppbconf.h> ++#endif ++ + + #ifdef __GLIBC__ + #include <sys/io.h> +@@ -20,6 +25,7 @@ + #define DIRBIT 0x20 + + extern GtkWidget *app1; ++extern gboolean uhf; + + // new port defines to get 0x378 working on lp0 + #define LPTBASE 0x378 +@@ -76,6 +82,36 @@ + "ch09cct", "ch10cct", "ch11cct", "ch12cct", + "ch13cct", "ch14cct", "ch15cct", "ch16cct" }; + ++#ifdef USE_PPI_DEV ++static void ppi_outb(u_int8_t outb_val, int addr) { ++ int outb_action=-1; ++ ++ if(addr==LPTBASE || addr==LPTDAT) ++ outb_action=PPISDATA; ++ else if(addr==LPTSTAT) ++ outb_action=PPISSTATUS; ++ else if(addr==LPTCTRL) ++ outb_action=PPISCTRL; ++ ioctl(fd0, outb_action, &outb_val); ++} ++ ++static u_int8_t ppi_inb(int addr) ++{ ++ u_int8_t ret=0; ++ ++ if(addr==LPTBASE || addr==LPTDAT) ++ ioctl(fd0, PPIGDATA, &ret); ++ else if(addr==LPTSTAT) ++ ioctl(fd0, PPIGSTATUS, &ret); ++ else if(addr==LPTCTRL) ++ ioctl(fd0, PPIGCTRL, &ret); ++ return ret; ++} ++ ++#define outb(v,a) ppi_outb((v),(a)) ++#define inb(a) ppi_inb(a) ++#endif ++ + /* convert 2 ascii chars in hex to a decimal number */ + static int hex2( unsigned char a, unsigned char b) + { +@@ -111,7 +147,9 @@ + /* release parallel port */ + if (fd0 > 0) + close(fd0); ++#ifndef USE_PPI_DEV + ioperm(LPTDAT, 3, 0); ++#endif + } + //===================================================================== + // +@@ -209,6 +247,7 @@ + case 0x03: space = 6250.0; break; + default: fprintf(stderr,"Invalid channel spacing code %d\n",r); + } ++ if(uhf) space *= 3; + + // g_print("ref = %fhz, spacing = %fhz \n",ref,space); + +@@ -736,6 +775,35 @@ + return 0; + } + ++gboolean freq_good(double freq) ++{ ++ if(uhf) ++ return ( freq >= 134.33*3 && freq <= 185.66*3 ); ++ return ( freq >= 136.0 && freq <= 174.0 ); ++} ++ ++int calc_divisor(double freq, double space, gboolean is_rx) ++{ ++ int divisor = (((freq + (is_rx?45.0:0))*1e6) + (space/2.0)) / space; ++ /* Out of range... */ ++ if(divisor > 0xffff || divisor < 0) ++ divisor=0; ++ return divisor; ++} ++ ++double calc_realfreq(int divisor, double space, gboolean is_rx) ++{ ++ return ((divisor * space ) - (is_rx?45e6:0))/1e6; /* in mhz */ ++} ++ ++void fill_ch(unsigned char *chbuff, int divisor) ++{ ++ chbuff[1] = ( divisor & 0x8000) >> 12; ++ chbuff[2] = (divisor & 0x780) >> 7; ++ chbuff[3] = (divisor & 0x7800) >> 11; ++ chbuff[4] = divisor & 0xf; ++ chbuff[5] = ((divisor & 0x30) >> 4) + ((divisor & 0x40) >> 3); ++} + + //===================================================================== + // +@@ -743,15 +811,37 @@ + //===================================================================== + void encoderom( void ) + { +- int i; ++ int i,j; + int chan; +- double freq, realfreq; ++ double realfreq; ++ double rx_freq; ++ double tx_freq; + int divisor; + unsigned char *chbuff; +- ++ double spaces[3]; ++ double errors[3]; ++ int spacecode[3]; ++ int sc_idx; ++ ++ if(uhf) { ++ spaces[0]=12500.0; ++ spaces[1]=15000.0; ++ spaces[2]=18750.0; ++ spacecode[0]=1; ++ spacecode[1]=2; ++ spacecode[2]=3; ++ } ++ else { ++ spaces[0]=5000.0; ++ spaces[1]=12500.0/3.0; ++ spaces[2]=6250.0; ++ spacecode[0]=2; ++ spacecode[1]=1; ++ spacecode[2]=3; ++ } + GtkWidget *wid; + G_CONST_RETURN gchar *txt; +- ++ + /* start with a clean image */ + memset(x2212,0,sizeof(x2212)); + +@@ -778,55 +868,61 @@ + /* single digit conversion */ + x2212[0x40] = hex2bin(txt[0]) - 1; + +- /* number of channels in radio... to do this we need to look */ +- /* at all the rx channels and count any in the range of 136-174 */ +- chan = 0; +- for ( i = 0; i<16; i++ ) +- { +- wid = lookup_widget(app1,rxfreq[i]); +- txt = gtk_entry_get_text((GtkEntry *)wid); +- freq = atof(txt); +- if ( freq >= 136.0 && freq <= 174.0 ) chan++; +- } +- if ( chan < 1 ) +- fprintf(stderr,"Warning, no valid channels found\n"); +- x2212[0x80] = chan - 1; +- ++ chan=0; + /* now lets fill in all the channels */ + for ( i = 0; i<16; i++ ) + { + /* rx freq lookup off the screen */ + wid = lookup_widget(app1,rxfreq[i]); + txt = gtk_entry_get_text((GtkEntry *)wid); +- freq = atof(txt); ++ rx_freq = atof(txt); ++ ++ if ( !freq_good(rx_freq) ) { ++ if(rx_freq > 0) ++ g_printf("Warning, ignoring and removing invalid channel %d\n",i+1); ++ continue; ++ } ++ chan++; ++ if(chan != i+1) ++ g_printf("Warning, channel %d will be renumbered to %d\n",i+1,chan); ++ ++ /* tx freq lookup off the screen */ ++ wid = lookup_widget(app1,txfreq[i]); ++ txt = gtk_entry_get_text((GtkEntry *)wid); ++ tx_freq = atof(txt); ++ ++ for(j=0; j<3; j++) { ++ divisor = calc_divisor(rx_freq, spaces[j], TRUE); ++ realfreq = calc_realfreq(divisor, spaces[j], TRUE); /* in mhz */ ++ errors[j] = fabs(rx_freq-realfreq); ++ divisor = calc_divisor(tx_freq, spaces[j], FALSE); ++ realfreq = calc_realfreq(divisor, spaces[j], FALSE); /* in mhz */ ++ errors[j] += fabs(tx_freq-realfreq)*2; ++ } ++ sc_idx=0; ++ for(j=1; j<3; j++) { ++ if(errors[j] < errors[sc_idx]) ++ sc_idx=j; ++ } ++// if(sc_idx) ++// g_printf("Using non-standard spacing of %fHz for channel %d\n",spaces[sc_idx],i+1); + +- /* 3 gross assumptions!!!, timebomb below */ + ref = 13.2e6; +- space = 5000.0; +-#define REFCODE 2 + + /* point to the 8 bytes of rx channel data for specified channel */ +- chbuff = &x2212[0] + (((i+1) % 16) * 16); ++ chbuff = &x2212[0] + ((chan % 16) * 16); + /* there are 20 packed bits of freq info... lets build the numbers */ + + /* fill in info for valid rx channels */ +- if ( freq >= 136.0 && freq <= 174.0 ) ++ if ( freq_good(rx_freq) ) + { +- /* we have a choice of 3 ch spacings when building info */ +- /* for a particular rx and tx channel pair */ +- /* as a start, we assume 5khz will do.. should probably */ +- /* try all 3 and use the one with the least error */ +- divisor = (((freq + 45.0)*1e6) + (space/2.0)) / space; +- realfreq = ((divisor * space ) - 45e6)/1e6; /* in mhz */ +- if ( fabs(freq-realfreq) > 0.001 ) ++ divisor = calc_divisor(rx_freq, spaces[sc_idx], TRUE); ++ realfreq = calc_realfreq(divisor, spaces[sc_idx], TRUE); /* in mhz */ ++ if ( fabs(rx_freq-realfreq) > 0.001 ) + fprintf(stderr,"Warning ch %d freq error: %f <> %fmhz\n", +- i+1,realfreq,freq); +- chbuff[1] = REFCODE + (( divisor & 0x8000) >> 12); +- chbuff[2] = (divisor & 0x780) >> 7; +- chbuff[3] = (divisor & 0x7800) >> 11; +- chbuff[4] = divisor & 0xf; +- chbuff[5] = ((divisor & 0x30) >> 4) + ((divisor & 0x40) >> 3); +- ++ i+1,realfreq,rx_freq); ++ fill_ch(chbuff, divisor); ++ chbuff[1] |= spacecode[sc_idx]; + } + /* fill in the rx cg code (1st 2 digits of entrybox) */ + wid = lookup_widget(app1,rxcg[i]); +@@ -835,28 +931,19 @@ + chbuff[7] = hex2bin(txt[1]); + + /* now fill in the tx info */ +- /* tx freq lookup off the screen */ +- wid = lookup_widget(app1,txfreq[i]); +- txt = gtk_entry_get_text((GtkEntry *)wid); +- freq = atof(txt); +- + /* point to the 8 bytes of tx channel data for specified channel */ +- chbuff = &x2212[0] + (((i+1) % 16) * 16) + 8; ++ chbuff = &x2212[0] + ((chan % 16) * 16) + 8; + /* there are 20 packed bits of freq info... lets build the numbers */ + + /* fill in info for valid tx channels */ +- if ( freq >= 136.0 && freq <= 174.0 ) ++ if ( freq_good(tx_freq) ) + { +- divisor = ((freq*1e6) + (space/2.0)) / space; +- realfreq = divisor * space /1e6; /* in mhz */ +- if ( fabs(freq-realfreq) > 0.001 ) ++ divisor = calc_divisor(tx_freq, spaces[sc_idx], FALSE); ++ realfreq = calc_realfreq(divisor, spaces[sc_idx], FALSE); /* in mhz */ ++ if ( fabs(tx_freq-realfreq) > 0.001 ) + fprintf(stderr,"Warning ch %d freq error: %f <> %fmhz\n", +- i+1,realfreq,freq); +- chbuff[1] = ( divisor & 0x8000) >> 12; +- chbuff[2] = (divisor & 0x780) >> 7; +- chbuff[3] = (divisor & 0x7800) >> 11; +- chbuff[4] = divisor & 0xf; +- chbuff[5] = ((divisor & 0x30) >> 4) + ((divisor & 0x40) >> 3); ++ i+1,realfreq,tx_freq); ++ fill_ch(chbuff, divisor); + } + /* fill in the tx cg code (1st 2 digits of entrybox) */ + wid = lookup_widget(app1,txcg[i]); +@@ -869,6 +956,11 @@ + if (gtk_toggle_button_get_active((GtkToggleButton *)wid)) + chbuff[1] = chbuff[1] + 0x04; + } ++ /* number of channels in radio... to do this we need to look */ ++ /* at all the rx channels and count any in the range of 136-174 */ ++ if ( chan < 1 ) ++ fprintf(stderr,"Warning, no valid channels found\n"); ++ x2212[0x80] = chan - 1; + } + + +@@ -1148,19 +1240,30 @@ + } + + /* to read and write to the parallel port, we need it open as root */ ++#ifdef USE_PPI_DEV ++ fd0 = open("/dev/ppi0", O_RDWR | O_NONBLOCK); ++#else + fd0 = open("/dev/lp0", O_RDWR | O_NONBLOCK); ++#endif + if (fd0 >= 0) + { ++#ifndef USE_PPI_DEV + int stat = ioperm(LPTDAT, 3, 1); + if ( stat == -1 ) + perror("ioperm failed "); ++#endif + } + else + { ++#ifdef USE_PPI_DEV ++ fprintf(stderr,"\n\n*** open on /dev/ppi0 failed...Do you have permission?\n"); ++ perror("/dev/lp0"); ++#else + fprintf(stderr,"\n\n*** open on /dev/lp0 failed...Do you have permission?\n"); + fprintf(stderr,"*** you may need to 'sudo modprobe parport_pc'\n"); + fprintf(stderr,"*** 'sudo ge-x2212-2'\n"); + perror("/dev/lp0"); ++#endif + done(); + } + // g_print("Using port: 0x%x \n", LPTDAT); Added: head/comms/ge-x2212/files/patch-src__callbacks.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/comms/ge-x2212/files/patch-src__callbacks.h Tue Sep 18 20:53:36 2012 (r304462) @@ -0,0 +1,11 @@ +--- ./src/callbacks.h.orig 2004-09-27 20:13:40.000000000 +0000 ++++ ./src/callbacks.h 2012-09-18 15:29:36.555081225 +0000 +@@ -1,5 +1,8 @@ + #include <gnome.h> + ++#ifdef __FreeBSD__ ++#define USE_PPI_DEV ++#endif + + void + on_new1_activate (GtkMenuItem *menuitem, Added: head/comms/ge-x2212/files/patch-src__interface.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/comms/ge-x2212/files/patch-src__interface.c Tue Sep 18 20:53:36 2012 (r304462) @@ -0,0 +1,38 @@ +--- ./src/interface.c.orig 2010-09-16 00:33:07.000000000 +0000 ++++ ./src/interface.c 2012-09-18 15:29:36.558084978 +0000 +@@ -18,6 +18,8 @@ + #include "interface.h" + #include "support.h" + ++extern gboolean uhf; ++ + #define GLADE_HOOKUP_OBJECT(component,widget,name) \ + gtk_object_set_data_full (GTK_OBJECT (component), name, \ + gtk_widget_ref (widget), (GtkDestroyNotify) gtk_widget_unref) +@@ -267,7 +269,7 @@ + GtkWidget *combo_entry5; + GtkWidget *appbar1; + +- app1 = gnome_app_new ("Ge-x2212-2", "GE Phoenix SX X2212 EEProm programmer (VHF 16ch scan) by Lawrence Glaister VE7IT 15-Sept-2010"); ++ app1 = gnome_app_new ("Ge-x2212-2", uhf?"GE Phoenix SX X2212 EEProm programmer (UHF 16ch scan) by Lawrence Glaister VE7IT 15-Sept-2010":"GE Phoenix SX X2212 EEProm programmer (VHF 16ch scan) by Lawrence Glaister VE7IT 15-Sept-2010"); + + bonobodock1 = GNOME_APP (app1)->dock; + gtk_widget_show (bonobodock1); +@@ -678,7 +680,7 @@ + gtk_table_attach (GTK_TABLE (table1), ch01rx, 1, 2, 1, 2, + (GtkAttachOptions) (0), + (GtkAttachOptions) (0), 2, 2); +- gtk_entry_set_text (GTK_ENTRY (ch01rx), "146.5200"); ++ gtk_entry_set_text (GTK_ENTRY (ch01rx), uhf?"446.0000":"146.5200"); + gtk_entry_set_width_chars (GTK_ENTRY (ch01rx), 9); + + ch02rx = gtk_entry_new (); +@@ -742,7 +744,7 @@ + gtk_table_attach (GTK_TABLE (table1), ch01tx, 3, 4, 1, 2, + (GtkAttachOptions) (0), + (GtkAttachOptions) (0), 2, 2); +- gtk_entry_set_text (GTK_ENTRY (ch01tx), "146.5200"); ++ gtk_entry_set_text (GTK_ENTRY (ch01tx), uhf?"446.0000":"146.5200"); + gtk_entry_set_width_chars (GTK_ENTRY (ch01tx), 9); + + ch02tx = gtk_entry_new (); Added: head/comms/ge-x2212/files/patch-src__main.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/comms/ge-x2212/files/patch-src__main.c Tue Sep 18 20:53:36 2012 (r304462) @@ -0,0 +1,42 @@ +--- ./src/main.c.orig 2004-09-27 05:10:30.000000000 +0000 ++++ ./src/main.c 2012-09-18 15:29:36.559079154 +0000 +@@ -14,14 +14,31 @@ + + /* globval so we can do widget lookups */ + GtkWidget *app1; ++gboolean uhf=FALSE; + + int + main (int argc, char *argv[]) + { ++ gchar **remaining_args = NULL; ++ GOptionEntry option_entries[] = { ++ { "uhf", ++ 'u', ++ 0, ++ G_OPTION_ARG_NONE, ++ &uhf, ++ "Use UHF rather than VHF calculations", ++ NULL ++ }, ++ { NULL } ++ }; ++ GOptionContext *option_context; ++ option_context = g_option_context_new (NULL); ++ g_option_context_add_main_entries (option_context, option_entries, NULL); + + gnome_program_init (PACKAGE, VERSION, LIBGNOMEUI_MODULE, + argc, argv, + GNOME_PARAM_APP_DATADIR, PACKAGE_DATA_DIR, ++ GNOME_PARAM_GOPTION_CONTEXT, option_context, + NULL); + + /* +@@ -31,7 +48,6 @@ + */ + app1 = create_app1 (); + +- + gtk_widget_show (app1); + + gtk_main (); Added: head/comms/ge-x2212/files/schematic.txt ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/comms/ge-x2212/files/schematic.txt Tue Sep 18 20:53:36 2012 (r304462) @@ -0,0 +1,37 @@ + X2212 programmer schematic + +Parallel port X2212 / X22C12 eeprom + +2 (D0) ------------+---------------------------------------- 6 (A0) +3 (D1) ----------+-|---------------------------------------- 5 (A1) +4 (D2) --------+-|-|---------------------------------------- 4 (A2) +5 (D3) ------+-|-|-|---------------------------------------- 3 (A3) +6 (D4) ------|-|-|-|---------------------------------------- 2 (A4) +7 (D5) ------|-|-|-|---------------------------------------- 16 (A5) +8 (D6) ------|-|-|-|---------------------------------------- 17 (A6) +9 (D7) ------|-|-|-|---------------------------------------- 1 (A7) + | | | | +------------+ + | | | +--|3 d0 q0 2|-------+---------------- 12 (D0) + | | +----|4 d1 q1 5|-------|-+-------------- 13 (D1) + | +------|7 d2 q2 6|-------|-|-+------------ 14 (D2) + +--------|8 d3 q3 9|-------|-|-|-+---------- 15 (D3) + +--|1 /OE LE 11|--+ | | | | + | +------------+ | | | | | + | 74xx373 or 374 | | | | | +1 (/C0) -----------+------------------+----|-|-|-|---------- 11 (/WE) + | | | | +15 (S3) -----------------------------------+ | | | +13 (S4) -------------------------------------+ | | +12 (S5) ---------------------------------------+ | +10 (S6) -----------------------------------------+ + +14 (/C1) --------------------------------------------------> 7 (/CS) +16 (C2) --------------------------------------------------> 9 (/STORE) +17 (/C3) --------------------------------------------------> 10 (/RECALL) + +Also connect grounds: pins 18-25 on LPTx -> pin 10 on '373 -> pin 8 on 2212 +Connect 5V to pin 20 on '373, and pin 18 on 2212. If you dont trust your +5v supply, put a 5.1v zener across the X2212 power pins and use a 10ohm +quarter watt resistor in series with the plus supply lead. This may save +the logic chips if you hook it up to 12 volts by mistake (it will certainly +let you know by letting the smoke out of the resistor!). Added: head/comms/ge-x2212/pkg-descr ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/comms/ge-x2212/pkg-descr Tue Sep 18 20:53:36 2012 (r304462) @@ -0,0 +1,9 @@ +This program is a software package for programming the X22C12 EEPROM +in the GE Phoenix SX radios (specifically the VHF and UHF 16 channel +scanning versions). The X2212 is removed from the radio, placed +in the parallel port adaper socket and can be read/written/verified +or archived. The prom contents can be saved in a hex file format +or exported as a text file for printing. Changing frequencies and +channel guard settings is as easy as filling in the blanks. + +WWW: http://members.shaw.ca/swstuff/phoenix2212.html
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201209182053.q8IKra0c060611>