summaryrefslogtreecommitdiff
path: root/firmware
diff options
context:
space:
mode:
Diffstat (limited to 'firmware')
-rw-r--r--firmware/export/tuner.h59
-rw-r--r--firmware/tuner_philips.c23
-rw-r--r--firmware/tuner_samsung.c19
3 files changed, 85 insertions, 16 deletions
diff --git a/firmware/export/tuner.h b/firmware/export/tuner.h
index 0a13613711..590e61dedb 100644
--- a/firmware/export/tuner.h
+++ b/firmware/export/tuner.h
@@ -20,34 +20,81 @@
20#ifndef __TUNER_SAMSUNG_H__ 20#ifndef __TUNER_SAMSUNG_H__
21#define __TUNER_SAMSUNG_H__ 21#define __TUNER_SAMSUNG_H__
22 22
23#include "hwcompat.h"
24
23/* settings to the tuner layer */ 25/* settings to the tuner layer */
26#define RADIO_ALL -1 /* debug */
24#define RADIO_SLEEP 0 27#define RADIO_SLEEP 0
25#define RADIO_FREQUENCY 1 28#define RADIO_FREQUENCY 1
26#define RADIO_MUTE 2 29#define RADIO_MUTE 2
27#define RADIO_IF_MEASUREMENT 3 30#define RADIO_IF_MEASUREMENT 3
28#define RADIO_SENSITIVITY 4 31#define RADIO_SENSITIVITY 4
29#define RADIO_FORCE_MONO 5 32#define RADIO_FORCE_MONO 5
33#define RADIO_SCAN_FREQUENCY 6
30#if (CONFIG_TUNER & TEA5767) 34#if (CONFIG_TUNER & TEA5767)
31#define RADIO_SET_DEEMPHASIS 6 35#define RADIO_SET_DEEMPHASIS 7
32#define RADIO_SET_BAND 7 36#define RADIO_SET_BAND 8
33#endif 37#endif
34/* readback from the tuner layer */ 38/* readback from the tuner layer */
35#define RADIO_PRESENT 0 39#define RADIO_PRESENT 0
36#define RADIO_TUNED 1 40#define RADIO_TUNED 1
37#define RADIO_STEREO 2 41#define RADIO_STEREO 2
38#define RADIO_ALL 3 /* debug */
39 42
40#if CONFIG_TUNER 43#if CONFIG_TUNER
41 44
45#ifdef SIMULATOR
46int radio_set(int setting, int value);
47int radio_get(int setting);
48#else
49#if CONFIG_TUNER == S1A0903X01 /* FM recorder */
50#define radio_set samsung_set
51#define radio_get samsung_get
52#elif CONFIG_TUNER == TEA5767 /* iRiver, iAudio */
53#define radio_set philips_set
54#define radio_get philips_get
55#elif CONFIG_TUNER == (S1A0903X01 | TEA5767) /* OndioFM */
56#define radio_set _radio_set
57#define radio_get _radio_get
58int (*_radio_set)(int setting, int value);
59int (*_radio_get)(int setting);
60#endif
61#endif
62
42#if (CONFIG_TUNER & S1A0903X01) 63#if (CONFIG_TUNER & S1A0903X01)
43void samsung_set(int setting, int value); 64int samsung_set(int setting, int value);
44int samsung_get(int setting); 65int samsung_get(int setting);
45#endif 66#endif /* CONFIG_TUNER & S1A0903X01 */
46 67
47#if (CONFIG_TUNER & TEA5767) 68#if (CONFIG_TUNER & TEA5767)
48void philips_set(int setting, int value); 69struct philips_dbg_info
70{
71 unsigned char read_regs[5];
72 unsigned char write_regs[5];
73};
74int philips_set(int setting, int value);
49int philips_get(int setting); 75int philips_get(int setting);
76void philips_dbg_info(struct philips_dbg_info *info);
77#endif /* CONFIG_TUNER & TEA5767 */
78
79/* Just inline here since only radio screen needs this atm and
80 there's no tuner.c. */
81static inline void tuner_init(void)
82{
83#ifndef SIMULATOR
84#if CONFIG_TUNER == (S1A0903X01 | TEA5767)
85 if (read_hw_mask() & TUNER_MODEL)
86 {
87 _radio_set = philips_set;
88 _radio_get = philips_get;
89 }
90 else
91 {
92 _radio_set = samsung_set;
93 _radio_get = samsung_get;
94 }
95#endif
50#endif 96#endif
97}
51 98
52#endif /* #if CONFIG_TUNER */ 99#endif /* #if CONFIG_TUNER */
53 100
diff --git a/firmware/tuner_philips.c b/firmware/tuner_philips.c
index 0a6f5c4c7f..8520fdbae9 100644
--- a/firmware/tuner_philips.c
+++ b/firmware/tuner_philips.c
@@ -29,7 +29,7 @@
29static unsigned char write_bytes[5] = { 0x00, 0x00, 0x00, 0x00, 0x00 }; 29static unsigned char write_bytes[5] = { 0x00, 0x00, 0x00, 0x00, 0x00 };
30 30
31/* tuner abstraction layer: set something to the tuner */ 31/* tuner abstraction layer: set something to the tuner */
32void philips_set(int setting, int value) 32int philips_set(int setting, int value)
33{ 33{
34 switch(setting) 34 switch(setting)
35 { 35 {
@@ -60,6 +60,11 @@ void philips_set(int setting, int value)
60 } 60 }
61 break; 61 break;
62 62
63 case RADIO_SCAN_FREQUENCY:
64 philips_set(RADIO_FREQUENCY, value);
65 sleep(HZ/30);
66 return philips_get(RADIO_TUNED);
67
63 case RADIO_MUTE: 68 case RADIO_MUTE:
64 write_bytes[0] = (write_bytes[0] & 0x7F) | (value ? 0x80 : 0); 69 write_bytes[0] = (write_bytes[0] & 0x7F) | (value ? 0x80 : 0);
65 break; 70 break;
@@ -75,9 +80,10 @@ void philips_set(int setting, int value)
75 case RADIO_SET_BAND: 80 case RADIO_SET_BAND:
76 write_bytes[3] = (write_bytes[3] & ~(1<<5)) | (value ? (1<<5) : 0); 81 write_bytes[3] = (write_bytes[3] & ~(1<<5)) | (value ? (1<<5) : 0);
77 default: 82 default:
78 return; 83 return -1;
79 } 84 }
80 fmradio_i2c_write(I2C_ADR, write_bytes, sizeof(write_bytes)); 85 fmradio_i2c_write(I2C_ADR, write_bytes, sizeof(write_bytes));
86 return 1;
81} 87}
82 88
83/* tuner abstraction layer: read something from the tuner */ 89/* tuner abstraction layer: read something from the tuner */
@@ -106,13 +112,12 @@ int philips_get(int setting)
106 case RADIO_STEREO: 112 case RADIO_STEREO:
107 val = read_bytes[2] >> 7; 113 val = read_bytes[2] >> 7;
108 break; 114 break;
109
110 case RADIO_ALL: /* debug query */
111 val = read_bytes[0] << 24
112 | read_bytes[1] << 16
113 | read_bytes[2] << 8
114 | read_bytes[3];
115 break;
116 } 115 }
117 return val; 116 return val;
118} 117}
118
119void philips_dbg_info(struct philips_dbg_info *info)
120{
121 fmradio_i2c_read(I2C_ADR, info->read_regs, 5);
122 memcpy(info->write_regs, write_bytes, 5);
123}
diff --git a/firmware/tuner_samsung.c b/firmware/tuner_samsung.c
index b0887d0d7a..82934d7160 100644
--- a/firmware/tuner_samsung.c
+++ b/firmware/tuner_samsung.c
@@ -21,6 +21,7 @@
21#include <stdbool.h> 21#include <stdbool.h>
22#include <stdlib.h> 22#include <stdlib.h>
23#include "config.h" 23#include "config.h"
24#include "kernel.h"
24#include "tuner.h" /* tuner abstraction interface */ 25#include "tuner.h" /* tuner abstraction interface */
25#include "fmradio.h" /* physical interface driver */ 26#include "fmradio.h" /* physical interface driver */
26#include "mpeg.h" 27#include "mpeg.h"
@@ -34,8 +35,10 @@ static int fm_in1;
34static int fm_in2; 35static int fm_in2;
35 36
36/* tuner abstraction layer: set something to the tuner */ 37/* tuner abstraction layer: set something to the tuner */
37void samsung_set(int setting, int value) 38int samsung_set(int setting, int value)
38{ 39{
40 int val = 1;
41
39 switch(setting) 42 switch(setting)
40 { 43 {
41 case RADIO_SLEEP: 44 case RADIO_SLEEP:
@@ -90,6 +93,16 @@ void samsung_set(int setting, int value)
90 break; 93 break;
91 } 94 }
92 95
96 case RADIO_SCAN_FREQUENCY:
97 /* Tune in and delay */
98 samsung_set(RADIO_FREQUENCY, value);
99 sleep(1);
100 /* Start IF measurement */
101 samsung_set(RADIO_IF_MEASUREMENT, 1);
102 sleep(1);
103 val = samsung_get(RADIO_TUNED);
104 break;
105
93 case RADIO_MUTE: 106 case RADIO_MUTE:
94 fm_in1 = (fm_in1 & 0xfffffffe) | (value?1:0); 107 fm_in1 = (fm_in1 & 0xfffffffe) | (value?1:0);
95 fmradio_set(1, fm_in1); 108 fmradio_set(1, fm_in1);
@@ -109,7 +122,11 @@ void samsung_set(int setting, int value)
109 fm_in2 = (fm_in2 & 0xfffffffb) | (value?0:4); 122 fm_in2 = (fm_in2 & 0xfffffffb) | (value?0:4);
110 fmradio_set(2, fm_in2); 123 fmradio_set(2, fm_in2);
111 break; 124 break;
125 default:
126 val = -1;
112 } 127 }
128
129 return val;
113} 130}
114 131
115/* tuner abstraction layer: read something from the tuner */ 132/* tuner abstraction layer: read something from the tuner */