亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? intel82527_can.c

?? intel 82527控制器描述can2.0協議的內容
?? C
?? 第 1 頁 / 共 2 頁
字號:
#include <linux/module.h>

#if defined(CONFIG_SMP)
#define __SMP__
#endif
 
#if defined(CONFIG_MODVERSIONS)
#define MODVERSIONS
#include <linux/modversions.h>
#endif
 
#include <linux/kernel.h>
#include <linux/sched.h>
#include <linux/timer.h>        /* for timers */
#include <linux/fs.h>           /* file modes and device registration */
#include <linux/poll.h>         /* for poll */
#include <linux/wrapper.h>      /* mem_map_reserve,mem_map_unreserve */
#include <linux/proc_fs.h>
#include <linux/sysctl.h>
#include <linux/init.h>
#include <asm/io.h>

#include "intel82527_can.h"

/* module parameters and descriptions */
MODULE_PARM(ican_name, "s");
MODULE_PARM_DESC(ican_name, "Name of device");
 
MODULE_PARM(ican_debug, "1b");
MODULE_PARM_DESC(ican_debug, "Enable debugging messages");
 
MODULE_DESCRIPTION("ican, Sample character driver");
MODULE_AUTHOR("grd");

MODULE_LICENSE("GPL");

struct file_operations ican_fops = 
{
  read:    ican_read,
  write:   ican_write,
  ioctl:   ican_ioctl,
  open:	 	 ican_open,
  release: ican_release,
  poll:    ican_poll,
  owner:   THIS_MODULE,
};

DECLARE_WAIT_QUEUE_HEAD(inq);
DECLARE_WAIT_QUEUE_HEAD(outq);

static void i82527_start_chip(CAN_Dev *dev)
{
	unsigned short flags = 0;
	unsigned char* base;
	base=dev->reg_base;
	flags =readb(base+iCTL) & (iCTL_IE|iCTL_SIE|iCTL_EIE);
	writeb(flags,base+iCTL);
}

static void i82527_stop_chip(CAN_Dev *dev)
{
	unsigned short flags = 0;
	unsigned char* base;
	base=dev->reg_base;
	flags =readb(base+iCTL) & (iCTL_IE|iCTL_SIE|iCTL_EIE);
	writeb(flags|(iCTL_CCE|iCTL_INI),base+iCTL);
}

static void i82527_reset_chip(CAN_Dev *dev)
{
	int i=0,j=0,k=0;
	unsigned char* base;
	base=dev->reg_base;
	
	/***************** register reset *******************/
	writeb((iCTL_CCE | iCTL_INI),base+iCTL);// control register
	
	writeb(0,base+iSTAT);//status reister
	
	writeb((iCPU_DMC | iCPU_DSC | iCPU_CEN),base+iCPU);//CPU interface
	
	//writeb(0,base+iHSR);//High Speed Read

	writeb((iCLK_SL1 | iCLK_CD1),base+iCLK);//Clock Out Register
	
	writeb((iBUS_CBY),base+iBUS);//Bus Configuration Register
	
	readb(base+iIRQ);//interrupt register
	
	/**************** Write test pattern ********************/
	writeb(0x25,base+16+iMSGDAT0);
	writeb(0x52,base+32+iMSGDAT3);
	writeb(0xc3,base+160+iMSGDAT6);
	
	if(readb(base+16+iMSGDAT0)!=0x25 ||
		 readb(base+32+iMSGDAT3)!=0x52 ||
		 readb(base+160+iMSGDAT6)!=0xc3)
	{
		printk("Could not read back from the hardware.\n");
		printk("This probably means that your hardware is not correctly configured!\n");
		return -1;
	}
	else
	{
		printk("Could read back, hardware is probably configured correctly");
	}

	/*************** clear message object **********************/
	for(i=1;i<16;i++)
	{
		writeb(INTPD_RES | RXIE_RES | TXIE_RES | MVAL_RES,base+16*i+iMSGCTL0);
		writeb(NEWD_RES | MLST_RES | TXRQ_RES | RMPD_RES,base+16*i+iMSGCTL1);
		
		for(j=0;j<4;j++)
		{
			writeb(0,base+16*i+iMSGID0+j);
		}
		
		for(k=0;k<8;k++)
		{
			writeb(0,base+16*i+iMSGDAT0+j);
		}
		
		writeb(0,base+16*i+iMSGCFG);
	}
	
	/****************** set timing **************************/
	writeb((uint8_t) iCanTiming[9][0],base+iBT0);//Bit Timing Register
	writeb((uint8_t) iCanTiming[9][1],base+iBT1);
	
	/****************** set mask ****************************/ 
	writeb(0,base+iSGM0);//Standard Global Mask
	writeb(0,base+iSGM1);
	
	writeb(0,base+iEGM0);//Extended Global Mask
	writeb(0,base+iEGM1);
	writeb(0,base+iEGM2);
	writeb(0,base+iEGM3); 
	
	writeb(0,base+i15M0);//Message 15 Mask
	writeb(0,base+i15M1);
	writeb(0,base+i15M2);
	writeb(0,base+i15M3);
}

static int ican_ioctl(struct inode *inode, struct file *filp, unsigned int cmd, unsigned long arg)
{
	unsigned char* base;
	CAN_Dev *dev;
	int myarg;
	int err=0;
	int i=0;
	
	int dev_minor = MINOR(inode->i_rdev) & 0x0f;
	
	base = canDev[dev_minor].reg_base;
		
	dev = canDev + dev_minor;
	
	get_user(myarg, (int *)arg);
	
	if(_IOC_TYPE(cmd) != ICAN_IOC_BASE)
	{
		return -EINVAL;
	}
	if(_IOC_NR(cmd) > CAN_IOC_MAXNR)
	{
		return -EINVAL;
	}
	
	if(_IOC_DIR(cmd) & _IOC_READ)
	{
		err = !access_ok(VERIFY_WRITE, (void *)arg, _IOC_SIZE(cmd));
	}
	else if(_IOC_DIR(cmd) & _IOC_WRITE)
	{
		err = !access_ok(VERIFY_READ, (void *)arg, _IOC_SIZE(cmd));
	}
	if(err)
	{
		return -EFAULT;
	}
	
	switch(cmd)
	{
		case ICAN_IOC_SBAUD:
			{
				if((arg >= 0) && (arg <= 9))
				{
					i82527_stop_chip(dev);
					writeb(iCanTiming[arg][0],base+iBT0);
					writeb(iCanTiming[arg][1],base+iBT1);
					i82527_start_chip(dev);
				}
			}
			break;
		case ICAN_IOC_MASK:
			{
				//none
			}
			break;
		case ICAN_IOC_CRBUF:
			{
				dev->nm_rb = 0;			               
				dev->wp_rb = 0;
				dev->rp_rb =0;
			}
			break;
		case ICAN_IOC_CWBUF:
			{
				dev->nm_wb = 0;		
				dev->wp_wb = 0;	
				dev->rp_wb =0;
			}
			break;
		case ICAN_IOC_RREG:
			{
				if(myarg>=0x100)
				{
					printk("Error reister number\n");
				}
				else
				{
					printk("0x%x is 0x%x\n",myarg,readb(base+myarg));
				}
			}
			break;
		case ICAN_IOC_RTTS:
			{
				copy_to_user((struct timeval *)arg, &transmit_timestamp, sizeof(struct timeval));
			}
			break;
		case ICAN_IOC_RAPS:
			{
				printk("Ican active_passive_status is %d\n",dev->active_passive_status);
			}
			break;
		case ICAN_IOC_SBTR:
			{
				i82527_stop_chip(dev);
				writeb((arg >> 8) & 0xff,base+iBT0);
				writeb(arg & 0xff,base+iBT1);
				i82527_start_chip(dev);
			}
			break;
		case ICAN_IOC_START:
			{
				i82527_start_chip(dev);
			}
			break;
		case ICAN_IOC_STOP:
			{
				i82527_stop_chip(dev);
			}
			break;
		case ICAN_IOC_RESET:
			{
				i82527_reset_chip(dev);
			}
			break;
		case ICAN_IOC_CONF_FILTER:
			{
				//none
			}
			break;
		case ICAN_IOC_SEND:
			{
				//none
			}
			break;
		case ICAN_IOC_RECEIVE:
			{
				//none
			}
			break;
		default:
			{
				return -EINVAL;
			}
			break;
	}
	return 0;
}

static unsigned int ican_poll(struct file *filp, poll_table *wait)
{
	unsigned int mask = 0;

	CAN_Dev *dev = filp->private_data;

	poll_wait(filp, &inq, wait);
	poll_wait(filp, &outq, wait);

	if(dev->nm_rb > 0)  /* at least one message in the buffer */
		mask |= POLLIN | POLLRDNORM;  /* readable */

	if(dev->nm_wb < BUFFER_SIZE)  /* at least one message in the buffer */
		mask |= POLLOUT | POLLWRNORM;  /* readable */

	return mask;
}

static void read_from_INTEL82527(CAN_Dev *dev)
{
	int i = 0;
  uint8_t msgctlreg;
  uint8_t ctl1reg;
  
  uint8_t id0, id1, id2, id3;
	unsigned char* base;
	
	base=dev->reg_base;
	
	ctl1reg=readb(base+16*15+iMSGCTL1);
	
	if(dev->nm_rb < BUFFER_SIZE)
	{
		if( ctl1reg & MLST_SET )
		{
			printk("\ni82527: Previous message lost\n");
		}
	
		if(ctl1reg & NEWD_SET)
		{
			if (ctl1reg & RMPD_SET) 
			{
       	dev->read_buf[dev->wp_rb].rtr=1;
    	}
    
   	 	msgctlreg=readb(base+16*15+iMSGCFG);
    
    	if( msgctlreg & MCFG_XTD ) 
    	{
      	id0=readb(base+16*15+iMSGID3);
      	id1=readb(base+16*15+iMSGID2)<<8;
      	id2=readb(base+16*15+iMSGID1)<<16;
      	id3=readb(base+16*15+iMSGID0)<<24; 
      	dev->read_buf[dev->wp_rb].type=EXTENDED;
     	  dev->read_buf[dev->wp_rb].id=(id0|id1|id2|id3)>>3;    
    	}
    	else
    	{
    		id0=readb(base+16*15+iMSGID1);
    		id1=readb(base+16*15+iMSGID0)<<8;
    		dev->read_buf[dev->wp_rb].type=STANDARD;
      	dev->read_buf[dev->wp_rb].id=(id0|id1|id2|id3)>>5;
    	}
    
    	msgctlreg  &= 0xf0;
    	msgctlreg  = msgctlreg >>4;
    
    	msgctlreg %= 9;
    	dev->read_buf[dev->wp_rb].len=msgctlreg;
    
    	for (i = 0; i < msgctlreg; i++) 
    	{
    		dev->read_buf[dev->wp_rb].d[i]=readb(base+16*15+iMSGDAT0+i);
    	}
    
    	do_gettimeofday(&dev->read_buf[dev->wp_rb].timestamp);
    	transmit_timestamp=dev->read_buf[dev->wp_rb].timestamp;
    
    	writeb(MVAL_SET | TXIE_RES | RXIE_SET | INTPD_RES,base+16*15+iMSGCTL0);
    	writeb(RMPD_RES | TXRQ_RES | MLST_RES |  NEWD_RES,base+16*15+iMSGCTL1);
    	
    	dev->nm_rb++;
			dev->wp_rb++; 
			wake_up_interruptible(&inq);
		}
	}
	else
	{
		printk("CAN: buffer full, dropping message,this meassage will be release!\n");
	}
}

static ssize_t ican_read(struct file *filp, char *buf, size_t count, loff_t *f_pos)
{
	int pos, nmrb;
	CAN_Dev *dev = (CAN_Dev *)filp->private_data;
	
	pos = dev->rp_rb;
  nmrb = dev->nm_rb; 
	
	if(nmrb == 0)
	{
		if(filp->f_flags & O_NONBLOCK)
		{ 
			return -EAGAIN;	
		}

		printk("\n can_read! sleep_on inq\n");
		interruptible_sleep_on(&inq); 

		if(signal_pending(current))
    {   printk("\n signal_pending \n");
			return -ERESTARTSYS;
    }
	}
	
	if(nmrb > 0)
	{
		copy_to_user(buf, &dev->read_buf[pos],MSG_LENGTH); 
		dev->nm_rb--;
		dev->rp_rb++;

		if(dev->rp_rb == dev->wp_rb)
		{		/* Buffer empty */
			dev->rp_rb = 0;
			dev->wp_rb = 0;
		}

		return MSG_LENGTH;
	}
	else
	{
		printk("No messages available nmrb=0x%x",nmrb);
		return -EAGAIN;	
	}			    
}

void ican_msgobj15_read_interrupt(CAN_Dev *dev)
{
	read_from_INTEL82527(dev);
}

void ican_msgobj_write_interrupt(CAN_Dev *dev)
{
	int i=1,j=0;
	uint8_t id0, id1, id2, id3;
	unsigned long flags;
	unsigned char* base;
	
	base=dev->reg_base;
	
	save_flags(flags);
	
	if(dev->nm_wb > 0)
	{
		writeb(RMPD_RES | TXRQ_RES | CPUU_SET | NEWD_SET,base+16+iMSGCTL1);
		writeb(MVAL_SET | TXIE_SET | RXIE_RES | INTPD_RES,base+16+iMSGCTL0);
		
		dev->write_buf[dev->rp_wb].len%=9;
		
		if(dev->write_buf[dev->rp_wb].type == EXTENDED)
		{
			writeb(dev->write_buf[dev->rp_wb].len<<4 | ( MCFG_DIR | MCFG_XTD ),base+16+iMSGCFG);
			id0=dev->write_buf[dev->rp_wb].id << 3;
			id1=dev->write_buf[dev->rp_wb].id >> 5;
			id2=dev->write_buf[dev->rp_wb].id >> 13;
			id3=dev->write_buf[dev->rp_wb].id >> 21;
			writeb(id3,base+16+iMSGID0);
			writeb(id2,base+16+iMSGID1);
			writeb(id1,base+16+iMSGID2);
			writeb(id0,base+16+iMSGID3);
		}
		else
		{
			writeb(dev->write_buf[dev->rp_wb].len<<4 | ( MCFG_DIR),base+16+iMSGCFG);
			id0=dev->write_buf[dev->rp_wb].id << 5;
			id1=dev->write_buf[dev->rp_wb].id >> 3;
			writeb(id1,base+16+iMSGID0);
			writeb(id0,base+16+iMSGID1);
		}
		
		for ( j=0; j <dev->write_buf[dev->rp_wb].len ; j++ ) 
		{
       writeb( dev->write_buf[dev->rp_wb].d[i],base+16+iMSGDAT0+j);
    }
    
    if (dev->write_buf[dev->rp_wb].rtr == REMOTEFRAME)
		{
       writeb(RMPD_RES | TXRQ_RES | CPUU_RES | NEWD_UNC,base+16+iMSGCTL1);
    }
    else 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
成人av在线资源| 中文字幕一区二区三区四区| 九色综合狠狠综合久久| 久久久久亚洲蜜桃| 91麻豆自制传媒国产之光| 亚洲一级在线观看| 国产欧美一区二区精品性色超碰| 91丨九色丨蝌蚪丨老版| 天天综合网 天天综合色| 久久免费电影网| 欧美一区二区三区免费观看视频| 懂色av一区二区三区蜜臀| 日韩电影一区二区三区四区| 亚洲欧美一区二区三区国产精品| 日韩一区二区精品葵司在线| 99国产一区二区三精品乱码| 国产在线视频一区二区三区| 亚洲国产精品精华液网站| 中文字幕制服丝袜成人av | 日本高清不卡一区| 麻豆91精品视频| 亚洲男人的天堂一区二区 | 久久久综合视频| 一本在线高清不卡dvd| 首页亚洲欧美制服丝腿| 国产精品美女久久久久aⅴ | 日韩三级在线免费观看| 成人蜜臀av电影| 另类人妖一区二区av| 国产精品一区二区91| 日本一区二区免费在线观看视频| 色八戒一区二区三区| 国产福利精品导航| 激情综合色综合久久综合| 亚洲一区免费在线观看| 中文字幕的久久| 欧美一三区三区四区免费在线看| 99久久国产免费看| 国产揄拍国内精品对白| 无码av中文一区二区三区桃花岛| 亚洲欧美日韩在线不卡| 国产精品久久久久久亚洲伦| 精品久久久网站| 欧美成人在线直播| 日韩午夜精品电影| 欧美人动与zoxxxx乱| 欧美日韩国产经典色站一区二区三区| 国产99久久久国产精品免费看| 精品一区二区三区久久| 色综合天天综合网国产成人综合天| 欧美精选一区二区| 亚洲欧洲制服丝袜| 国内不卡的二区三区中文字幕| 秋霞午夜鲁丝一区二区老狼| 玖玖九九国产精品| 国产精品538一区二区在线| jizz一区二区| 日本高清不卡视频| 日韩免费观看高清完整版 | 欧美日韩国产首页| 日韩欧美在线网站| 国产精品乱人伦中文| 一区二区三区成人| 亚洲国产你懂的| 亚洲色图欧美偷拍| 亚洲男同性视频| 成人激情视频网站| 91麻豆产精品久久久久久| 国产麻豆91精品| 欧美一区二区播放| 亚洲国产精品人人做人人爽| 99视频在线观看一区三区| 国产欧美一区视频| 久久97超碰色| 337p粉嫩大胆色噜噜噜噜亚洲| 欧美zozozo| 久久久久久免费毛片精品| 欧美浪妇xxxx高跟鞋交| 欧美日韩一区在线观看| 欧美视频完全免费看| 色又黄又爽网站www久久| 欧美三片在线视频观看| 国产日韩一级二级三级| 一区二区三区中文字幕| 亚洲图片欧美一区| 精品一区精品二区高清| 成人黄色电影在线 | 日韩美女主播在线视频一区二区三区| 欧美日韩一区高清| 国产日韩三级在线| 亚洲一区二区视频在线观看| 久久国产三级精品| 欧美日韩国产另类不卡| 国产亚洲成av人在线观看导航| 一区二区欧美在线观看| 丰满放荡岳乱妇91ww| 色婷婷亚洲精品| 久久亚洲影视婷婷| 亚洲高清视频中文字幕| 成人国产一区二区三区精品| 久久久91精品国产一区二区三区| 日本成人在线电影网| 欧美另类变人与禽xxxxx| 秋霞午夜av一区二区三区| 久久久久99精品一区| 亚洲黄色在线视频| 国精产品一区一区三区mba桃花| 国产91色综合久久免费分享| yourporn久久国产精品| 亚洲国产一区二区三区| 久久久精品日韩欧美| 2020国产精品自拍| 精品99一区二区三区| 午夜不卡av在线| 91视频一区二区三区| 久久色视频免费观看| 日本aⅴ亚洲精品中文乱码| 91在线一区二区| 中文字幕成人av| 国产精品一区二区在线看| 日韩一级片网址| 国产一区二区看久久| 一区二区三区久久久| 色国产综合视频| 五月婷婷激情综合| 日韩欧美二区三区| 毛片av一区二区三区| 日韩欧美一区二区三区在线| 国产精一区二区三区| 国产精品久久久久久久裸模| 色偷偷一区二区三区| 国产精品久久三| 欧美色精品在线视频| 蜜桃一区二区三区在线| 久久五月婷婷丁香社区| 99久久免费视频.com| 亚洲成人免费观看| 国产视频一区在线观看| 在线观看日韩毛片| 免费欧美高清视频| 国产精品免费视频网站| 精品视频一区三区九区| 狠狠v欧美v日韩v亚洲ⅴ| 中文字幕亚洲成人| 91精品久久久久久久99蜜桃 | 另类中文字幕网| 中文字幕不卡一区| 欧美美女黄视频| bt7086福利一区国产| 久久av老司机精品网站导航| 中文字幕不卡一区| 久久综合中文字幕| 精品国产在天天线2019| 国产亚洲污的网站| 亚洲日本一区二区| 亚洲制服欧美中文字幕中文字幕| 亚洲自拍与偷拍| 久草在线在线精品观看| 蜜臀av一区二区在线免费观看| 久久久久成人黄色影片| 91香蕉视频污| 成人综合婷婷国产精品久久 | 久久精品国产网站| 免费欧美在线视频| 日韩无一区二区| 国产成人综合自拍| 亚洲最大色网站| 日韩一二在线观看| 国产成人高清视频| 亚洲一区二区在线视频| 日韩欧美一二区| 99国内精品久久| 免费在线看一区| 国产精品久久三| 亚洲电影视频在线| 国产午夜亚洲精品午夜鲁丝片| 26uuu另类欧美亚洲曰本| 日韩午夜中文字幕| 日韩欧美成人激情| 国产视频在线观看一区二区三区| 日韩精品一区在线观看| 精品人伦一区二区色婷婷| 精品裸体舞一区二区三区| 久久久av毛片精品| 国产精品五月天| 亚洲一区二区三区激情| 婷婷亚洲久悠悠色悠在线播放 | 成人精品鲁一区一区二区| 国产中文字幕精品| 99久久99久久免费精品蜜臀| 欧美在线一二三| 精品成人一区二区三区| 国产欧美1区2区3区| 亚洲一区二区高清| 国产精品18久久久久久久网站| 97精品久久久久中文字幕| 在线播放日韩导航| 中文字幕国产精品一区二区| 亚洲成国产人片在线观看| 国产乱人伦偷精品视频不卡|