📄 ioctl.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 + -