📄 close.c
字号:
/** close.c * * Written by Sebastian Stolzenberg email:stolzi@sebastian-stolzenberg.de * Version 1.0 04 Feb 2003 */#ifndef __KERNEL__# define __KERNEL__#endif#ifndef MODULE# define MODULE#endif#include <linux/module.h>#include "../include/candrv.h"#include "../include/hms30c7202_can.h"#include "../include/c_can.h"#include "../include/irq.h"////////////////////////////////////////////////////////////////////////////////** * Close function called by the user. */int can_close( struct inode *inode, struct file *filp ){ struct msgobj_t *pmsgobj = NULL; unsigned short tempreg = 0; unsigned short readMaskCM = IFXCM_CNTRL | IFXCM_ARB; unsigned short writeMaskCM = IFXCM_CNTRL | IFXCM_ARB; /* Check if message object exists */ if ( NULL == ( pmsgobj = filp->private_data )) { CANMSG("No object defined"); return -ENODEV; } /* Wait for end sending and receiving process */ while ( ( pmsgobj->fifo->flags & (TX_IN_PROGRESS | RX_IN_PROGRESS) ) && !(pmsgobj->hostchip->chip_status & SR_EPASS) ) CANMSG("Still working"); spin_lock( &pmsgobj->hostchip->if1lock ); /* load Message Object in IF1 */ if (c_can_if1_busycheck(pmsgobj->hostchip)) return -ENODEV; pmsgobj->hostchip->write_register(readMaskCM, pmsgobj->hostchip, CCIF1CM); pmsgobj->hostchip->write_register(pmsgobj->object+1, pmsgobj->hostchip, CCIF1CR); /* setting Message Valid Bit to zero */ if (c_can_if1_busycheck(pmsgobj->hostchip)) return -ENODEV; tempreg = pmsgobj->hostchip->read_register(pmsgobj->hostchip, CCIF1A2); pmsgobj->hostchip->write_register(tempreg & ~IFXARB2_MVAL, pmsgobj->hostchip, CCIF1A2); pmsgobj->hostchip->write_register(writeMaskCM, pmsgobj->hostchip, CCIF1CM); pmsgobj->hostchip->write_register(pmsgobj->object+1, pmsgobj->hostchip, CCIF1CR); spin_unlock( &pmsgobj->hostchip->if1lock ); /* Reset flags */ pmsgobj->flags &= ~CHANNEL_OPENED; pmsgobj->hostchip->active_obj_cnt--; /* release chip io and interrupt if no message object is active anymore */ if (pmsgobj->hostchip->active_obj_cnt == 0) { if ( ! pmsgobj->hostchip->time_triggered ) { /* disable interrupt generation */ c_can_config_irqs(pmsgobj->hostchip, 0); /* Free the interrupt */ free_irq( pmsgobj->hostchip->irq, pmsgobj->hostchip ); } if ( pmsgobj->hostchip->time_triggered || (pmsgobj->hostchip->chip_status & (SR_EPASS | SR_BOFF)) ) { stop_time_trig(pmsgobj->hostchip); } /* Release I/O */ pmsgobj->hostchip->release_io( pmsgobj->hostchip ); /* Reset flags */ pmsgobj->hostchip->flags &= ~CHANNEL_OPENED; pmsgobj->hostchip->flags &= ~CHANNEL_CONFIGURED; } if (NULL != pmsgobj->fifo) { /* Give up tx message buffer memory */ if ( NULL != pmsgobj->fifo->ptxbuf ) { del_mem_from_list( pmsgobj->fifo->ptxbuf ); } else { CANMSG("pmsgobj->fifo->buf_tx_entry is NULL"); } /* Give up rx message buffer memory */ if ( NULL != pmsgobj->fifo->prxbuf ) { del_mem_from_list( pmsgobj->fifo->prxbuf ); } else { CANMSG("pmsgobj->fifo->buf_rx_entry is NULL"); } /* Give up fifo memory */ del_mem_from_list( pmsgobj->fifo ); } else CANMSG("pmsg->fifo is NULL"); MOD_DEC_USE_COUNT; return 0;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -