Radio Data System (RDS)
What is RDS ?
RDS is the abbreviation for Radio Data System. RDS is a method of transmitting digital data along with the audio signal on FM radio. Although RDS is a European standard, it is also used in a slightly modified way in the USA, where it is called RBDS. Information on this page applies to both RDS and RBDS. In the following, the term RDS is used to refer to both standards.
Data transmitted by many FM radio stations includes:
- Name of the station.
- List of alternative frequencies for the same station.
- Radiotext, e.g. artist and song title.
- Current date and time.
- Program type, e.g. Rock, Pop, Country, News...
- Traffic Message Channel (TMC), information about traffic jams etc.
Even though analog radio looks a bit old fashioned nowadays, RDS will certainly continue for several years, as most car radios and navigation systems rely on it.
Which cards can receive RDS ?
A card to be used for RDS naturally has to have a radio tuner. Additionally, it needs an RDS decoder. The most common chip seems to be the SAA6588 by Philips. It is connected via I2C to the video decoder chip.
Examples for RDS capable cards:
- Terratec Cinergy 600
- KNC ONE TV-Station RDS
- KNC One TV-Station DVR
RDS in V4L2 standard
According to V4L2 specifications, raw data from RDS decoders is read from the radio device. Data consists of blocks where each block is 3 bytes long. All decoding has to be done in user space.
A kernel module for accessing the RDS decoder is needed. Hans J. Koch wrote a module for the SAA6588 (saa6588.ko). It's in the stable kernel since 2.6.14.
The modules for the main video chips (bttv, saa7134...) have to be modified to load and use the RDS decoder module. This has only been done for bttv so far. With a bttv card that has a SAA6588, you can read raw RDS data via /dev/radio after loading the saa6588 kernel module. For the moment, saa6588 is not requested automatically by bttv, you have to modprobe it manually.
When loading saa6588, you might need to pass parameters to make it work with your card. The SAA6588 chip uses its own crystal with a frequency that is a multiple of 4.332MHz (4.332, 8.664, 12.996, or 17.328 MHz). Depending on the crystal you have on your board, the module parameter "xtal" must have a value of 0, 1, 2, or 3, respectively. Default is 0, so you don't need the "xtal" parameter if you have a 4.332 MHz crystal for the SAA6588 on your card.
See this page for more details.
RDS decoding in user space has to address the following situations:
- There are more than one RDS capable cards in the system.
- There are more than one applications that want to access an RDS source.
This can best be done by a daemon that reads raw data from all RDS sources, decodes it, and distributes the results via TCP/IP or a unix domain socket. Such a daemon (rdsd) is under development, the project is hosted here:
There is also a library (librds) that simplifies application development by handling the communication with rdsd. While rdsd depends on a V4L2 compatible architecture, librds can be cross platform! It could therefore be possible to write applications for other operating systems that can connect via TCP/IP to an rdsd running on a Linux box.
Development progress in that project is somewhat slow as there is only one developer. Any help is highly welcome!
Within the rdsd project, a simple console tool (rdsquery) will be developed. Other possible applications could be:
- Enhance current radio applications (radio text, station names, ...)
- Stand alone RDS viewers.
- TMC applications to process traffic messages.
- Application to set the system clock according to RDS date/time.