pdc.c

Go to the documentation of this file.
00001 /*This file has been prepared for Doxygen automatic documentation generation.*/
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         /* 0x00 */
00033         volatile       unsigned long _reserved[64];
00034         /* 0x100 PDC start */
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         /* Disable RX and TX */
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         /* Enable RX and TX */
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         /* Disable RX */
00089         ((struct peripheral_t *)dev)->ptcr = (1<<PDC_RXTDIS_OFFSET);
00090 }
00091 
00092 
00097 void pdc_disableTx( void * dev )
00098 {
00099         /* Disable TX */
00100         ((struct peripheral_t *)dev)->ptcr = (1<<PDC_TXTDIS_OFFSET);
00101 }
00102 
00103 
00110 void pdc_enableRx( void * dev )
00111 {
00112         /* Enable RX */
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         /* Mapping between virtual address and physical address when the
00338          * MCU has been reset, and the MMU is not being used, is done by
00339          * clearing MSB in the memory address.
00340          *
00341          * For more details conserning the MMU see application note
00342          * AVR32113 Configuration and Use of the Memory Managment Unit.
00343          */
00344         returnAddress &= ~(0x80000000);
00345 
00346         return (void *) returnAddress;
00347 }
00348 

Generated on Thu May 10 14:14:48 2007 for AVR321000 Communication with the AVR32 USART by  doxygen 1.5.1