├── Hardware ├── UKHASnet-Pi │ ├── UKHASnet-Pi-board.png │ ├── UKHASnet-Pi-schematic.png │ ├── UKHASnet-node-gerbers.zip │ └── README.md ├── one-inch-HF-to-VHF-converter │ ├── upconverter PCB.png │ ├── upconverter schematic.png │ ├── one-inch-HF-receive-converter-gerbers-v1.2.zip │ ├── hf-upconverter-bom.csv │ ├── README.md │ ├── LICENCE │ └── hf-upconverter.brd └── README.md ├── RaspberryPi ├── README.md └── rf │ ├── README.md │ ├── sstv │ ├── beacon.py │ ├── README.md │ └── tones-to-rf.c │ └── freq_pi │ ├── README.md │ ├── PiVFO.py │ └── freq_pi.c └── README.md /Hardware/UKHASnet-Pi/UKHASnet-Pi-board.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JennyList/LanguageSpy/HEAD/Hardware/UKHASnet-Pi/UKHASnet-Pi-board.png -------------------------------------------------------------------------------- /Hardware/UKHASnet-Pi/UKHASnet-Pi-schematic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JennyList/LanguageSpy/HEAD/Hardware/UKHASnet-Pi/UKHASnet-Pi-schematic.png -------------------------------------------------------------------------------- /Hardware/UKHASnet-Pi/UKHASnet-node-gerbers.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JennyList/LanguageSpy/HEAD/Hardware/UKHASnet-Pi/UKHASnet-node-gerbers.zip -------------------------------------------------------------------------------- /Hardware/one-inch-HF-to-VHF-converter/upconverter PCB.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JennyList/LanguageSpy/HEAD/Hardware/one-inch-HF-to-VHF-converter/upconverter PCB.png -------------------------------------------------------------------------------- /Hardware/one-inch-HF-to-VHF-converter/upconverter schematic.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JennyList/LanguageSpy/HEAD/Hardware/one-inch-HF-to-VHF-converter/upconverter schematic.png -------------------------------------------------------------------------------- /RaspberryPi/README.md: -------------------------------------------------------------------------------- 1 | # Raspberry Pi code 2 | This directory contains code for the Raspberry Pi. 3 | 4 | The rf directory contains work on the use of the Pi's clock generator as an RF source. 5 | -------------------------------------------------------------------------------- /Hardware/one-inch-HF-to-VHF-converter/one-inch-HF-receive-converter-gerbers-v1.2.zip: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JennyList/LanguageSpy/HEAD/Hardware/one-inch-HF-to-VHF-converter/one-inch-HF-receive-converter-gerbers-v1.2.zip -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # LanguageSpy 2 | Open source code from Language Spy, [http://www.languagespy.com](http://www.languagespy.com) 3 | 4 | The Hardware directory contains open source hardware projects. 5 | 6 | The RaspberryPi directory contains code for the Raspberry Pi. 7 | -------------------------------------------------------------------------------- /RaspberryPi/rf/README.md: -------------------------------------------------------------------------------- 1 | # Raspberry Pi RF code 2 | This directory contains work on the use of the Pi's clock generator as an RF source. 3 | 4 | The freq__pi directory contains a copy of Jan Panteltje's freq_pi signal generator modified to detect which Pi version it is running on. 5 | 6 | The sstv directory contains a proff-of-concept Raspberry Pi SSTV transmitter. 7 | 8 | 9 | -------------------------------------------------------------------------------- /Hardware/README.md: -------------------------------------------------------------------------------- 1 | # Hardware 2 | This directory contains open source hardware projects. 3 | 4 | The one-inch-HF-to-VHF-converter directory contains an entry for the [2015 Hackaday.io One Square Inch competition](https://hackaday.io/project/7813-the-square-inch-project), an HF receive converter for VHF receivers like the RTL SDRs or similar. 5 | 6 | The UKHASnet-Pi directory contains a board to allow the [HopeRF RFM69](http://www.hoperf.com/rf_transceiver/modules/RFM69HW.html) RF modules to be interfaced to a Raspberry Pi. It can be used for experimenting with [UKHASnet](https://ukhas.net/). 7 | -------------------------------------------------------------------------------- /Hardware/one-inch-HF-to-VHF-converter/hf-upconverter-bom.csv: -------------------------------------------------------------------------------- 1 | Part,Value,Package,Description 2 | C1,10u,PANASONIC_B,"POLARIZED CAPACITOR, European symbol" 3 | C2,0.1u,C0805,"CAPACITOR, European symbol" 4 | C3,180p,C0805,"CAPACITOR, European symbol" 5 | C4,180p,C0805,"CAPACITOR, European symbol" 6 | C5,0.1u,C0805,"CAPACITOR, European symbol" 7 | L1,220nH,L1206,1206 wire-wound inductor 8 | IC1,74VHC4053,SO16,Triple 2-channel ANALOG MULTIPLEXER 9 | JP1,USBA-SMD-MALE,USB-A-SMT-MALE,USB Connectors 10 | OS1,50MHz,7.2X5.2-4-PAD,5v oscillator – IMPORTANT! Don't use a 3v3 part! 11 | R1,2k2,R0805,"RESISTOR, European symbol" 12 | R2,2k2,R0805,"RESISTOR, European symbol" 13 | SMA1,ANT,SMA-EDGE,SMA Connector 14 | SMA2,OUT,SMA-EDGE,SMA Connector 15 | T1,Bourns PT61018PEL,N5,10/100BASE-TX SOIC-16 Fast Ethernet Magnetic Module 16 | PCB,,,As described in hf-upconverter.brd and one-inch-HF-receive-converter-gerbers.zip 17 | -------------------------------------------------------------------------------- /RaspberryPi/rf/sstv/beacon.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | """ 4 | This file is a modified version of the beacon.py from http://hsbp.org/rpi-sstv. 5 | Their repo: https://github.com/hsbp/rpi-sstv 6 | I am much indebted to them for their work. 7 | 8 | What it does: Takes a jpeg image called test.jpg, passes it through PySSTV, returns tone,duration pairs. 9 | 10 | Modifications to original: 11 | 12 | Removed callsign insertion code 13 | Changed tuple output to CSV output to stdout 14 | Removed GPIO code 15 | 16 | Usage: Pipe output to a file 17 | 18 | python beacon.py > test.csv 19 | 20 | """ 21 | 22 | from PIL import Image, ImageFont, ImageDraw 23 | from pysstv.color import MartinM2 24 | from subprocess import check_output 25 | from cStringIO import StringIO 26 | import RPi.GPIO as GPIO 27 | import struct, sys 28 | 29 | TX_PIN = 18 30 | 31 | def main(): 32 | img = Image.open('./test.jpg') 33 | img = img.resize((MartinM2.WIDTH, MartinM2.HEIGHT)) 34 | font = ImageFont.load_default() 35 | sstv = MartinM2(img, 44100, 16) 36 | sstv.vox_enabled = True 37 | for freq, msec in sstv.gen_freq_bits(): 38 | print freq,',',msec 39 | 40 | if __name__ == '__main__': 41 | main() 42 | -------------------------------------------------------------------------------- /Hardware/UKHASnet-Pi/README.md: -------------------------------------------------------------------------------- 1 | # A HopeRF RFM69 board for the Raspberry Pi 2 | This is a board to allow the [HopeRF RFM69](http://www.hoperf.com/rf_transceiver/modules/RFM69HW.html) RF modules to be interfaced to a Raspberry Pi. It can be used for experimenting with [UKHASnet](https://ukhas.net/), or just as an experimenting board in its own right for the RFM69 series. 3 | 4 | ###Files: 5 | - RPi-UKHASnet-node.brd, an EAGLE CAD board file. 6 | - RPi-UKHASnet-node.sch, an EAGLE CAD schematic file. 7 | - UKHASnet-node-gerbers.zip, Gerber files for manufacturing generated through EAGLE CAD using Dirt Cheap Dirty Boards' CAM file. 8 | - UKHASnet-Pi-board.png, a generated image of the PCB. 9 | - UKHASnet-Pi-schematic.png, the converter circuit diagram. 10 | - LICENCE, a copy of the Solderpad Hardware Licence v0.51 11 | 12 | ###Description: 13 | This is a simple breakout board, very little rocket science. It features a 3.3v regulator on the underside because the module is capable of taking more current than the Pi's regulator has to spare. 14 | 15 | ###Licence and boilerplate 16 | 17 | This project is licenced under the Solderpad Hardware licence. 18 | 19 | Copyright 2016 Jenny List 20 | Copyright and related rights are licensed under the Solderpad Hardware License, Version 0.51 (the “License”); you may not use these files except in compliance with the License. 21 | You may obtain a copy of the License at [http://solderpad.org/licenses/SHL-0.51](http://solderpad.org/licenses/SHL-0.51). Unless required by applicable law or agreed to in writing, software, hardware and materials distributed under this License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. 22 | -------------------------------------------------------------------------------- /Hardware/one-inch-HF-to-VHF-converter/README.md: -------------------------------------------------------------------------------- 1 | # One inch HF to VHF converter 2 | This is an entry for the [2015 Hackaday.io One Square Inch competition](https://hackaday.io/project/7813-the-square-inch-project), an HF receive converter for VHF receivers like the RTL SDR or similar. You can find its project page [here](https://hackaday.io/project/8486-hf-receive-converter-for-rtl-sdrs-and-similar). 3 | 4 | ###Files: 5 | - hf-upconverter.brd, an EAGLE CAD board file. 6 | - hf-upconverter.sch, an EAGLE CAD schematic file. 7 | - one-inch-HF-receive-converter-gerbers-v1.2.zip, Gerber files for manufacturing generated through EAGLE CAD using OSH Park's CAM file. 8 | - upconverter PCB.png, a generated image of the PCB. 9 | - upconverter schematic.png, the converter circuit diagram. 10 | - hf-upconverter-bom.csv, the bill of materials for the project. 11 | - LICENCE, a copy of the Solderpad Hardware Licence v0.51 12 | 13 | ###Instructions: 14 | It's a small board, so the instructions are short and sweet. 15 | Solder all the chip components first, then the mixer IC, then the transformer, the electrolytic, the oscillator, and finally the connectors. You'll get lots of flux all over everything, but a quick brush with a bit of solvent cleaner should deal with that. 16 | 17 | ###Licence and boilerplate 18 | 19 | This project is licenced under the Solderpad Hardware licence. 20 | 21 | Copyright 2015 Jenny List 22 | Copyright and related rights are licensed under the Solderpad Hardware License, Version 0.51 (the “License”); you may not use these files except in compliance with the License. 23 | You may obtain a copy of the License at [http://solderpad.org/licenses/SHL-0.51](http://solderpad.org/licenses/SHL-0.51). Unless required by applicable law or agreed to in writing, software, hardware and materials distributed under this License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. 24 | -------------------------------------------------------------------------------- /RaspberryPi/rf/freq_pi/README.md: -------------------------------------------------------------------------------- 1 | # freq_pi signal generator and PiVFO GUI 2 | This directory contains two pieces of software: 3 | * A copy of Jan Panteltje's freq_pi signal generator modified to detect which Raspberry Pi model it is running on. 4 | * PiVFO, a Python GUI for freq_pi that provides a simple variable frequency oscillator. 5 | 6 | ##Quick install for both pieces of software: 7 | At a command line in your home directory on a stock Raspbian install: 8 | ``` 9 | mkdir freq_pi 10 | cd freq_pi 11 | curl -o freq_pi.c https://raw.githubusercontent.com/JennyList/LanguageSpy/master/RaspberryPi/rf/freq_pi/freq_pi.c 12 | curl -o PiVFO.py https://raw.githubusercontent.com/JennyList/LanguageSpy/master/RaspberryPi/rf/freq_pi/PiVFO.py 13 | gcc -Wall -O4 -o freq_pi freq_pi.c -std=gnu99 -lm 14 | ``` 15 | 16 | ##freq_pi 17 | 18 | ###Function:### 19 | freq_pi is a programmable frequency generator that uses the Raspberry Pi GPCLK0 line, on pin 7 of the GPIO port. 20 | This version 0.72 now does not need any configuration to run on either BCM2385 or BCM2386 Pi boards, so will run on the Pi or the Pi 2. 21 | 22 | ###To compile freq_pi:### 23 | gcc -Wall -O4 -o freq_pi freq_pi.c -std=gnu99 -lm 24 | 25 | ###To run freq_pi:### 26 | sudo freq_pi -f (frequency in Hz) 27 | 28 | Example for 14MHz: sudo freq_pi -f 14000000 29 | 30 | To turn freq_pi off: sudo freq_pi -q 31 | 32 | sudo is required to access the Pi hardware directly. 33 | 34 | ##PiVFO 35 | 36 | ###Function:### 37 | PiVFO is a simple GUI for freq_pi that simulates a simple variable frequency oscillator. 38 | 39 | ###To configure PiVFO:### 40 | If the freq_pi executable is in the same directory as PiVFO.py then no configuration should be necessary. 41 | If it is in a different directory then find the line that defines the variable called freqgen and update it to the path where freq_pi can be found. 42 | 43 | ###To run PiVFO### 44 | 45 | sudo python ./PiVFO.py 46 | 47 | sudo is required to access the Pi hardware directly. 48 | 49 | Click the "Start VFO" button to start the VFO, select your frequency with the buttons and dial. 50 | -------------------------------------------------------------------------------- /RaspberryPi/rf/sstv/README.md: -------------------------------------------------------------------------------- 1 | #Stand alone SSTV for the Raspberry Pi 2 | 3 | This directory contains proof-of-concept code to use the Raspberry Pi as a stand-alone slow-scan television (SSTV) transmitter generating low-level RF using the Pi's internal clock generator on pin 7 of the expansion connector. 4 | 5 | It builds on the work of others, in particular the following: 6 | 7 | * beacon.py from [http://hsbp.org/rpi-sstv](http://hsbp.org/rpi-sstv) 8 | * freq_pi from [http://panteltje.com/panteltje/newsflex/download.html](http://panteltje.com/panteltje/newsflex/download.html) 9 | 10 | It relies upon PySSTV[https://github.com/dnet/pySSTV](https://github.com/dnet/pySSTV) to generate tone,duration pairs. 11 | 12 | ##Overview 13 | 14 | There are two pieces of software in this package. 15 | 16 | * beacon.py takes a jpeg image hardcoded as test.jpg, passes it through PySSTV, and returns tone and duration pairs to stdout. 17 | * tones-to-rf takes a CSV file hardcoded as test.csv containing tone(Hz) and duration(mSec) pairs generated by beacon.py, 18 | then adds each successive tone to an RF carrier generated on GPCLK0 for each duration. 19 | 20 | If you have an apporpriate amateur radio licence this RF can be fed through a low-pass filter to an antenna to make a simple QRP (less than 10mW) SSTV transmitter. 21 | 22 | ##Installation & config 23 | 24 | You will first need to install PySSTV, if you do not already have it. The following commands worked for me on a stock Raspbian install. 25 | 26 | ``` 27 | sudo apt-get install python-setuptools 28 | sudo apt-get install python-imaging 29 | sudo easy_install pip 30 | sudo pip install setuptools --no-use-wheel --upgrade 31 | sudo pip install PySSTV 32 | ``` 33 | 34 | Then you will need to configure and compile tones-to-rf.c 35 | 36 | The version of tones-to-rf.c distributed is pre-configured for the Raspberry Pi 2. If you have a Raspberry Pi 1, find the lines that define BCM2708_PERI_BASE, and uncomment the line relevant to your platform. 37 | 38 | Compile tones-to-rf as follows: 39 | ``` 40 | gcc -Wall -O4 -o tones-to-rf tones-to-rf.c -std=gnu99 -lm 41 | ``` 42 | 43 | ##Usage 44 | 45 | First, set up your RF output and HF receiver. It is suggested that you use a DC blocking capacitor on pin 7 of the expansion connector, and feed it into a dummy load for testing. This software was written to demonstrate the RF breakout board at [https://www.kickstarter.com/projects/2001938575/rf-breakout-kit-for-the-raspberry-pi](https://www.kickstarter.com/projects/2001938575/rf-breakout-kit-for-the-raspberry-pi), with that board an old 50 ohm BNC Ethernet terminator was used. The HF receiver was loosely coupled with a short piece of insulated wire from its antenna terminal looped round the Ethernet terminator. SSTV was demodulated using an Android SSTV app on a tablet next to the speaker. The SSTV mode is set as Martin2 in beacon.py. 46 | 47 | Save the JPEG image you wish to transmit as test.jpg. You could add Python code to put your callsign in as the original beacon.py did, however I used the GIMP. 48 | Run beacon.py as follows, piping output to a file. 49 | 50 | ``` 51 | python beacon.py > test.csv 52 | ``` 53 | You should find test.csv, containing frequency,duration pairs. 54 | 55 | Then run tones-to-rf to generate the transmission. Specify a frequency as below, in this example the 20m SSTV calling frequency. Tune your receiver to the frequency. 56 | 57 | ``` 58 | sudo ./tones-to-rf -f 14230000 59 | ``` 60 | 61 | You should hear the SSTV tones in your receiver's speaker, and all being well your SSTV decoder should give you your image. 62 | 63 | There is a fudge factor with comments in the CSV-reading loop of tones-to-rf.c. This is to compensate for the time taken by each iteration of the loop, and was found by trial and error for best picture decoding. It therefore should work for a Raspberry Pi 2, but may not work for a Raspberry Pi 1. You may have to experiment with this figure. This is proof-of-concept code only. 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | -------------------------------------------------------------------------------- /RaspberryPi/rf/freq_pi/PiVFO.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | # This program is free software: you can redistribute it and/or modify 4 | # it under the terms of the GNU General Public License as published by 5 | # the Free Software Foundation, either version 3 of the License, or 6 | # (at your option) any later version. 7 | # 8 | # This program is distributed in the hope that it will be useful, 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 11 | # GNU General Public License for more details. 12 | # 13 | # You should have received a copy of the GNU General Public License 14 | # along with this program. If not, see . 15 | 16 | # PiVFO Version 0.1 17 | # A GUI for freq_pi 18 | # Jenny List G7CKF 19 | # http://www.languagespy.com 20 | 21 | import time 22 | import math 23 | import subprocess 24 | 25 | #import and rename the 'tkinter' module for < Python 3.3: 26 | import Tkinter as tkinter 27 | 28 | #Initial frequency, variable then holds VFO frequency 29 | vfoFreq = 14000000 30 | #VFO state 31 | vfoState = False 32 | 33 | #Max frequency 250MHz 34 | maxFreq = 250000000 35 | #Min frequency is 125kHz 36 | minFreq = 125000 37 | 38 | #Location of freq_pi 39 | freqgen = "./freq_pi" 40 | 41 | def doQuitEvent(key): 42 | c.resetty() # set terminal settings 43 | c.endwin() # end curses session 44 | subprocess.call([freqgen, "-q"]) #Turn off the clock 45 | raise SystemExit 46 | 47 | #VFO on and off 48 | def vfoOnFunc(): 49 | global vfoState 50 | subprocess.call([freqgen, "-f", str(vfoFreq)]) 51 | vfoState = True 52 | vfoOnButton['state'] = 'disabled' 53 | vfoOffButton['state'] = 'normal' 54 | 55 | def vfoOffFunc(): 56 | global vfoState 57 | subprocess.call([freqgen, "-q"]) 58 | vfoState = False 59 | vfoOnButton['state'] = 'normal' 60 | vfoOffButton['state'] = 'disabled' 61 | 62 | #Change frequency 63 | def freqChange(deltaF): 64 | global vfoFreq 65 | global frequencyLabel 66 | global frequencyUnitLabel 67 | newFreq = vfoFreq + deltaF 68 | #max/min check 69 | if(newFreq >= minFreq and newFreq <= maxFreq): 70 | vfoFreq = newFreq 71 | #else: 72 | #Need to display some kind of message perhaps? 73 | #set the display 74 | frequencyLabel.configure(text=freqToDisplay(vfoFreq)) 75 | frequencyUnitLabel.configure(text=freqDisplayUnit(vfoFreq)) 76 | if(vfoState == True): 77 | subprocess.call([freqgen, "-f", str(vfoFreq)]) 78 | 79 | #Format a display frequency 80 | def freqToDisplay(intFreq): 81 | freq = str(intFreq) 82 | #Split off Hz. Everything will have a Hz fraction 83 | Hz = freq[-3] +freq[-2] +freq[-1] 84 | #Split off kHz. All frequencies will be above 100kHz. 85 | kHz = freq[-6] + freq[-5] +freq[-4] + '.' 86 | #Split off the Mhz fraction 87 | if intFreq >= 1000000: 88 | MHz = str(int(intFreq/1000000)) + '.' 89 | else: #Catch frequencies below 1MHz 90 | MHz = '' #We'll display these as kHz 91 | returnFreq = MHz + kHz + Hz 92 | return returnFreq 93 | 94 | #Pick a unit for frequency display 95 | def freqDisplayUnit(intFreq): 96 | unit = 'MHz' 97 | if intFreq < 1000000: 98 | unit = 'kHz' 99 | return unit 100 | 101 | #Dial function 102 | dialAngle = 0 103 | def dialMove(event): 104 | global canvasWidth 105 | global canvasHeight 106 | global dialAngle 107 | global dialFingerHole 108 | global dialCanvas 109 | global fingerX 110 | global fingerY 111 | xRelativeToCentre = int(event.x-(canvasWidth/2)) 112 | yRelativeToCentre = int(event.y-(canvasHeight/2)) 113 | if(xRelativeToCentre == 0): #Catch divide by zero 114 | xRelativeToCentre = 1 115 | theta = (math.atan2(xRelativeToCentre,yRelativeToCentre) + math.pi) #make it 0 rather than -pi at the top. 116 | if( theta>dialAngle): 117 | subtended = theta-dialAngle 118 | if(subtended > 1): 119 | deltaF = -24 #Catch 2pi to zero switchover with about the delta-f we want. 120 | else: 121 | deltaF = int(-1*subtended*(500/2*math.pi)) 122 | else: 123 | subtended = dialAngle-theta 124 | if(subtended > 1): 125 | deltaF = 24 126 | else: 127 | deltaF = int(subtended*(500/2*math.pi)) 128 | freqChange(deltaF) 129 | dialAngle = theta 130 | #Move the finger hole. 131 | newFingerX = int(canvasWidth/2 + ((canvasWidth/2)-20)*math.cos(theta-math.pi/2)) 132 | newFingerY = int(canvasHeight/2 + ((canvasHeight/2)-20)*math.sin(theta-math.pi/2)) 133 | dialCanvas.move(dialFingerHole, fingerX-newFingerX, newFingerY-fingerY) 134 | fingerX = newFingerX 135 | fingerY = newFingerY 136 | 137 | 138 | #create a new window 139 | window = tkinter.Tk() 140 | #set the window title 141 | window.title("PiVFO by G7CKF/Language Spy") 142 | #set the window background colour 143 | windowBackground = '#123123123' 144 | window.configure(background=windowBackground) 145 | 146 | #Display row group, for frequency controls and display 147 | frequencyRowGroup = tkinter.LabelFrame(window, relief="flat", background=windowBackground) 148 | frequencyRowGroup.pack(side="left") 149 | 150 | #Display row group, for freq display 151 | displayRowGroup = tkinter.LabelFrame(frequencyRowGroup, relief="flat", background=windowBackground) 152 | displayRowGroup.pack() 153 | 154 | #Group to hold VFO display and adjustment 155 | displayGroup = tkinter.LabelFrame(displayRowGroup, background="#000000000", foreground="#000fff000", padx=5, pady=5) 156 | displayGroup.pack(padx=2, pady=2, side="left") 157 | #Frequency display 158 | frequencyLabel = tkinter.Label(displayGroup, text=freqToDisplay(vfoFreq), background="#000000000", foreground="#000fff000", width="12", justify="right", font=("Helvetica", 24)) 159 | #Frequency unit 160 | frequencyUnitLabel = tkinter.Label(displayGroup, text=freqDisplayUnit(vfoFreq), background="#000000", foreground="#000fff000", width="3", justify="left", font=("Helvetica", 10)) 161 | frequencyLabel.pack(side="left") 162 | frequencyUnitLabel.pack(side="left") 163 | 164 | #Frequency control row group, for up/down buttons and dial 165 | frequencyControlRowGroup = tkinter.LabelFrame(frequencyRowGroup, relief="flat", background=windowBackground) 166 | frequencyControlRowGroup.pack() 167 | 168 | #Frequency dial 169 | canvasWidth = 100 170 | canvasHeight = 100 171 | fingerX = 50 172 | fingerY = 20 173 | dialCanvas = tkinter.Canvas(frequencyControlRowGroup, height=canvasHeight, width=canvasWidth, relief="flat", background=windowBackground) 174 | dial = dialCanvas.create_oval(10, 10, 90, 90, width=5, outline='#800800800', fill='#200200200') 175 | dialFingerHole = dialCanvas.create_oval(40, 10, 60, 30, width=2, fill='#500500500') 176 | dialCanvas.bind("", dialMove)#Bound to whole canvas 177 | 178 | #Groups to hold up/down buttons 179 | frequencyControlGroupLeft = tkinter.LabelFrame(frequencyControlRowGroup, padx=0, pady=0, relief="flat", background=windowBackground) 180 | frequencyControlGroupRight = tkinter.LabelFrame(frequencyControlRowGroup, padx=0, pady=0, relief="flat", background=windowBackground) 181 | #create button widgets to increment 182 | downTenMHz = tkinter.Button(frequencyControlGroupLeft, text="-10MHz", command=lambda: freqChange(-10000000), padx=2, pady=3, font=("Helvetica", 10)) 183 | downOneMHz = tkinter.Button(frequencyControlGroupLeft, text="-1MHz", command=lambda: freqChange(-1000000), padx=2, pady=3, font=("Helvetica", 10)) 184 | downhundredKHz = tkinter.Button(frequencyControlGroupLeft, text="-100kHz", command=lambda: freqChange(-100000), padx=2, pady=3, font=("Helvetica", 10)) 185 | downTenKHz = tkinter.Button(frequencyControlGroupLeft, text="-10kHz", command=lambda: freqChange(-10000), padx=2, pady=3, font=("Helvetica", 10)) 186 | downTenMHz.pack(fill='x') 187 | downOneMHz.pack(fill='x') 188 | downhundredKHz.pack(fill='x') 189 | downTenKHz.pack(fill='x') 190 | #create button widgets to decrement 191 | upTenKHz = tkinter.Button(frequencyControlGroupRight, text="+10kHz", command=lambda: freqChange(10000), padx=2, pady=3, font=("Helvetica", 10)) 192 | uphundredKHz = tkinter.Button(frequencyControlGroupRight, text="+100kHz", command=lambda: freqChange(100000), padx=2, pady=3, font=("Helvetica", 10)) 193 | upOneMHz = tkinter.Button(frequencyControlGroupRight, text="+1MHz", command=lambda: freqChange(1000000), padx=2, pady=3, font=("Helvetica", 10)) 194 | upTenMHz = tkinter.Button(frequencyControlGroupRight, text="+10MHz", command=lambda: freqChange(10000000), padx=2, pady=3, font=("Helvetica", 10)) 195 | upTenMHz.pack(fill='x') 196 | upOneMHz.pack(fill='x') 197 | uphundredKHz.pack(fill='x') 198 | upTenKHz.pack(fill='x') 199 | 200 | #Pack all the frequency control stuff 201 | frequencyControlGroupLeft.pack(padx=0, pady=0, side="left") 202 | dialCanvas.pack(side='left') 203 | frequencyControlGroupRight.pack(padx=0, pady=0, side="left") 204 | 205 | #Group to hold VFO power functions 206 | powerGroup = tkinter.LabelFrame(window, relief="flat", background=windowBackground) 207 | powerGroup.pack(padx=0, pady=0, side="top") 208 | #create a button widget to call vfoOn 209 | vfoOnButton = tkinter.Button(powerGroup, text="Start VFO", command=vfoOnFunc, font=("Helvetica", 10)) 210 | #create a button widget to call vfoOff 211 | vfoOffButton = tkinter.Button(powerGroup, text="Stop VFO", command=vfoOffFunc, state='disabled', font=("Helvetica", 10)) 212 | #Pack powerGroup widgets 213 | vfoOnButton.pack() 214 | vfoOffButton.pack() 215 | 216 | #create a label widget called 'lbl' 217 | #lbl = tkinter.Label(window, text="Label") 218 | #pack (add) the widgets into the window 219 | #lbl.pack() 220 | 221 | #draw the window, and start the 'application' 222 | window.mainloop() 223 | -------------------------------------------------------------------------------- /Hardware/one-inch-HF-to-VHF-converter/LICENCE: -------------------------------------------------------------------------------- 1 | SOLDERPAD HARDWARE LICENSE version 0.51 2 | 3 | This license is based closely on the Apache License Version 2.0, but is not approved or endorsed by the Apache Foundation. A copy of the non-modified Apache License 2.0 can be found at http://www.apache.org/licenses/LICENSE-2.0. 4 | 5 | As this license is not currently OSI or FSF approved, the Licensor permits any Work licensed under this License, at the option of the Licensee, to be treated as licensed under the Apache License Version 2.0 (which is so approved). 6 | 7 | This License is licensed under the terms of this License and in particular clause 7 below (Disclaimer of Warranties) applies in relation to its use. 8 | 9 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 10 | 11 | 1. Definitions. 12 | 13 | “License” shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. 14 | 15 | “Licensor” shall mean the Rights owner or entity authorized by the Rights owner that is granting the License. 16 | 17 | “Legal Entity” shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, “control” means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. 18 | 19 | “You” (or “Your”) shall mean an individual or Legal Entity exercising permissions granted by this License. 20 | 21 | “Rights” means copyright and any similar right including design right (whether registered or unregistered), semiconductor topography (mask) rights and database rights (but excluding Patents and Trademarks). 22 | 23 | “Source” form shall mean the preferred form for making modifications, including but not limited to source code, net lists, board layouts, CAD files, documentation source, and configuration files. 24 | 25 | “Object” form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, the instantiation of a hardware design and conversions to other media types, including intermediate forms such as bytecodes, FPGA bitstreams, artwork and semiconductor topographies (mask works). 26 | 27 | “Work” shall mean the work of authorship, whether in Source form or other Object form, made available under the License, as indicated by a Rights notice that is included in or attached to the work (an example is provided in the Appendix below). 28 | 29 | “Derivative Works” shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) or physically connect to or interoperate with the interfaces of, the Work and Derivative Works thereof. 30 | 31 | “Contribution” shall mean any design or work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the Rights owner or by an individual or Legal Entity authorized to submit on behalf of the Rights owner. For the purposes of this definition, “submitted” means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the Rights owner as “Not a Contribution.” 32 | 33 | “Contributor” shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 34 | 35 | 2. Grant of License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable license under the Rights to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form and do anything in relation to the Work as if the Rights did not exist. 36 | 37 | 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 38 | 39 | 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: 40 | 41 | You must give any other recipients of the Work or Derivative Works a copy of this License; and 42 | 43 | You must cause any modified files to carry prominent notices stating that You changed the files; and 44 | 45 | You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and 46 | 47 | If the Work includes a “NOTICE” text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 48 | 49 | 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 50 | 51 | 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 52 | 53 | 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 54 | 55 | 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 56 | 57 | 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. 58 | 59 | END OF TERMS AND CONDITIONS 60 | 61 | APPENDIX: How to apply this license to your work 62 | 63 | To apply this license to your work, attach the following boilerplate notice, with the fields enclosed by brackets “[]” replaced with your own identifying information. (Don’t include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same “printed page” as the copyright notice for easier identification within third-party archives. 64 | 65 | Copyright [yyyy] [name of copyright owner] Copyright and related rights are licensed under the Solderpad Hardware License, Version 0.51 (the “License”); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://solderpad.org/licenses/SHL-0.51. Unless required by applicable law or agreed to in writing, software, hardware and materials distributed under this License is distributed on an “AS IS” BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. 66 | -------------------------------------------------------------------------------- /RaspberryPi/rf/sstv/tones-to-rf.c: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | tones-to-rf.c 4 | 5 | Purpose: 6 | Proof of concept code for Raspberry Pi SSTV transmission 7 | Takes a CSV file called test.csv containing tone(Hz),duration(mSec) pairs, 8 | adds tone to an RF carrier generated on GPCLK0 for duration. 9 | 10 | Jenny List, http://www.languagespy.com 11 | Derived from freq_pi Copyright (c) Jan Panteltje 2013-always 12 | email: panteltje@yahoo.com 13 | This code contains parts of code from Pifm.c 14 | 15 | Config: find the BCM2708_PERI_BASE definitions, and uncomment the one for your Raspberry Pi version 16 | As supplied, this file has the Raspberry Pi 2 version uncommented. 17 | 18 | You may wish to adjust the loop fudge factor to suit your SSTV timing when calculating duration, 19 | my figure came from trial and error. This is only a proof of concept, not polished and lovely code. 20 | 21 | To compile: 22 | gcc -Wall -O4 -o tones-to-rf tones-to-rf.c -std=gnu99 -lm 23 | 24 | Start GPL license: 25 | This program is free software; you can redistribute it and/or modify 26 | it under the terms of the GNU General Public License as published by 27 | the Free Software Foundation; either version 2 of the License, or 28 | (at your option) any later version. 29 | 30 | This program is distributed in the hope that it will be useful, 31 | but WITHOUT ANY WARRANTY; without even the implied warranty of 32 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 33 | GNU General Public License for more details. 34 | 35 | You should have received a copy of the GNU General Public License 36 | along with this program; if not, write to the Free Software 37 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 38 | 39 | */ 40 | 41 | #include 42 | #include 43 | #include 44 | #include 45 | #include 46 | #include 47 | #include 48 | #include 49 | #include 50 | #include 51 | #include 52 | #include 53 | #include 54 | #include 55 | #include 56 | #include 57 | #include 58 | #include 59 | #include 60 | #include 61 | 62 | 63 | #define PAGE_SIZE (4*1024) 64 | #define BLOCK_SIZE (4*1024) 65 | 66 | 67 | //Uncomment the relevant base address definition for your platform 68 | //Base address definition for Pi 1 69 | //#define BCM2708_PERI_BASE 0x20000000 70 | //Base address definition for Pi 2 71 | #define BCM2708_PERI_BASE 0x3F000000 72 | 73 | 74 | int mem_fd; 75 | char *gpio_mem, *gpio_map; 76 | char *spi0_mem, *spi0_map; 77 | 78 | 79 | // I/O access 80 | volatile unsigned *gpio; 81 | volatile unsigned *allof7e; 82 | 83 | // GPIO setup macros. Always use INP_GPIO(x) before using OUT_GPIO(x) or SET_GPIO_ALT(x,y) 84 | #define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3)) 85 | #define OUT_GPIO(g) *(gpio+((g)/10)) |= (1<<(((g)%10)*3)) 86 | #define SET_GPIO_ALT(g,a) *(gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3)) 87 | 88 | #define GPIO_SET *(gpio+7) // sets bits which are 1 ignores bits which are 0 89 | #define GPIO_CLR *(gpio+10) // clears bits which are 1 ignores bits which are 0 90 | #define GPIO_GET *(gpio+13) // sets bits which are 1 ignores bits which are 0 91 | 92 | #define ACCESS(base) *(volatile int*)((int)allof7e+base-0x7e000000) 93 | #define SETBIT(base, bit) ACCESS(base) |= 1< 4095.0) || (divi < 1.0) ) 195 | { 196 | fprintf(stderr, "freq_pi: requested frequency out of range, aborting.\n"); 197 | 198 | exit(1); 199 | } 200 | 201 | 202 | if(divf > 4095.0) 203 | { 204 | fprintf(stderr, "freq_pi: requested frequency out of range, aborting.\n"); 205 | 206 | exit(1); 207 | } 208 | 209 | ua = (0x5a << 24) + (divi << 12) + divf; 210 | 211 | return ua; 212 | } 213 | /* end of calculate_divider */ 214 | 215 | void start_rf_output(int source) 216 | { 217 | 218 | printf("Starting RF\n"); 219 | 220 | /* open /dev/mem */ 221 | if ((mem_fd = open("/dev/mem", O_RDWR|O_SYNC) ) < 0) 222 | { 223 | printf("can't open /dev/mem \n"); 224 | exit (-1); 225 | } 226 | 227 | allof7e = (unsigned *)mmap( NULL, 0x01000000, /*len */ PROT_READ|PROT_WRITE, MAP_SHARED, mem_fd, BCM2708_PERI_BASE /* base */ ); 228 | 229 | if ((int)allof7e==-1) exit(-1); 230 | 231 | SETBIT(GPFSEL0 , 14); 232 | CLRBIT(GPFSEL0 , 13); 233 | CLRBIT(GPFSEL0 , 12); 234 | 235 | /* 236 | Clock source 237 | 0 = GND 238 | 1 = oscillator 239 | 2 = testdebug0 240 | 3 = testdebug1 241 | 4 = PLLA per 242 | 5 = PLLC per 243 | 6 = PLLD per 244 | 7 = HDMI auxiliary 245 | 8-15 = GND 246 | */ 247 | 248 | struct GPCTL setupword = {source/*SRC*/, 1, 0, 0, 0, 1,0x5a}; 249 | 250 | ACCESS(CM_GP0CTL) = *((int*)&setupword); 251 | } 252 | 253 | void stop_rf_output(int source) 254 | { 255 | printf("Stopping RF\n"); 256 | 257 | /* 258 | Clock source 259 | 0 = GND 260 | 1 = oscillator 261 | 2 = testdebug0 262 | 3 = testdebug1 263 | 4 = PLLA per 264 | 5 = PLLC per 265 | 6 = PLLD per 266 | 7 = HDMI auxiliary 267 | 8-15 = GND 268 | */ 269 | 270 | struct GPCTL setupword = {source/*SRC*/, 0, 0, 0, 0, 0,0x5a}; 271 | 272 | ACCESS(CM_GP0CTL) = *((int*)&setupword); 273 | } 274 | 275 | void modulate(int m) 276 | { 277 | ACCESS(CM_GP0DIV) = (0x5a << 24) + 0x4d72 + m; 278 | } 279 | 280 | 281 | struct CB 282 | { 283 | volatile unsigned int TI; 284 | volatile unsigned int SOURCE_AD; 285 | volatile unsigned int DEST_AD; 286 | volatile unsigned int TXFR_LEN; 287 | volatile unsigned int STRIDE; 288 | volatile unsigned int NEXTCONBK; 289 | volatile unsigned int RES1; 290 | volatile unsigned int RES2; 291 | }; 292 | 293 | 294 | struct DMAregs 295 | { 296 | volatile unsigned int CS; 297 | volatile unsigned int CONBLK_AD; 298 | volatile unsigned int TI; 299 | volatile unsigned int SOURCE_AD; 300 | volatile unsigned int DEST_AD; 301 | volatile unsigned int TXFR_LEN; 302 | volatile unsigned int STRIDE; 303 | volatile unsigned int NEXTCONBK; 304 | volatile unsigned int DEBUG; 305 | }; 306 | 307 | 308 | struct PageInfo 309 | { 310 | void* p; // physical address 311 | void* v; // virtual address 312 | }; 313 | 314 | 315 | struct PageInfo constPage; 316 | struct PageInfo instrPage; 317 | struct PageInfo instrs[1024]; 318 | 319 | 320 | 321 | 322 | void print_usage() 323 | { 324 | fprintf(stderr,\ 325 | "\ntones-to-rf \n\ 326 | Usage:\nfreq_pic -f frequency [-h]\n\ 327 | -f int frequency to ouput on GPIO_4 pin 7.\n\ 328 | -h help (this help).\n\ 329 | \n"); 330 | fprintf(stderr,\ 331 | "Example for 1 MHz:\n\ 332 | freq_pi -f 100000000\n\ 333 | \n"\ 334 | ); 335 | 336 | } /* end function print_usage */ 337 | 338 | 339 | 340 | 341 | int main(int argc, char **argv) 342 | { 343 | int a; 344 | uint32_t frequency = 0; // -Wall 345 | 346 | 347 | /* defaults */ 348 | 349 | 350 | 351 | /* end defaults */ 352 | 353 | 354 | 355 | /* proces any command line arguments */ 356 | while(1) 357 | { 358 | a = getopt(argc, argv, "f:h"); 359 | if(a == -1) break; 360 | 361 | switch(a) 362 | { 363 | case 'f': // frequency 364 | a = atoi(optarg); 365 | 366 | 367 | frequency = a; 368 | break; 369 | case 'h': // help 370 | print_usage(); 371 | exit(1); 372 | break; 373 | break; 374 | case -1: 375 | break; 376 | case '?': 377 | if (isprint(optopt) ) 378 | { 379 | fprintf(stderr, "send_iq: unknown option `-%c'.\n", optopt); 380 | } 381 | else 382 | { 383 | fprintf(stderr, "send_iq: unknown option character `\\x%x'.\n", optopt); 384 | } 385 | print_usage(); 386 | 387 | exit(1); 388 | break; 389 | default: 390 | print_usage(); 391 | 392 | exit(1); 393 | break; 394 | }/* end switch a */ 395 | }/* end while getopt() */ 396 | 397 | int clock_source; 398 | /* 399 | Clock source 400 | 0 = GND 401 | 1 = oscillator 402 | 2 = testdebug0 403 | 3 = testdebug1 404 | 4 = PLLA per 405 | 5 = PLLC per 406 | 6 = PLLD per 407 | 7 = HDMI auxiliary 408 | 8-15 = GND 409 | */ 410 | 411 | /* init hardware */ 412 | 413 | clock_source = 6; /* this GPIO_4 pin 7 allows only the 200 MHz clock????? as source, the other clock GPIO lines are not on a pin in revision 2 board, so we have to work with 200 MHz, and that seems to be 250 MHz */ 414 | 415 | start_rf_output(clock_source); 416 | 417 | FILE *file = fopen("./test.csv", "r"); 418 | if ( file ) 419 | { 420 | 421 | //Borrowing from example at http://stackoverflow.com/a/13195361 CSV extraction 422 | char line[512]; 423 | int tone; 424 | int duration; 425 | while (fgets(line, 512, file)) 426 | { 427 | 428 | char tmp[sizeof line]; /* this will save a malloc()/free() pair */ 429 | char *tok, *fence, *pstr; 430 | char ch, *cp1=line, *cp2=tmp; 431 | 432 | while (0 != (ch = *cp1++)) 433 | *cp2++ = (ch == ',') ? 0 : ch; 434 | 435 | fence = cp2; /* remember end of string */ 436 | *fence = 0; /* and terminate final string */ 437 | tok = tmp; /* point to first token */ 438 | 439 | tone =strtol(tok, &pstr, 10); 440 | if (tok < fence) tok += strlen(tok) + 1; 441 | 442 | //Make duration an int in microseconds 443 | //Subtracting an ugly fudge factor to account for the loop time taking about 90usec on a Raspberry Pi 2 444 | //Your fudge factor may vary with trial and error. 445 | duration =(int)(strtof(tok,NULL)*1000)-90; 446 | 447 | //Make the RF tone 448 | ACCESS(CM_GP0DIV) = calculate_divider(frequency+tone); 449 | //Time interval for tone 450 | usleep(duration); 451 | } 452 | 453 | 454 | } 455 | else /* fopen() returned NULL */ 456 | { 457 | printf("error opening csv file"); 458 | } 459 | 460 | 461 | stop_rf_output(clock_source); 462 | 463 | 464 | //fprintf(stderr, "WAS here\n"); 465 | 466 | exit(0); 467 | } /* end function main */ 468 | 469 | -------------------------------------------------------------------------------- /RaspberryPi/rf/freq_pi/freq_pi.c: -------------------------------------------------------------------------------- 1 | /* 2 | This file is part of freq_pi Copyright (c) Jan Panteltje 2013-always 3 | email: panteltje@yahoo.com 4 | 5 | This code contains parts of code from Pifm.c 6 | 7 | Start GPL license: 8 | This program is free software; you can redistribute it and/or modify 9 | it under the terms of the GNU General Public License as published by 10 | the Free Software Foundation; either version 2 of the License, or 11 | (at your option) any later version. 12 | 13 | This program is distributed in the hope that it will be useful, 14 | but WITHOUT ANY WARRANTY; without even the implied warranty of 15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 | GNU General Public License for more details. 17 | 18 | You should have received a copy of the GNU General Public License 19 | along with this program; if not, write to the Free Software 20 | Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 21 | 22 | If you take this code and port it to that Redmond crap you STILL must release SOURCE code, 23 | this program has secret beyond bit level encrypted bits that make it traceable and you will be bitten by the FSF if you violate these terms. 24 | */ 25 | 26 | /* set TABs to 4 for correct formatting of this file, or if you do not know what that is replace all TABs with 4 spaces, else you cannot READ this */ 27 | /* 28 | 29 | Raspberry Pi 2 support added Jenny List http://www.languagespy.com 2015-07-04 and 2015-10-16 30 | 31 | */ 32 | /* 33 | Program name: 34 | freq_pi 35 | 36 | Function: 37 | programmable frequency generator on GPIO_4 pin 7 38 | 39 | 40 | To compile: 41 | gcc -Wall -O4 -o freq_pi freq_pi.c -std=gnu99 -lm 42 | 43 | 44 | To install: 45 | cp freq_pi /usr/local/bin/ 46 | 47 | To run: 48 | freq_pi 49 | */ 50 | 51 | #define PROGRAM_VERSION "0.72" 52 | 53 | 54 | /* 55 | Changes: 56 | 57 | 0.1: 58 | First release 59 | 60 | 0.2: 61 | dunno 62 | 63 | 0.3: 64 | Added sweep function 65 | 66 | 0.4: 67 | Added loop and trigger output, 68 | 69 | 0.5: 70 | Added -s command line option delay between scans. 71 | 72 | 0.6: 73 | Put menu option in alphabetic order, fixed some things in menu. 74 | Added -q for exit with frequency off. 75 | 76 | 0.7: 77 | Added ppm frequency correction -y command line flag. 78 | 79 | 0.71 80 | Minor modification to add Raspberry Pi 2 base address support 81 | 82 | 0.72 83 | Brought in code to automatically select Pi or Pi 2 84 | From minimal_clk.c courtesy of http://abyz.co.uk/rpi/pigpio/index.html which is Public Domain 85 | 86 | */ 87 | 88 | #include 89 | #include 90 | #include 91 | #include 92 | #include 93 | #include 94 | #include 95 | #include 96 | #include 97 | #include 98 | #include 99 | #include 100 | #include 101 | #include 102 | #include 103 | #include 104 | #include 105 | #include 106 | #include 107 | #include 108 | 109 | 110 | #define PAGE_SIZE (4*1024) 111 | #define BLOCK_SIZE (4*1024) 112 | 113 | int mem_fd; 114 | char *gpio_mem, *gpio_map; 115 | char *spi0_mem, *spi0_map; 116 | int wait_for_gpio8_flag; 117 | double ppm_correction; 118 | double pllo_frequency; 119 | 120 | 121 | //#define PLL0_FREQUENCY 250000000.0 122 | #define PLL0_FREQUENCY 500000000.0 123 | 124 | //Variables used by auto Pi model detection 125 | static volatile uint32_t piModel = 1; 126 | static volatile uint32_t piPeriphBase = 0x20000000; 127 | static volatile uint32_t piBusAddr = 0x40000000; 128 | static volatile uint32_t piGpioBase; 129 | 130 | // I/O access 131 | volatile unsigned *gpio; 132 | volatile unsigned *allof7e; 133 | 134 | // GPIO setup macros. Always use INP_GPIO(x) before using OUT_GPIO(x) or SET_GPIO_ALT(x,y) 135 | #define INP_GPIO(g) *(gpio+((g)/10)) &= ~(7<<(((g)%10)*3)) 136 | #define OUT_GPIO(g) *(gpio+((g)/10)) |= (1<<(((g)%10)*3)) 137 | #define SET_GPIO_ALT(g,a) *(gpio+(((g)/10))) |= (((a)<=3?(a)+4:(a)==4?3:2)<<(((g)%10)*3)) 138 | 139 | #define GPIO_SET *(gpio+7) // sets bits which are 1 ignores bits which are 0 140 | #define GPIO_CLR *(gpio+10) // clears bits which are 1 ignores bits which are 0 141 | #define GPIO_GET *(gpio+13) // sets bits which are 1 ignores bits which are 0 142 | 143 | #define ACCESS(base) *(volatile int*)((int)allof7e+base-0x7e000000) 144 | #define SETBIT(base, bit) ACCESS(base) |= 1< 4095.0) || (divi < 1.0) ) 474 | { 475 | fprintf(stderr, "freq_pi: requested frequency out of range, aborting.\n"); 476 | 477 | exit(1); 478 | } 479 | 480 | if(divf > 4095.0) 481 | { 482 | fprintf(stderr, "freq_pi: requested frequency out of range, aborting.\n"); 483 | 484 | exit(1); 485 | } 486 | 487 | ua = (0x5a << 24) + (divi << 12) + divf; 488 | 489 | ACCESS(CM_GP0DIV) = ua; 490 | 491 | if(verbose) 492 | { 493 | fprintf(stderr, "set_frequency: frequency set to %d\n", frequency); 494 | } 495 | 496 | return 1; 497 | } /* end function set_frequency */ 498 | 499 | 500 | 501 | 502 | void print_usage() 503 | { 504 | 505 | fprintf(stderr,\ 506 | "\nPanteltje freq_pi-%s\n\ 507 | Usage:\nfreq_pic [-b begin_frequency] [-d step_delay] [-e end_frequency] [-f frequency] [-h] [-i frequency_increment] [-l] [-r] [-s scan_delay] [-q] [-v] [-w] [-y ppm_correction]\n\ 508 | -b int begin frequency in sweep mode.\n\ 509 | -d int delay in micro seconds between frequency steps in sweep mode, default 1.\n\ 510 | -e int end frequency in sweep mode.\n\ 511 | -f int frequency to output on GPIO_4 pin 7, on my revision 2 board from 130 kHz to 250 MHz,\n\ 512 | phase noise is caused by divf (fractional part of divider) not being zero, use -v to show divf.\n\ 513 | -h help (this help).\n\ 514 | -i int frequency increment between steps in sweep mode, default 1 MHz.\n\ 515 | -l loop mode, trigger output signals start sweep.\n\ 516 | -r wait for low level on GPIO8 pin 24 in case -f -w.\n\ 517 | -q switch output off and exit.\n\ 518 | -s int delay between scans in us, default 1.\n\ 519 | -v verbose.\n\ 520 | -w wait for GPIO8 pin 24 to go high to start a scan.\n\ 521 | -y float frequency correction in parts per million (ppm), positive or negative, for calibration, default 0.\n\ 522 | \n",\ 523 | PROGRAM_VERSION); 524 | 525 | fprintf(stderr,\ 526 | "Note:\n\ 527 | GPIO17 pin 11 is trigger output, positive, high during sweep, for example for scope.\n\n"); 528 | fprintf(stderr,\ 529 | "GPIO8 pin 24 is only initialized when the -w command line flag is used, else it can be used for other things.\n\n"); 530 | 531 | fprintf(stderr,\ 532 | "Example for 1 MHz, with +39.4 parts per million correction :\n\ 533 | freq_pi -f 100000000 -y 39.4\n\ 534 | \n\ 535 | Example for a sweep from 1 MHz to 100 MHz step 1 MHz with 100 mS delay between steps:\n\ 536 | freq_pi -b 1000000 -e 100000000 -i 1000000 -d 100000\n\ 537 | \n\ 538 | Use -v to see where you are, but this makes it slower than the speed specified with -d.\n\ 539 | \n\ 540 | Example for a repeated scan every second from 1 MHz to 100 MHz with 1 MHz increments and 10 mS delay between increments:\n\ 541 | freq_pi freq_pi -b 1000000 -e 100000000 -i 1000000 -d 100000 -s 1000000 -l\n\ 542 | \n\ 543 | Control C exits.\n\ 544 | freq_pi -q switches off output, then exits.\n\ 545 | \n\ 546 | "); 547 | 548 | } /* end function print_usage */ 549 | 550 | 551 | 552 | 553 | int main(int argc, char **argv) 554 | { 555 | int a; 556 | uint32_t frequency = 0; // -Wall 557 | uint32_t frequency_increment; 558 | int step_delay; 559 | uint32_t begin_frequency; 560 | uint32_t end_frequency; 561 | int reverse_start_polarity_flag; 562 | int loop_mode_flag; 563 | int scan_delay; 564 | int exit_with_output_off_flag; 565 | 566 | /* defaults */ 567 | 568 | verbose = 0; 569 | step_delay = 1; 570 | frequency_increment = 1000000; 571 | begin_frequency = 0; 572 | end_frequency = 0; 573 | wait_for_gpio8_flag = 0; 574 | reverse_start_polarity_flag = 0; 575 | loop_mode_flag = 0; 576 | scan_delay = 1; 577 | exit_with_output_off_flag = 0; 578 | pllo_frequency = PLL0_FREQUENCY; 579 | ppm_correction = 0.0; 580 | 581 | /* end defaults */ 582 | 583 | 584 | /* proces any command line arguments */ 585 | while(1) 586 | { 587 | a = getopt(argc, argv, "b:d:e:f:hi:lqs:vwry:"); 588 | if(a == -1) break; 589 | 590 | switch(a) 591 | { 592 | case 'b': // begin_frequency 593 | begin_frequency = atoi(optarg); 594 | break; 595 | case 'd': // delay between frequency increments 596 | step_delay = atoi(optarg); 597 | break; 598 | case 'e': // end_frequency 599 | end_frequency = atoi(optarg); 600 | break; 601 | case 'f': // frequency 602 | a = atoi(optarg); 603 | frequency = a; 604 | break; 605 | case 'h': // help 606 | print_usage(); 607 | exit(1); 608 | break; 609 | break; 610 | case 'i':// fequency increment in sweep mode 611 | frequency_increment = atoi(optarg); 612 | break; 613 | case 'l': // loop mode 614 | loop_mode_flag = 1; 615 | break; 616 | case 'v': // verbose 617 | verbose = 1 - verbose; 618 | break; 619 | case 'w': // wai tfor GPIO8 pin 24 to go high 620 | wait_for_gpio8_flag = 1; 621 | break; 622 | case 'r': // wait for low level in case -w 623 | reverse_start_polarity_flag = 1; 624 | break; 625 | case 'q': // switch of output 626 | exit_with_output_off_flag = 1; 627 | break; 628 | case 's': // scan delay 629 | scan_delay = atoi(optarg); 630 | break; 631 | case 'y': // ppm correction 632 | ppm_correction = atof(optarg); 633 | break; 634 | case -1: 635 | break; 636 | case '?': 637 | if (isprint(optopt) ) 638 | { 639 | fprintf(stderr, "send_iq: unknown option `-%c'.\n", optopt); 640 | } 641 | else 642 | { 643 | fprintf(stderr, "freq_pi: unknown option character `\\x%x'.\n", optopt); 644 | } 645 | print_usage(); 646 | 647 | exit(1); 648 | break; 649 | default: 650 | print_usage(); 651 | 652 | exit(1); 653 | break; 654 | }/* end switch a */ 655 | }/* end while getopt() */ 656 | 657 | gpioHardwareRevision(); /* sets piModel, needed for peripherals address */ 658 | 659 | setup_io(); 660 | 661 | set_gpio_directions(); // start pin only 662 | 663 | /* 664 | From ducument BCM2835-ARM-Peripherals.pdf 665 | page 105 666 | 6.3 General Purpose GPIO Clocks 667 | 668 | 669 | The General Purpose clocks can be output to GPIO pins. 670 | They run from the peripherals clock sources and use clock generators with noise-shaping MASH dividers. 671 | These allow the GPIO clocks to be used to drive audio devices. 672 | The fractional divider operates by periodically dropping source clock pulses, therefore the output frequency will periodically switch between: 673 | source_frequency / DIVI, and source_frequency / (DIVI + 1) 674 | 675 | Jitter is therefore reduced by increasing the source clock frequency. 676 | In applications where jitter is a concern, the fastest available clock source should be used. 677 | The General Purpose clocks have MASH noise-shaping dividers which push this fractional divider jitter out of the audio band. 678 | MASH noise-shaping is incorporated to push the fractional divider jitter out of the audio band if required. 679 | The MASH can be programmed for 1, 2 or 3-stage filtering. MASH filter, the frequency is spread around the requested frequency and the user must ensure that the module is not exposed to frequencies higher than 25MHz. 680 | Also, the MASH filter imposes a low limit on the range of DIVI. 681 | 682 | MASH min DIVI min output freq average output freq max output freq 683 | 0 (int divide) 1 source / ( DIVI ) source / ( DIVI ) source / ( DIVI ) 684 | 1 2 source / ( DIVI ) source / ( DIVI + DIVF / 1024 ) source / ( DIVI + 1 ) 685 | 2 3 source / ( DIVI - 1 ) source / ( DIVI + DIVF / 1024 ) source / ( DIVI + 2 ) 686 | 3 5 source / ( DIVI - 3 ) source / ( DIVI + DIVF / 1024 ) source / ( DIVI + 4 ) 687 | Table 6-32 Effect of MASH Filter on Frequency 688 | 689 | The following example illustrates the spreading of output clock frequency resulting from the 690 | use of the MASH filter. Note that the spread is greater for lower divisors. 691 | PLL target min ave max 692 | freq freq freq freq freq 693 | (MHz) (MHz) MASH divisor DIVI DIVF (MHz) (MHz) (MHz) error 694 | 650 18.32 0 35.480 35 492 18.57 18.57 18.57 ok 695 | 650 18.32 1 35.480 35 492 18.06 18.32 18.57 ok 696 | 650 18.32 2 35.480 35 492 17.57 18.32 19.12 ok 697 | 650 18.32 3 35.480 35 492 16.67 18.32 20.31 ok 698 | 400 18.32 0 21.834 21 854 19.05 19.05 19.05 ok 699 | 400 18.32 1 21.834 21 854 18.18 18.32 19.05 ok 700 | 400 18.32 2 21.834 21 854 17.39 18.32 20.00 ok 701 | 400 18.32 3 21.834 21 854 16.00 18.32 22.22 ok 702 | 200 18.32 0 10.917 10 939 20.00 20.00 20.00 ok 703 | 200 18.32 1 10.917 10 939 18.18 18.32 20.00 ok 704 | 200 18.32 2 10.917 10 939 16.67 18.32 22.22 ok 705 | 200 18.32 3 10.917 10 939 14.29 18.32 28.57 error 706 | Table 6-33 Example of Frequency Spread when using MASH Filtering 707 | 708 | 709 | Operating Frequency 710 | The maximum operating frequency of the General Purpose clocks is ~125MHz at 1.2V but this will be reduced if the GPIO pins are heavily loaded or have a capacitive load. 711 | 712 | 713 | Register Definitions 714 | Clock Manager General Purpose Clocks Control (CM_GP0CTL, GP1CTL & 715 | GP2CTL) 716 | Address 0x 7e10 1070 CM_GP0CTL 717 | 0x 7e10 1078 CM_GP1CTL 718 | 0x 7e10 1080 CM_GP2CTL 719 | Bit Field Read/ 720 | Description Reset 721 | Number Name Write 722 | 31-24 PASSWD Clock Manager password "5a" W 0 723 | 23-11 - Unused R 0 724 | 10-9 MASH MASH control R/W 0 725 | 0 = integer division 726 | 1 = 1-stage MASH (equivalent to non-MASH dividers) 727 | 2 = 2-stage MASH 728 | 3 = 3-stage MASH 729 | To avoid lock-ups and glitches do not change this 730 | control while BUSY=1 and do not change this control 731 | at the same time as asserting ENAB. 732 | 8 FLIP Invert the clock generator output R/W 0 733 | This is intended for use in test/debug only. Switching 734 | this control will generate an edge on the clock 735 | generator output. To avoid output glitches do not 736 | switch this control while BUSY=1. 737 | 7 BUSY Clock generator is running R 0 738 | Indicates the clock generator is running. To avoid 739 | glitches and lock-ups, clock sources and setups must 740 | not be changed while this flag is set. 741 | 6 - Unused R 0 742 | 5 KILL Kill the clock generator R/W 0 743 | 0 = no action 744 | 1 = stop and reset the clock generator 745 | This is intended for test/debug only. Using this control 746 | may cause a glitch on the clock generator output. 747 | 4 ENAB Enable the clock generator R/W 0 748 | This requests the clock to start or stop without 749 | glitches. The output clock will not stop immediately 750 | because the cycle must be allowed to complete to 751 | avoid glitches. The BUSY flag will go low when the 752 | final cycle is completed. 753 | 3-0 SRC Clock source R/W 0 754 | 0 = GND 755 | 1 = oscillator 756 | 2 = testdebug0 757 | 3 = testdebug1 758 | 4 = PLLA per 759 | 5 = PLLC per 760 | 6 = PLLD per 761 | 7 = HDMI auxiliary 762 | 8-15 = GND 763 | To avoid lock-ups and glitches do not change this 764 | control while BUSY=1 and do not change this control 765 | at the same time as asserting ENAB. 766 | 06 February 2012 Broadcom Europe Ltd. 406 Science Park Milton Road Cambridge CB4 0WW Page 107 767 | 2012 Broadcom Corporation. All rights reserved 768 | 769 | 770 | Clock Manager General Purpose Clock Divisors (CM_GP0DIV, CM_GP1DIV & 771 | CM_GP2DIV) 772 | Address 0x 7e10 1074 CM_GP0DIV 773 | 0x 7e10 107c CM_GP1DIV 774 | 0x 7e10 1084 CM_GP2DIV 775 | 776 | Bit Field Read/ 777 | Description Reset 778 | Number Name Write 779 | 31-24 PASSWD Clock Manager password "5a" W 0 780 | 23-12 DIVI Integer part of divisor R/W 0 781 | This value has a minimum limit determined by the 782 | MASH setting. See text for details. To avoid lock-ups 783 | and glitches do not change this control while BUSY=1. 784 | 11-0 DIVF Fractional part of divisor R/W 0 785 | To avoid lock-ups and glitches do not change this 786 | control while BUSY=1. 787 | Table 6-35 General Purpose Clock Divisors 788 | */ 789 | 790 | 791 | 792 | 793 | //struct GPCTL setupword = {6 /* clock source */, 1 /* enable */, 0 /* not kill */, 0 , 0, 1 /* 1 stage MASH (equivalent to no MASH */, 0x5a /* password */ }; 794 | 795 | //ACCESS(CM_GP0CTL) = *((int*)&setupword); 796 | 797 | 798 | //ACCESS(CM_GP0DIV) = (0x5a << 24) + 0x4d72 + m 799 | 800 | 801 | /* 802 | clock sources are 650 MHz, 400 MHz, and 200 MHz 803 | 804 | So the lowest frequency we can make is 200,000,000 / 4095.4095 = 48,835.165323516 Hz 805 | 806 | But I get 61,043 Hz 807 | 808 | 4095.4095 * 61043 = 249,996,082.108499999 Hz.... 809 | 810 | But for MASH 1, 811 | MASH min DIVI min output freq average output freq max output freq 812 | 0 (int divide) 1 source / ( DIVI ) source / ( DIVI ) source / ( DIVI ) 813 | * 1 2 source / ( DIVI ) source / ( DIVI + DIVF / 1024 ) source / ( DIVI + 1 ) 814 | 2 3 source / ( DIVI - 1 ) source / ( DIVI + DIVF / 1024 ) source / ( DIVI + 2 ) 815 | 3 5 source / ( DIVI - 3 ) source / ( DIVI + DIVF / 1024 ) source / ( DIVI + 4 ) 816 | 817 | 200,000,000 / (4095 = 48840.048840048 818 | 200,000,000 / (4095 + (4095/1024) ) = 48792.400011912 819 | 820 | So 821 | 61043 * (4095 + .3999023437) = 249995496.238766479 Hz, looks liike we have a 250 MHz clock. 822 | 823 | Lowest frequency then is 61,043 Hz, 824 | highest frequency then is 250,000,000 / 1 = 250,000,000 Hz 825 | 826 | mm looks like a 500 MHz clock to me... 827 | */ 828 | 829 | 830 | int clock_source; 831 | /* 832 | Clock source 833 | 0 = GND 834 | 1 = oscillator 835 | 2 = testdebug0 836 | 3 = testdebug1 837 | 4 = PLLA per 838 | 5 = PLLC per 839 | 6 = PLLD per 840 | 7 = HDMI auxiliary 841 | 8-15 = GND 842 | */ 843 | 844 | /* init hardware */ 845 | 846 | if(exit_with_output_off_flag) 847 | { 848 | /* RF off */ 849 | clock_source = 0; // ground 850 | start_rf_output(clock_source); 851 | 852 | fprintf(stderr, "freq_pi: output is off.\n"); 853 | 854 | exit(0); 855 | } 856 | 857 | clock_source = 6; /* this GPIO_4 pin 7 allows only the PLLD clock as source, the other clock GPIO lines are not on a pin in revision 2 board, so we have to work with PLLD, and that seems to be 500 MHz */ 858 | start_rf_output(clock_source); 859 | 860 | if(frequency) // if normal mode 861 | { 862 | if(begin_frequency) 863 | { 864 | print_usage(); 865 | 866 | fprintf(stderr, "freq_pi: cannot use both normal and scan mode at the same time, aborting.\n"); 867 | 868 | exit(1); 869 | } 870 | 871 | set_frequency(frequency); 872 | 873 | exit(0); 874 | } 875 | 876 | // test for scan mode 877 | if(! begin_frequency) 878 | { 879 | print_usage(); 880 | fprintf(stderr, "freq_pi: no begin frequency specified, aborting.\n"); 881 | 882 | exit(1); 883 | } 884 | 885 | if(! end_frequency) 886 | { 887 | print_usage(); 888 | fprintf(stderr, "freq_pi: no end frequency specified, aborting.\n"); 889 | 890 | exit(1); 891 | } 892 | 893 | if(end_frequency <= begin_frequency) 894 | { 895 | fprintf(stderr, "freq_pi: end_frequency must be > begin_frequency, aborting.\n"); 896 | 897 | exit(1); 898 | } 899 | 900 | *(gpio + 10) = (1<= end_frequency) break; 937 | } 938 | 939 | /* trigger output low */ 940 | *(gpio + 10) = (1< 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 | 144 | 145 | 146 | 147 | HF in 148 | VHF out 149 | G7CKF HF-to-RTL 150 | receive converter 151 | Rev 1.2 152 | 153 | 154 | 155 | <b>Resistors, Capacitors, Inductors</b><p> 156 | Based on the previous libraries: 157 | <ul> 158 | <li>r.lbr 159 | <li>cap.lbr 160 | <li>cap-fe.lbr 161 | <li>captant.lbr 162 | <li>polcap.lbr 163 | <li>ipc-smd.lbr 164 | </ul> 165 | All SMD packages are defined according to the IPC specifications and CECC<p> 166 | <author>Created by librarian@cadsoft.de</author><p> 167 | <p> 168 | for Electrolyt Capacitors see also :<p> 169 | www.bccomponents.com <p> 170 | www.panasonic.com<p> 171 | www.kemet.com<p> 172 | http://www.secc.co.jp/pdf/os_e/2004/e_os_all.pdf <b>(SANYO)</b> 173 | <p> 174 | for trimmer refence see : <u>www.electrospec-inc.com/cross_references/trimpotcrossref.asp</u><p> 175 | 176 | <table border=0 cellspacing=0 cellpadding=0 width="100%" cellpaddding=0> 177 | <tr valign="top"> 178 | 179 | <! <td width="10">&nbsp;</td> 180 | <td width="90%"> 181 | 182 | <b><font color="#0000FF" size="4">TRIM-POT CROSS REFERENCE</font></b> 183 | <P> 184 | <TABLE BORDER=0 CELLSPACING=1 CELLPADDING=2> 185 | <TR> 186 | <TD COLSPAN=8> 187 | <FONT SIZE=3 FACE=ARIAL><B>RECTANGULAR MULTI-TURN</B></FONT> 188 | </TD> 189 | </TR> 190 | <TR> 191 | <TD ALIGN=CENTER> 192 | <B> 193 | <FONT SIZE=3 FACE=ARIAL color="#FF0000">BOURNS</FONT> 194 | </B> 195 | </TD> 196 | <TD ALIGN=CENTER> 197 | <B> 198 | <FONT SIZE=3 FACE=ARIAL color="#FF0000">BI&nbsp;TECH</FONT> 199 | </B> 200 | </TD> 201 | <TD ALIGN=CENTER> 202 | <B> 203 | <FONT SIZE=3 FACE=ARIAL color="#FF0000">DALE-VISHAY</FONT> 204 | </B> 205 | </TD> 206 | <TD ALIGN=CENTER> 207 | <B> 208 | <FONT SIZE=3 FACE=ARIAL color="#FF0000">PHILIPS/MEPCO</FONT> 209 | </B> 210 | </TD> 211 | <TD ALIGN=CENTER> 212 | <B> 213 | <FONT SIZE=3 FACE=ARIAL color="#FF0000">MURATA</FONT> 214 | </B> 215 | </TD> 216 | <TD ALIGN=CENTER> 217 | <B> 218 | <FONT SIZE=3 FACE=ARIAL color="#FF0000">PANASONIC</FONT> 219 | </B> 220 | </TD> 221 | <TD ALIGN=CENTER> 222 | <B> 223 | <FONT SIZE=3 FACE=ARIAL color="#FF0000">SPECTROL</FONT> 224 | </B> 225 | </TD> 226 | <TD ALIGN=CENTER> 227 | <B> 228 | <FONT SIZE=3 FACE=ARIAL color="#FF0000">MILSPEC</FONT> 229 | </B> 230 | </TD><TD>&nbsp;</TD> 231 | </TR> 232 | <TR> 233 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3 > 234 | 3005P<BR> 235 | 3006P<BR> 236 | 3006W<BR> 237 | 3006Y<BR> 238 | 3009P<BR> 239 | 3009W<BR> 240 | 3009Y<BR> 241 | 3057J<BR> 242 | 3057L<BR> 243 | 3057P<BR> 244 | 3057Y<BR> 245 | 3059J<BR> 246 | 3059L<BR> 247 | 3059P<BR> 248 | 3059Y<BR></FONT> 249 | </TD> 250 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 251 | -<BR> 252 | 89P<BR> 253 | 89W<BR> 254 | 89X<BR> 255 | 89PH<BR> 256 | 76P<BR> 257 | 89XH<BR> 258 | 78SLT<BR> 259 | 78L&nbsp;ALT<BR> 260 | 56P&nbsp;ALT<BR> 261 | 78P&nbsp;ALT<BR> 262 | T8S<BR> 263 | 78L<BR> 264 | 56P<BR> 265 | 78P<BR></FONT> 266 | </TD> 267 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 268 | -<BR> 269 | T18/784<BR> 270 | 783<BR> 271 | 781<BR> 272 | -<BR> 273 | -<BR> 274 | -<BR> 275 | 2199<BR> 276 | 1697/1897<BR> 277 | 1680/1880<BR> 278 | 2187<BR> 279 | -<BR> 280 | -<BR> 281 | -<BR> 282 | -<BR></FONT> 283 | </TD> 284 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 285 | -<BR> 286 | 8035EKP/CT20/RJ-20P<BR> 287 | -<BR> 288 | RJ-20X<BR> 289 | -<BR> 290 | -<BR> 291 | -<BR> 292 | 1211L<BR> 293 | 8012EKQ&nbsp;ALT<BR> 294 | 8012EKR&nbsp;ALT<BR> 295 | 1211P<BR> 296 | 8012EKJ<BR> 297 | 8012EKL<BR> 298 | 8012EKQ<BR> 299 | 8012EKR<BR></FONT> 300 | </TD> 301 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 302 | -<BR> 303 | 2101P<BR> 304 | 2101W<BR> 305 | 2101Y<BR> 306 | -<BR> 307 | -<BR> 308 | -<BR> 309 | -<BR> 310 | -<BR> 311 | -<BR> 312 | -<BR> 313 | -<BR> 314 | 2102L<BR> 315 | 2102S<BR> 316 | 2102Y<BR></FONT> 317 | </TD> 318 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 319 | -<BR> 320 | EVMCOG<BR> 321 | -<BR> 322 | -<BR> 323 | -<BR> 324 | -<BR> 325 | -<BR> 326 | -<BR> 327 | -<BR> 328 | -<BR> 329 | -<BR> 330 | -<BR> 331 | -<BR> 332 | -<BR> 333 | -<BR></FONT> 334 | </TD> 335 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 336 | -<BR> 337 | 43P<BR> 338 | 43W<BR> 339 | 43Y<BR> 340 | -<BR> 341 | -<BR> 342 | -<BR> 343 | -<BR> 344 | 40L<BR> 345 | 40P<BR> 346 | 40Y<BR> 347 | 70Y-T602<BR> 348 | 70L<BR> 349 | 70P<BR> 350 | 70Y<BR></FONT> 351 | </TD> 352 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 353 | -<BR> 354 | -<BR> 355 | -<BR> 356 | -<BR> 357 | -<BR> 358 | -<BR> 359 | -<BR> 360 | -<BR> 361 | RT/RTR12<BR> 362 | RT/RTR12<BR> 363 | RT/RTR12<BR> 364 | -<BR> 365 | RJ/RJR12<BR> 366 | RJ/RJR12<BR> 367 | RJ/RJR12<BR></FONT> 368 | </TD> 369 | </TR> 370 | <TR> 371 | <TD COLSPAN=8>&nbsp; 372 | </TD> 373 | </TR> 374 | <TR> 375 | <TD COLSPAN=8> 376 | <FONT SIZE=4 FACE=ARIAL><B>SQUARE MULTI-TURN</B></FONT> 377 | </TD> 378 | </TR> 379 | <TR> 380 | <TD ALIGN=CENTER> 381 | <FONT SIZE=3 FACE=ARIAL><B>BOURN</B></FONT> 382 | </TD> 383 | <TD ALIGN=CENTER> 384 | <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> 385 | </TD> 386 | <TD ALIGN=CENTER> 387 | <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> 388 | </TD> 389 | <TD ALIGN=CENTER> 390 | <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> 391 | </TD> 392 | <TD ALIGN=CENTER> 393 | <FONT SIZE=3 FACE=ARIAL><B>MURATA</B></FONT> 394 | </TD> 395 | <TD ALIGN=CENTER> 396 | <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> 397 | </TD> 398 | <TD ALIGN=CENTER> 399 | <FONT SIZE=3 FACE=ARIAL><B>SPECTROL</B></FONT> 400 | </TD> 401 | <TD ALIGN=CENTER> 402 | <FONT SIZE=3 FACE=ARIAL><B>MILSPEC</B></FONT> 403 | </TD> 404 | </TR> 405 | <TR> 406 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 407 | 3250L<BR> 408 | 3250P<BR> 409 | 3250W<BR> 410 | 3250X<BR> 411 | 3252P<BR> 412 | 3252W<BR> 413 | 3252X<BR> 414 | 3260P<BR> 415 | 3260W<BR> 416 | 3260X<BR> 417 | 3262P<BR> 418 | 3262W<BR> 419 | 3262X<BR> 420 | 3266P<BR> 421 | 3266W<BR> 422 | 3266X<BR> 423 | 3290H<BR> 424 | 3290P<BR> 425 | 3290W<BR> 426 | 3292P<BR> 427 | 3292W<BR> 428 | 3292X<BR> 429 | 3296P<BR> 430 | 3296W<BR> 431 | 3296X<BR> 432 | 3296Y<BR> 433 | 3296Z<BR> 434 | 3299P<BR> 435 | 3299W<BR> 436 | 3299X<BR> 437 | 3299Y<BR> 438 | 3299Z<BR></FONT> 439 | </TD> 440 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 441 | -<BR> 442 | 66P&nbsp;ALT<BR> 443 | 66W&nbsp;ALT<BR> 444 | 66X&nbsp;ALT<BR> 445 | 66P&nbsp;ALT<BR> 446 | 66W&nbsp;ALT<BR> 447 | 66X&nbsp;ALT<BR> 448 | -<BR> 449 | 64W&nbsp;ALT<BR> 450 | -<BR> 451 | 64P&nbsp;ALT<BR> 452 | 64W&nbsp;ALT<BR> 453 | 64X&nbsp;ALT<BR> 454 | 64P<BR> 455 | 64W<BR> 456 | 64X<BR> 457 | 66X&nbsp;ALT<BR> 458 | 66P&nbsp;ALT<BR> 459 | 66W&nbsp;ALT<BR> 460 | 66P<BR> 461 | 66W<BR> 462 | 66X<BR> 463 | 67P<BR> 464 | 67W<BR> 465 | 67X<BR> 466 | 67Y<BR> 467 | 67Z<BR> 468 | 68P<BR> 469 | 68W<BR> 470 | 68X<BR> 471 | 67Y&nbsp;ALT<BR> 472 | 67Z&nbsp;ALT<BR></FONT> 473 | </TD> 474 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 475 | 5050<BR> 476 | 5091<BR> 477 | 5080<BR> 478 | 5087<BR> 479 | -<BR> 480 | -<BR> 481 | -<BR> 482 | -<BR> 483 | -<BR> 484 | -<BR> 485 | -<BR> 486 | T63YB<BR> 487 | T63XB<BR> 488 | -<BR> 489 | -<BR> 490 | -<BR> 491 | 5887<BR> 492 | 5891<BR> 493 | 5880<BR> 494 | -<BR> 495 | -<BR> 496 | -<BR> 497 | T93Z<BR> 498 | T93YA<BR> 499 | T93XA<BR> 500 | T93YB<BR> 501 | T93XB<BR> 502 | -<BR> 503 | -<BR> 504 | -<BR> 505 | -<BR> 506 | -<BR></FONT> 507 | </TD> 508 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 509 | -<BR> 510 | -<BR> 511 | -<BR> 512 | -<BR> 513 | -<BR> 514 | -<BR> 515 | -<BR> 516 | -<BR> 517 | -<BR> 518 | -<BR> 519 | 8026EKP<BR> 520 | 8026EKW<BR> 521 | 8026EKM<BR> 522 | 8026EKP<BR> 523 | 8026EKB<BR> 524 | 8026EKM<BR> 525 | 1309X<BR> 526 | 1309P<BR> 527 | 1309W<BR> 528 | 8024EKP<BR> 529 | 8024EKW<BR> 530 | 8024EKN<BR> 531 | RJ-9P/CT9P<BR> 532 | RJ-9W<BR> 533 | RJ-9X<BR> 534 | -<BR> 535 | -<BR> 536 | -<BR> 537 | -<BR> 538 | -<BR> 539 | -<BR> 540 | -<BR></FONT> 541 | </TD> 542 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 543 | -<BR> 544 | -<BR> 545 | -<BR> 546 | -<BR> 547 | -<BR> 548 | -<BR> 549 | -<BR> 550 | -<BR> 551 | -<BR> 552 | -<BR> 553 | 3103P<BR> 554 | 3103Y<BR> 555 | 3103Z<BR> 556 | 3103P<BR> 557 | 3103Y<BR> 558 | 3103Z<BR> 559 | -<BR> 560 | -<BR> 561 | -<BR> 562 | -<BR> 563 | -<BR> 564 | -<BR> 565 | 3105P/3106P<BR> 566 | 3105W/3106W<BR> 567 | 3105X/3106X<BR> 568 | 3105Y/3106Y<BR> 569 | 3105Z/3105Z<BR> 570 | 3102P<BR> 571 | 3102W<BR> 572 | 3102X<BR> 573 | 3102Y<BR> 574 | 3102Z<BR></FONT> 575 | </TD> 576 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 577 | -<BR> 578 | -<BR> 579 | -<BR> 580 | -<BR> 581 | -<BR> 582 | -<BR> 583 | -<BR> 584 | -<BR> 585 | -<BR> 586 | -<BR> 587 | -<BR> 588 | -<BR> 589 | -<BR> 590 | -<BR> 591 | -<BR> 592 | -<BR> 593 | -<BR> 594 | -<BR> 595 | -<BR> 596 | -<BR> 597 | -<BR> 598 | -<BR> 599 | EVMCBG<BR> 600 | EVMCCG<BR> 601 | -<BR> 602 | -<BR> 603 | -<BR> 604 | -<BR> 605 | -<BR> 606 | -<BR> 607 | -<BR> 608 | -<BR></FONT> 609 | </TD> 610 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 611 | 55-1-X<BR> 612 | 55-4-X<BR> 613 | 55-3-X<BR> 614 | 55-2-X<BR> 615 | -<BR> 616 | -<BR> 617 | -<BR> 618 | -<BR> 619 | -<BR> 620 | -<BR> 621 | -<BR> 622 | -<BR> 623 | -<BR> 624 | -<BR> 625 | -<BR> 626 | -<BR> 627 | 50-2-X<BR> 628 | 50-4-X<BR> 629 | 50-3-X<BR> 630 | -<BR> 631 | -<BR> 632 | -<BR> 633 | 64P<BR> 634 | 64W<BR> 635 | 64X<BR> 636 | 64Y<BR> 637 | 64Z<BR> 638 | -<BR> 639 | -<BR> 640 | -<BR> 641 | -<BR> 642 | -<BR></FONT> 643 | </TD> 644 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 645 | RT/RTR22<BR> 646 | RT/RTR22<BR> 647 | RT/RTR22<BR> 648 | RT/RTR22<BR> 649 | RJ/RJR22<BR> 650 | RJ/RJR22<BR> 651 | RJ/RJR22<BR> 652 | RT/RTR26<BR> 653 | RT/RTR26<BR> 654 | RT/RTR26<BR> 655 | RJ/RJR26<BR> 656 | RJ/RJR26<BR> 657 | RJ/RJR26<BR> 658 | RJ/RJR26<BR> 659 | RJ/RJR26<BR> 660 | RJ/RJR26<BR> 661 | RT/RTR24<BR> 662 | RT/RTR24<BR> 663 | RT/RTR24<BR> 664 | RJ/RJR24<BR> 665 | RJ/RJR24<BR> 666 | RJ/RJR24<BR> 667 | RJ/RJR24<BR> 668 | RJ/RJR24<BR> 669 | RJ/RJR24<BR> 670 | -<BR> 671 | -<BR> 672 | -<BR> 673 | -<BR> 674 | -<BR> 675 | -<BR> 676 | -<BR></FONT> 677 | </TD> 678 | </TR> 679 | <TR> 680 | <TD COLSPAN=8>&nbsp; 681 | </TD> 682 | </TR> 683 | <TR> 684 | <TD COLSPAN=8> 685 | <FONT SIZE=4 FACE=ARIAL><B>SINGLE TURN</B></FONT> 686 | </TD> 687 | </TR> 688 | <TR> 689 | <TD ALIGN=CENTER> 690 | <FONT SIZE=3 FACE=ARIAL><B>BOURN</B></FONT> 691 | </TD> 692 | <TD ALIGN=CENTER> 693 | <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> 694 | </TD> 695 | <TD ALIGN=CENTER> 696 | <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> 697 | </TD> 698 | <TD ALIGN=CENTER> 699 | <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> 700 | </TD> 701 | <TD ALIGN=CENTER> 702 | <FONT SIZE=3 FACE=ARIAL><B>MURATA</B></FONT> 703 | </TD> 704 | <TD ALIGN=CENTER> 705 | <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> 706 | </TD> 707 | <TD ALIGN=CENTER> 708 | <FONT SIZE=3 FACE=ARIAL><B>SPECTROL</B></FONT> 709 | </TD> 710 | <TD ALIGN=CENTER> 711 | <FONT SIZE=3 FACE=ARIAL><B>MILSPEC</B></FONT> 712 | </TD> 713 | </TR> 714 | <TR> 715 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 716 | 3323P<BR> 717 | 3323S<BR> 718 | 3323W<BR> 719 | 3329H<BR> 720 | 3329P<BR> 721 | 3329W<BR> 722 | 3339H<BR> 723 | 3339P<BR> 724 | 3339W<BR> 725 | 3352E<BR> 726 | 3352H<BR> 727 | 3352K<BR> 728 | 3352P<BR> 729 | 3352T<BR> 730 | 3352V<BR> 731 | 3352W<BR> 732 | 3362H<BR> 733 | 3362M<BR> 734 | 3362P<BR> 735 | 3362R<BR> 736 | 3362S<BR> 737 | 3362U<BR> 738 | 3362W<BR> 739 | 3362X<BR> 740 | 3386B<BR> 741 | 3386C<BR> 742 | 3386F<BR> 743 | 3386H<BR> 744 | 3386K<BR> 745 | 3386M<BR> 746 | 3386P<BR> 747 | 3386S<BR> 748 | 3386W<BR> 749 | 3386X<BR></FONT> 750 | </TD> 751 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 752 | 25P<BR> 753 | 25S<BR> 754 | 25RX<BR> 755 | 82P<BR> 756 | 82M<BR> 757 | 82PA<BR> 758 | -<BR> 759 | -<BR> 760 | -<BR> 761 | 91E<BR> 762 | 91X<BR> 763 | 91T<BR> 764 | 91B<BR> 765 | 91A<BR> 766 | 91V<BR> 767 | 91W<BR> 768 | 25W<BR> 769 | 25V<BR> 770 | 25P<BR> 771 | -<BR> 772 | 25S<BR> 773 | 25U<BR> 774 | 25RX<BR> 775 | 25X<BR> 776 | 72XW<BR> 777 | 72XL<BR> 778 | 72PM<BR> 779 | 72RX<BR> 780 | -<BR> 781 | 72PX<BR> 782 | 72P<BR> 783 | 72RXW<BR> 784 | 72RXL<BR> 785 | 72X<BR></FONT> 786 | </TD> 787 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 788 | -<BR> 789 | -<BR> 790 | -<BR> 791 | T7YB<BR> 792 | T7YA<BR> 793 | -<BR> 794 | -<BR> 795 | -<BR> 796 | -<BR> 797 | -<BR> 798 | -<BR> 799 | -<BR> 800 | -<BR> 801 | -<BR> 802 | -<BR> 803 | -<BR> 804 | -<BR> 805 | TXD<BR> 806 | TYA<BR> 807 | TYP<BR> 808 | -<BR> 809 | TYD<BR> 810 | TX<BR> 811 | -<BR> 812 | 150SX<BR> 813 | 100SX<BR> 814 | 102T<BR> 815 | 101S<BR> 816 | 190T<BR> 817 | 150TX<BR> 818 | 101<BR> 819 | -<BR> 820 | -<BR> 821 | 101SX<BR></FONT> 822 | </TD> 823 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 824 | ET6P<BR> 825 | ET6S<BR> 826 | ET6X<BR> 827 | RJ-6W/8014EMW<BR> 828 | RJ-6P/8014EMP<BR> 829 | RJ-6X/8014EMX<BR> 830 | TM7W<BR> 831 | TM7P<BR> 832 | TM7X<BR> 833 | -<BR> 834 | 8017SMS<BR> 835 | -<BR> 836 | 8017SMB<BR> 837 | 8017SMA<BR> 838 | -<BR> 839 | -<BR> 840 | CT-6W<BR> 841 | CT-6H<BR> 842 | CT-6P<BR> 843 | CT-6R<BR> 844 | -<BR> 845 | CT-6V<BR> 846 | CT-6X<BR> 847 | -<BR> 848 | -<BR> 849 | 8038EKV<BR> 850 | -<BR> 851 | 8038EKX<BR> 852 | -<BR> 853 | -<BR> 854 | 8038EKP<BR> 855 | 8038EKZ<BR> 856 | 8038EKW<BR> 857 | -<BR></FONT> 858 | </TD> 859 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 860 | -<BR> 861 | -<BR> 862 | -<BR> 863 | 3321H<BR> 864 | 3321P<BR> 865 | 3321N<BR> 866 | 1102H<BR> 867 | 1102P<BR> 868 | 1102T<BR> 869 | RVA0911V304A<BR> 870 | -<BR> 871 | RVA0911H413A<BR> 872 | RVG0707V100A<BR> 873 | RVA0607V(H)306A<BR> 874 | RVA1214H213A<BR> 875 | -<BR> 876 | -<BR> 877 | -<BR> 878 | -<BR> 879 | -<BR> 880 | -<BR> 881 | -<BR> 882 | -<BR> 883 | -<BR> 884 | 3104B<BR> 885 | 3104C<BR> 886 | 3104F<BR> 887 | 3104H<BR> 888 | -<BR> 889 | 3104M<BR> 890 | 3104P<BR> 891 | 3104S<BR> 892 | 3104W<BR> 893 | 3104X<BR></FONT> 894 | </TD> 895 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 896 | EVMQ0G<BR> 897 | EVMQIG<BR> 898 | EVMQ3G<BR> 899 | EVMS0G<BR> 900 | EVMQ0G<BR> 901 | EVMG0G<BR> 902 | -<BR> 903 | -<BR> 904 | -<BR> 905 | EVMK4GA00B<BR> 906 | EVM30GA00B<BR> 907 | EVMK0GA00B<BR> 908 | EVM38GA00B<BR> 909 | EVMB6<BR> 910 | EVLQ0<BR> 911 | -<BR> 912 | EVMMSG<BR> 913 | EVMMBG<BR> 914 | EVMMAG<BR> 915 | -<BR> 916 | -<BR> 917 | EVMMCS<BR> 918 | -<BR> 919 | -<BR> 920 | -<BR> 921 | -<BR> 922 | -<BR> 923 | EVMM1<BR> 924 | -<BR> 925 | -<BR> 926 | EVMM0<BR> 927 | -<BR> 928 | -<BR> 929 | EVMM3<BR></FONT> 930 | </TD> 931 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 932 | -<BR> 933 | -<BR> 934 | -<BR> 935 | 62-3-1<BR> 936 | 62-1-2<BR> 937 | -<BR> 938 | -<BR> 939 | -<BR> 940 | -<BR> 941 | -<BR> 942 | -<BR> 943 | -<BR> 944 | -<BR> 945 | -<BR> 946 | -<BR> 947 | -<BR> 948 | 67R<BR> 949 | -<BR> 950 | 67P<BR> 951 | -<BR> 952 | -<BR> 953 | -<BR> 954 | -<BR> 955 | 67X<BR> 956 | 63V<BR> 957 | 63S<BR> 958 | 63M<BR> 959 | -<BR> 960 | -<BR> 961 | 63H<BR> 962 | 63P<BR> 963 | -<BR> 964 | -<BR> 965 | 63X<BR></FONT> 966 | </TD> 967 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 968 | -<BR> 969 | -<BR> 970 | -<BR> 971 | RJ/RJR50<BR> 972 | RJ/RJR50<BR> 973 | RJ/RJR50<BR> 974 | -<BR> 975 | -<BR> 976 | -<BR> 977 | -<BR> 978 | -<BR> 979 | -<BR> 980 | -<BR> 981 | -<BR> 982 | -<BR> 983 | -<BR> 984 | -<BR> 985 | -<BR> 986 | -<BR> 987 | -<BR> 988 | -<BR> 989 | -<BR> 990 | -<BR> 991 | -<BR> 992 | -<BR> 993 | -<BR> 994 | -<BR> 995 | -<BR> 996 | -<BR> 997 | -<BR> 998 | -<BR> 999 | -<BR> 1000 | -<BR> 1001 | -<BR></FONT> 1002 | </TD> 1003 | </TR> 1004 | </TABLE> 1005 | <P>&nbsp;<P> 1006 | <TABLE BORDER=0 CELLSPACING=1 CELLPADDING=3> 1007 | <TR> 1008 | <TD COLSPAN=7> 1009 | <FONT color="#0000FF" SIZE=4 FACE=ARIAL><B>SMD TRIM-POT CROSS REFERENCE</B></FONT> 1010 | <P> 1011 | <FONT SIZE=4 FACE=ARIAL><B>MULTI-TURN</B></FONT> 1012 | </TD> 1013 | </TR> 1014 | <TR> 1015 | <TD> 1016 | <FONT SIZE=3 FACE=ARIAL><B>BOURNS</B></FONT> 1017 | </TD> 1018 | <TD> 1019 | <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> 1020 | </TD> 1021 | <TD> 1022 | <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> 1023 | </TD> 1024 | <TD> 1025 | <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> 1026 | </TD> 1027 | <TD> 1028 | <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> 1029 | </TD> 1030 | <TD> 1031 | <FONT SIZE=3 FACE=ARIAL><B>TOCOS</B></FONT> 1032 | </TD> 1033 | <TD> 1034 | <FONT SIZE=3 FACE=ARIAL><B>AUX/KYOCERA</B></FONT> 1035 | </TD> 1036 | </TR> 1037 | <TR> 1038 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1039 | 3224G<BR> 1040 | 3224J<BR> 1041 | 3224W<BR> 1042 | 3269P<BR> 1043 | 3269W<BR> 1044 | 3269X<BR></FONT> 1045 | </TD> 1046 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1047 | 44G<BR> 1048 | 44J<BR> 1049 | 44W<BR> 1050 | 84P<BR> 1051 | 84W<BR> 1052 | 84X<BR></FONT> 1053 | </TD> 1054 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1055 | -<BR> 1056 | -<BR> 1057 | -<BR> 1058 | ST63Z<BR> 1059 | ST63Y<BR> 1060 | -<BR></FONT> 1061 | </TD> 1062 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1063 | -<BR> 1064 | -<BR> 1065 | -<BR> 1066 | ST5P<BR> 1067 | ST5W<BR> 1068 | ST5X<BR></FONT> 1069 | </TD> 1070 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1071 | -<BR> 1072 | -<BR> 1073 | -<BR> 1074 | -<BR> 1075 | -<BR> 1076 | -<BR></FONT> 1077 | </TD> 1078 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1079 | -<BR> 1080 | -<BR> 1081 | -<BR> 1082 | -<BR> 1083 | -<BR> 1084 | -<BR></FONT> 1085 | </TD> 1086 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1087 | -<BR> 1088 | -<BR> 1089 | -<BR> 1090 | -<BR> 1091 | -<BR> 1092 | -<BR></FONT> 1093 | </TD> 1094 | </TR> 1095 | <TR> 1096 | <TD COLSPAN=7>&nbsp; 1097 | </TD> 1098 | </TR> 1099 | <TR> 1100 | <TD COLSPAN=7> 1101 | <FONT SIZE=4 FACE=ARIAL><B>SINGLE TURN</B></FONT> 1102 | </TD> 1103 | </TR> 1104 | <TR> 1105 | <TD> 1106 | <FONT SIZE=3 FACE=ARIAL><B>BOURNS</B></FONT> 1107 | </TD> 1108 | <TD> 1109 | <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> 1110 | </TD> 1111 | <TD> 1112 | <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> 1113 | </TD> 1114 | <TD> 1115 | <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> 1116 | </TD> 1117 | <TD> 1118 | <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> 1119 | </TD> 1120 | <TD> 1121 | <FONT SIZE=3 FACE=ARIAL><B>TOCOS</B></FONT> 1122 | </TD> 1123 | <TD> 1124 | <FONT SIZE=3 FACE=ARIAL><B>AUX/KYOCERA</B></FONT> 1125 | </TD> 1126 | </TR> 1127 | <TR> 1128 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1129 | 3314G<BR> 1130 | 3314J<BR> 1131 | 3364A/B<BR> 1132 | 3364C/D<BR> 1133 | 3364W/X<BR> 1134 | 3313G<BR> 1135 | 3313J<BR></FONT> 1136 | </TD> 1137 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1138 | 23B<BR> 1139 | 23A<BR> 1140 | 21X<BR> 1141 | 21W<BR> 1142 | -<BR> 1143 | 22B<BR> 1144 | 22A<BR></FONT> 1145 | </TD> 1146 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1147 | ST5YL/ST53YL<BR> 1148 | ST5YJ/5T53YJ<BR> 1149 | ST-23A<BR> 1150 | ST-22B<BR> 1151 | ST-22<BR> 1152 | -<BR> 1153 | -<BR></FONT> 1154 | </TD> 1155 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1156 | ST-4B<BR> 1157 | ST-4A<BR> 1158 | -<BR> 1159 | -<BR> 1160 | -<BR> 1161 | ST-3B<BR> 1162 | ST-3A<BR></FONT> 1163 | </TD> 1164 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1165 | -<BR> 1166 | EVM-6YS<BR> 1167 | EVM-1E<BR> 1168 | EVM-1G<BR> 1169 | EVM-1D<BR> 1170 | -<BR> 1171 | -<BR></FONT> 1172 | </TD> 1173 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1174 | G4B<BR> 1175 | G4A<BR> 1176 | TR04-3S1<BR> 1177 | TRG04-2S1<BR> 1178 | -<BR> 1179 | -<BR> 1180 | -<BR></FONT> 1181 | </TD> 1182 | <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 1183 | -<BR> 1184 | -<BR> 1185 | DVR-43A<BR> 1186 | CVR-42C<BR> 1187 | CVR-42A/C<BR> 1188 | -<BR> 1189 | -<BR></FONT> 1190 | </TD> 1191 | </TR> 1192 | </TABLE> 1193 | <P> 1194 | <FONT SIZE=4 FACE=ARIAL><B>ALT =&nbsp;ALTERNATE</B></FONT> 1195 | <P> 1196 | 1197 | &nbsp; 1198 | <P> 1199 | </td> 1200 | </tr> 1201 | </table> 1202 | 1203 | 1204 | <b>CAPACITOR</b><p> 1205 | 1206 | 1207 | 1208 | 1209 | 1210 | 1211 | 1212 | 1213 | >NAME 1214 | >VALUE 1215 | 1216 | 1217 | 1218 | 1219 | 1220 | <b>Panasonic Aluminium Electrolytic Capacitor VS-Serie Package B</b> 1221 | 1222 | 1223 | 1224 | 1225 | 1226 | 1227 | 1228 | 1229 | 1230 | 1231 | 1232 | 1233 | 1234 | 1235 | 1236 | 1237 | 1238 | 1239 | >NAME 1240 | >VALUE 1241 | 1242 | 1243 | 1244 | 1245 | 1246 | 1247 | 1248 | 1249 | 1250 | 1251 | 1252 | 1253 | 1254 | <b>RESISTOR</b><p> 1255 | 1256 | 1257 | 1258 | 1259 | 1260 | 1261 | 1262 | 1263 | >NAME 1264 | >VALUE 1265 | 1266 | 1267 | 1268 | 1269 | 1270 | 1271 | 1272 | <b>CMOS Logic Devices, 4000 Series</b><p> 1273 | Based on the following sources: 1274 | <ul> 1275 | <li>Motorola <i>CMOS LOGIC DATA</i>; book, 02/88, DL131 REV 1 1276 | <li>http://www.elexp.com 1277 | <li>http://www.intersil.com 1278 | <li>http://www.ls3c.com.tw/product/1/COMOS.html 1279 | </ul> 1280 | <author>Created by librarian@cadsoft.de</author> 1281 | 1282 | 1283 | <b>Small Outline package</b> 150 mil 1284 | 1285 | 1286 | 1287 | 1288 | 1289 | 1290 | 1291 | 1292 | 1293 | 1294 | 1295 | 1296 | 1297 | 1298 | 1299 | 1300 | 1301 | 1302 | 1303 | 1304 | 1305 | 1306 | 1307 | 1308 | 1309 | 1310 | 1311 | 1312 | >VALUE 1313 | >NAME 1314 | 1315 | 1316 | 1317 | 1318 | 1319 | 1320 | 1321 | 1322 | 1323 | 1324 | 1325 | 1326 | 1327 | 1328 | 1329 | 1330 | 1331 | 1332 | 1333 | 1334 | <h3>SparkFun Electronics' preferred foot prints</h3> 1335 | In this library you'll find connectors and sockets- basically anything that can be plugged into or onto.<br><br> 1336 | We've spent an enormous amount of time creating and checking these footprints and parts, but it is the end user's responsibility to ensure correctness and suitablity for a given componet or application. If you enjoy using this library, please buy one of our products at www.sparkfun.com. 1337 | <br><br> 1338 | <b>Licensing:</b> Creative Commons ShareAlike 4.0 International - https://creativecommons.org/licenses/by-sa/4.0/ 1339 | <br><br> 1340 | You are welcome to use this library for commercial purposes. For attribution, we ask that when you begin to sell your device using our footprint, you email us with a link to the product being sold. We want bragging rights that we helped (in a very small part) to create your 8th world wonder. We would like the opportunity to feature your device on our homepage. 1341 | 1342 | 1343 | 1344 | 1345 | 1346 | 1347 | 1348 | 1349 | 1350 | 1351 | 1352 | 1353 | 1354 | 1355 | 1356 | 1357 | 1358 | 1359 | 1360 | 1361 | 1362 | 1363 | 1364 | >NAME 1365 | PCB Edge 1366 | 1367 | 1368 | 1369 | 1370 | 1371 | 1372 | 1373 | 1374 | 1375 | 1376 | 1377 | 1378 | <b>SMA Antenna Connector</b><p> 1379 | This is a footprint for an edge mount RF antenna. Works pretty well with SMA type connectors but may also work with other edge mount RF connectors. Keep in mind, these edge mount connectors assume you are using a 0.062" PCB thickness. 1380 | 1381 | 1382 | 1383 | 1384 | 1385 | 1386 | 1387 | 1388 | 1389 | <b>Crystals and Oscillators</b><p> 1390 | <author>Created by IQD Frequency Products</author> 1391 | 1392 | 1393 | <b>IQD Frequency Products SMD Package</b> 1394 | 1395 | 1396 | 1397 | 1398 | >NAME 1399 | >VALUE 1400 | 1401 | 1402 | 1403 | 1404 | 1405 | 1406 | 1407 | 1408 | 1409 | 1410 | 1411 | <b>HALO ELECTRONIC, INC.</b><p> 1412 | www.haloelectronics.com<p> 1413 | <author>Created by librarian@cadsoft.de</author> 1414 | 1415 | 1416 | <b>E-Ultra (TM) 10/100BASE-TX SOIC-16 Fast Ethernet Magnetic Modules</b><p> 1417 | Source: www.haloelectronics.com .. e-ultra.pdf 1418 | 1419 | 1420 | 1421 | 1422 | 1423 | 1424 | 1425 | 1426 | 1427 | 1428 | 1429 | 1430 | 1431 | 1432 | 1433 | 1434 | 1435 | 1436 | 1437 | 1438 | 1439 | >NAME 1440 | >VALUE 1441 | 1442 | 1443 | 1444 | 1445 | 1446 | 1447 | 1448 | 1449 | 1450 | 1451 | 1452 | 1453 | 1454 | 1455 | 1456 | 1457 | 1458 | 1459 | 1460 | 1461 | 1462 | 1463 | <b>RESISTOR</b> 1464 | 1465 | 1466 | 1467 | 1468 | 1469 | 1470 | 1471 | 1472 | >NAME 1473 | >VALUE 1474 | 1475 | 1476 | 1477 | 1478 | 1479 | 1480 | 1481 | 1482 | 1483 | 1484 | 1485 | 1486 | 1487 | 1488 | 1489 | 1490 | <b>EAGLE Design Rules</b> 1491 | <p> 1492 | Die Standard-Design-Rules sind so gewählt, dass sie für 1493 | die meisten Anwendungen passen. Sollte ihre Platine 1494 | besondere Anforderungen haben, treffen Sie die erforderlichen 1495 | Einstellungen hier und speichern die Design Rules unter 1496 | einem neuen Namen ab. 1497 | <b>Laen's PCB Order Design Rules</b> 1498 | <p> 1499 | Please make sure your boards conform to these design rules. 1500 | 1501 | 1502 | 1503 | 1504 | 1505 | 1506 | 1507 | 1508 | 1509 | 1510 | 1511 | 1512 | 1513 | 1514 | 1515 | 1516 | 1517 | 1518 | 1519 | 1520 | 1521 | 1522 | 1523 | 1524 | 1525 | 1526 | 1527 | 1528 | 1529 | 1530 | 1531 | 1532 | 1533 | 1534 | 1535 | 1536 | 1537 | 1538 | 1539 | 1540 | 1541 | 1542 | 1543 | 1544 | 1545 | 1546 | 1547 | 1548 | 1549 | 1550 | 1551 | 1552 | 1553 | 1554 | 1555 | 1556 | 1557 | 1558 | 1559 | 1560 | 1561 | 1562 | 1563 | 1564 | 1565 | 1566 | 1567 | 1568 | 1569 | 1570 | 1571 | 1572 | 1573 | 1574 | 1575 | 1576 | 1577 | 1578 | 1579 | 1580 | 1581 | 1582 | 1583 | 1584 | 1585 | 1586 | 1587 | 1588 | 1589 | 1590 | 1591 | 1592 | 1593 | 1594 | 1595 | 1596 | 1597 | 1598 | 1599 | 1600 | 1601 | 1602 | 1603 | 1604 | 1605 | 1606 | 1607 | 1608 | 1609 | 1610 | 1611 | 1612 | 1613 | 1614 | 1615 | 1616 | 1617 | 1618 | 1619 | 1620 | 1621 | 1622 | 1623 | 1624 | 1625 | 1626 | 1627 | 1628 | 1629 | 1630 | 1631 | 1632 | 1633 | 1634 | 1635 | 1636 | 1637 | 1638 | 1639 | 1640 | 1641 | 1642 | 1643 | 1644 | 1645 | 1646 | 1647 | 1648 | 1649 | 1650 | 1651 | 1652 | 1653 | 1654 | 1655 | 1656 | 1657 | 1658 | 1659 | 1660 | 1661 | 1662 | 1663 | 1664 | 1665 | 1666 | 1667 | 1668 | 1669 | 1670 | 1671 | 1672 | 1673 | 1674 | 1675 | 1676 | 1677 | 1678 | 1679 | 1680 | 1681 | 1682 | 1683 | 1684 | 1685 | 1686 | 1687 | 1688 | 1689 | 1690 | 1691 | 1692 | 1693 | 1694 | 1695 | 1696 | 1697 | 1698 | 1699 | 1700 | 1701 | 1702 | 1703 | 1704 | 1705 | 1706 | 1707 | 1708 | 1709 | 1710 | 1711 | 1712 | 1713 | 1714 | 1715 | 1716 | 1717 | 1718 | 1719 | 1720 | 1721 | 1722 | 1723 | 1724 | 1725 | 1726 | 1727 | 1728 | 1729 | 1730 | 1731 | 1732 | 1733 | 1734 | 1735 | 1736 | 1737 | 1738 | 1739 | 1740 | 1741 | 1742 | 1743 | 1744 | 1745 | 1746 | 1747 | 1748 | 1749 | 1750 | 1751 | 1752 | 1753 | 1754 | 1755 | 1756 | 1757 | 1758 | 1759 | 1760 | 1761 | 1762 | 1763 | 1764 | 1765 | 1766 | 1767 | 1768 | 1769 | 1770 | 1771 | 1772 | 1773 | 1774 | 1775 | 1776 | 1777 | 1778 | 1779 | 1780 | 1781 | 1782 | 1783 | 1784 | 1785 | 1786 | 1787 | 1788 | 1789 | 1790 | 1791 | 1792 | 1793 | 1794 | 1795 | 1796 | 1797 | 1798 | 1799 | 1800 | 1801 | 1802 | 1803 | 1804 | 1805 | 1806 | 1807 | 1808 | 1809 | 1810 | 1811 | 1812 | 1813 | 1814 | 1815 | 1816 | 1817 | 1818 | 1819 | 1820 | 1821 | 1822 | 1823 | 1824 | 1825 | 1826 | 1827 | 1828 | 1829 | 1830 | 1831 | 1832 | 1833 | 1834 | 1835 | 1836 | 1837 | 1838 | 1839 | 1840 | 1841 | 1842 | 1843 | 1844 | 1845 | 1846 | 1847 | 1848 | 1849 | 1850 | 1851 | 1852 | 1853 | 1854 | 1855 | 1856 | 1857 | 1858 | 1859 | 1860 | 1861 | 1862 | 1863 | 1864 | 1865 | 1866 | 1867 | 1868 | 1869 | 1870 | 1871 | 1872 | 1873 | 1874 | 1875 | 1876 | 1877 | 1878 | 1879 | 1880 | 1881 | 1882 | 1883 | 1884 | 1885 | 1886 | 1887 | 1888 | 1889 | 1890 | 1891 | 1892 | 1893 | 1894 | 1895 | 1896 | 1897 | 1898 | 1899 | 1900 | 1901 | 1902 | 1903 | 1904 | 1905 | 1906 | 1907 | 1908 | 1909 | 1910 | 1911 | 1912 | 1913 | 1914 | 1915 | 1916 | 1917 | 1918 | 1919 | 1920 | 1921 | 1922 | 1923 | 1924 | 1925 | 1926 | 1927 | 1928 | 1929 | 1930 | 1931 | 1932 | 1933 | 1934 | 1935 | 1936 | 1937 | 1938 | 1939 | 1940 | 1941 | 1942 | 1943 | 1944 | 1945 | 1946 | 1947 | 1948 | 1949 | 1950 | 1951 | 1952 | 1953 | 1954 | 1955 | 1956 | 1957 | 1958 | 1959 | 1960 | 1961 | 1962 | 1963 | 1964 | 1965 | 1966 | 1967 | 1968 | 1969 | 1970 | 1971 | 1972 | 1973 | 1974 | 1975 | 1976 | 1977 | 1978 | 1979 | 1980 | 1981 | 1982 | 1983 | 1984 | 1985 | 1986 | 1987 | 1988 | 1989 | 1990 | 1991 | 1992 | 1993 | 1994 | 1995 | 1996 | 1997 | 1998 | 1999 | 2000 | 2001 | 2002 | 2003 | 2004 | 2005 | 2006 | 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 2026 | 2027 | 2028 | 2029 | 2030 | 2031 | 2032 | 2033 | 2034 | 2035 | 2036 | 2037 | 2038 | 2039 | 2040 | 2041 | 2042 | 2043 | 2044 | 2045 | 2046 | 2047 | 2048 | 2049 | 2050 | 2051 | 2052 | 2053 | 2054 | 2055 | 2056 | 2057 | 2058 | 2059 | 2060 | 2061 | 2062 | 2063 | 2064 | 2065 | 2066 | 2067 | 2068 | Since Version 6.2.2 text objects can contain more than one line, 2069 | which will not be processed correctly with this version. 2070 | 2071 | 2072 | 2073 | --------------------------------------------------------------------------------