fp@0: /************************************************************************************************** fp@0: * fp@0: * msr_io.c fp@0: * fp@0: * Verwaltung der IO-Karten fp@0: * fp@0: * fp@0: * Autor: Wilhelm Hagemeister fp@0: * fp@0: * (C) Copyright IgH 2002 fp@0: * Ingenieurgemeinschaft IgH fp@0: * Heinz-Bäcker Str. 34 fp@0: * D-45356 Essen fp@0: * Tel.: +49 201/61 99 31 fp@0: * Fax.: +49 201/61 98 36 fp@0: * E-mail: sp@igh-essen.com fp@0: * fp@0: * fp@0: * $RCSfile: msr_io.c,v $ fp@0: * $Revision: 1.9 $ fp@0: * $Author: ha $ fp@0: * $Date: 2005/06/24 20:06:56 $ fp@0: * $State: Exp $ fp@0: * fp@0: * fp@0: * $Log: msr_io.c,v $ fp@0: * Revision 1.9 2005/06/24 20:06:56 ha fp@0: * *** empty log message *** fp@0: * fp@0: * Revision 1.8 2005/06/24 17:39:05 ha fp@0: * *** empty log message *** fp@0: * fp@0: * fp@0: * fp@0: * fp@0: * fp@0: * fp@0: **************************************************************************************************/ fp@0: fp@0: fp@0: /*--includes-------------------------------------------------------------------------------------*/ fp@0: fp@0: #ifndef __KERNEL__ fp@0: # define __KERNEL__ fp@0: #endif fp@0: #ifndef MODULE fp@0: # define MODULE fp@0: #endif fp@0: fp@0: #include /* mdelay() */ fp@0: #include fp@0: #include /* HZ */ fp@0: #include /* jiffies */ fp@0: #include /* everything... */ fp@0: #include fp@0: fp@0: #include "msr_io.h" fp@0: fp@0: #include fp@0: fp@0: fp@0: #include "aim_globals.h" fp@0: fp@0: spinlock_t data_lock = SPIN_LOCK_UNLOCKED; fp@0: fp@0: #include "cif-rtai-io.h" fp@0: fp@0: /*--defines--------------------------------------------------------------------------------------*/ fp@0: fp@0: fp@0: /*--external functions---------------------------------------------------------------------------*/ fp@0: fp@0: fp@0: /*--external data--------------------------------------------------------------------------------*/ fp@0: fp@0: fp@0: /*--public data----------------------------------------------------------------------------------*/ fp@0: fp@0: #define PB_CARDS 4 fp@0: struct { fp@0: unsigned int fd; fp@0: unsigned int timestamp; fp@0: unsigned int fault; fp@0: unsigned int active; fp@0: void *in_buf; fp@0: void *out_buf; fp@0: size_t in_buf_len; fp@0: size_t out_buf_len; fp@0: fp@0: unsigned int reset_timeout; fp@0: } card[PB_CARDS]; fp@0: fp@0: fp@0: /* fp@0: *************************************************************************************************** fp@0: * fp@0: * Function: msr_io_init fp@0: * fp@0: * Beschreibung: Initialisieren der I/O-Karten fp@0: * fp@0: * Parameter: fp@0: * fp@0: * Rückgabe: fp@0: * fp@0: * Status: exp fp@0: * fp@0: *************************************************************************************************** fp@0: */ fp@0: void x_PB_io(unsigned long card_no) { fp@0: int rv = 0; fp@0: unsigned int flags; fp@0: fp@0: spin_lock_irqsave(&data_lock, flags); fp@0: fp@0: switch (card_no) { fp@0: case 0: fp@0: rv = cif_exchange_io(card[0].fd,card[0].in_buf,card[0].out_buf); fp@0: if (!rv) fp@0: card[0].timestamp = jiffies; fp@0: break; fp@0: case 1: fp@0: rv = cif_exchange_io(card[1].fd,card[1].in_buf,card[1].out_buf); fp@0: // rv = cif_read_io(card[1].fd,card[1].in_buf); fp@0: // IMO.to_dSPACE.P101.HX_Stat = 51; fp@0: // IMO.from_dSPACE.P101.HX_Control |= IMO.to_dSPACE.P101.HX_Stat<<4; fp@0: // rv += cif_write_io(card[1].fd,card[1].out_buf); fp@0: if (!rv) fp@0: card[1].timestamp = jiffies; fp@0: break; fp@0: /* fp@0: case 2: fp@0: rv = cif_exchange_io(card[2].fd,&cif_in.P201,&cif_out.P201); fp@0: break; fp@0: */ fp@0: case 3: fp@0: rv = cif_exchange_io(card[3].fd,card[3].in_buf,card[3].out_buf); fp@0: if (!rv) fp@0: card[3].timestamp = jiffies; fp@0: break; fp@0: } fp@0: fp@0: if (rv) { fp@0: msr_print_error("Error during exchange_io %i %i", fp@0: card_no, rv ); fp@0: } fp@0: fp@0: spin_unlock_irqrestore(&data_lock, flags); fp@0: fp@0: } fp@0: fp@0: int msr_io_init() fp@0: { fp@0: int rv; fp@0: fp@0: memset(card, 0, sizeof(card)); fp@0: fp@0: #define FIFO_BUF 10000 fp@0: fp@0: if ((rv = rtf_create(0, FIFO_BUF)) < 0) { fp@0: msr_print_error("Could not open FIFO %i", rv); fp@0: return -1; fp@0: } fp@0: fp@0: #ifndef _SIMULATION fp@0: /* fp@0: card[0].in_buf_len = sizeof(IMO.from_dSPACE); fp@0: card[0].out_buf_len = sizeof(IMO.to_dSPACE); fp@0: card[0].in_buf = &IMO.from_dSPACE; fp@0: card[0].out_buf = &IMO.to_dSPACE; fp@0: card[0].active = 1; fp@0: if (!(card[0].fd = cif_open_card(0, card[0].in_buf_len, fp@0: card[0].out_buf_len, x_PB_io, 0))) { fp@0: msr_print_error("Cannot open CIF card PB01"); fp@0: return -1; fp@0: } fp@0: fp@0: fp@0: card[1].in_buf_len = sizeof(IMO.to_dSPACE.P101); fp@0: card[1].out_buf_len = sizeof(IMO.from_dSPACE.P101); fp@0: card[1].in_buf = &IMO.to_dSPACE.P101; fp@0: card[1].out_buf = &IMO.from_dSPACE.P101; fp@0: card[1].active = 1; fp@0: if (!(card[1].fd = cif_open_card(1, card[1].in_buf_len, fp@0: card[1].out_buf_len, x_PB_io, 1))) { fp@0: msr_print_error("Cannot open CIF card P101"); fp@0: return -1; fp@0: } fp@0: fp@0: card[2].in_buf_len = sizeof(IMO.to_dSPACE.P201); fp@0: card[2].out_buf_len = sizeof(IMO.from_dSPACE.P201); fp@0: card[2].in_buf = &IMO.to_dSPACE.P201; fp@0: card[2].out_buf = &IMO.from_dSPACE.P201; fp@0: if (!(card[2].fd = cif_open_card(2, card[2].in_buf_len, fp@0: card[2].out_buf_len, x_PB_io, 2))) { fp@0: msr_print_error("Cannot open CIF card P201"); fp@0: return -1; fp@0: } fp@0: fp@0: */ fp@0: card[3].in_buf_len = sizeof(dSPACE.in); fp@0: card[3].out_buf_len = sizeof(dSPACE.out); fp@0: card[3].in_buf = &dSPACE.in; fp@0: card[3].out_buf = &dSPACE.out; fp@0: card[3].active = 1; fp@0: if (!(card[3].fd = cif_open_card(0, card[3].in_buf_len, fp@0: card[3].out_buf_len, x_PB_io,3))) { fp@0: msr_print_error("Cannot open CIF card P301"); fp@0: return -1; fp@0: } fp@0: fp@0: //msr_reg_chk_failure(&int_cif_io_fail,TINT,T_CHK_HIGH,0,T_CRIT,"CIF Card was not ready to exchange data"); fp@0: fp@0: fp@0: #endif fp@0: fp@0: return 0; fp@0: } fp@0: fp@0: /* fp@0: *************************************************************************************************** fp@0: * fp@0: * Function: msr_io_register fp@0: * fp@0: * Beschreibung: Rohdaten als Kanaele registrieren fp@0: * fp@0: * Parameter: fp@0: * fp@0: * Rückgabe: fp@0: * fp@0: * Status: exp fp@0: * fp@0: *************************************************************************************************** fp@0: */ fp@0: fp@0: int msr_io_register() fp@0: { fp@0: fp@0: #ifndef _SIMULATION fp@0: fp@0: #endif fp@0: fp@0: return 0; fp@0: } fp@0: fp@0: fp@0: /* fp@0: *************************************************************************************************** fp@0: * fp@0: * Function: msr_io_write fp@0: * fp@0: * Beschreibung: Schreiben der Werte fp@0: * fp@0: * Parameter: fp@0: * fp@0: * Rückgabe: fp@0: * fp@0: * Status: exp fp@0: * fp@0: *************************************************************************************************** fp@0: */ fp@0: int msr_io_write() fp@0: { fp@0: static int return_value = 0; fp@0: int rv; fp@0: int i = 0; fp@0: unsigned int flags; fp@0: unsigned int com_check_timestamp = 0; fp@0: static int COM_Up = 1; fp@0: fp@0: if (jiffies - com_check_timestamp > HZ/20) { fp@0: fp@0: if ( rtf_put_if(0,&IMO,sizeof(IMO)) != sizeof(IMO)) { fp@0: //msr_print_error("Could not output data"); fp@0: } fp@0: fp@0: com_check_timestamp = jiffies; fp@0: fp@0: spin_lock_irqsave(&data_lock, flags); fp@0: for ( i=0; i < PB_CARDS; i++) { fp@0: // Ignore inactive and cards that already have a fault fp@0: if (!card[i].active || card[i].fault) fp@0: continue; fp@0: fp@0: // For active cards, check timestamp value. Mark card fp@0: // as faulty if there was no data exchange in the last fp@0: // 50ms fp@0: if (jiffies - card[i].timestamp > HZ/20) { fp@0: COM_Up = 0; fp@0: card[i].fault = 1; fp@0: card[i].reset_timeout = jiffies; fp@0: msr_print_error("Card %i timed out", i); fp@0: } fp@0: fp@0: } fp@0: fp@0: spin_unlock_irqrestore(&data_lock, flags); fp@0: fp@0: for ( i = 0; i < PB_CARDS; i++ ) { fp@0: if (!card[i].active || (card[i].active && !card[i].fault)) fp@0: continue; fp@0: fp@0: switch (card[i].fault) { fp@0: case 1: fp@0: rv = cif_write_io(card[i].fd,card[i].out_buf); fp@0: fp@0: if (!rv) { fp@0: msr_print_error("Card %i online", i); fp@0: card[i].fault = 0; fp@0: card[i].timestamp = jiffies; fp@0: break; fp@0: } fp@0: fp@0: msr_print_error("rv of cif_write_io(%i) = %i", fp@0: i, rv); fp@0: fp@0: card[i].fault = 2; fp@0: cif_set_host_state(card[i].fd,0); fp@0: card[i].reset_timeout = jiffies; fp@0: fp@0: case 2: fp@0: if (cif_card_ready(card[i].fd)) { fp@0: cif_set_host_state(card[i].fd,1); fp@0: card[i].fault = 0; fp@0: break; fp@0: } fp@0: if (jiffies < card[i].reset_timeout) fp@0: break; fp@0: fp@0: rv = cif_reset_card(card[i].fd,10,1); fp@0: msr_print_error("rv of cif_reset_card(%i) = %i", fp@0: i, rv); fp@0: fp@0: // Reset again in 10 seconds fp@0: card[i].reset_timeout += 10*HZ; fp@0: } fp@0: } fp@0: } fp@0: fp@0: if (COM_Up) fp@0: IMO.to_dSPACE.Status = IMO.from_dSPACE.WatchDog; fp@0: fp@0: // if (return_value) fp@0: // int_cif_io_fail = 1; fp@0: fp@0: return return_value; fp@0: } fp@0: fp@0: /* fp@0: *************************************************************************************************** fp@0: * fp@0: * Function: msr_io_read fp@0: * fp@0: * Beschreibung: Lesen der Werte fp@0: * fp@0: * Parameter: fp@0: * fp@0: * Rückgabe: fp@0: * fp@0: * Status: exp fp@0: * fp@0: *************************************************************************************************** fp@0: */ fp@0: int msr_io_read() fp@0: { fp@0: int return_value = 0; fp@0: fp@0: #ifndef _SIMULATION fp@0: fp@0: int_cif_io_fail = 0; fp@0: /* fp@0: return_value = cif_exchange_io(fd_PB01, fp@0: &cif_out,&cif_in, fp@0: sizeof(cif_out),sizeof(cif_in) fp@0: ); fp@0: */ fp@0: /* if (return_value) */ fp@0: /* int_cif_io_fail = 1; */ fp@0: // printk("%i\n", return_value); fp@0: fp@0: #endif fp@0: return return_value; fp@0: } fp@0: fp@0: fp@0: /* fp@0: *************************************************************************************************** fp@0: * fp@0: * Function: msr_io_cleanup fp@0: * fp@0: * Beschreibung: Aufräumen fp@0: * fp@0: * Parameter: fp@0: * fp@0: * Rückgabe: fp@0: * fp@0: * Status: exp fp@0: * fp@0: *************************************************************************************************** fp@0: */ fp@0: void msr_io_cleanup() fp@0: { fp@0: /* fp@0: cif_set_host_state(card[0].fd,0); fp@0: cif_close_card(card[0].fd); fp@0: fp@0: cif_set_host_state(card[1].fd,0); fp@0: cif_close_card(card[1].fd); fp@0: fp@0: cif_set_host_state(card[2].fd,0); fp@0: cif_close_card(card[2].fd); fp@0: fp@0: fp@0: */ fp@0: cif_set_host_state(card[3].fd,0); fp@0: cif_close_card(card[3].fd); fp@0: fp@0: rtf_destroy(0); fp@0: } fp@0: fp@0: