HD Radio

Hardware

This page deals with the Visteon Zoom HDZ300 and Directed DMHD-1000. I haven't seen a DMHD-1000 in person, but everything I have seen and heard leads me to believe it is the exact same radio. I suspect that there are a few more radios that are similar enough that a lot of the data on this page applies to them as well, but that is nothing more than a hunch at this point.

To control the radio via computer, you need a cable to connect it to your serial (or USB) port. The cables can be purchased from MitchJS's site at rush2112.net. A USB cable has replaced the older serial cable.

The heart of these radios is the DRI350 (TMS320DRI350) chip from Texas Instruments. Also important is the DRI8201 (AFEDRI8201) analog front end. I will update this page with photographs of the circuit board with every chip labeled. (Maybe not.. I had all of the pictures taken and chips labeled, but I lost the the files.)

Other Resources

Distributions

When these radios came out, LinuxICE was the distribution of choice. It included support for media playback, navigation (GPS), vehicle information/statistics, and cell phone integration. LinuxICE includes the control library so you won't need to write your own anymore. nGhost was used at the front end. I believe the latest version released was LinuxICE Beta 3. Good luck finding it. Try searching for "LinuxICE-Beta3-4.iso".

After LinuxICE, development efforts shifted towards MeeGo. On September 27, 2011, it was announced that MeeGo development was essentially coming to an end and everyone should transition to Tizen. I can't tell if Tizen includes support for the DMHD-1000/HDZ300 radios by default. I haven't had a chance to use it yet.

Front Ends

nGhost Media Center - v2.0.2 seems to be the final release, although I thought I saw someone else providing updates.

Hal Blog HD Radio Controller - This is a command line program with full source code.

RevFE ("carpal") - Mobile cross-platform solution for automobile based entertainment/information centers. This has HDRadio support.

HD Radio PCR - This is a Windows app, but it comes from the same guy who sells the cables to communicate with the DMHD-1000/HDZ300 via serial port. As far as I know, it was the first program released with full support for these HDRadio units.

Serial Protocol

2008-04-12: Someone else has completed a control library. My laptop hard drive was damaged on a recent flight and I lost some of my code, so my control module will be delayed suspended indefinitely. Now that it is possible to control this radio in Linux, working on my control module is not as high of a priority for me. Regardless, I do encourage anyone to ask me questions and I'll help in any way I can.

Basic Format

The basic format of all data packets sent to and from the radio is:

<header><length><data><checksum>

The header is one byte and always equal to 10100100 in binary, A4 in hex, 164 in decimal, or ¤ in ASCII.

The length is one byte and represents the length (in bytes) of the data section. It does not include the checksum. The length is calculated before any 1B escaping is done.

The data section seems to have a different format depending upon the type of message being set. It does appear, however, that the first two or three bytes represent the actual command and the rest are various parameters. Once I confirm more of the commands, I should be able to figure out the pattern.

The checksum is always one byte. It is calculated by adding up the values of every character of the header, length, and data sections. With larger packets you will end up with values that simply can't fit into one byte. Use the following formula (in decimal) to get the correct value: <total> mod 256 = checksum. For example: 317 mod 256 = 61.

1B seems to be an escape character. Any data with 1B in it is escaped as 1B 1B before it is sent. This also means any 1B 1B read from the actual communication needs to be unescaped. Since there is an escape character, there has to be other values that are escaped. My limited examples here don't seem to have anything else escaped. I'll have to let the radio run for a while and dump all of the data sent between it and the control head. Perhaps A4 is also escaped?

Commands

Tune up command:

A4 10 02 01 00 00 00 00 00 00 00 00 00 00 01 00   ¤...............
00 00 B8                                          ..¸             

Tune up response:

                              vv vv = Station
A4 10 02 01 02 00 01 00 00 00 F5 03 00 00 00 00   ¤.........õ.....
00 00 B2 A4 08 01 03 02 00 00 00 00 00 B2         ..²¤.........²  

Tune down command:

A4 10 02 01 00 00 00 00 00 00 00 00 00 00 FF FF   ¤.............ÿÿ
FF FF B3                                          ÿÿ³             

Tune down response #1 (To a good station): (Station seems to be in little endian format.)

                              vv vv = Station (101.1)
A4 10 02 01 02 00 01 00 00 00 F3 03 00 00 00 00   ¤.........ó.....
00 00 B0                                          ..°             

Tune down response #2 (To no station):

                              vv vv = Station (100.9)
A4 10 02 01 02 00 01 00 00 00 F1 03 00 00 00 00   ¤.........ñ.....
00 00 AE A4 08 01 03 02 00 00 00 00 00 B2         ..®¤.........²  

Tune down response #3 (To a good station):

                              vv vv = Station (94.7)
A4 10 02 01 02 00 01 00 00 00 B3 03 00 00 00 00   ¤.........³.....
00 00 B0                                          ..°             

Tune down response #4 (To a good station): (1B is escaped as 1B 1B.)

                              vv vv vv = Station? (105.1)
A4 10 02 01 02 00 01 00 00 00 1B 1B 04 00 00 00   ¤...............
00 00 00 D9                                       ...Ù            

Tune down response #5 (To no station): (I was expecting the second packet as in tune down response #2.))

                              vv vv = Station (104.9)
A4 10 02 01 02 00 01 00 00 00 19 04 00 00 00 00   ¤...............
00 00 D7                                          ..×             

Seek down (All stations) command:

A4 14 03 01 00 00 A5 00 00 00 00 00 00 00 FF FF   ¤.....¥.......ÿÿ
FF FF 00 00 00 00 5D                              ÿÿ....]         

Seek down (All stations) response:

A4 14 03 01 02 00 01 00 00 00 F1 03 00 00 00 00   ¤.........ñ.....
00 00 00 00 00 00 B3 A4 08 01 03 02 00 00 00 00   ......³¤........
00 B2 A4 14 03 01 02 00 01 00 00 00 EF 03 00 00   .²¤.........ï...
00 00 00 00 00 00 00 00 B1 A4 14 03 01 02 00 01   ........±¤......
00 00 00 ED 03 00 00 00 00 00 00 00 00 00 00 AF   ...í...........¯
A4 14 03 01 02 00 01 00 00 00 EB 03 00 00 00 00   ¤.........ë.....
00 00 00 00 00 00 AD A4 10 02 01 02 00 01 00 00   ......­¤........
00 EB 03 00 00 00 00 00 00 A8                     .ë.......¨      

Seek down (HD stations) command:

A4 14 03 01 00 00 A5 00 00 00 00 00 00 00 FF FF   ¤.....¥.......ÿÿ
FF FF 01 00 00 00 5E                              ÿÿ....^         

Seek down (HD stations) response:

A4 14 03 01 02 00 01 00 00 00 B5 03 00 00 00 00   ¤.........µ.....
00 00 01 00 00 00 78 A4 14 03 01 02 00 01 00 00   ......x¤........
00 B3 03 00 00 00 00 00 00 01 00 00 00 76         .³...........v  

Seek up (All stations) command:

A4 14 03 01 00 00 A5 00 00 00 00 00 00 00 01 00   ¤.....¥.........
00 00 00 00 00 00 62                              ......b         

Seek up (All stations) response:

A4 14 03 01 02 00 01 00 00 00 ED 03 00 00 00 00   ¤.........í.....
00 00 00 00 00 00 AF A4 08 01 03 02 00 00 00 00   ......¯¤........
00 B2 A4 14 03 01 02 00 01 00 00 00 EF 03 00 00   .²¤.........ï...
00 00 00 00 00 00 00 00 B1 A4 14 03 01 02 00 01   ........±¤......
00 00 00 F1 03 00 00 00 00 00 00 00 00 00 00 B3   ...ñ...........³
A4 14 03 01 02 00 01 00 00 00 F3 03 00 00 00 00   ¤.........ó.....
00 00 00 00 00 00 B5 A4 10 02 01 02 00 01 00 00   ......µ¤........
00 F3 03 00 00 00 00 00 00 B0                     .ó.......°      

Seek up (HD stations) command:

A4 14 03 01 00 00 A5 00 00 00 00 00 00 00 01 00   ¤.....¥.........
00 00 01 00 00 00 63                              ......c         

Seek up (HD stations) response:

A4 14 03 01 02 00 01 00 00 00 A5 03 00 00 00 00   ¤.........¥.....
00 00 01 00 00 00 68 A4 14 03 01 02 00 01 00 00   ......h¤........
00 A7 03 00 00 00 00 00 00 01 00 00 00 6A A4 08   .§...........j¤.
02 02 02 00 00 00 00 00 B2 A4 08 01 02 02 00 00   ........²¤......
00 00 00 B1 A4 14 03 01 02 00 01 00 00 00 A9 03   ...±¤.........©.
00 00 00 00 00 00 01 00 00 00 6C A4 14 03 01 02   ..........l¤....
00 01 00 00 00 AB 03 00 00 00 00 00 00 01 00 00   .....«..........
00 6E A4 08 05 02 02 00 00 00 00 00 B5            .n¤.........µ   

SEL (Switching from HD1 to HD2) command:

A4 08 04 02 00 00 02 00 00 00 B4                  ¤.........´     

SEL (Switching from HD1 to HD2) response:

A4 08 04 02 02 00 02 00 00 00 B6 A4 08 02 02 02   ¤.........¶¤....
00 00 00 00 00 B2 A4 08 02 02 02 00 01 00 00 00   .....²¤.........
B3                                                ³               

SEL (Switching from HD2 to HD1) command:

A4 08 04 02 00 00 01 00 00 00 B3                  ¤.........³     

SEL (Switching from HD2 to HD1) response:

A4 08 04 02 02 00 01 00 00 00 B5 A4 08 02 02 02   ¤.........µ¤....
00 00 00 00 00 B2 A4 08 02 02 02 00 01 00 00 00   .....²¤.........
B3                                                ³               

Band (From FM to AM) command:

A4 10 02 01 00 00 00 00 00 00 12 02 00 00 00 00   ¤...............
00 00 CB                                          ..ë             

Band (From FM to AM) response:

A4 10 02 01 02 00 00 00 00 00 12 02 00 00 00 00   ¤...............
00 00 CD A4 08 05 02 02 00 00 00 00 00 B5 A4 08   ..í¤.........µ¤.
02 02 02 00 00 00 00 00 B2 A4 08 01 02 02 00 00   ........²¤......
00 00 00 B1                                       ...±            

Band (From AM to FM) command:

A4 10 02 01 00 00 01 00 00 00 2B 04 00 00 00 00   ¤.........+.....
00 00 E7                                          ..ç             

Band (From AM to FM) response:

A4 10 02 01 02 00 01 00 00 00 2B 04 00 00 00 00   ¤.........+.....
00 00 E9                                          ..é             

HD artist and song information samples: (I'm pretty sure this isn't RDS because it is from a station that was in HD.)

                                 A4 1B 1B 08 02              ¤....
02 00 01 00 00 00 0F 00 00 00 52 4F 42 45 52 54   ..........ROBERT
4F 20 43 41 52 4C 4F 53 20 FC A4 20 07 02 02 00   O CARLOS ü¤ ....
01 00 00 00 14 00 00 00 4E 4F 20 54 45 20 41 50   ........NO TE AP
41 52 54 45 53 20 44 45 20 4D 49 20 E9            ARTES DE MI é   

                                 A4 08 05 02 02              ¤....
00 03 00 00 00 B8 A4 19 08 02 02 00 01 00 00 00   .....¸¤.........
0D 00 00 00 56 49 43 54 4F 52 20 49 54 55 52 42   ....VICTOR ITURB
45 99 A4 15 07 02 02 00 01 00 00 00 09 00 00 00   E.¤.............
46 45 4C 49 43 49 44 41 44 43 A4 0D 08 02 02 00   FELICIDADC¤.....
02 00 00 00 01 00 00 00 20 E0                     ........ à      

                                 A4 1E 08 02 02              ¤....
00 01 00 00 00 12 00 00 00 4A 4F 53 45 20 4C 55   .........JOSE LU
49 53 20 50 45 52 41 4C 45 53 20 BB A4 16 07 02   IS PERALES »¤...
02 00 01 00 00 00 0A 00 00 00 4D 45 20 4C 4C 41   ..........ME LLA
4D 41 53 20 5C                                    MAS \           

                                 A4 08 05 02 02              ¤....
00 03 00 00 00 B8 A4 14 08 02 02 00 01 00 00 00   .....¸¤.........
08 00 00 00 46 52 45 44 44 59 27 53 05 A4 1B 1B   ....FREDDY'S.¤..
07 02 02 00 01 00 00 00 0F 00 00 00 45 4C 20 50   ............EL P
52 49 4D 45 52 20 54 4F 4E 54 4F 0E A4 0D 08 02   RIMER TONTO.¤...
02 00 02 00 00 00 01 00 00 00 20 E0               .......... à    

Judging from the above samples, tt looks like HD song info (and maybe RDS?) is in the following format:
A4 xx yy 02 02 00 01 00 00 00 zz 00 00 00 <data> <checksum>

xx       = length
yy       = ??
zz       = ??
data     = The actual song/artist info
checksum = The checksum all packets have

Valid XHTML 1.1