00001
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056 #include <avr32/io.h>
00057 #include "compiler.h"
00058
00059 #include "cs2200.h"
00060
00061 #if CS2200_INTERFACE == CS2200_INTERFACE_SPI
00062 # include "spi.h"
00063 #elif CS2200_INTERFACE == CS2200_INTERFACE_TWI
00064 # include "twi.h"
00065 #endif
00066 #include "gpio.h"
00067 #include "board.h"
00068
00069 #if CS2200_INTERFACE == CS2200_INTERFACE_SPI
00070 # warning SPI interface not supported.
00071 #endif
00072
00075 #define CS2200_EXPECTED_DEVICE_ID 0x00
00076 #define CS2200_DEVICE_CTRL_LOCKED 0x00
00078
00079
00081
00082 #define CS2200_DEVICE_ID_REG_MASK 0xF8
00083 #define CS2200_DEVICE_ID_REG_OFFSET 3
00084
00085 #define CS2200_DEVICE_CTRL_UNLOCK_REG_MASK 0x80
00086 #define CS2200_DEVICE_CTRL_UNLOCK_REG_OFFSET 8
00088
00089
00090 void cs2200_switch_on(void)
00091 {
00092 }
00093
00094 void cs2200_switch_off(void)
00095 {
00096 }
00097
00098 Bool cs2200_setup(U32 out_freq)
00099 {
00100 int device_id;
00101 int nb_tries = CS2200_NB_TRIES;
00102
00103 do
00104 {
00105 device_id = (CS2200_READ_DEVICE_ID() & CS2200_DEVICE_ID_REG_MASK) >> CS2200_DEVICE_ID_REG_OFFSET;
00106
00107 } while ((device_id != CS2200_EXPECTED_DEVICE_ID)
00108 && --nb_tries);
00109
00110
00111 if (!nb_tries)
00112 return FALSE;
00113
00114
00115 CS2200_WRITE_GLOBAL_CFG(1<<3);
00116
00117 CS2200_WRITE_DEVICE_CTRL(0x00);
00118 CS2200_WRITE_DEVICE_CFG_1( 0 << 5
00119 | 0 << 1
00120 );
00121 CS2200_WRITE_32_BITS_RATIO(_32_BITS_RATIO(out_freq));
00122 CS2200_WRITE_FUNCT_CFG_1( 0x00 << 6
00123 | 0x02 << 3
00124 );
00125 CS2200_WRITE_FUNCT_CFG_2( 0x00 << 4
00126 );
00127
00128
00129 CS2200_WRITE_GLOBAL_CFG( 0x00 << 3
00130 | 0x01 << 0
00131 );
00132 cs2200_enter_test_mode();
00133 return TRUE;
00134 }
00135
00136 void cs2200_enter_test_mode(void)
00137 {
00138 CS2200_WRITE_TEST_MODE_1(0x99);
00139 CS2200_WRITE_TEST_MODE_2(0x80);
00140 }
00141
00142
00143 void cs2200_leave_test_mode(void)
00144 {
00145 CS2200_WRITE_TEST_MODE_2(0x00);
00146 CS2200_WRITE_TEST_MODE_1(0x00);
00147 }
00148
00149
00150 void cs2200_freq_clk_out(U32 ratio)
00151 {
00152 CS2200_WRITE_32_BITS_RATIO(ratio);
00153 }
00154
00155
00156 void cs2200_freq_clk_adjust(U16 lsh_ratio)
00157 {
00158 static U16 s_ratio;
00159 s_ratio=lsh_ratio;
00160 cs2200_write_ex(CS2200_REG_LSW_RATIO_ADDR, &s_ratio, sizeof(lsh_ratio));
00161 }
00162
00163
00164 #if 0
00165 void cs2200_set_new_freq_clk_out(U32 ratio)
00166 {
00167
00168
00169
00170 cs2200_leave_test_mode();
00171 CS2200_WRITE_32_BITS_RATIO(ratio);
00172
00173
00174
00175
00176
00177
00178
00179
00180 cs2200_enter_test_mode();
00181 }
00182 #endif
00183
00184 #if CS2200_INTERFACE == CS2200_INTERFACE_TWI
00185
00186 void cs2200_read(U8 address, void *buffer, U8 len)
00187 {
00188 twi_package_t twi_packet;
00189 int twi_status;
00190
00191 do{
00192 twi_packet.chip = CS2200_TWI_SLAVE_ADDRESS;
00193 twi_packet.addr = address;
00194 twi_packet.addr_length = 1;
00195 twi_packet.buffer = buffer;
00196 twi_packet.length = len;
00197 twi_status=twi_master_read(CS2200_TWI, &twi_packet);
00198 }
00199 while( twi_status != TWI_SUCCESS );
00200 }
00201
00202 void cs2200_write(U8 address, const void *buffer, U8 len)
00203 {
00204 twi_package_t twi_packet;
00205 int twi_status;
00206
00207 do{
00208 twi_packet.chip = CS2200_TWI_SLAVE_ADDRESS;
00209 twi_packet.addr = address | 0x80;
00210 twi_packet.addr_length = 1;
00211 twi_packet.buffer = (void *)buffer;
00212 twi_packet.length = len;
00213 twi_status=twi_master_write(CS2200_TWI, &twi_packet);
00214 }
00215 while( twi_status != TWI_SUCCESS );
00216 }
00217
00218
00219 int cs2200_write_ex(U8 address, const void *buffer, U8 len)
00220 {
00221 twi_package_t twi_packet;
00222
00223 twi_packet.chip = CS2200_TWI_SLAVE_ADDRESS;
00224 twi_packet.addr = address | 0x80;
00225 twi_packet.addr_length = 1;
00226 twi_packet.buffer = (void *)buffer;
00227 twi_packet.length = len;
00228 return twi_master_write_ex(CS2200_TWI, &twi_packet);
00229 }
00230
00231 #endif