FTH-2008 Programming under Un*x

I recently picked up a Yaesu FTH-2008 2m handheld for cheap. Of course, I needed to reprogram it from its previous owner's channels to the channels I was interested in (APRS, mostly). It's not too hard to find the programming software on the net, but of course it's all old DOS stuff. I've reverse-engineered the format of the configuration data block and written a Python tool to pack and unpack it. That tool is here in hopes that it will be useful to someone else.

Use of this software is at your own risk. I haven't managed to screw up my radio, and the configuration data format seems to be straightforward enough that damaging the radio seems unlikely. But of course I might have made a mistake reading the format or writing the code, and using this software may leave your radio unusable or transmitting on an unexpected frequency — maybe an illegal or hazardous frequency. You've been warned!

As far as I can tell, this software should work equally well for the FTH-2009, FTH-7008, and FTH-7009. You can tell what model a given config file corresponds to by examining the IF and channel frequencies. Channels in the 134-174 MHz range correspond to the x008, and channels in the 400-512 MHz range correspond to the x009 radios. From what I can tell, an IF of 17.3 MHz indicates an 200x-model radio and (apparently) an IF of 21.4 MHz or 45 MHz indicates a 700x radio.


There are two pieces to this software:

rwconfig is not absolutely necessary, but it makes things easier; you can use cat if you want to. fth2008.py is where all the secrets live.

Using fth2008.py

This is not a user-friendly program, unfortunately. I simply haven't gotten around to writing a spiffy windowing or menuing UI, and the allowable configuration values are mostly indicated by whether you can repack the configuration file without throwing an exception. However, if you know Python, it should be pretty straightforward. (If you don't know Python, well, … uh, it's not too hard to learn … )

There are two classes which do all the work: fth2008.FTH2008 and fth2008.Channel. The FTH2008 class can parse and pack the configuration file, and contains an array of Channel instances to represent the settings of individual channels. Here's an example of creating an FTH2008 instance from a configuration file saved on disk by rwconfig:

import fth2008 # load the module
f = fth2008.FTH2008() # create an instance of the FTH2008 class
data = open('configfile').read()  # slurp the data file into 'data'
f.parse_conf(data)  # parse the data
f.display()  # optionally - display the parsed data in human readable form
# ... modify the members of f here to suit your taste...
data = f.pack_conf()  # convert the configuration back to a 212-byte blob
open('newconfig', 'w').write(data)  # write it to disk

After that, you'd use rwconfig to send the data back to the radio.

Okay, so how do you modify the configuration? That's the kludgy part. You just set the members directly. You can print f.__dict__ in order to get a list of the names and values. Then, for example, if you want to disable the keypad beep, you can type f.beep_enabled = 0 to change that attribute. Or maybe you want to change the settings of channel 12:

ch = f.channels[11]  # the channels list is 0-based, so this is the 12th channel
ch.__dict__          # print out the channel's current values
ch.label = '47'      # the 2-digit label is arbitrary
ch.disabled = 0      # enable the channel
ch.tx_disabled = 0   # and allow the user to transmit
ch.rx_kHz = '147180' # receive on 147.180 MHz. Yes, it's a string value
ch.tx_kHz = '147780' # transmit split 600 kHz
ch.tx_ctcss = (1, 35) # enable 103.5 Hz CTCSS on transmit
ch.rx_ctcss = (0, 35) # disable CTCSS for receive (still need to specify a number though)
# ch is a reference to the channel, not a copy, so f.display() will show
# the changed values now

That's all there is. By the way, I'm not particularly sure I got the CTCSS tone mappings correct (see the array fth2008.ctcss_tones for the frequency corresponding to each number), so if you use this and it does/doesn't work, I'd be interested to hear about it.

There are several parameters, such as the PLL type and IF, which you probably shouldn't try to change (at least not without making corresponding changes to the radio's circuitry).

I've done what I wanted to do with my radio, so I'm unlikely to develop this software any further. I might or might not be able to answer any questions about it. So if you're using this, I'd love to hear from you, but I'm afraid I don't want to maintain or support it. Links to (or from) similar radio-programming information pages elsewhere on the net would be very welcome, however.

$Header: /home/wiml/www-cvs/wiml/proj/fth2008.html,v 1.4 2004/08/10 06:32:31 wiml Exp $mail me