diff options
Diffstat (limited to 'firmware')
-rw-r--r-- | firmware/export/tuner.h | 59 | ||||
-rw-r--r-- | firmware/tuner_philips.c | 23 | ||||
-rw-r--r-- | firmware/tuner_samsung.c | 19 |
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 | ||
46 | int radio_set(int setting, int value); | ||
47 | int 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 | ||
58 | int (*_radio_set)(int setting, int value); | ||
59 | int (*_radio_get)(int setting); | ||
60 | #endif | ||
61 | #endif | ||
62 | |||
42 | #if (CONFIG_TUNER & S1A0903X01) | 63 | #if (CONFIG_TUNER & S1A0903X01) |
43 | void samsung_set(int setting, int value); | 64 | int samsung_set(int setting, int value); |
44 | int samsung_get(int setting); | 65 | int samsung_get(int setting); |
45 | #endif | 66 | #endif /* CONFIG_TUNER & S1A0903X01 */ |
46 | 67 | ||
47 | #if (CONFIG_TUNER & TEA5767) | 68 | #if (CONFIG_TUNER & TEA5767) |
48 | void philips_set(int setting, int value); | 69 | struct philips_dbg_info |
70 | { | ||
71 | unsigned char read_regs[5]; | ||
72 | unsigned char write_regs[5]; | ||
73 | }; | ||
74 | int philips_set(int setting, int value); | ||
49 | int philips_get(int setting); | 75 | int philips_get(int setting); |
76 | void 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. */ | ||
81 | static 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 @@ | |||
29 | static unsigned char write_bytes[5] = { 0x00, 0x00, 0x00, 0x00, 0x00 }; | 29 | static 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 */ |
32 | void philips_set(int setting, int value) | 32 | int 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 | |||
119 | void 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; | |||
34 | static int fm_in2; | 35 | static int fm_in2; |
35 | 36 | ||
36 | /* tuner abstraction layer: set something to the tuner */ | 37 | /* tuner abstraction layer: set something to the tuner */ |
37 | void samsung_set(int setting, int value) | 38 | int 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 */ |