static unsigned ni_tio_next_load_register(struct ni_gpct *counter) { const unsigned bits = read_register(counter, NITIO_Gxx_Status_Reg(counter->counter_index)); if (bits & Gi_Next_Load_Source_Bit(counter->counter_index)) { return NITIO_Gi_LoadB_Reg(counter->counter_index); } else { return NITIO_Gi_LoadA_Reg(counter->counter_index); } }
static lsampl_t ni_tio_counter_status(struct ni_gpct *counter) { lsampl_t status = 0; const unsigned bits = read_register(counter, NITIO_Gxx_Status_Reg(counter->counter_index)); if (bits & Gi_Armed_Bit(counter->counter_index)) { status |= COMEDI_COUNTER_ARMED; if (bits & Gi_Counting_Bit(counter->counter_index)) status |= COMEDI_COUNTER_COUNTING; } return status; }
void ni_tio_acknowledge_and_confirm(struct ni_gpct *counter, int *gate_error, int *tc_error, int *perm_stale_data, int *stale_data) { const unsigned short gxx_status = read_register(counter, NITIO_Gxx_Status_Reg(counter->counter_index)); const unsigned short gi_status = read_register(counter, NITIO_Gi_Status_Reg(counter->counter_index)); unsigned ack = 0; if (gate_error) *gate_error = 0; if (tc_error) *tc_error = 0; if (perm_stale_data) *perm_stale_data = 0; if (stale_data) *stale_data = 0; if (gxx_status & Gi_Gate_Error_Bit(counter->counter_index)) { ack |= Gi_Gate_Error_Confirm_Bit(counter->counter_index); if (gate_error) { /*660x don't support automatic acknowledgement of gate interrupt via dma read/write and report bogus gate errors */ if (counter->counter_dev->variant != ni_gpct_variant_660x) { *gate_error = 1; } } } if (gxx_status & Gi_TC_Error_Bit(counter->counter_index)) { ack |= Gi_TC_Error_Confirm_Bit(counter->counter_index); if (tc_error) *tc_error = 1; } if (gi_status & Gi_TC_Bit) { ack |= Gi_TC_Interrupt_Ack_Bit; } if (gi_status & Gi_Gate_Interrupt_Bit) { if (should_ack_gate(counter)) ack |= Gi_Gate_Interrupt_Ack_Bit; } if (ack) write_register(counter, ack, NITIO_Gi_Interrupt_Acknowledge_Reg(counter-> counter_index)); if (ni_tio_get_soft_copy(counter, NITIO_Gi_Mode_Reg(counter-> counter_index)) & Gi_Loading_On_Gate_Bit) { if (gxx_status & Gi_Stale_Data_Bit(counter->counter_index)) { if (stale_data) *stale_data = 1; } if (read_register(counter, NITIO_Gxx_Joint_Status2_Reg(counter-> counter_index)) & Gi_Permanent_Stale_Bit(counter->counter_index)) { rt_printk("%s: Gi_Permanent_Stale_Data detected.\n", __FUNCTION__); if (perm_stale_data) *perm_stale_data = 1; } } }
void ni_tio_acknowledge_and_confirm(struct ni_gpct *counter, int *gate_error, int *tc_error, int *perm_stale_data, int *stale_data) { const unsigned short gxx_status = read_register(counter, NITIO_Gxx_Status_Reg (counter-> counter_index)); const unsigned short gi_status = read_register(counter, NITIO_Gi_Status_Reg (counter-> counter_index)); unsigned ack = 0; if (gate_error) *gate_error = 0; if (tc_error) *tc_error = 0; if (perm_stale_data) *perm_stale_data = 0; if (stale_data) *stale_data = 0; if (gxx_status & Gi_Gate_Error_Bit(counter->counter_index)) { ack |= Gi_Gate_Error_Confirm_Bit(counter->counter_index); if (gate_error) { if (counter->counter_dev->variant != ni_gpct_variant_660x) { *gate_error = 1; } } } if (gxx_status & Gi_TC_Error_Bit(counter->counter_index)) { ack |= Gi_TC_Error_Confirm_Bit(counter->counter_index); if (tc_error) *tc_error = 1; } if (gi_status & Gi_TC_Bit) ack |= Gi_TC_Interrupt_Ack_Bit; if (gi_status & Gi_Gate_Interrupt_Bit) { if (should_ack_gate(counter)) ack |= Gi_Gate_Interrupt_Ack_Bit; } if (ack) write_register(counter, ack, NITIO_Gi_Interrupt_Acknowledge_Reg (counter->counter_index)); if (ni_tio_get_soft_copy (counter, NITIO_Gi_Mode_Reg(counter->counter_index)) & Gi_Loading_On_Gate_Bit) { if (gxx_status & Gi_Stale_Data_Bit(counter->counter_index)) { if (stale_data) *stale_data = 1; } if (read_register(counter, NITIO_Gxx_Joint_Status2_Reg (counter->counter_index)) & Gi_Permanent_Stale_Bit(counter->counter_index)) { printk(KERN_INFO "%s: Gi_Permanent_Stale_Data detected.\n", __func__); if (perm_stale_data) *perm_stale_data = 1; } } }