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

? 歡迎來(lái)到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? isa_sja1000.c

?? canbus4linux,來(lái)自www.sourceforge.net
?? C
字號(hào):
/* * isa_sja1000.c * Copyright (c) 2003 Kirill Smelkov <smelkov@mph1.phys.spbu.ru> * * ... BLURB ABOUT HARDWARE... * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. *  * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. *  * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. *//* * two words about prefixes: * board_ prefix marks routines assotiated with the whole board * isa_sja1000_ prefix marks routines assotiated with some chip on the board */#include <linux/version.h>#include <linux/module.h>#include <linux/init.h>#include <linux/ioport.h>#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,5,67)#include <linux/interrupt.h>#endif#include <asm/io.h>#include "trace.h"#include "canbus4linux.h"#include "isa_sja1000.h"#ifdef MODULE_LICENSEMODULE_LICENSE("GPL");#endifstruct io_info {	unsigned long io_base;	unsigned long io_len;};struct board_info {	const char *name;	int  io_irq;		// irq line	long Fosc;			// oscillator frequency	u8   OCR;			// OCR (output control register) value specific for board	int  nchips;	struct io_info io_info[MAXCHIPS];};static const struct board_info boards_list[] = {//  name           irq   Fosc,		OCR,  nchips	{io_base, io_len} for each chip{	"can-200pc",	5,	16000000,	0x1b,	2,		{ {0x100, 0x20}, {0x120, 0x20} }	},// next two are for testing{	"c200-1",		5,	16000000,	0x1b,	1,		{ {0x100, 0x20}                }	},	// first channel of can-200pc{	"c200-2",		5,	16000000,	0x1b,	1,		{                {0x120, 0x20} }	},	// second channel of can-200pc{	NULL	}};// find specified board in the liststatic int find_board(const char * name){	int i=0;	while (boards_list[i].name) {		if ( !strcmp(name, boards_list[i].name) )			return i;		++i;	}	return -1;}#define MAXBOARDS	2static ISA_SJA1000_BOARD devices[MAXBOARDS];// *******************// * REGISTER ACCESS *// *******************static void isa_sja1000_writereg(void * data, u8 reg, u8 val){	ISA_SJA1000_CHIP * self = (ISA_SJA1000_CHIP *) data;	TRACE("writereg(0x%2.2x,0x%2.2x)", reg, val);	outb(val, self->io_base + reg);}static u8 isa_sja1000_readreg(void * data, u8 reg){	ISA_SJA1000_CHIP * self = (ISA_SJA1000_CHIP *) data;	u8 val;	val = inb(self->io_base + reg);	TRACE("readreg(0x%2.2x) = 0x%2.2x", reg, val);	return val;}// *** ?unneeded? _reset routines.../*static inline void isa_sja1000_reset_mode(ISA_SJA1000_CHIP * self){	u8 val = inb(self->io_base + 0);	u8 CR  = val | 0x01;	int tries=100;	while ( !(val & 0x01)) {		outb_p(CR, self->io_base + 0);		val = inb(self->io_base + 0);				if (--tries == 0) {			TRACE("can't reset sja1000... XXX: ?what can i do here?");			break;		}	};}static inline void isa_sja1000_operating_mode(ISA_SJA1000_CHIP * self){	u8 val = inb(self->io_base + 0);	u8 CR  = val & 0x3e;	// ? 1e	int tries=100;	while (val & 0x01) {		outb_p(CR, self->io_base + 0);		val = inb(self->io_base + 0);		if (--tries == 0) {			TRACE("can't put sja1000 into operating mode... XXX: ?what can i do here?");			break;		}	}}static void isa_sja1000_writereg_reset(void * data, u8 reg, u8 val){	ISA_SJA1000_CHIP * self = (ISA_SJA1000_CHIP *) data;	TRACE("DEPRECATED!");	TRACE("writereg_reset(0x%2.2x,0x%2.2x)", reg, val);	isa_sja1000_reset_mode(self);	outb(val, self->io_base + reg);	isa_sja1000_operating_mode(self);}static u8 isa_sja1000_readreg_reset(void * data, u8 reg){	ISA_SJA1000_CHIP * self = (ISA_SJA1000_CHIP *) data;	u8 ret;	isa_sja1000_reset_mode(self);	ret = inb(self->io_base + reg);	isa_sja1000_operating_mode(self);	TRACE("DEPRECATED!");	TRACE("readreg_reset(0x%2.2x) = 0x%2.2x", reg, ret);	return ret;}*/// ****************// * IRQ HANDLING *// ****************static int isa_sja1000_register_isr(void * data, sja1000_isr chip_isr, struct sja1000_admin * chip_isr_data){	ISA_SJA1000_CHIP * self = (ISA_SJA1000_CHIP *) data;	TRACE("register_isr()");	if (!self)		return -EINVAL;	self->chip_isr		= chip_isr;	self->chip_isr_data	= chip_isr_data;	return 0;}static int isa_sja1000_unregister_isr(void * data){	ISA_SJA1000_CHIP * self = (ISA_SJA1000_CHIP *) data;	TRACE("unregister_isr()");	if (!self)		return -EINVAL;	self->chip_isr		= 0;	self->chip_isr_data	= 0;	return 0;}// the whole board interrupt service routine#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,4)static irqreturn_t board_isr(int irq, void * dev_id, struct pt_regs * regs)#elsestatic void board_isr(int irq, void * dev_id, struct pt_regs * regs)#endif{	ISA_SJA1000_BOARD * self = (ISA_SJA1000_BOARD *) dev_id;	unsigned int i;	TRACE("isr()");	if (!self)#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,4)		return IRQ_NONE;#else		return;#endif	for (i=0;i<self->nchips;++i)		if (self->chips[i].chip_isr)			self->chips[i].chip_isr(&self->chips[i],self->chips[i].chip_isr_data);#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,4)		return IRQ_HANDLED;#else		return;#endif}// *****************// *  OPEN & CLOSE *// *****************static int isa_sja1000_open(void * data){	ISA_SJA1000_CHIP * self = (ISA_SJA1000_CHIP *) data;	int err;	TRACE("open()");//	spin_lock(&self->lock);	do {		if (self->open) {			err = -EBUSY;			break;		}		self->open++;		// NOTE: this is currently specific for my card (the wierd thing)		//       hardware reset is made via		isa_sja1000_writereg(self, 0x1e, 0x00);		// reset	} while (0);//	spin_unlock(&self->lock);		return 0;}static int isa_sja1000_close(void * data){//	ISA_SJA1000_CHIP * self = (ISA_SJA1000_CHIP *) data;	TRACE("close()");	return 0;}char * cards[MAXBOARDS];MODULE_PARM(cards,"1-" __MODULE_STRING(MAXBOARDS) "s");MODULE_PARM_DESC(cards, "specify (comma separated) CAN board models");// *************************// * MODULE INIT & CLEANUP *// *************************void __exit isa_sja1000_cleanup(void);int __init isa_sja1000_init(void){	int err=-ENODEV;	int num, i, minor;	int cards_idx[MAXBOARDS];	TRACE("init()");	if (!cards[0]) {		TRACE("you have to specify your card (cards parameter). giving up.");		return -ENODEV;	}	for (num=0;num<MAXBOARDS;++num)	{		if (!cards[num]) {			cards_idx[num] = -1;			break;		}		err = find_board(cards[num]);		if (err==-1) {			TRACE("card '%s' is not suppoprted.", cards[num]);			return -ENODEV;		}		cards_idx[num] = err;	}	for (num=0,minor=0; (cards_idx[num]!=-1 && num<MAXBOARDS) ;++num)	{		ISA_SJA1000_BOARD *       dev  = &devices[num];		const struct board_info * idev = &boards_list[cards_idx[num]];		unsigned int	io_irq;		struct sja1000_access access = {			pOpenCanDevice:				isa_sja1000_open,			pCloseCanDevice:			isa_sja1000_close,			pWriteToRegister:			isa_sja1000_writereg,			pReadFromRegister:			isa_sja1000_readreg,			pRegisterIsr:				isa_sja1000_register_isr,			pUnregisterIsr:				isa_sja1000_unregister_isr,			bCanChipsetFlags:			CANBUS_CFS_CAN_2_0_B | CANBUS_CFS_EXT_FRAME,			chipset_frequency:			idev->Fosc,			output_control_register:	idev->OCR		};		// io for all chips an the board		TRACE("requesting io...");		for (i=0;i<idev->nchips;++i) {			ISA_SJA1000_CHIP * chip = &dev->chips[i];			unsigned long	io_base;			unsigned long	io_len;			snprintf(chip->name, MAX_DEVICE_NAME_LENGTH, "%s[%i]", idev->name, i);			chip->num	= -1;			chip->lock	= SPIN_LOCK_UNLOCKED;			dev->nchips++;			io_base = idev->io_info[i].io_base;			io_len	= idev->io_info[i].io_len;			if (!request_region(io_base, io_len, chip->name)) {				TRACE("request_region(%lx,%lx) failed", io_base, io_len);				err=-EBUSY;				goto out;			}			chip->io_base = io_base;			chip->io_len  = io_len;			++minor;		}		// irq for the board		io_irq  = idev->io_irq;		TRACE("requesting irq...");		err = request_irq(io_irq, board_isr, 0 /* flags */, "isacan", dev);		if (err) {			TRACE("request_irq(%i) failed", io_irq);			goto out;		}		dev->io_irq = io_irq;		// register every chip on the board in the canbus4linux subsystem		for (i=0;i<dev->nchips;++i) {			ISA_SJA1000_CHIP * chip = &dev->chips[i];			TRACE("%s: registering device no.: %i ...", idev->name, i);			chip->num = sja1000_register_device(chip->name, CANBUS4LINUX_VERSION, chip, &access, 0, minor);			if (chip->num == -1) {				TRACE("sja1000_register_device() failed");				err = -ENOMEM;				goto out; // not enough memory to register this device			}		}		err = 0;	}out:	if (err)		isa_sja1000_cleanup();	return err;}void __exit isa_sja1000_cleanup(void){	int num, i;	TRACE("cleanup()");	for (num=0;num<MAXBOARDS;++num)	{		ISA_SJA1000_BOARD * dev = &devices[num];		if (!dev->nchips)			continue;		for (i=0; i<dev->nchips; ++i) {			ISA_SJA1000_CHIP * chip = &dev->chips[i];			if (chip->num!=-1)				chip->num = sja1000_unregister_device(chip->num);		}			if (dev->io_irq)			free_irq(dev->io_irq, dev);		for (i=0; i<dev->nchips; ++i) {			ISA_SJA1000_CHIP * chip = &dev->chips[i];			if (chip->io_base)				release_region(chip->io_base, chip->io_len);		}	}}module_init(isa_sja1000_init);module_exit(isa_sja1000_cleanup);MODULE_AUTHOR("Kirill Smelkov <smelkov@mph1.phys.spbu.ru>");MODULE_DESCRIPTION("CAN driver for generic SJA1000 based ISA card");// vim: ts=4

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
色综合久久天天综合网| 一二三区精品视频| 久久久噜噜噜久久中文字幕色伊伊 | 欧美日韩午夜在线视频| 91福利视频久久久久| 色香蕉成人二区免费| 欧洲人成人精品| 欧美在线观看你懂的| 精品视频免费在线| 91精品国产91久久久久久一区二区 | 日本午夜一区二区| 美女视频一区在线观看| 蜜桃视频在线观看一区二区| 久久精品av麻豆的观看方式| 麻豆精品在线播放| 国产成人在线影院| jizzjizzjizz欧美| 91成人在线精品| 欧美高清视频在线高清观看mv色露露十八| 欧美日韩亚洲综合一区| 日韩一卡二卡三卡四卡| 久久免费视频色| 国产精品大尺度| 亚洲一区日韩精品中文字幕| 人人狠狠综合久久亚洲| 国产一区二区毛片| 91在线码无精品| 欧美日韩在线综合| 欧美成人a∨高清免费观看| 国产午夜精品美女毛片视频| 亚洲色图视频网站| 午夜亚洲福利老司机| 久久99国产精品尤物| www.综合网.com| 欧美性大战久久久久久久蜜臀 | 一区二区在线观看免费视频播放 | 国产露脸91国语对白| 99riav久久精品riav| 欧美丰满少妇xxxxx高潮对白| 欧美电影免费提供在线观看| 国产精品久久久久久久浪潮网站 | 色综合久久久久综合| 51精品视频一区二区三区| 久久久久9999亚洲精品| 亚洲欧美另类久久久精品2019| 日产国产高清一区二区三区| 成人午夜伦理影院| 777午夜精品免费视频| 欧美国产日韩精品免费观看| 亚洲成人一区二区| 国产成人综合视频| 欧美日本一区二区三区| 国产亚洲人成网站| 午夜影视日本亚洲欧洲精品| 国产精品伊人色| 欧美日本在线视频| 国产精品传媒视频| 激情久久五月天| 欧美午夜精品久久久久久孕妇| 久久精品夜夜夜夜久久| 亚洲成精国产精品女| www.日本不卡| 精品国产区一区| 午夜欧美电影在线观看| 91色视频在线| 国产亚洲1区2区3区| 视频一区国产视频| 91香蕉视频黄| 国产日韩精品一区二区三区| 日本怡春院一区二区| 91捆绑美女网站| 国产偷国产偷亚洲高清人白洁| 午夜日韩在线观看| 日本高清不卡一区| 国产精品狼人久久影院观看方式| 日本欧美久久久久免费播放网| 色综合亚洲欧洲| 中文字幕欧美国产| 韩国成人精品a∨在线观看| 7777精品伊人久久久大香线蕉| 国产精品成人免费在线| 国产精品一区不卡| 精品国产91九色蝌蚪| 日韩av在线发布| 9191久久久久久久久久久| 亚洲综合久久久久| 日本道精品一区二区三区| 亚洲国产电影在线观看| 精品一二三四区| 欧美福利一区二区| 亚洲成av人片| 欧美日韩精品一区二区三区蜜桃 | 天堂av在线一区| 日本乱人伦aⅴ精品| 亚洲欧美日韩国产一区二区三区| 国产99久久久国产精品潘金网站| 久久久久亚洲蜜桃| 国内久久精品视频| 久久久亚洲午夜电影| 国产一区999| 久久久精品黄色| 国产精品77777| 久久久久久久久久久久久久久99| 精品亚洲成a人在线观看| 欧美成人猛片aaaaaaa| 久久aⅴ国产欧美74aaa| 欧美成人女星排行榜| 国产一区在线不卡| 国产蜜臀97一区二区三区| 懂色av一区二区三区蜜臀| 欧美国产国产综合| 不卡av免费在线观看| 亚洲欧美日韩在线不卡| 在线这里只有精品| 亚洲国产精品人人做人人爽| 51精品秘密在线观看| 精品一区二区三区免费观看| 2023国产精品自拍| 高清日韩电视剧大全免费| 中文字幕亚洲在| 欧美性生活一区| 青椒成人免费视频| 久久久国产精品麻豆| 97se狠狠狠综合亚洲狠狠| 一区二区三区在线视频免费| 欧美午夜精品一区二区三区| 日本在线不卡视频| 久久男人中文字幕资源站| 99v久久综合狠狠综合久久| 亚洲亚洲人成综合网络| 欧美大片拔萝卜| 国产91高潮流白浆在线麻豆| 亚洲欧美日韩国产综合在线| 欧美疯狂性受xxxxx喷水图片| 狠狠色丁香婷婷综合| 一区在线观看视频| 欧美久久久久久久久中文字幕| 久久99久久99小草精品免视看| 欧美性三三影院| 免费高清成人在线| 欧美亚洲图片小说| 强制捆绑调教一区二区| 久久久精品人体av艺术| 色婷婷av一区二区三区之一色屋| 日本韩国欧美在线| 久久久噜噜噜久久人人看| 免费欧美高清视频| 欧美日韩高清一区二区三区| 亚洲天堂av一区| 国产成人精品1024| 久久这里只精品最新地址| 午夜精品久久久久久久久久| 91久久国产综合久久| 日韩美女精品在线| 成人性生交大片免费| 国产无一区二区| 精油按摩中文字幕久久| 日韩三区在线观看| 婷婷国产v国产偷v亚洲高清| 欧美日韩一区二区在线视频| 亚洲卡通欧美制服中文| av中文字幕在线不卡| 国产亚洲人成网站| 国产激情精品久久久第一区二区| 精品国产不卡一区二区三区| 青青草91视频| 精品日韩欧美在线| 激情图片小说一区| 精品福利在线导航| 亚洲另类色综合网站| 日韩av不卡在线观看| 91麻豆精品国产91久久久资源速度 | 国产乱色国产精品免费视频| 久久先锋影音av鲁色资源 | 成人a区在线观看| 亚洲国产电影在线观看| jizzjizzjizz欧美| 亚洲乱码日产精品bd| 欧美视频在线观看一区| 日韩成人一区二区| 久久理论电影网| 成人av电影在线| 亚洲精品v日韩精品| 欧美日韩电影一区| 麻豆国产精品777777在线| 久久天堂av综合合色蜜桃网| 国产99一区视频免费| 一区二区三区在线免费视频| 欧美日韩精品专区| 极品少妇xxxx精品少妇偷拍| 国产情人综合久久777777| av网站免费线看精品| 亚洲一线二线三线视频| 欧美另类高清zo欧美| 国产精品影视网| 又紧又大又爽精品一区二区| 欧美一级在线视频| 成人a免费在线看| 肉色丝袜一区二区| 国产欧美久久久精品影院|