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