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

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

?? mcpcan.c

?? CAN總線芯片MCP2510在ARM芯片S3C2410上的完整驅動程序
?? C
?? 第 1 頁 / 共 2 頁
字號:
#include <linux/unistd.h>#include <linux/module.h>#include <asm-arm/arch-s3c2410/S3C2410.h>#include <asm-arm/arch-s3c2410/irqs.h>#if defined(CONFIG_SMP)#define __SMP__#endif#if defined(CONFIG_MODVERSIONS)#define MODVERSIONS#endif#include <linux/sched.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/errno.h> 	/* for -EBUSY *///#include <linux/malloc.h>#include <linux/slab.h>#include <linux/ioport.h>	/* for verify_area */#include <linux/mm.h>#include <linux/interrupt.h>#include <linux/tqueue.h>#include <linux/timer.h>#include <linux/delay.h>#include <linux/types.h>#include <linux/init.h>		/* for module_init */#include <linux/module.h>#include <asm/io.h>#include <asm/segment.h>#include <asm/irq.h>#include <asm/signal.h>#include <asm/siginfo.h>#include <asm/uaccess.h>  	/* for get_user and put_user */#include <asm/fcntl.h>#include <asm/cache.h>#include <asm/atomic.h>//#include <asm-arm/arch-s3c2410/S3C2410_2.h>#include <sys/syscall.h>//#include <asm-arm/arch-s3c2410/S3C2410_2.h>//#include	<asm-arm/arch-s3c2410/S3C2410_2.h>//#include "S3C2410_2.h"#include "mcpcan.h"#include	"spi_cmd.h"
#include    "spi.h"#define	MCP2510_FLAG
#define BUF_SIZE sizeof(struct MCP_device) * 100//#define DEBUG#ifdef DEBUG#define DbgPrintk(S) printk(S)#else#define DbgPrintk(S)#endifstruct MCP_device {       volatile unsigned long RecvBuf;       volatile unsigned long RecvHead;       volatile unsigned long RecvTail;       volatile unsigned long RecvNum;                                                                                                                                                      wait_queue_head_t inq;   //or use as a global variable                                                                                                                                                      struct semaphore sem;    //semaphore used for mutex                                                                                                                                                      unsigned int      IrqNum;       unsigned int      MinorNum;/*device minor number*/       unsigned int      BaudRate;                                                                                                                                                      unsigned char     *SendBuf;       unsigned int      SendNum;       volatile unsigned long SendHead;       volatile unsigned long SendTail;}__attribute__((aligned(L1_CACHE_BYTES),packed));                                                                                                                                               /*****************************Variable define*******************************/unsigned int MCP_major = MCP_MAJOR;struct MCP_device *Device[MCP_NUM];unsigned int MCP_irq[MCP_NUM] = {IRQ_EINT4_7,IRQ_EINT8_23};static char *MCP_name[MCP_NUM] = {"mcpcan0","mcpcan1"};/*****************************SJA device initialize*************************///這個函數用來對struct MCP_device進行初始化static int MCP_device_init(void){        int res,i;        for(i=0;i<MCP_NUM;i++) {                Device[i] = kmalloc(sizeof(struct MCP_device),GFP_KERNEL);  //malloc the device struct                if(Device[i] == NULL) {                        printk(KERN_ALERT"allocate device memory failed.\n");                        return(-ENOMEM);                }                memset((char *)Device[i],0,sizeof(struct MCP_device));                //Device[i]->RecvBuf = (unsigned char *)get_free_page(GFP_KERNEL);  //malloc the recv buffer                Device[i]->RecvBuf = (unsigned long)kmalloc(sizeof(struct MCP_device) * 100,GFP_KERNEL);  //malloc the recv buffer                if(Device[i]->RecvBuf == 0) {                        printk(KERN_ALERT"allocate Recv memory failed.\n");                        return(-ENOMEM);                }                memset((char *)Device[i]->RecvBuf,0,sizeof(struct MCP_device) * 100);                Device[i]->RecvHead = Device[i]->RecvBuf;                Device[i]->RecvTail = Device[i]->RecvBuf;                Device[i]->RecvNum = 0;                //Device[i]->RecvQueue = NULL;                                //Device[i]->SendBuf = (unsigned char *)get_free_page(GFP_KERNEL);   //malloc the send buffer                Device[i]->SendBuf = kmalloc(sizeof(struct MCP_device) * 100,GFP_KERNEL);  //malloc the send buffer                if(Device[i]->SendBuf == NULL) {                        printk(KERN_ALERT"allocate Send memory failed.\n");                        return(-ENOMEM);                }                memset((char *)Device[i]->SendBuf,0,sizeof(struct MCP_device) * 100);                Device[i]->MinorNum = i;                //Device[i]->FrameMode = 1;                Device[i]->IrqNum = MCP_irq[i];                //Device[i]->BaudRate = MCP_baudrate[i];		init_waitqueue_head(&(Device[i]->inq));		//init_waitqueue_head(&(Device[i]->outq));		init_MUTEX(&(Device[i]->sem));		}        return 0;}/*****************************MCP device initialize*************************//* Initialize the mcp2510 */
void MCP2510_Init(int MinorNum )
{
	// Configure the SPI Interface in MX1
	//int canstat = 0;	SPI_Init( ); 
	// Configure the mcp2510 through spi interface

	// Reset controller
	CAN_SPI_CMD( SPI_CMD_RESET, ARG_UNUSED, ARG_UNUSED, ARG_UNUSED );
		CAN_SPI_CMD( SPI_CMD_BITMOD, TOLONG(&(MCP2510_MAP->CANCTRL)), 0xe0, 0x80 );		// CONFIG MODE
	// make sure we are in configuration mode
	while( (CAN_SPI_CMD( SPI_CMD_READ, TOLONG(&(MCP2510_MAP->CANSTAT)), ARG_UNUSED, ARG_UNUSED )>>5)!=0x04 );
	// start configuration
	CAN_SPI_CMD( SPI_CMD_WRITE, TOLONG(&(MCP2510_MAP->BFPCTRL)), 	BFPCTRL_INIT_VAL, 	ARG_UNUSED);
	CAN_SPI_CMD( SPI_CMD_WRITE, TOLONG(&(MCP2510_MAP->TXRTSCTRL)), 	TXRTSCTRL_INIT_VAL, ARG_UNUSED);
	CAN_SPI_CMD( SPI_CMD_WRITE, TOLONG(&(MCP2510_MAP->CNF3)), 		CNF3_INIT_VAL, 		ARG_UNUSED);
	CAN_SPI_CMD( SPI_CMD_WRITE, TOLONG(&(MCP2510_MAP->CNF2)), 		CNF2_INIT_VAL, 		ARG_UNUSED);
	CAN_SPI_CMD( SPI_CMD_WRITE, TOLONG(&(MCP2510_MAP->CNF1)),		CNF1_INIT_VAL, 		ARG_UNUSED);
	CAN_SPI_CMD( SPI_CMD_WRITE, TOLONG(&(MCP2510_MAP->CANINTE)),	CANINTE_INIT_VAL, 	ARG_UNUSED);
	CAN_SPI_CMD( SPI_CMD_WRITE, TOLONG(&(MCP2510_MAP->CANINTF)), 	CANINTF_INIT_VAL, 	ARG_UNUSED);
	CAN_SPI_CMD( SPI_CMD_WRITE, TOLONG(&(MCP2510_MAP->EFLG)), 		EFLG_INIT_VAL, 		ARG_UNUSED);
	CAN_SPI_CMD( SPI_CMD_WRITE, TOLONG(&(MCP2510_MAP->TXB0CTRL)), 	TXBnCTRL_INIT_VAL, 	ARG_UNUSED);
	CAN_SPI_CMD( SPI_CMD_WRITE, TOLONG(&(MCP2510_MAP->TXB1CTRL)), 	TXBnCTRL_INIT_VAL, 	ARG_UNUSED);
	CAN_SPI_CMD( SPI_CMD_WRITE, TOLONG(&(MCP2510_MAP->TXB2CTRL)), 	TXBnCTRL_INIT_VAL, 	ARG_UNUSED);
	CAN_SPI_CMD( SPI_CMD_WRITE, TOLONG(&(MCP2510_MAP->RXB0CTRL)), 	RXB1CTRL_INIT_VAL, 	ARG_UNUSED);
	CAN_SPI_CMD( SPI_CMD_WRITE, TOLONG(&(MCP2510_MAP->RXB1CTRL)), 	RXB1CTRL_INIT_VAL, 	ARG_UNUSED);
	
	// switch to normal mode or loopback mode ( for testing)
	//CAN_SPI_CMD( SPI_CMD_BITMOD, TOLONG(&(MCP2510_MAP->CANCTRL)), 0xe0, 0x40 );		// LOOP BACK MODE
	CAN_SPI_CMD( SPI_CMD_BITMOD, TOLONG(&(MCP2510_MAP->CANCTRL)), 0xe0, 0x00 );	// NORMAL OPERATION MODE
	
	// Flush the MX1 SPI receive buffer
	
	CAN_SPI_CMD( SPI_CMD_READ, TOLONG(&(MCP2510_MAP->CANSTAT)), ARG_UNUSED, ARG_UNUSED );
}/* Transmit data */
/*
 TxBuf	: select the transmit buffer( 0=buffer0 or 1=buffer1 2=buffer2 )
 IdType	: 0=standard id or 1=extended id
 id	: frame identifier
 DataLen	: the number of byte
 data	: the pointer to data byte
*/void MCP2510_TX( int TxBuf, int IdType, unsigned int id, int DataLen, char * data )
{
	int i, offset;

	switch( TxBuf ){
		case TXBUF0:
			offset = 0;
			break;
		case TXBUF1:
			offset = 0x10;
			break;
		case TXBUF2:
			offset = 0x20;
			break;
	}
	// Set the frame identifier
	if( IdType==STANDID ){
		CAN_SPI_CMD( SPI_CMD_WRITE, TOLONG(&(MCP2510_MAP->TXB0SIDL))+offset, (id&0x7)<<5, ARG_UNUSED );
		CAN_SPI_CMD( SPI_CMD_WRITE, TOLONG(&(MCP2510_MAP->TXB0SIDH))+offset, (id>>3)&0xff, ARG_UNUSED );
	}else if( IdType==EXTID ){
		CAN_SPI_CMD( SPI_CMD_WRITE, TOLONG(&(MCP2510_MAP->TXB0EID0))+offset, id&0xff, ARG_UNUSED );
		CAN_SPI_CMD( SPI_CMD_WRITE, TOLONG(&(MCP2510_MAP->TXB0EID8))+offset, (id>>8)&0xff, ARG_UNUSED );			
		CAN_SPI_CMD( SPI_CMD_WRITE, TOLONG(&(MCP2510_MAP->TXB0SIDL)), ((id>>16)&0x3)|0x08, ARG_UNUSED );
	}
	// Set the data length
	CAN_SPI_CMD( SPI_CMD_WRITE, TOLONG(&(MCP2510_MAP->TXB0DLC))+offset, DataLen, ARG_UNUSED );
	// fill the data
	if( DataLen>8 )
		DataLen = 8;
	for( i=0; i<DataLen; i++ ){
		CAN_SPI_CMD( SPI_CMD_WRITE, TOLONG(&(MCP2510_MAP->TXB0D0))+offset+i, data[i], ARG_UNUSED );
	}	// initiate transmit	i = 0;	while( CAN_SPI_CMD( SPI_CMD_READ, TOLONG(&(MCP2510_MAP->TXB0CTRL))+offset, ARG_UNUSED, ARG_UNUSED )&0x08 ){		i++;		if(i == 1000)printk("Please connect the CAN PORT with wire.");	}	CAN_SPI_CMD( SPI_CMD_BITMOD, TOLONG(&(MCP2510_MAP->TXB0CTRL))+offset, 0x08, 0x08 );}
/* Receive data */
/*
 * RxBuf		: The receive buffer from which the data is get
 * IdType		: Identifier type of the data frame ( STANDID, EXTID )
 * id		: The identifier of the received frame
 * DataLen	: The number of bytes received
 * data		: The received data
 */
void MCP2510_RX( int RxBuf, int *IdType, unsigned int *id, int *DataLen, char *data )
{
	unsigned int flag;
	int offset, i;
	
	switch( RxBuf ){
		case RXBUF0:
			flag = 0x1;
			offset = 0x00;
			break;
		case RXBUF1:
			flag = 0x2;
			offset = 0x10;
			break;
	}
	// wait for a frame to com
	while( !(CAN_SPI_CMD( SPI_CMD_READ, TOLONG(&(MCP2510_MAP->CANINTF)), ARG_UNUSED, ARG_UNUSED )&flag) );	// Get the identifier
	if( CAN_SPI_CMD( SPI_CMD_READ, TOLONG(&(MCP2510_MAP->RXB0SIDL))+offset, ARG_UNUSED, ARG_UNUSED )&0x08 ){
		// Extended identifier
		if( IdType )
			*IdType = EXTID;
		if( id ){
			*id = (CAN_SPI_CMD( SPI_CMD_READ, TOLONG(&(MCP2510_MAP->RXB0SIDL))+offset, ARG_UNUSED, ARG_UNUSED )&0x3)<<16;
			*id |= (CAN_SPI_CMD( SPI_CMD_READ, TOLONG(&(MCP2510_MAP->RXB0EID8))+offset, ARG_UNUSED, ARG_UNUSED ))<<8;
			*id |= (CAN_SPI_CMD( SPI_CMD_READ, TOLONG(&(MCP2510_MAP->RXB0EID0))+offset, ARG_UNUSED, ARG_UNUSED ));
		}
	}else{
		// Standard identifier
		if( IdType )
			*IdType = STANDID;
		if( id ){
			*id = (CAN_SPI_CMD( SPI_CMD_READ, TOLONG(&(MCP2510_MAP->RXB0SIDH))+offset, ARG_UNUSED, ARG_UNUSED ))<<3;
			*id |= (CAN_SPI_CMD( SPI_CMD_READ, TOLONG(&(MCP2510_MAP->RXB0SIDL))+offset, ARG_UNUSED, ARG_UNUSED ))>>5;
		}
	}
	// Get the data frame lenth
	if( DataLen )
		*DataLen = (CAN_SPI_CMD( SPI_CMD_READ, TOLONG(&(MCP2510_MAP->RXB0DLC))+offset, ARG_UNUSED, ARG_UNUSED )&0xf);
	// Get the data
	for( i=0; DataLen&&(i<*DataLen)&&data; i++ ){
		data[i] = CAN_SPI_CMD( SPI_CMD_READ, TOLONG(&(MCP2510_MAP->RXB0D0))+offset+i, ARG_UNUSED, ARG_UNUSED );
	}
	// clear the receive int flag
	CAN_SPI_CMD( SPI_CMD_BITMOD, TOLONG(&(MCP2510_MAP->CANINTF)), flag, 0x00 );
	

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品久久久久久妇女6080 | 中文字幕日韩av资源站| 欧美精品在线视频| 欧美高清视频不卡网| 欧美亚洲另类激情小说| 欧美性xxxxxxxx| 欧美日韩高清一区二区| 欧美日韩情趣电影| 欧美精品久久久久久久久老牛影院| 欧美亚洲日本一区| 91精品国产综合久久久久久久久久 | 国产精品亚洲人在线观看| 老司机精品视频导航| 久久激情五月婷婷| 国产一区二区三区免费在线观看| 国模冰冰炮一区二区| 国产美女视频91| av一二三不卡影片| 国产一区亚洲一区| 5566中文字幕一区二区电影| 亚洲人成伊人成综合网小说| 国产乱妇无码大片在线观看| 日韩精品在线一区| 日韩高清在线观看| 欧美日韩第一区日日骚| 亚洲永久精品国产| 欧美在线视频日韩| 亚洲资源在线观看| 色老头久久综合| 亚洲欧美日韩国产手机在线| 粉嫩欧美一区二区三区高清影视| 日韩一级片在线播放| 美女网站一区二区| 日韩免费性生活视频播放| 免费成人性网站| 日韩午夜激情电影| 制服.丝袜.亚洲.另类.中文| 欧美日韩国产另类一区| 久久久久国色av免费看影院| 亚洲精品国产a| 韩日av一区二区| 91福利社在线观看| 久久婷婷成人综合色| 亚洲一区在线观看网站| 国产在线精品国自产拍免费| 欧美午夜免费电影| 国产欧美综合色| 日本va欧美va瓶| 91视频91自| 久久影院电视剧免费观看| 一二三区精品视频| 一区二区三区欧美亚洲| 成人一区二区在线观看| 综合久久给合久久狠狠狠97色| 99久久免费国产| 天天av天天翘天天综合网色鬼国产| 国产精品自在欧美一区| 欧美一区午夜视频在线观看| 欧美日韩亚洲综合在线| www.66久久| 亚洲最新视频在线观看| 91精品国产91综合久久蜜臀| 国产精品亚洲午夜一区二区三区| 亚洲欧洲www| 欧美日产在线观看| 国产精品一区一区| 一区二区三区中文在线观看| 日韩一卡二卡三卡| 福利视频网站一区二区三区| 精品国产乱码久久久久久久久| 欧美一区二区视频在线观看2022| 亚洲国产毛片aaaaa无费看| 91亚洲国产成人精品一区二三| 成人福利电影精品一区二区在线观看 | 欧美男女性生活在线直播观看| 日韩精品最新网址| 午夜欧美电影在线观看| 亚洲一区在线视频| 欧美群妇大交群的观看方式| 国产精品一卡二| 香蕉加勒比综合久久| 久久精品在线免费观看| 欧美日韩在线免费视频| 国产suv一区二区三区88区| 午夜一区二区三区视频| 久久久久亚洲蜜桃| 欧美三级日本三级少妇99| 国产成人精品在线看| 美女视频一区二区三区| 欧美xxxx老人做受| 国产一区二区三区av电影| 久久久久久久久久久99999| 成人综合婷婷国产精品久久| 《视频一区视频二区| 色婷婷精品大视频在线蜜桃视频| 亚洲综合自拍偷拍| 欧美精品乱人伦久久久久久| 免费成人在线观看| 国产人久久人人人人爽| 色综合视频一区二区三区高清| 亚洲中国最大av网站| 日韩欧美国产一二三区| 成人黄色国产精品网站大全在线免费观看| 国产精品网站导航| 欧洲国产伦久久久久久久| 日本一道高清亚洲日美韩| 国产欧美日韩卡一| 91成人在线精品| 久久久精品国产99久久精品芒果 | 国产精品一区二区在线观看网站| 国产日韩欧美综合一区| 91丨九色丨国产丨porny| 午夜国产精品一区| 久久欧美一区二区| 91福利国产成人精品照片| 狠狠网亚洲精品| 一区二区国产盗摄色噜噜| 精品国产污污免费网站入口| 91福利区一区二区三区| 国产精品亚洲综合一区在线观看| 一区二区三区自拍| 久久午夜老司机| 欧美日韩电影在线| 成人动漫在线一区| 韩国女主播一区| 亚洲第一激情av| 国产精品久久久久毛片软件| 69堂国产成人免费视频| 99精品欧美一区二区三区小说 | 日韩欧美国产精品一区| 亚洲欧洲成人自拍| 精品国产精品网麻豆系列| 久久综合久久综合亚洲| 欧美激情一区二区在线| 国产精品卡一卡二| 亚洲精品成人在线| 天天av天天翘天天综合网色鬼国产| 五月婷婷久久丁香| 美女视频一区二区三区| 高清shemale亚洲人妖| 欧美老肥妇做.爰bbww| 日韩欧美在线综合网| 久久只精品国产| 亚洲欧美综合色| 午夜成人免费视频| 国内精品久久久久影院薰衣草 | 亚洲成人激情综合网| 日韩不卡一二三区| 岛国av在线一区| 日韩高清不卡一区二区| 久久久噜噜噜久噜久久综合| 欧美精品一区二区蜜臀亚洲| 日韩一级成人av| 宅男噜噜噜66一区二区66| 欧美美女网站色| 欧美人牲a欧美精品| 欧美三级乱人伦电影| 欧美色网站导航| 欧美日韩成人一区二区| 欧美另类videos死尸| 欧美一区二区三区四区视频 | 肉肉av福利一精品导航| 亚洲成a人v欧美综合天堂下载| 亚洲第一成年网| 日本亚洲欧美天堂免费| 免费成人在线网站| 久久99精品国产麻豆婷婷 | 精品国产免费久久| 久久伊人中文字幕| 国产精品久久久久一区二区三区共| 中文字幕av资源一区| 亚洲视频一二三区| 亚洲一区二区三区不卡国产欧美| 亚洲国产一区二区三区| 日本免费新一区视频 | 国产精品卡一卡二| 亚洲男人都懂的| 亚洲h在线观看| 久久精品国产一区二区三| 国产美女久久久久| 91免费小视频| 91精品国产色综合久久ai换脸| 精品久久久影院| 国产精品国产馆在线真实露脸| 亚洲欧美电影一区二区| 日本欧美韩国一区三区| 国产成人综合精品三级| 91老师国产黑色丝袜在线| 91精品在线免费观看| 国产精品天美传媒沈樵| 亚洲不卡av一区二区三区| 久久国产精品露脸对白| av网站一区二区三区| 欧美一级二级在线观看| 国产精品麻豆99久久久久久| 日韩电影在线观看一区| 北条麻妃一区二区三区| 日韩女优av电影| 欧美日韩一级黄| 亚洲电影激情视频网站|