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