N900 FM radio receiver

The N900 FM receiver allows the reception of broadcast FM radio signals using the headset/headphones as an antenna.


[edit] Hardware

The FM radio is part of the Bluetooth chip. It receives FM radio signals using the headset or earphones plugged into the 3.5 mm socket as an antenna (actually arbitrary headset/headphones, or any other cable, for this purpose).

The audio output of the FM radio is connected to the audio codec chip. This can be routed directly to the headphones - but possibly not the speaker due to concerns about speaker damage due to the speakers not being able to handle bass.

The existing software that uses the radio passes the audio through the CPU, implementing a software filter for speaker protection when the speakers are enabled.

[edit] Software

[edit] Kernel

The FM receiver is implemented as a video4linux radio device by the bcm2048 module. This controls the receiver over the N900 Hardware Bus I2C.

It appears as device /dev/radio1.

v4l2-ctl --all -d /dev/radio1
Driver Info:
 Driver name   : bcm2048
 Card type     : Broadcom bcm2048 FM Radio Recei
 Bus info      : I2C: 0x22
 Driver version: 1
 Capabilities  : 0x00050400
 Video input : 0
Frequency: 1518400 (94.900000 MHz)
Video Standard = 0x00000000
Streaming Parameters Video Capture:
 Frames per second: 25.000 (25/1)
 Read buffers     : 0
 Name                 : FM Receiver
 Capabilities         : 62.5 Hz stereo 
 Frequency range      : 87.5 MHz - 108.0 MHz
 Signal strength/AFC  : 0%/0
 Current audio mode   : stereo
 Available subchannels: stereo 

The module is only loaded when the radio is used.

It is also exposed under sysfs.

/sys/class/i2c-adapter/i2c-3/3-0022# ls
audio_route               fm_rssi                   rds_data
bus                       fm_search_mode_direction  rds_pi
dac_output                fm_search_rssi_threshold  rds_pi_mask
driver                    fm_search_tune_mode       rds_pi_match
fm_af_frequency           modalias                  rds_ps
fm_best_tune_mode         mute                      rds_rt
fm_carrier_error          name                      rds_wline
fm_deemphasis             power                     region
fm_frequency              power_state               region_bottom_frequency
fm_hi_lo_injection        rds                       region_top_frequency
fm_rds_flags              rds_b_block_mask          subsystem
fm_rds_mask               rds_b_block_match         uevent

The sysfs interface allows configuration of region (which affects frequency ranges and other parameters).

[edit] User

There are 3 userspace application that uses the FM receiver:

FMRadio, QRadio and C FM Radio