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

📄 ioctl.c

📁 HMS30C7202下的CAN驱动
💻 C
字号:
/** ioctl.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#define EXPORT_SYMTAB#include "../include/candrv.h"#include "../include/hms30c7202_can.h"#include "../include/c_can.h"////////////////////////////////////////////////////////////////////////////////** * Ioctl function called by the user */int can_ioctl( struct inode *inode,               struct file *filp,               unsigned int cmd,               unsigned long arg ){        //int i=0;        u32 id = 0;        u32 mask = 0;        unsigned short baudrate = 0;        struct msgobj_t *pmsgobj = NULL;        DEBUGMSG("\ncalling can_ioctl(...)");        if ( NULL == ( pmsgobj = filp->private_data )) {                CANMSG("Device is not correctly configured.");                CANMSG("Please reload the driver.");                return -1;        }        /* Handle the ioctl command */        switch ( cmd ) {                case IOCTL_CAN_SET_BAUDRATE:                        baudrate = arg;                        if (baudrate >= 1 && baudrate <= 1000) {                                if (pmsgobj->hostchip->set_baud_rate(pmsgobj->hostchip,                                                                     baudrate*1000,                                                                     pmsgobj->hostchip->clock,                                                                     0,75,0)) {                                        CANMSG("Error configuring baud rate");                                        return -1;                                }                                pmsgobj->hostchip->baudrate = baudrate;                        } else {                                CANMSG("Error: given Baudrate not allowed, must be between 1 and 1000 (kBit/s)");                                return -1;                        }                        break;                case IOCTL_CAN_ENABLE_EXTMODE:                        DEBUGMSG("Enabling Extended Mode");                        pmsgobj->msg_mode = 1;                        break;                case IOCTL_CAN_DISABLE_EXTMODE:                        DEBUGMSG("Disabling Extended Mode");                        pmsgobj->msg_mode = 0;                        break;                case IOCTL_CAN_SET_READ_MODE:                        id = (u32)arg;                        DEBUGMSG("configuring message object for reception with ID=%lx",                                 (unsigned long)id);                        if (pmsgobj->hostchip->pre_read_config(pmsgobj, id))                                return -1;                        break;                case IOCTL_CAN_SET_FILTER:                        mask =  (u32)arg;                        DEBUGMSG("configuring MASK=%lx", (unsigned long)mask);                        if (pmsgobj->hostchip->set_mask(pmsgobj, mask, 0))                                return -1;                        if (pmsgobj->hostchip->set_use_mask(pmsgobj, 1))                                return -1;                        /* In- and output buffer re-initialization */                        pmsgobj->fifo->txrp = pmsgobj->fifo->ptxbuf;                        pmsgobj->fifo->txwp = pmsgobj->fifo->ptxbuf;                        pmsgobj->fifo->rxrp = pmsgobj->fifo->prxbuf;                        pmsgobj->fifo->rxwp = pmsgobj->fifo->prxbuf;                        pmsgobj->fifo->rxsize = MAX_BUF_LENGTH * sizeof( struct canmsg_t );                        pmsgobj->fifo->txsize = pmsgobj->fifo->rxsize;                        init_waitqueue_head( &pmsgobj->fifo->readq );                        init_waitqueue_head( &pmsgobj->fifo->writeq  );                        pmsgobj->fifo->flags &= ~(TX_IN_PROGRESS | RX_IN_PROGRESS);                        pmsgobj->fifo->head = pmsgobj->fifo->tail = 0;  /* TEMP!! */                        break;                case IOCTL_CAN_DISABLE_FILTER:                        DEBUGMSG("Disabling Acceptance Mask filtering");                        if (pmsgobj->hostchip->set_use_mask(pmsgobj, 0))                                return -1;                        break;                case IOCTL_CAN_DUMP_REG:                        pmsgobj->hostchip->register_dump(pmsgobj->hostchip);                        break;                case IOCTL_CAN_GET_STATUS:                        return pmsgobj->hostchip->chip_status;                        break;                case IOCTL_CAN_GET_STATISTICS:                        copy_to_user( (struct canstatistics_t *)arg, &pmsgobj->hostchip->stat,                                     sizeof(struct canstatistics_t));                        break;                case IOCTL_CAN_PRINT_STATISTICS:                        CANMSG("ch%d->cntRxPkt      = %d", pmsgobj->hostchip->chip_nr,                                pmsgobj->hostchip->stat.cntRxPkt);                        CANMSG("ch%d->cntRxData     = %d", pmsgobj->hostchip->chip_nr,                                pmsgobj->hostchip->stat.cntRxData);                        CANMSG("ch%d->cntTxPkt      = %d", pmsgobj->hostchip->chip_nr,                                pmsgobj->hostchip->stat.cntTxPkt);                        CANMSG("ch%d->cntTxData     = %d", pmsgobj->hostchip->chip_nr,                                pmsgobj->hostchip->stat.cntTxData);                        CANMSG("ch%d->cntWarnings   = %d", pmsgobj->hostchip->chip_nr,                                pmsgobj->hostchip->stat.cntWarnings);                        CANMSG("ch%d->cntErrPassive = %d", pmsgobj->hostchip->chip_nr,                                pmsgobj->hostchip->stat.cntErrPassive);                        CANMSG("ch%d->cntBusOff     = %d", pmsgobj->hostchip->chip_nr,                                pmsgobj->hostchip->stat.cntBusOff);                        CANMSG("ch%d->cntMsgLst     = %d", pmsgobj->hostchip->chip_nr,                                pmsgobj->hostchip->stat.cntMsgLst);                        CANMSG("ch%d->cntRxFifoOvr  = %d", pmsgobj->hostchip->chip_nr,                                pmsgobj->hostchip->stat.cntRxFifoOvr);                        CANMSG("ch%d->cntTxFifoOvr  = %d", pmsgobj->hostchip->chip_nr,                                pmsgobj->hostchip->stat.cntTxFifoOvr);                        CANMSG("ch%d->cntStuffErr   = %d", pmsgobj->hostchip->chip_nr,                                pmsgobj->hostchip->stat.cntStuffErr);                        CANMSG("ch%d->cntFormErr    = %d", pmsgobj->hostchip->chip_nr,                                pmsgobj->hostchip->stat.cntFormErr);                        CANMSG("ch%d->cntAckErr     = %d", pmsgobj->hostchip->chip_nr,                                pmsgobj->hostchip->stat.cntAckErr);                        CANMSG("ch%d->cntBit0Err    = %d", pmsgobj->hostchip->chip_nr,                                pmsgobj->hostchip->stat.cntBit0Err);                        CANMSG("ch%d->cntBit1Err    = %d", pmsgobj->hostchip->chip_nr,                                pmsgobj->hostchip->stat.cntBit1Err);                        CANMSG("ch%d->cntCrcErr     = %d", pmsgobj->hostchip->chip_nr,                                pmsgobj->hostchip->stat.cntCrcErr);                        break;                case IOCTL_CAN_CLEAR_STATISTICS:                        /* Initialize statistics block */                        pmsgobj->hostchip->stat.cntRxPkt = 0;                        pmsgobj->hostchip->stat.cntRxData = 0;                        pmsgobj->hostchip->stat.cntTxPkt = 0;                        pmsgobj->hostchip->stat.cntTxData = 0;                        pmsgobj->hostchip->stat.cntWarnings = 0;                        pmsgobj->hostchip->stat.cntErrPassive = 0;                        pmsgobj->hostchip->stat.cntBusOff = 0;                        pmsgobj->hostchip->stat.cntMsgLst = 0;                        pmsgobj->hostchip->stat.cntRxFifoOvr = 0;                        pmsgobj->hostchip->stat.cntTxFifoOvr = 0;                        pmsgobj->hostchip->stat.cntStuffErr = 0;                        pmsgobj->hostchip->stat.cntFormErr = 0;                        pmsgobj->hostchip->stat.cntAckErr = 0;                        pmsgobj->hostchip->stat.cntBit0Err = 0;                        pmsgobj->hostchip->stat.cntBit1Err = 0;                        pmsgobj->hostchip->stat.cntCrcErr = 0;                        break;                default:                        CANMSG("Not a valid ioctl command");                        return -EINVAL;        } /* switch */        return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -