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

📄 candrv.c

📁 uClinux下can接口驱动程序
💻 C
📖 第 1 页 / 共 2 页
字号:
    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 + -