⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 close.c

📁 HMS30C7202下的CAN驱动
💻 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 + -