Error message

Deprecated function: The each() function is deprecated. This message will be suppressed on further calls in menu_set_active_trail() (line 2405 of /home/qx/drupal-7.58/includes/menu.inc).

Sirius Front Panel

Contents: 

Introduction

I recently got a used Sirius satellite radio receiver. It didn't have an antenna (or presumably a subscription), and I don't listen to radio much, so I was more interested in the hardware as parts than as a radio. The front panel looks useful, especially when you take the thing apart and find out that the front panel has an ATmega128 controlling it!

On further investigation, it seems that the radio and front panel operate mostly independently, with only a serial link and a few discrete signals connecting them. There is information on the web about connecting the radio to a computer via this serial link, but that's not what I'm after. The front panel has 17 rubber buttons, an encoder with a button, an IR detector, and a monochrome LCD screen with a red backlight. There are test points on the board for programming the ATmega128 at the factory. See where I'm going with this?

The board is only two layers, and the only large chip is the ATmega128, so almost everything was easy to figure out. The one problem was the LCD screen. It has no useful part numbers (this happens a lot), and no exposed chips. The controller/driver is a bare die mounted on the flex cable, as in many cell phones.


Front Panel

Back, with wires for ISP and power

The silkscreen text in the upper left corner reads:

SIRIUS
Satellite Radio
SIR-PNP2.REV.1
(CK100SR.REV.0)
2004.03.25

MCU pinout

This was determined by following traces on the board. See below for how the LCD signals were identified.

Pin Description
PA0 Button column 1
PA1 Button column 2
PA2 Button column 3
PA3 Button column 4
PA4 Button column 5
PA5 Button column 6
PA6 Encoder 1
PA7 Encoder 2
 
PB0  
PB1 ISP SCK
PB2  
PB3  
PB4 FM_CNT (OC0)
PB5 Beeper (OC1A)
PB6 LCD backlight control (OC1B)
PB7 P_EN (power enable to radio) (OC2/OC1C)
 
PC0 LCD D0
PC1 LCD D1
PC2 LCD D2
PC3 LCD D3
PC4 LCD D4
PC5 LCD D5
PC6 LCD D6
PC7 LCD D7
 
PD0 Button backlight control
PD1  
PD2 RX (from radio)
PD3 TX (to radio)
PD4 LCD /RD
PD5 LCD /WR
PD6 LCD RS
PD7 LCD /RESET
 
PE0 ISP MOSI
PE1 ISP MISO
PE2  
PE3  
PE4  
PE5  
PE6 IR detector
PE7  
 
PF0  
PF1  
PF2  
PF3  
PF4  
PF5 Button row C
PF6 Button row A
PF7 Button row B

I haven't messed with the thing beside the IR detector which is either an IR emitter or a light level sensor.

LCD

Since I couldn't get any information from the screen itself, I captured the initialization sequence, one bit at a time, with an oscilloscope (I have since bought a logic analyzer) and made some educated guesses about what the signals did. It was pretty clear that the LCD had to have its own controller, since the ATmega128 shouldn't be loaded down with constantly refreshing the screen, so the interface was probably similar to other graphic LCDs with a built-in controller. All of port C was probably eight data lines, since that was eight adjacent data lines. One signal (PD7) has an RC filter on it and pulses only on startup, so it was probably a reset. The remaining three signals had to contain a read/write line (or seperate read and write lines) and one or two register select lines.

The activity on the three control lines suggested that there were seperate read and write signals, since all three showed lots of activity on startup (when the logo was being drawn) but in different patterns. I started reading all the datasheets I could find for graphic LCD controllers that might be used for this display and found that the Samsung S6B1713 has an interface that is consistent with my observations. Most importantly, the bytes I captured from the data lines made sense as initialization commands for this chip.

The lock bits were set on the MCU, so after recording some other timing details I erased the chip and started working on my own code. I imitated the initialization sequence that I recorded and eventually got the LCD to initialize and display data. Later I wrote text display code using a free 8x8 bitmap font.

It turns out that the screen is 132x65, the largest size supported by the S6B1713.

Buttons

The buttons are wired in a 3x6 matrix. I labelled the columns 1-6 and the rows A-C. This table shows which keys are in which positions in the matrix:

  1 2 3 4 5 6
A 1 2 3 4 5 6
B 7 8 9 0 Cat. Right Cat. Left
C Power MEMO BAND MENU DISP Encoder

 

Code

You can get my code and misuse your own radio's front panel, or use it as example code for other purposes. The font code is probably useful if you have an S6B1713, but the code depends on that chip's addressing scheme so it may not be helpful for other LCD screens.

The encoder code is not the best and doesn't debounce, so you really shouldn't reuse it. This code is really just proof-of-concept.