00001
00021 #include "pdc.h"
00022
00024 #define PDC_TXTDIS_OFFSET 9
00025 #define PDC_TXTEN_OFFSET 8
00026 #define PDC_RXTDIS_OFFSET 1
00027 #define PDC_RXTEN_OFFSET 0
00028
00030 struct peripheral_t
00031 {
00032
00033 volatile unsigned long _reserved[64];
00034
00036 volatile unsigned long rpr;
00038 volatile unsigned long rcr;
00040 volatile unsigned long tpr;
00042 volatile unsigned long tcr;
00044 volatile unsigned long rnpr;
00046 volatile unsigned long rncr;
00048 volatile unsigned long tnpr;
00050 volatile unsigned long tncr;
00052 volatile unsigned long ptcr;
00054 volatile const unsigned long ptsr;
00055 };
00056
00057
00062 void pdc_disable( void * dev )
00063 {
00064
00065 ((struct peripheral_t *)dev)->ptcr =
00066 (1<<PDC_RXTDIS_OFFSET)|(1<<PDC_TXTDIS_OFFSET);
00067 }
00068
00069
00074 void pdc_enable( void * dev )
00075 {
00076
00077 ((struct peripheral_t *)dev)->ptcr =
00078 (1<<PDC_RXTEN_OFFSET)|(1<<PDC_TXTEN_OFFSET);
00079 }
00080
00081
00086 void pdc_disableRx( void * dev )
00087 {
00088
00089 ((struct peripheral_t *)dev)->ptcr = (1<<PDC_RXTDIS_OFFSET);
00090 }
00091
00092
00097 void pdc_disableTx( void * dev )
00098 {
00099
00100 ((struct peripheral_t *)dev)->ptcr = (1<<PDC_TXTDIS_OFFSET);
00101 }
00102
00103
00110 void pdc_enableRx( void * dev )
00111 {
00112
00113 ((struct peripheral_t *)dev)->ptcr = (1<<PDC_RXTEN_OFFSET);
00114 }
00115
00116
00123 void pdc_enableTx( void * dev )
00124 {
00125 ((struct peripheral_t *)dev)->ptcr = (1<<PDC_TXTEN_OFFSET);
00126 }
00127
00128
00138 void pdc_setRxBuf( void * dev,
00139 void * rp,
00140 unsigned short rc,
00141 void * rnp,
00142 unsigned short rnc )
00143 {
00144 pdc_disableRx( dev );
00145
00146 if( rp == 0 || rc == 0 ) {
00147 return;
00148 }
00149
00150 ((struct peripheral_t *)dev)->rpr = (long)rp;
00151 ((struct peripheral_t *)dev)->rcr = rc;
00152
00153 if( rnp != 0 ) {
00154 ((struct peripheral_t *)dev)->rnpr = (long)rnp;
00155 ((struct peripheral_t *)dev)->rncr = rnc;
00156 }
00157
00158 pdc_enableRx( dev );
00159
00160 return;
00161 }
00162
00163
00171 void pdc_setRxNextBuf( void * dev,
00172 void * rnp,
00173 unsigned short rnc )
00174 {
00175 if( rnp == 0 || rnc == 0 ) {
00176 return;
00177 }
00178
00179 ((struct peripheral_t *)dev)->rnpr = (long)rnp;
00180 ((struct peripheral_t *)dev)->rncr = rnc;
00181
00182 return;
00183 }
00184
00185
00195 void pdc_setTxBuf( void * dev,
00196 void * tp,
00197 unsigned short tc,
00198 void * tnp,
00199 unsigned short tnc )
00200 {
00201 pdc_disableTx( dev );
00202
00203 if( tp == 0 || tc == 0 ) {
00204 return;
00205 }
00206
00207 ((struct peripheral_t *)dev)->tpr = (long)tp;
00208 ((struct peripheral_t *)dev)->tcr = tc;
00209
00210 if( tnp != 0 ) {
00211 ((struct peripheral_t *)dev)->tnpr = (long)tnp;
00212 ((struct peripheral_t *)dev)->tncr = tnc;
00213 }
00214
00215 pdc_enableTx( dev );
00216
00217 return;
00218 }
00219
00220
00228 void pdc_setTxNextBuf( void * dev,
00229 void * tnp,
00230 unsigned short tnc )
00231 {
00232 if( tnp == 0 || tnc == 0 ) {
00233 return;
00234 }
00235
00236 ((struct peripheral_t *)dev)->tnpr = (long)tnp;
00237 ((struct peripheral_t *)dev)->tncr = tnc;
00238
00239 return;
00240 }
00241
00242
00249 int pdc_getRcr( void * dev )
00250 {
00251 int bytes = 0;
00252 bytes += ((struct peripheral_t *)dev)->rcr;
00253
00254 return bytes;
00255 }
00256
00257
00264 int pdc_rxBytesLeft( void * dev )
00265 {
00266 int bytes = 0;
00267 bytes += ((struct peripheral_t *)dev)->rcr;
00268 bytes += ((struct peripheral_t *)dev)->rncr;
00269
00270 return bytes;
00271 }
00272
00273
00280 int pdc_getTcr( void * dev )
00281 {
00282 int bytes = 0;
00283 bytes += ((struct peripheral_t *)dev)->tcr;
00284
00285 return bytes;
00286 }
00287
00288
00295 int pdc_txBytesLeft( void * dev )
00296 {
00297 int bytes = 0;
00298 bytes += ((struct peripheral_t *)dev)->tcr;
00299 bytes += ((struct peripheral_t *)dev)->tncr;
00300
00301 return bytes;
00302 }
00303
00304
00310 void pdc_flushCache( void * buffer, unsigned short size )
00311 {
00312 unsigned int i;
00313 long memoryAddress = (long) buffer;
00314
00315 for( i = 0; i < size; ++i ) {
00316 __asm__ volatile ( "cache %0, 0x0C\n"
00317 :
00318 : "r"(memoryAddress) );
00319
00320 memoryAddress += 32;
00321 }
00322 }
00323
00324
00333 void * pdc_translatePtr( void * pointerAddr )
00334 {
00335 unsigned long returnAddress = (unsigned long) pointerAddr;
00336
00337
00338
00339
00340
00341
00342
00343
00344 returnAddress &= ~(0x80000000);
00345
00346 return (void *) returnAddress;
00347 }
00348