Back to home page

LXR

 
 

    


File indexing completed on 2025-05-11 08:23:48

0001 /*
0002  *  Copyright (c) 2000, National Research Council of Canada
0003  *
0004  *  The license and distribution terms for this file may be
0005  *  found in the file LICENSE in this distribution or at
0006  *  http://www.rtems.org/license/LICENSE.
0007  */
0008 
0009 /* CD2401 CONSOLE DRIVER DEBUG INFO RECORDING */
0010 
0011 #ifdef CD2401_RECORD_DEBUG_INFO
0012 
0013 /* Control individual recording here. That way, we don't clutter console.c */
0014 #define CD2401_RECORD_WRITE
0015 #define CD2401_RECORD_TX_ISR
0016 #define CD2401_RECORD_RX_ISR
0017 #define CD2401_RECORD_RE_ISR
0018 #define CD2401_RECORD_MODEM_ISR
0019 #define CD2401_RECORD_SET_ATTRIBUTE
0020 #define CD2401_RECORD_FIRST_OPEN
0021 #define CD2401_RECORD_LAST_CLOSE
0022 #define CD2401_RECORD_START_REMOTE_TX
0023 #define CD2401_RECORD_STOP_REMOTE_TX
0024 #define CD2401_RECORD_DRAIN_OUTPUT
0025 #define CD2401_RECORD_DELAY
0026 
0027 /* Call the data recording functions */
0028 #ifdef CD2401_RECORD_WRITE
0029 #define CD2401_RECORD_WRITE_INFO( args )              cd2401_record_write_info args
0030 #else
0031 #define CD2401_RECORD_WRITE_INFO( args )
0032 #endif
0033 
0034 #ifdef CD2401_RECORD_TX_ISR
0035 #define CD2401_RECORD_TX_ISR_INFO( args )             cd2401_record_tx_isr_info args
0036 #define CD2401_RECORD_TX_ISR_SPURIOUS_INFO( args )    cd2401_record_tx_isr_spurious_info args
0037 #define CD2401_RECORD_TX_ISR_BUSERR_INFO( args )      cd2401_record_tx_isr_buserr_info args
0038 #else
0039 #define CD2401_RECORD_TX_ISR_INFO( args )
0040 #define CD2401_RECORD_TX_ISR_SPURIOUS_INFO( args )
0041 #define CD2401_RECORD_TX_ISR_BUSERR_INFO( args )
0042 #endif
0043 
0044 #ifdef CD2401_RECORD_RX_ISR
0045 #define CD2401_RECORD_RX_ISR_INFO( args )             cd2401_record_rx_isr_info args
0046 #define CD2401_RECORD_RX_ISR_SPURIOUS_INFO( args )    cd2401_record_rx_isr_spurious_info args
0047 #else
0048 #define CD2401_RECORD_RX_ISR_INFO( args )
0049 #define CD2401_RECORD_RX_ISR_SPURIOUS_INFO( args )
0050 #endif
0051 
0052 #ifdef CD2401_RECORD_RE_ISR
0053 #define CD2401_RECORD_RE_ISR_SPURIOUS_INFO( args )    cd2401_record_re_isr_spurious_info args
0054 #else
0055 #define CD2401_RECORD_RE_ISR_SPURIOUS_INFO( args )
0056 #endif
0057 
0058 #ifdef CD2401_RECORD_MODEM_ISR
0059 #define CD2401_RECORD_MODEM_ISR_SPURIOUS_INFO( args ) cd2401_record_modem_isr_spurious_info args
0060 #else
0061 #define CD2401_RECORD_MODEM_ISR_SPURIOUS_INFO( args )
0062 #endif
0063 
0064 #ifdef CD2401_RECORD_SET_ATTRIBUTES
0065 #define CD2401_RECORD_SET_ATTRIBUTES_INFO( args )     cd2401_record_set_attributes_info args
0066 #else
0067 #define CD2401_RECORD_SET_ATTRIBUTES_INFO( args )
0068 #endif
0069 
0070 #ifdef CD2401_RECORD_FIRST_OPEN
0071 #define CD2401_RECORD_FIRST_OPEN_INFO( args )         cd2401_record_first_open_info args
0072 #else
0073 #define CD2401_RECORD_FIRST_OPEN_INFO( args )
0074 #endif
0075 
0076 #ifdef CD2401_RECORD_LAST_CLOSE
0077 #define CD2401_RECORD_LAST_CLOSE_INFO( args )         cd2401_record_last_close_info args
0078 #else
0079 #define CD2401_RECORD_LAST_CLOSE_INFO( args )
0080 #endif
0081 
0082 #ifdef CD2401_RECORD_START_REMOTE_TX
0083 #define CD2401_RECORD_START_REMOTE_TX_INFO( args )    cd2401_record_start_remote_tx_info args
0084 #else
0085 #define CD2401_RECORD_START_REMOTE_TX_INFO( args )
0086 #endif
0087 
0088 #ifdef CD2401_RECORD_STOP_REMOTE_TX
0089 #define CD2401_RECORD_STOP_REMOTE_TX_INFO( args )     cd2401_record_stop_remote_tx_info args
0090 #else
0091 #define CD2401_RECORD_STOP_REMOTE_TX_INFO( args )
0092 #endif
0093 
0094 #ifdef CD2401_RECORD_DRAIN_OUTPUT
0095 #define CD2401_RECORD_DRAIN_OUTPUT_INFO( args )       cd2401_record_drain_output_info args
0096 #else
0097 #define CD2401_RECORD_DRAIN_OUTPUT_INFO( args )
0098 #endif
0099 
0100 #ifdef CD2401_RECORD_DELAY
0101 #define CD2401_RECORD_DELAY_INFO( args )              cd2401_record_delay_info args
0102 #else
0103 #define CD2401_RECORD_DELAY_INFO( args )
0104 #endif
0105 
0106 /* Define the data and the recording functions */
0107 #define CD2401_DEBUG_BUFFER_SIZE     256
0108 #define CD2401_DEBUG_CHAR_BUFSIZE     64
0109 #define CD2401_WRITE_INFO              1
0110 #define CD2401_TX_ISR_INFO             2
0111 #define CD2401_TX_ISR_SPURIOUS_INFO    3
0112 #define CD2401_TX_ISR_BUSERR_INFO      4
0113 #define CD2401_RX_ISR_INFO             5
0114 #define CD2401_RX_ISR_SPURIOUS_INFO    6
0115 #define CD2401_RE_ISR_SPURIOUS_INFO    7
0116 #define CD2401_MODEM_ISR_SPURIOUS_INFO 8
0117 #define CD2401_FIRST_OPEN_INFO         9
0118 #define CD2401_LAST_CLOSE_INFO        10
0119 #define CD2401_START_REMOTE_TX_INFO   11
0120 #define CD2401_STOP_REMOTE_TX_INFO    12
0121 #define CD2401_SET_ATTRIBUTE_INFO     13
0122 #define CD2401_DRAIN_OUTPUT_INFO      14
0123 #define CD2401_DELAY_INFO             15
0124 
0125 struct cd2401_debug_info {
0126   short discriminant;
0127   short record_size;
0128   union {
0129     struct cd2401_write_info {
0130       int length;
0131       char buffer[CD2401_DEBUG_CHAR_BUFSIZE];
0132       char dmabuf;
0133     } write_info;
0134     struct cd2401_tx_isr_info {
0135       unsigned char channel;
0136       unsigned char status;
0137       unsigned char initial_ier;
0138       unsigned char final_ier;
0139       uint8_t         txEmpty;
0140     } tx_isr_info;
0141     struct cd2401_tx_isr_spurious_info {
0142       unsigned char channel;
0143       unsigned char status;
0144       unsigned char initial_ier;
0145       unsigned char final_ier;
0146       unsigned long spurdev;
0147       unsigned long spurcount;
0148     } tx_isr_spurious_info;
0149     struct cd2401_tx_isr_buserr_info {
0150       unsigned char channel;
0151       unsigned char status;
0152       unsigned char initial_ier;
0153       unsigned char buserr;
0154       unsigned long type;
0155       unsigned long addr;
0156     } tx_isr_buserr_info;
0157     struct cd2401_rx_isr_info {
0158       unsigned char channel;
0159       int length;
0160       char buffer[CD2401_DEBUG_CHAR_BUFSIZE];
0161     } rx_isr_info;
0162     struct cd2401_rx_isr_spurious_info {
0163       unsigned char channel;
0164       unsigned char status;
0165       unsigned long spurdev;
0166       unsigned long spurcount;
0167     } rx_isr_spurious_info;
0168     struct cd2401_re_isr_spurious_info {
0169       unsigned char channel;
0170       unsigned long spurdev;
0171       unsigned long spurcount;
0172     } re_isr_spurious_info;
0173     struct cd2401_modem_isr_spurious_info {
0174       unsigned char channel;
0175       unsigned long spurdev;
0176       unsigned long spurcount;
0177     } modem_isr_spurious_info;
0178     struct cd2401_first_open_info {
0179       unsigned char channel;
0180       uint8_t         init_count;
0181     } first_open_info;
0182     struct cd2401_last_close_info {
0183       unsigned char channel;
0184       uint8_t         init_count;
0185     } last_close_info;
0186     struct cd2401_start_remote_tx_info {
0187       unsigned char channel;
0188     } start_remote_tx_info;
0189     struct cd2401_stop_remote_tx_info {
0190       unsigned char channel;
0191     } stop_remote_tx_info;
0192     struct cd2401_set_attribute_info {
0193       int minor;
0194       uint8_t         need_reinit;
0195       uint8_t         txEmpty;
0196       uint8_t         csize;
0197       uint8_t         cstopb;
0198       uint8_t         parodd;
0199       uint8_t         parenb;
0200       uint8_t         ignpar;
0201       uint8_t         inpck;
0202       uint8_t         hw_flow_ctl;
0203       uint8_t         sw_flow_ctl;
0204       uint8_t         extra_flow_ctl;
0205       uint8_t         icrnl;
0206       uint8_t         igncr;
0207       uint8_t         inlcr;
0208       uint8_t         brkint;
0209       uint8_t         ignbrk;
0210       uint8_t         parmrk;
0211       uint8_t         istrip;
0212       uint16_t         tx_period;
0213       uint16_t         rx_period;
0214       uint32_t         out_baud;
0215       uint32_t         in_baud;
0216     } set_attribute_info;
0217     struct cd2401_drain_output_info {
0218       uint8_t         txEmpty;
0219       uint8_t         own_buf_A;
0220       uint8_t         own_buf_B;
0221     } drain_output_info;
0222     struct cd2401_delay_info {
0223       rtems_interval start;
0224       rtems_interval end;
0225       rtems_interval current;
0226       unsigned long loop_count;
0227     } delay_info;
0228   } u;
0229 };
0230 
0231 struct cd2401_debug_info cd2401_debug_buffer[CD2401_DEBUG_BUFFER_SIZE];
0232 int cd2401_debug_index = 0;
0233 
0234 #include <string.h>
0235 
0236 int cd2401_get_record_size(
0237   int size
0238 )
0239 {
0240   /* Not the best way to do this */
0241   return size + 4;
0242 }
0243 
0244 void cd2401_record_write_info(
0245   int len,
0246   const char * buf,
0247   char dmabuf
0248 )
0249 {
0250   int max_length;
0251 
0252   max_length = (len < CD2401_DEBUG_CHAR_BUFSIZE ) ? len : CD2401_DEBUG_CHAR_BUFSIZE;
0253 
0254   memset( &(cd2401_debug_buffer[cd2401_debug_index]), '\0', sizeof( struct cd2401_debug_info )  );
0255   cd2401_debug_buffer[cd2401_debug_index].discriminant = CD2401_WRITE_INFO;
0256   cd2401_debug_buffer[cd2401_debug_index].record_size =
0257       cd2401_get_record_size( sizeof( struct cd2401_write_info ) );
0258   cd2401_debug_buffer[cd2401_debug_index].u.write_info.length = len;
0259   memcpy ( &(cd2401_debug_buffer[cd2401_debug_index].u.write_info.buffer), buf, max_length );
0260   cd2401_debug_buffer[cd2401_debug_index].u.write_info.dmabuf = dmabuf;
0261 
0262   cd2401_debug_index = (cd2401_debug_index + 1 ) % CD2401_DEBUG_BUFFER_SIZE;
0263 }
0264 
0265 void cd2401_record_tx_isr_info(
0266   unsigned char ch,
0267   unsigned char status,
0268   unsigned char initial_ier,
0269   unsigned char final_ier,
0270   uint8_t         txEmpty
0271 )
0272 {
0273   memset( &(cd2401_debug_buffer[cd2401_debug_index]), '\0', sizeof( struct cd2401_debug_info )  );
0274   cd2401_debug_buffer[cd2401_debug_index].discriminant = CD2401_TX_ISR_INFO;
0275   cd2401_debug_buffer[cd2401_debug_index].record_size =
0276       cd2401_get_record_size( sizeof( struct cd2401_tx_isr_info ) );
0277   cd2401_debug_buffer[cd2401_debug_index].u.tx_isr_info.channel = ch;
0278   cd2401_debug_buffer[cd2401_debug_index].u.tx_isr_info.status = status;
0279   cd2401_debug_buffer[cd2401_debug_index].u.tx_isr_info.initial_ier = initial_ier;
0280   cd2401_debug_buffer[cd2401_debug_index].u.tx_isr_info.final_ier = final_ier;
0281   cd2401_debug_buffer[cd2401_debug_index].u.tx_isr_info.txEmpty = txEmpty;
0282 
0283   cd2401_debug_index = (cd2401_debug_index + 1 ) % CD2401_DEBUG_BUFFER_SIZE;
0284 }
0285 
0286 void cd2401_record_tx_isr_spurious_info(
0287   unsigned char ch,
0288   unsigned char status,
0289   unsigned char initial_ier,
0290   unsigned char final_ier,
0291   unsigned char spur_dev,
0292   unsigned char spur_cnt
0293 )
0294 {
0295   memset( &(cd2401_debug_buffer[cd2401_debug_index]), '\0', sizeof( struct cd2401_debug_info )  );
0296   cd2401_debug_buffer[cd2401_debug_index].discriminant = CD2401_TX_ISR_SPURIOUS_INFO;
0297   cd2401_debug_buffer[cd2401_debug_index].record_size =
0298       cd2401_get_record_size( sizeof( struct cd2401_tx_isr_spurious_info ) );
0299   cd2401_debug_buffer[cd2401_debug_index].u.tx_isr_spurious_info.channel = ch;
0300   cd2401_debug_buffer[cd2401_debug_index].u.tx_isr_spurious_info.status = status;
0301   cd2401_debug_buffer[cd2401_debug_index].u.tx_isr_spurious_info.initial_ier = initial_ier;
0302   cd2401_debug_buffer[cd2401_debug_index].u.tx_isr_spurious_info.final_ier = final_ier;
0303   cd2401_debug_buffer[cd2401_debug_index].u.tx_isr_spurious_info.spurdev = spur_dev;
0304   cd2401_debug_buffer[cd2401_debug_index].u.tx_isr_spurious_info.spurcount = spur_cnt;
0305 
0306   cd2401_debug_index = (cd2401_debug_index + 1 ) % CD2401_DEBUG_BUFFER_SIZE;
0307 }
0308 
0309 void cd2401_record_tx_isr_buserr_info(
0310   unsigned char ch,
0311   unsigned char status,
0312   unsigned char initial_ier,
0313   unsigned char buserr,
0314   unsigned long buserr_type,
0315   unsigned long buserr_addr
0316 )
0317 {
0318   memset( &(cd2401_debug_buffer[cd2401_debug_index]), '\0', sizeof( struct cd2401_debug_info )  );
0319   cd2401_debug_buffer[cd2401_debug_index].discriminant = CD2401_TX_ISR_BUSERR_INFO;
0320   cd2401_debug_buffer[cd2401_debug_index].record_size =
0321     cd2401_get_record_size( sizeof( struct cd2401_tx_isr_buserr_info ) );
0322   cd2401_debug_buffer[cd2401_debug_index].u.tx_isr_buserr_info.channel = ch;
0323   cd2401_debug_buffer[cd2401_debug_index].u.tx_isr_buserr_info.status = status;
0324   cd2401_debug_buffer[cd2401_debug_index].u.tx_isr_buserr_info.initial_ier = initial_ier;
0325   cd2401_debug_buffer[cd2401_debug_index].u.tx_isr_buserr_info.buserr = buserr;
0326   cd2401_debug_buffer[cd2401_debug_index].u.tx_isr_buserr_info.type = buserr_type;
0327   cd2401_debug_buffer[cd2401_debug_index].u.tx_isr_buserr_info.addr = buserr_addr;
0328 
0329   cd2401_debug_index = (cd2401_debug_index + 1 ) % CD2401_DEBUG_BUFFER_SIZE;
0330 }
0331 
0332 void cd2401_record_rx_isr_info(
0333   unsigned char ch,
0334   unsigned char total,
0335   char * buffer
0336 )
0337 {
0338   int max_length;
0339 
0340   max_length = (total < CD2401_DEBUG_CHAR_BUFSIZE ) ? total : CD2401_DEBUG_CHAR_BUFSIZE;
0341 
0342   memset( &(cd2401_debug_buffer[cd2401_debug_index]), '\0', sizeof( struct cd2401_debug_info )  );
0343   cd2401_debug_buffer[cd2401_debug_index].discriminant = CD2401_RX_ISR_INFO;
0344   cd2401_debug_buffer[cd2401_debug_index].record_size =
0345       cd2401_get_record_size( sizeof( struct cd2401_rx_isr_info ) );
0346   cd2401_debug_buffer[cd2401_debug_index].u.rx_isr_info.length = max_length;
0347  memcpy ( &(cd2401_debug_buffer[cd2401_debug_index].u.rx_isr_info.buffer), buffer, max_length );
0348 
0349   cd2401_debug_index = (cd2401_debug_index + 1 ) % CD2401_DEBUG_BUFFER_SIZE;
0350 }
0351 
0352 void cd2401_record_rx_isr_spurious_info(
0353   unsigned char ch,
0354   unsigned char status,
0355   uint32_t         spur_dev,
0356   uint32_t         spur_cnt
0357 )
0358 {
0359   memset( &(cd2401_debug_buffer[cd2401_debug_index]), '\0', sizeof( struct cd2401_debug_info )  );
0360   cd2401_debug_buffer[cd2401_debug_index].discriminant = CD2401_RX_ISR_SPURIOUS_INFO;
0361   cd2401_debug_buffer[cd2401_debug_index].record_size =
0362       cd2401_get_record_size( sizeof( struct cd2401_rx_isr_spurious_info ) );
0363   cd2401_debug_buffer[cd2401_debug_index].u.rx_isr_spurious_info.channel = ch;
0364   cd2401_debug_buffer[cd2401_debug_index].u.rx_isr_spurious_info.status = status;
0365   cd2401_debug_buffer[cd2401_debug_index].u.rx_isr_spurious_info.spurdev = spur_dev;
0366   cd2401_debug_buffer[cd2401_debug_index].u.rx_isr_spurious_info.spurcount = spur_cnt;
0367 
0368   cd2401_debug_index = (cd2401_debug_index + 1 ) % CD2401_DEBUG_BUFFER_SIZE;
0369 }
0370 
0371 void cd2401_record_re_isr_spurious_info(
0372   unsigned char ch,
0373   uint32_t         spur_dev,
0374   uint32_t         spur_cnt
0375 )
0376 {
0377   memset( &(cd2401_debug_buffer[cd2401_debug_index]), '\0', sizeof( struct cd2401_debug_info )  );
0378   cd2401_debug_buffer[cd2401_debug_index].discriminant = CD2401_RE_ISR_SPURIOUS_INFO;
0379   cd2401_debug_buffer[cd2401_debug_index].record_size =
0380       cd2401_get_record_size( sizeof( struct cd2401_re_isr_spurious_info ) );
0381   cd2401_debug_buffer[cd2401_debug_index].u.re_isr_spurious_info.channel = ch;
0382   cd2401_debug_buffer[cd2401_debug_index].u.re_isr_spurious_info.spurdev = spur_dev;
0383   cd2401_debug_buffer[cd2401_debug_index].u.re_isr_spurious_info.spurcount = spur_cnt;
0384 
0385   cd2401_debug_index = (cd2401_debug_index + 1 ) % CD2401_DEBUG_BUFFER_SIZE;
0386 }
0387 
0388 void cd2401_record_modem_isr_spurious_info(
0389   unsigned char ch,
0390   uint32_t         spur_dev,
0391   uint32_t         spur_cnt
0392 )
0393 {
0394   memset( &(cd2401_debug_buffer[cd2401_debug_index]), '\0', sizeof( struct cd2401_debug_info )  );
0395   cd2401_debug_buffer[cd2401_debug_index].discriminant = CD2401_MODEM_ISR_SPURIOUS_INFO;
0396   cd2401_debug_buffer[cd2401_debug_index].record_size =
0397       cd2401_get_record_size( sizeof( struct cd2401_modem_isr_spurious_info ) );
0398   cd2401_debug_buffer[cd2401_debug_index].u.modem_isr_spurious_info.channel = ch;
0399   cd2401_debug_buffer[cd2401_debug_index].u.modem_isr_spurious_info.spurdev = spur_dev;
0400   cd2401_debug_buffer[cd2401_debug_index].u.modem_isr_spurious_info.spurcount = spur_cnt;
0401 
0402   cd2401_debug_index = (cd2401_debug_index + 1 ) % CD2401_DEBUG_BUFFER_SIZE;
0403 }
0404 
0405 void cd2401_record_first_open_info(
0406   unsigned char ch,
0407   uint8_t         init_count
0408 )
0409 {
0410   memset( &(cd2401_debug_buffer[cd2401_debug_index]), '\0', sizeof( struct cd2401_debug_info )  );
0411   cd2401_debug_buffer[cd2401_debug_index].discriminant = CD2401_FIRST_OPEN_INFO;
0412   cd2401_debug_buffer[cd2401_debug_index].record_size =
0413       cd2401_get_record_size( sizeof( struct cd2401_first_open_info ) );
0414   cd2401_debug_buffer[cd2401_debug_index].u.first_open_info.channel = ch;
0415   cd2401_debug_buffer[cd2401_debug_index].u.first_open_info.init_count = init_count;
0416 
0417   cd2401_debug_index = (cd2401_debug_index + 1 ) % CD2401_DEBUG_BUFFER_SIZE;
0418 }
0419 
0420 void cd2401_record_last_close_info(
0421   unsigned char ch,
0422   uint8_t         init_count
0423 )
0424 {
0425   memset( &(cd2401_debug_buffer[cd2401_debug_index]), '\0', sizeof( struct cd2401_debug_info )  );
0426   cd2401_debug_buffer[cd2401_debug_index].discriminant = CD2401_LAST_CLOSE_INFO;
0427   cd2401_debug_buffer[cd2401_debug_index].record_size =
0428       cd2401_get_record_size( sizeof( struct cd2401_last_close_info ) );
0429   cd2401_debug_buffer[cd2401_debug_index].u.last_close_info.channel = ch;
0430   cd2401_debug_buffer[cd2401_debug_index].u.last_close_info.init_count = init_count;
0431 
0432   cd2401_debug_index = (cd2401_debug_index + 1 ) % CD2401_DEBUG_BUFFER_SIZE;
0433 }
0434 
0435 void cd2401_record_start_remote_tx_info(
0436   unsigned char ch
0437 )
0438 {
0439   memset( &(cd2401_debug_buffer[cd2401_debug_index]), '\0', sizeof( struct cd2401_debug_info )  );
0440   cd2401_debug_buffer[cd2401_debug_index].discriminant = CD2401_START_REMOTE_TX_INFO;
0441   cd2401_debug_buffer[cd2401_debug_index].record_size =
0442       cd2401_get_record_size( sizeof( struct cd2401_start_remote_tx_info ) );
0443   cd2401_debug_buffer[cd2401_debug_index].u.start_remote_tx_info.channel = ch;
0444 
0445   cd2401_debug_index = (cd2401_debug_index + 1 ) % CD2401_DEBUG_BUFFER_SIZE;
0446 }
0447 
0448 void cd2401_record_stop_remote_tx_info(
0449   unsigned char ch
0450 )
0451 {
0452   memset( &(cd2401_debug_buffer[cd2401_debug_index]), '\0', sizeof( struct cd2401_debug_info )  );
0453   cd2401_debug_buffer[cd2401_debug_index].discriminant = CD2401_STOP_REMOTE_TX_INFO;
0454   cd2401_debug_buffer[cd2401_debug_index].record_size =
0455       cd2401_get_record_size( sizeof( struct cd2401_stop_remote_tx_info ) );
0456   cd2401_debug_buffer[cd2401_debug_index].u.stop_remote_tx_info.channel = ch;
0457 
0458   cd2401_debug_index = (cd2401_debug_index + 1 ) % CD2401_DEBUG_BUFFER_SIZE;
0459 }
0460 
0461 void cd2401_record_set_attributes_info(
0462   int minor,
0463   uint8_t         need_reinit,
0464   uint8_t         csize,
0465   uint8_t         cstopb,
0466   uint8_t         parodd,
0467   uint8_t         parenb,
0468   uint8_t         ignpar,
0469   uint8_t         inpck,
0470   uint8_t         hw_flow_ctl,
0471   uint8_t         sw_flow_ctl,
0472   uint8_t         extra_flow_ctl,
0473   uint8_t         icrnl,
0474   uint8_t         igncr,
0475   uint8_t         inlcr,
0476   uint8_t         brkint,
0477   uint8_t         ignbrk,
0478   uint8_t         parmrk,
0479   uint8_t         istrip,
0480   uint16_t         tx_period,
0481   uint16_t         rx_period,
0482   uint32_t         out_baud,
0483   uint32_t         in_baud
0484 )
0485 {
0486   memset( &(cd2401_debug_buffer[cd2401_debug_index]), '\0', sizeof( struct cd2401_debug_info )  );
0487   cd2401_debug_buffer[cd2401_debug_index].discriminant = CD2401_SET_ATTRIBUTE_INFO;
0488   cd2401_debug_buffer[cd2401_debug_index].record_size =
0489   cd2401_get_record_size( sizeof( struct cd2401_set_attribute_info ) );
0490   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.minor = minor;
0491   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.need_reinit = need_reinit;
0492   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.txEmpty = CD2401_Channel_Info[minor].txEmpty;
0493   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.csize = csize;
0494   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.cstopb = cstopb;
0495   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.parodd = parodd;
0496   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.parenb = parenb;
0497   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.ignpar = ignpar;
0498   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.inpck = inpck;
0499   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.hw_flow_ctl = hw_flow_ctl;
0500   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.sw_flow_ctl = sw_flow_ctl;
0501   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.extra_flow_ctl = extra_flow_ctl;
0502   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.icrnl = icrnl;
0503   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.igncr = igncr;
0504   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.inlcr = inlcr;
0505   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.brkint = brkint;
0506   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.ignbrk = ignbrk;
0507   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.parmrk = parmrk;
0508   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.istrip = istrip;
0509   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.tx_period = tx_period;
0510   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.rx_period = rx_period;
0511   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.out_baud = out_baud;
0512   cd2401_debug_buffer[cd2401_debug_index].u.set_attribute_info.in_baud = in_baud;
0513 
0514   cd2401_debug_index = (cd2401_debug_index + 1 ) % CD2401_DEBUG_BUFFER_SIZE;
0515 }
0516 
0517 void cd2401_record_drain_output_info(
0518   uint8_t         txEmpty,
0519   uint8_t         own_buf_A,
0520   uint8_t         own_buf_B
0521 )
0522 {
0523   memset( &(cd2401_debug_buffer[cd2401_debug_index]), '\0', sizeof( struct cd2401_debug_info )  );
0524   cd2401_debug_buffer[cd2401_debug_index].discriminant = CD2401_DRAIN_OUTPUT_INFO;
0525   cd2401_debug_buffer[cd2401_debug_index].record_size =
0526       cd2401_get_record_size( sizeof( struct cd2401_drain_output_info ) );
0527   cd2401_debug_buffer[cd2401_debug_index].u.drain_output_info.txEmpty = txEmpty;
0528   cd2401_debug_buffer[cd2401_debug_index].u.drain_output_info.own_buf_A = own_buf_A;
0529   cd2401_debug_buffer[cd2401_debug_index].u.drain_output_info.own_buf_B = own_buf_B;
0530 
0531   cd2401_debug_index = (cd2401_debug_index + 1 ) % CD2401_DEBUG_BUFFER_SIZE;
0532 }
0533 
0534 void cd2401_record_delay_info(
0535   rtems_interval start,
0536   rtems_interval end,
0537   rtems_interval current,
0538   unsigned long loop_count
0539 )
0540 {
0541   memset( &(cd2401_debug_buffer[cd2401_debug_index]), '\0', sizeof( struct cd2401_debug_info )  );
0542   cd2401_debug_buffer[cd2401_debug_index].discriminant = CD2401_DELAY_INFO;
0543   cd2401_debug_buffer[cd2401_debug_index].record_size =
0544       cd2401_get_record_size( sizeof( struct cd2401_delay_info ) );
0545   cd2401_debug_buffer[cd2401_debug_index].u.delay_info.start = start;
0546   cd2401_debug_buffer[cd2401_debug_index].u.delay_info.end = end;
0547   cd2401_debug_buffer[cd2401_debug_index].u.delay_info.current = current;
0548   cd2401_debug_buffer[cd2401_debug_index].u.delay_info.loop_count = loop_count;
0549 
0550   cd2401_debug_index = (cd2401_debug_index + 1 ) % CD2401_DEBUG_BUFFER_SIZE;
0551 }
0552 
0553 #else
0554 
0555 /* Do not call the data recording functions */
0556 #define CD2401_RECORD_WRITE_INFO( args )
0557 #define CD2401_RECORD_TX_ISR_INFO( args )
0558 #define CD2401_RECORD_TX_ISR_SPURIOUS_INFO( args )
0559 #define CD2401_RECORD_TX_ISR_BUSERR_INFO( args )
0560 #define CD2401_RECORD_RX_ISR_INFO( args )
0561 #define CD2401_RECORD_RX_ISR_SPURIOUS_INFO( args )
0562 #define CD2401_RECORD_RE_ISR_SPURIOUS_INFO( args )
0563 #define CD2401_RECORD_MODEM_ISR_SPURIOUS_INFO( args )
0564 #define CD2401_RECORD_FIRST_OPEN_INFO( args )
0565 #define CD2401_RECORD_LAST_CLOSE_INFO( args )
0566 #define CD2401_RECORD_START_REMOTE_TX_INFO( args )
0567 #define CD2401_RECORD_STOP_REMOTE_TX_INFO( args )
0568 #define CD2401_RECORD_SET_ATTRIBUTES_INFO( args )
0569 #define CD2401_RECORD_DRAIN_OUTPUT_INFO( args )
0570 #define CD2401_RECORD_DELAY_INFO( args )
0571 
0572 #endif