📄 candrv.c
字号:
INT32U status;
ssize_t retval = 0;
if (!access_ok(VERIFY_READ, (void *)buf, count))
{
return -EFAULT;
}
dev = (CAN_Dev *)filp->private_data;
if(dev == NULL)
{
return -EFAULT;
}
can_number = dev->can_number;
if(CANMOD(can_number).Bits.RM == 1)
{
CanBufOffLinePrg(can_number);//总线关闭处理
return retval;
}
switch(can_number)
{
case CAN1:
case CAN2:
if(count < sizeof(stcRxBUF))
{
return -EFAULT;
}
if (down_interruptible (&dev->write_sem))
{
return -ERESTARTSYS;
}
if (copy_from_user (&wri_buff,buf,sizeof(stcRxBUF)))
{
retval = -EFAULT;
goto can_write_error;
}
status = CANSendData (can_number,NOM,&wri_buff);
if( status != 0)
{
retval= -EFAULT; /* Sending failed */
goto can_write_error;
}
retval=sizeof(stcRxBUF);
can_write_error:
up (&dev->write_sem);
break;
default:
return -EFAULT;
}
return retval;
}
/* =======================================================
Function Name:***** candrv_open *****
Description: ***** candrv_open entry func *****
Created By: ***** Chen kang *****
Created Date: ***** 2006-2-21 *****
Calls: ***** NONE *****
Called By: ***** NONE *****
normal para: ***** NONE *****
pointer para: ***** struct inode *inode; struct file *filp; *****
Return type: ***** int *****
Others: ***** NONE *****
==========================================================*/
static int candrv_open(struct inode *inode, struct file *filp)
{
unsigned char can_number;
can_number = MINOR(inode->i_rdev)- MINOR_DEV_CAN1 + CAN1;
if(can_number>CAN_MAX_NUM)
{
return -EFAULT;
}
sema_init(&(can_devices[can_number].read_sem),1);
sema_init(&(can_devices[can_number].write_sem),1);
can_devices[can_number].can_number=can_number;
filp->private_data = can_devices+can_number;/* save in file */
return 0; /* success */
}
/* =======================================================
Function Name:***** candrv_release *****
Description: ***** candrv_release entry func *****
Created By: ***** Chen kang *****
Created Date: ***** 2006-2-21 *****
Calls: ***** NONE *****
Called By: ***** NONE *****
normal para: ***** NONE *****
pointer para: ***** struct inode *inode; struct file *filp; *****
Return type: ***** int *****
Others: ***** NONE *****
==========================================================*/
static int candrv_release(struct inode *inode, struct file *filp)
{
return(0);
}
/* =======================================================
Function Name:***** candrv_ioctl *****
Description: ***** candrv_ioctl entry func *****
Created By: ***** Chen kang *****
Created Date: ***** 2006-2-21 *****
Calls: ***** NONE *****
Called By: ***** NONE *****
normal para: ***** ; *****
pointer para: ***** struct inode *inode; struct file *filp; *****
Return type: ***** int *****
Others: ***** NONE *****
==========================================================*/
static int candrv_ioctl(struct inode *inode, struct file *filp,
unsigned int cmd, unsigned long arg)
{
return 0;
}
/* =======================================================
Function Name:***** candrv_init *****
Description: ***** candrv_init entry func *****
Created By: ***** Chen kang *****
Created Date: ***** 2006-2-21 *****
Calls: ***** NONE *****
Called By: ***** NONE *****
normal para: ***** void; *****
pointer para: ***** NONE *****
Return type: ***** *****
Others: ***** NONE *****
==========================================================*/
int candrv_init(void)
{
int result,i;
result = register_chrdev(MAJOR_NR, DEVICE_NAME, &candrv_fops);
if (result < 0)
{
printk(KERN_ERR DEVICE_NAME ": Unable to get major %d\n", MAJOR_NR );
return(result);
}
printk(KERN_WARNING DEVICE_NAME ": init OK\n");
//print_debug();
init_proc_module();
for(i=0;i<CAN_MAX_NUM;i++)
{
init_waitqueue_head(&can_wait_queue[i]);
}
InitCAN (CAN1);
InitCAN (CAN2);
ConfigAFReg ();
printk(KERN_WARNING DEVICE_NAME ": InitCAN 1&2 OK, CAN[0]: ReadPoint=%d, WritePoint%d\n",
CANRcvCyBufApp[0].ReadPoint, CANRcvCyBufApp[0].WritePoint);
printk(KERN_WARNING DEVICE_NAME ": InitCAN 1&2 OK, CAN[1]: ReadPoint=%d, WritePoint%d\n",
CANRcvCyBufApp[1].ReadPoint, CANRcvCyBufApp[1].WritePoint);
printk(KERN_WARNING DEVICE_NAME ": sizeof(stcRcvCANCyBuf.RcvBuf)=%d\n",
sizeof(CANRcvCyBufApp[1].RcvBuf));
//print_debug();
return(0);
}
/* =======================================================
Function Name:***** candrv_cleanup *****
Description: ***** candrv_cleanup entry func *****
Created By: ***** Chen kang *****
Created Date: ***** 2006-2-21 *****
Calls: ***** NONE *****
Called By: ***** NONE *****
normal para: ***** void; *****
pointer para: ***** NONE *****
Return type: ***** void *****
Others: ***** NONE *****
==========================================================*/
void candrv_cleanup(void)
{
printk(KERN_WARNING DEVICE_NAME ": into cleanup \n");
//print_debug();
free_irq(IRQ_CAN_FILTER, NULL);
free_irq(IRQ_CAN0_TX, NULL);
free_irq(IRQ_CAN0_RX, NULL);
free_irq(IRQ_CAN1_TX, NULL);
free_irq(IRQ_CAN1_RX, NULL);
printk(KERN_WARNING DEVICE_NAME ": free_irq OK\n");
cleanup_proc_module();
unregister_chrdev(MAJOR_NR, DEVICE_NAME);
}
/* =======================================================
Function Name:***** print_debug *****
Description: ***** print_debug entry func *****
Created By: ***** Chen kang *****
Created Date: ***** 2006-2-21 *****
Calls: ***** NONE *****
Called By: ***** NONE *****
normal para: ***** NONE *****
pointer para: ***** NONE *****
Return type: ***** void *****
Others: ***** NONE *****
==========================================================*/
void print_debug()
{
/**
printk(KERN_WARNING DEVICE_NAME ": VICIRQStatus =0x%x\n", VICIRQStatus );
printk(KERN_WARNING DEVICE_NAME ": VICFIQStatus =0x%x\n", VICFIQStatus );
printk(KERN_WARNING DEVICE_NAME ": VICRawIntr =0x%x\n", VICRawIntr );
printk(KERN_WARNING DEVICE_NAME ": VICIntSelect =0x%x\n", VICIntSelect );
printk(KERN_WARNING DEVICE_NAME ": VICIntEnable =0x%x\n", VICIntEnable );
printk(KERN_WARNING DEVICE_NAME ": VICIntEnClr =0x%x\n", VICIntEnClr );
printk(KERN_WARNING DEVICE_NAME ": VICSoftInt =0x%x\n", VICSoftInt );
printk(KERN_WARNING DEVICE_NAME ": VICSoftIntClear =0x%x\n", VICSoftIntClear );
printk(KERN_WARNING DEVICE_NAME ": VICProtection =0x%x\n", VICProtection );
printk(KERN_WARNING DEVICE_NAME ": VICVectAddr =0x%x\n", VICVectAddr );
printk(KERN_WARNING DEVICE_NAME ": VICDefVectAddr =0x%x\n", VICDefVectAddr );
printk(KERN_WARNING DEVICE_NAME ": VICVectAddr0 =0x%x\n", VICVectAddr0 );
printk(KERN_WARNING DEVICE_NAME ": VICVectAddr1 =0x%x\n", VICVectAddr1 );
printk(KERN_WARNING DEVICE_NAME ": VICVectAddr2 =0x%x\n", VICVectAddr2 );
printk(KERN_WARNING DEVICE_NAME ": VICVectAddr3 =0x%x\n", VICVectAddr3 );
printk(KERN_WARNING DEVICE_NAME ": VICVectAddr4 =0x%x\n", VICVectAddr4 );
printk(KERN_WARNING DEVICE_NAME ": VICVectAddr5 =0x%x\n", VICVectAddr5 );
printk(KERN_WARNING DEVICE_NAME ": VICVectAddr6 =0x%x\n", VICVectAddr6 );
printk(KERN_WARNING DEVICE_NAME ": VICVectAddr7 =0x%x\n", VICVectAddr7 );
printk(KERN_WARNING DEVICE_NAME ": VICVectAddr8 =0x%x\n", VICVectAddr8 );
printk(KERN_WARNING DEVICE_NAME ": VICVectAddr9 =0x%x\n", VICVectAddr9 );
printk(KERN_WARNING DEVICE_NAME ": VICVectAddr10 =0x%x\n", VICVectAddr10 );
printk(KERN_WARNING DEVICE_NAME ": VICVectAddr11 =0x%x\n", VICVectAddr11 );
printk(KERN_WARNING DEVICE_NAME ": VICVectAddr12 =0x%x\n", VICVectAddr12 );
printk(KERN_WARNING DEVICE_NAME ": VICVectAddr13 =0x%x\n", VICVectAddr13 );
printk(KERN_WARNING DEVICE_NAME ": VICVectAddr14 =0x%x\n", VICVectAddr14 );
printk(KERN_WARNING DEVICE_NAME ": VICVectAddr15 =0x%x\n", VICVectAddr15 );
printk(KERN_WARNING DEVICE_NAME ": VICVectCntl0 =0x%x\n", VICVectCntl0 );
printk(KERN_WARNING DEVICE_NAME ": VICVectCntl1 =0x%x\n", VICVectCntl1 );
printk(KERN_WARNING DEVICE_NAME ": VICVectCntl2 =0x%x\n", VICVectCntl2 );
printk(KERN_WARNING DEVICE_NAME ": VICVectCntl3 =0x%x\n", VICVectCntl3 );
printk(KERN_WARNING DEVICE_NAME ": VICVectCntl4 =0x%x\n", VICVectCntl4 );
printk(KERN_WARNING DEVICE_NAME ": VICVectCntl5 =0x%x\n", VICVectCntl5 );
printk(KERN_WARNING DEVICE_NAME ": VICVectCntl6 =0x%x\n", VICVectCntl6 );
printk(KERN_WARNING DEVICE_NAME ": VICVectCntl7 =0x%x\n", VICVectCntl7 );
printk(KERN_WARNING DEVICE_NAME ": VICVectCntl8 =0x%x\n", VICVectCntl8 );
printk(KERN_WARNING DEVICE_NAME ": VICVectCntl9 =0x%x\n", VICVectCntl9 );
printk(KERN_WARNING DEVICE_NAME ": VICVectCntl10 =0x%x\n", VICVectCntl10 );
printk(KERN_WARNING DEVICE_NAME ": VICVectCntl11 =0x%x\n", VICVectCntl11 );
printk(KERN_WARNING DEVICE_NAME ": VICVectCntl12 =0x%x\n", VICVectCntl12 );
printk(KERN_WARNING DEVICE_NAME ": VICVectCntl13 =0x%x\n", VICVectCntl13 );
printk(KERN_WARNING DEVICE_NAME ": VICVectCntl14 =0x%x\n", VICVectCntl14 );
printk(KERN_WARNING DEVICE_NAME ": VICVectCntl15 =0x%x\n", VICVectCntl15 );
printk(KERN_WARNING DEVICE_NAME ": VPBDIV =0x%x\n", VPBDIV );
**/
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -