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 Fix: Install this port! Yay! Patch attached with submission follows: How-To-Repeat: Buy a GE Phoenix SX Radio, desire to program it.
Responsible Changed From-To: freebsd-ports-bugs->makc I'll take it.
State Changed From-To: open->feedback Can you suggest less puzzling name for this port?
State Changed From-To: feedback->open Feedback received.
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 _______________________________________________ svn-ports-all@freebsd.org mailing list http://lists.freebsd.org/mailman/listinfo/svn-ports-all To unsubscribe, send any mail to "svn-ports-all-unsubscribe@freebsd.org"
State Changed From-To: open->closed New port added, with minor changes. Thanks!