Skip to content

Instantly share code, notes, and snippets.

@JamesHagerman
Last active December 21, 2022 10:43
Show Gist options
  • Save JamesHagerman/40f414c5f0db8d476d64f78f9dd3a7b6 to your computer and use it in GitHub Desktop.
Save JamesHagerman/40f414c5f0db8d476d64f78f9dd3a7b6 to your computer and use it in GitHub Desktop.
Some useful YARD Stick One notes

Some useful YARD Stick One notes

This thing is a bit of a beast. People don't give it NEARLY the credit, or the documentation it deserves.

Two ways of using this thing: rfcat directly, or write a python script for it.

Basically, writing a python script is easier. Using rfcat directly is great but often, there are just too many silly settings to configure

NOTE ABOUT FREQUENCIES

Make sure you're transmitting in a band you're allowed to. No, this thing ain't that powerful at 20dBm (100mW) output but it's worth knowing that can literally kill people if you end up fucking with the wrong band...

Get a HAM license, look up the band plans the frequency coordinator in your area puts out, find the experimental allocation range, and stick to the middle of that range.

... Unless you're super clear on what you're doing.

NOTE ABOUT POWER OUTPUT

Basically, don't transmit into a null load. Throw a 50Ohm antenna on there. If you didn't get one yet, go get one.

I found this note somewhere. It's as accurate as I've found:

>> What is the maximum transmitting power of the yardstick in mW?
>
> Roughly it is 100 mW (20 dBm).  The transmit power is reduced a bit as
> the frequency increases, and it may vary from unit to unit.  It is
> approximately 20 dBm at 300 MHz, 19 dBm at 450 MHz, and 18 dBm at 900
> MHz.  (Those numbers are with the TX amplifier enabled.)

NOTE ABOUT MAXIMUM POWER INPUT

I don't know what the maximum input power this thing can handle is but basically don't fire up your Baofeng right next to the YARD Stick One or connect a transmitter directly to it without a good sized attenuator in the signal path.

Using Python

There are a few good examples out there... but some of them are incomplete. The following script should cover the basics of transmitting data. Receiving "is left as an exercise for the reader" (lol. seriously, just haven't bothered yet. single ys1 here...)

Note on USB Timeouts:

There are a lot of example scripts that miss a really important piece of code: Setting the YS1 back to Idle mode. If you don't do this, rfcat seems to hang its responses to libusb and your host machine's OS will yell that the USB device has timed out.

Long and short of it: After you're done (doing RX or TX or whatever), call: d.setModeIDLE() as your scripts "final" command. That seems to tell rfcat/the YS1 to go back to it's normal USB handling.

#!/usr/bin/python2.7
import sys
from rflib import *
# The middle of the two NoCal, 70cm, Experimental bands
FREQ = 434200000 # (BW = 0.6MHz = 600kHz) 433.60+(434.80-433.60)/2
# FREQ = 438500000 # (BW = 0.05MHz = 50kHz) 438.45+(438.55-438.45)/2
PKTLEN = 1       # Set packet length
DRATE = 512
try:
    d = RfCat()
    d.setFreq(FREQ)
    d.setMdmModulation(MOD_2FSK)
    d.setMdmDeviatn(4500)
    d.makePktFLEN(PKTLEN)
    d.setMdmDRate(DRATE)
    d.setMdmSyncMode(0) # disable syncword and preamble as this is not used
                        # by the remote.
    #d.setMaxPower()    # Pretty sure this turns on the TX amp
    bytes = [0, 0x41, 0xff] # Data to send
    d.setModeTX()       # It's good to enter the right mode first...
    d.RFxmit("".join(map(chr, bytes)))

    # WITHOUT THIS YOU WILL GET USB TIMEOUTS!
    d.setModeIDLE()  # DO THIS OR GET USB TIMEOUTS!
except Exception, e: # Make sure things are sane...
    d.setModeIDLE()  # Probably a good idea here too... just in case
    sys.exit("Error %s" % str(e))

Using rfcat

Just start playing with: rfcat -r

Getting help on rfcat

The author highly suggests picking up the cc1111 manual from TI...

After using rfcat -r to get an interactive terminal, you can type the following to get some help:

help(d)

Modulation modes:

These go for either using Python OR rfcat.

The simply way to see them is to just type MOD_ and hit tab in the interactive console...

I was dumb when I started and I had a bit of a hard time finding these. They are defined in rfcat/rflib/chipcon_nic.py along with a bunch of other useful things.

NOTE: Keep in mind that some of these modes are limited in various ways. Either bandwidth limitations (can't do RTTY using HAM 2FSK deviations), baud rate limitations, so on...

Also, each one has it's own strange ness with bit packing. Start digging... :D

"""  MODULATIONS
Note that MSK is only supported for data rates above 26 kBaud and GFSK,
ASK , and OOK is only supported for data rate up until 250 kBaud. MSK
cannot be used if Manchester encoding/decoding is enabled.
"""
MOD_2FSK                        = 0x00
MOD_GFSK                        = 0x10
MOD_ASK_OOK                     = 0x30
MOD_MSK                         = 0x70
MANCHESTER                      = 0x08

MODULATIONS = {
        MOD_2FSK    : "2FSK",
        MOD_GFSK    : "GFSK",
        MOD_ASK_OOK : "ASK/OOK",
        MOD_MSK     : "MSK",
        MOD_2FSK | MANCHESTER    : "2FSK/Manchester encoding",
        MOD_GFSK | MANCHESTER    : "GFSK/Manchester encoding",
        MOD_ASK_OOK | MANCHESTER : "ASK/OOK/Manchester encoding",
        MOD_MSK  | MANCHESTER    : "MSK/Manchester encoding",
        }

Install notes

Get some packages:

sudo apt-get install mercurial ipython

Get rfcat firmware and userland tools

TODO: OOPS! They finally moved to github!

git clone https://github.com/atlas0fd00m/rfcat.git

Client install notes

This needs both libusb and python-usb.

install python-usb:

sudo pip install pyusb==1.0.0b1
cd rfcat
sudo python setup.py install

Firmware compile notes:

You probably want to skip these:

Get some packages:

sudo apt-get install sdcc

Compile:

cd rfcat/firmware/

Trying to get yardstick one working under android:

Obviously, this thing uses libusb. Direct control shouldn't be too hard... But Termux, for example, has shitty libusb support :(

List all available methods:

dir(d) ['FHSSxmit', 'RESET', 'RFcapture', 'RFdump', 'RFlisten', 'RFrecv', 'RFxmit', 'doc', 'init', 'module', '_bootloader', '_clear_buffers', '_d', '_debug', '_do', '_doSpecAn', '_init_on_reconnect', '_quiet', '_radio_configured', '_recvEP0', '_recvEP5', '_recv_time', '_rfmode', '_sendEP0', '_sendEP5', '_stopSpecAn', '_threadGo', '_usbcfg', '_usbeps', '_usberrorcnt', '_usbintf', '_usbmaxi', '_usbmaxo', 'adjustFreqOffset', 'bootloader', 'calculateFsIF', 'calculateFsOffset', 'calculateMdmDeviatn', 'calculatePktChanBW', 'changeChannel', 'checkRepr', 'chipnum', 'chipstr', 'cleanup', 'ctrl_thread', 'debug', 'devnum', 'discover', 'endec', 'ep0GetAddr', 'ep0Peek', 'ep0Ping', 'ep0Poke', 'ep0Reset', 'ep5timeout', 'freq_offset_accumulator', 'getAESmode', 'getAmpMode', 'getBSLimit', 'getBuildInfo', 'getChannel', 'getChannels', 'getDebugCodes', 'getEnableMdmDCFilter', 'getEnableMdmFEC', 'getEnableMdmManchester', 'getEnablePktAppendStatus', 'getEnablePktCRC', 'getEnablePktDataWhitening', 'getFHSSstate', 'getFreq', 'getFreqEst', 'getFsIF', 'getFsOffset', 'getInterruptRegisters', 'getLQI', 'getMACdata', 'getMACthreshold', 'getMARCSTATE', 'getMdmChanBW', 'getMdmChanSpc', 'getMdmDRate', 'getMdmDeviatn', 'getMdmModulation', 'getMdmNumPreamble', 'getMdmSyncMode', 'getMdmSyncWord', 'getPartNum', 'getPktAddr', 'getPktLEN', 'getPktPQT', 'getRSSI', 'getRadioConfig', 'idx', 'lowball', 'lowballRestore', 'mac_SyncCell', 'makePktFLEN', 'makePktVLEN', 'max_packet_size', 'mhz', 'nextChannel', 'peek', 'ping', 'poke', 'pokeReg', 'printClientState', 'printRadioConfig', 'printRadioState', 'radiocfg', 'recv', 'recvAll', 'recv_event', 'recv_mbox', 'recv_queue', 'recv_thread', 'recv_threadcounter', 'reprAESMode', 'reprClientState', 'reprFreqConfig', 'reprHardwareConfig', 'reprMACdata', 'reprMdmModulation', 'reprModemConfig', 'reprPacketConfig', 'reprRadioConfig', 'reprRadioState', 'reprRadioTestSignalConfig', 'reprSoftwareConfig', 'reset_event', 'resetup', 'rf_configure', 'rf_redirection', 'rsema', 'runEP5_recv', 'runEP5_send', 'run_ctrl', 'scan', 'send', 'send_thread', 'send_threadcounter', 'setAESiv', 'setAESkey', 'setAESmode', 'setAmpMode', 'setBSLimit', 'setChannel', 'setChannels', 'setEnDeCoder', 'setEnableCCA', 'setEnableMdmDCFilter', 'setEnableMdmFEC', 'setEnableMdmManchester', 'setEnablePktAppendStatus', 'setEnablePktCRC', 'setEnablePktDataWhitening', 'setFHSSstate', 'setFreq', 'setFsIF', 'setFsOffset', 'setMACdata', 'setMACperiod', 'setMACthreshold', 'setMaxPower', 'setMdmChanBW', 'setMdmChanSpc', 'setMdmDRate', 'setMdmDeviatn', 'setMdmModulation', 'setMdmNumPreamble', 'setMdmSyncMode', 'setMdmSyncWord', 'setModeIDLE', 'setModeRX', 'setModeTX', 'setPktAddr', 'setPktPQT', 'setPower', 'setRFRegister', 'setRFbits', 'setRFparameters', 'setRadioConfig', 'setRfMode', 'setup', 'setup24330MHz', 'setup900MHz', 'setup900MHzContTrans', 'setup900MHzHopTrans', 'setup_rfstudio_902PktTx', 'specan', 'startHopping', 'stopHopping', 'strobeModeCAL', 'strobeModeFSTXON', 'strobeModeIDLE', 'strobeModeRX', 'strobeModeReturn', 'strobeModeTX', 'testTX', 'trash', 'xmit_event', 'xmit_queue', 'xsema']

using ipython:

Display all 177 possibilities? (y or n)
d.FHSSxmit                   d.getMdmSyncMode             d.setAmpMode
d.RESET                      d.getMdmSyncWord             d.setBSLimit
d.RFcapture                  d.getPartNum                 d.setChannel
d.RFdump                     d.getPktAddr                 d.setChannels
d.RFlisten                   d.getPktLEN                  d.setEnDeCoder
d.RFrecv                     d.getPktPQT                  d.setEnableCCA
d.RFxmit                     d.getRSSI                    d.setEnableMdmDCFilter
d.adjustFreqOffset           d.getRadioConfig             d.setEnableMdmFEC
d.bootloader                 d.idx                        d.setEnableMdmManchester
d.calculateFsIF              d.lowball                    d.setEnablePktAppendStatus
d.calculateFsOffset          d.lowballRestore             d.setEnablePktCRC
d.calculateMdmDeviatn        d.mac_SyncCell               d.setEnablePktDataWhitening
d.calculatePktChanBW         d.makePktFLEN                d.setFHSSstate
d.changeChannel              d.makePktVLEN                d.setFreq
d.checkRepr                  d.max_packet_size            d.setFsIF
d.chipnum                    d.mhz                        d.setFsOffset
d.chipstr                    d.nextChannel                d.setMACdata
d.cleanup                    d.peek                       d.setMACperiod
d.ctrl_thread                d.ping                       d.setMACthreshold
d.debug                      d.poke                       d.setMaxPower
d.devnum                     d.pokeReg                    d.setMdmChanBW
d.discover                   d.printClientState           d.setMdmChanSpc
d.endec                      d.printRadioConfig           d.setMdmDRate
d.ep0GetAddr                 d.printRadioState            d.setMdmDeviatn
d.ep0Peek                    d.radiocfg                   d.setMdmModulation
d.ep0Ping                    d.recv                       d.setMdmNumPreamble
d.ep0Poke                    d.recvAll                    d.setMdmSyncMode
d.ep0Reset                   d.recv_event                 d.setMdmSyncWord
d.ep5timeout                 d.recv_mbox                  d.setModeIDLE
d.freq_offset_accumulator    d.recv_queue                 d.setModeRX
d.getAESmode                 d.recv_thread                d.setModeTX
d.getAmpMode                 d.recv_threadcounter         d.setPktAddr
d.getBSLimit                 d.reprAESMode                d.setPktPQT
d.getBuildInfo               d.reprClientState            d.setPower
d.getChannel                 d.reprFreqConfig             d.setRFRegister
d.getChannels                d.reprHardwareConfig         d.setRFbits
d.getDebugCodes              d.reprMACdata                d.setRFparameters
d.getEnableMdmDCFilter       d.reprMdmModulation          d.setRadioConfig
d.getEnableMdmFEC            d.reprModemConfig            d.setRfMode
d.getEnableMdmManchester     d.reprPacketConfig           d.setup
d.getEnablePktAppendStatus   d.reprRadioConfig            d.setup24330MHz
d.getEnablePktCRC            d.reprRadioState             d.setup900MHz
d.getEnablePktDataWhitening  d.reprRadioTestSignalConfig  d.setup900MHzContTrans
d.getFHSSstate               d.reprSoftwareConfig         d.setup900MHzHopTrans
d.getFreq                    d.reset_event                d.setup_rfstudio_902PktTx
d.getFreqEst                 d.resetup                    d.specan
d.getFsIF                    d.rf_configure               d.startHopping
d.getFsOffset                d.rf_redirection             d.stopHopping
d.getInterruptRegisters      d.rsema                      d.strobeModeCAL
d.getLQI                     d.runEP5_recv                d.strobeModeFSTXON
d.getMACdata                 d.runEP5_send                d.strobeModeIDLE
d.getMACthreshold            d.run_ctrl                   d.strobeModeRX
d.getMARCSTATE               d.scan                       d.strobeModeReturn
d.getMdmChanBW               d.send                       d.strobeModeTX
d.getMdmChanSpc              d.send_thread                d.testTX
d.getMdmDRate                d.send_threadcounter         d.trash
d.getMdmDeviatn              d.setAESiv                   d.xmit_event
d.getMdmModulation           d.setAESkey                  d.xmit_queue
d.getMdmNumPreamble          d.setAESmode                 d.xsema
@rjzak
Copy link

rjzak commented Aug 4, 2019

Is it possible to forego the demodulation and just capture raw IQ values?

@pickeditmate
Copy link

Fantastic writeup! You should let atlas know about it and maybe he will put it on the wiki to help everyone especially people new to rfcat

@Dougsworth
Copy link

Fantastic writeup! You should let atlas know about it and maybe he will put it on the wiki to help everyone especially people new to rfcat

Hi im really new to rfcat and was wondering if it is possible to use the yardstick one to transmit a signal to the cc1101 arduino module

@BG7UHS
Copy link

BG7UHS commented Jul 27, 2021

I use rfcat to receive ook's remote control buttons. It is difficult to receive the correct value. Is there a better way?
mmexport1611890029367

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment