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

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

?? nsi.c

?? can bus driver code.
?? C
字號(hào):
/* nsi.c * Linux CAN-bus device driver. * Written by Arnaud Westenberg email:arnaud@wanadoo.nl * This software is released under the GPL-License. * Version 0.7  6 Aug 2001 */ #include <linux/autoconf.h>#if defined (CONFIG_MODVERSIONS) && !defined (MODVERSIONS)#define MODVERSIONS#endif#if defined (MODVERSIONS)#include <linux/modversions.h>#endif#include <linux/ioport.h>#include <linux/delay.h>#include <asm/errno.h>#include <asm/io.h>#include <asm/irq.h>#include "../include/main.h"#include "../include/nsi.h"#include "../include/i82527.h"int nsican_irq=-1;unsigned long nsican_base=0x0;/* IO_RANGE is the io-memory range that gets reserved, please adjust according * your hardware. Example: #define IO_RANGE 0x100 for i82527 chips or * #define IO_RANGE 0x20 for sja1000 chips. */#define IO_RANGE 0x04/* The function template_request_io is used to reserve the io-memory. If your * hardware uses a dedicated memory range as hardware control registers you * will have to add the code to reserve this memory as well. * The reserved memory starts at io_addr, wich is the module parameter io. */int nsi_request_io(unsigned long io_addr){	if (check_region(io_addr,IO_RANGE)) {		CANMSG("Unable to open port: 0x%lx\n",io_addr);		return -ENODEV;	}	else {		request_region(io_addr,IO_RANGE,DEVICE_NAME);		DEBUGMSG("Registered IO-memory: 0x%lx - 0x%lx\n", io_addr, 			 io_addr + IO_RANGE - 1);	}	return 0;}/* The function template_release_io is used to free the previously reserved  * io-memory. In case you reserved more memory, don't forget to free it here. */int nsi_release_io(unsigned long io_addr){	release_region(io_addr,IO_RANGE);	return 0;}/* The function template_reset is used to give a hardware reset. This is rather * hardware specific so I haven't included example code. Don't forget to check * the reset status of the chip before returning. */int nsi_reset(int card){    int i;     DEBUGMSG("Resetting nsi hardware ...\n");    /* we don't use template_write_register because we don't use the two first       register of the card but the third in order to make a hard reset */    outb (1, nsican_base + candevices_p[card]->res_addr);    outb (0, nsican_base + candevices_p[card]->res_addr);    for (i = 1; i < 1000; i++)	udelay (1000);            /* Check hardware reset status */     i=0;    while ( (nsi_read_register(nsican_base+iCPU) & iCPU_RST) && (i<=15)) {	udelay(20000);	i++;    }    if (i>=15) {	CANMSG("Reset status timeout!\n");	CANMSG("Please check your hardware.\n");	return -ENODEV;    }    else	DEBUGMSG("Chip0 reset status ok.\n");    return 0;}/* The function template_init_hw_data is used to initialize the hardware * structure containing information about the installed CAN-board. * RESET_ADDR represents the io-address of the hardware reset register. * NR_82527 represents the number of intel 82527 chips on the board. * NR_SJA1000 represents the number of philips sja1000 chips on the board. * The flags entry can currently only be PROGRAMMABLE_IRQ to indicate that * the hardware uses programmable interrupts. */#define RESET_ADDR 0x02#define NR_82527 1#define NR_SJA1000 0int nsi_init_hw_data(int card)      {	candevices_p[card]->res_addr=RESET_ADDR;	candevices_p[card]->nr_82527_chips=1;	candevices_p[card]->nr_sja1000_chips=0;	candevices_p[card]->flags |= PROGRAMMABLE_IRQ;	return 0;}/* The function template_init_chip_data is used to initialize the hardware * structure containing information about the CAN chips. * CHIP_TYPE represents the type of CAN chip. CHIP_TYPE can be "i82527" or * "sja1000". * The chip_base_addr entry represents the start of the 'official' memory map * of the installed chip. It's likely that this is the same as the io_addr * argument supplied at module loading time. * The clock argument holds the chip clock value in Hz. */#define CHIP_TYPE "i82527"int nsi_init_chip_data(int card, int chipnr){	candevices_p[card]->chip[chipnr]->chip_type=CHIP_TYPE;	candevices_p[card]->chip[chipnr]->chip_base_addr=	    candevices_p[card]->io_addr;	candevices_p[card]->chip[chipnr]->clock = 16000000;	nsican_irq=candevices_p[card]->chip[chipnr]->chip_irq;	        nsican_base=candevices_p[card]->chip[chipnr]->chip_base_addr;	candevices_p[card]->chip[chipnr]->int_cpu_reg = iCPU_DSC;	candevices_p[card]->chip[chipnr]->int_clk_reg = iCLK_SL1;	candevices_p[card]->chip[chipnr]->int_bus_reg = iBUS_CBY;	return 0;} /* The function template_init_obj_data is used to initialize the hardware * structure containing information about the different message objects on the * CAN chip. In case of the sja1000 there's only one message object but on the * i82527 chip there are 15. * The code below is for a i82527 chip and initializes the object base addresses * The entry obj_base_addr represents the first memory address of the message  * object. In case of the sja1000 obj_base_addr is taken the same as the chips * base address. * Unless the hardware uses a segmented memory map, flags can be set zero. */int nsi_init_obj_data(int chipnr, int objnr){	chips_p[chipnr]->msgobj[objnr]->obj_base_addr=	    chips_p[chipnr]->chip_base_addr+(objnr+1)*0x10;	chips_p[chipnr]->msgobj[objnr]->flags=0;		return 0;}/* The function template_program_irq is used for hardware that uses programmable * interrupts. If your hardware doesn't use programmable interrupts you should * not set the candevices_t->flags entry to PROGRAMMABLE_IRQ and leave this * function unedited. Again this function is hardware specific so there's no * example code. */int nsi_program_irq(int card){	return 0;}/* The function template_write_register is used to write to hardware registers * on the CAN chip. You should only have to edit this function if your hardware * uses some specific write process. */void nsi_write_register(unsigned char data, unsigned long address){    /* address is an absolute address */    /* the nsi card has two registers, the address register at 0x0       and the data register at 0x01 */    /* write the relative address on the eight LSB bits        and the data on the eight MSB bits in one time */    outw(address-nsican_base + (256 * data), nsican_base); }/* The function template_read_register is used to read from hardware registers * on the CAN chip. You should only have to edit this function if your hardware * uses some specific read process. */unsigned nsi_read_register(unsigned long address){    /* this is the same thing that the function write_register.       We use the two register, we write the address where we        want to read in a first time. In a second time we read the       data */    unsigned char ret;        disable_irq(nsican_irq);     outb(address-nsican_base, nsican_base);    ret=inb(nsican_base+1);    enable_irq(nsican_irq);     return ret;} /* !!! Don't change this function !!! */int nsi_register(struct hwspecops_t *hwspecops){	hwspecops->request_io = nsi_request_io;	hwspecops->release_io = nsi_release_io;	hwspecops->reset = nsi_reset;	hwspecops->init_hw_data = nsi_init_hw_data;	hwspecops->init_chip_data = nsi_init_chip_data;	hwspecops->init_obj_data = nsi_init_obj_data;	hwspecops->write_register = nsi_write_register;	hwspecops->read_register = nsi_read_register;	hwspecops->program_irq = nsi_program_irq;	return 0;}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美性三三影院| 91成人看片片| 欧美激情中文字幕| 成人激情校园春色| 日韩毛片精品高清免费| 在线观看不卡一区| 视频一区二区三区在线| 久久免费看少妇高潮| 国产传媒日韩欧美成人| 亚洲色图制服诱惑| 欧美美女网站色| 国模少妇一区二区三区| 中文字幕在线视频一区| 欧美三级电影在线观看| 久久国产免费看| 综合激情网...| 日韩欧美资源站| 成人av在线影院| 午夜a成v人精品| 欧美激情资源网| 欧美精品v日韩精品v韩国精品v| 国产伦精品一区二区三区视频青涩| 国产精品久久久久影院老司| 欧美蜜桃一区二区三区| 国产一区二区按摩在线观看| 亚洲综合视频在线| 久久人人爽爽爽人久久久| 91免费版pro下载短视频| 日韩激情一二三区| 综合久久一区二区三区| 精品乱人伦一区二区三区| 91视频一区二区三区| 美日韩一区二区三区| 亚洲视频1区2区| 精品国产一区二区亚洲人成毛片| 99精品欧美一区二区三区综合在线| 日韩制服丝袜av| 亚洲天堂a在线| www国产成人| 欧美日本免费一区二区三区| 成人av电影免费观看| 蜜桃久久精品一区二区| 亚洲人成精品久久久久| 久久精品视频一区| 欧美日韩亚洲综合一区| 99久久婷婷国产综合精品电影| 日韩激情av在线| 亚洲国产美国国产综合一区二区| 国产精品色婷婷久久58| 欧美大肚乱孕交hd孕妇| 欧美群妇大交群中文字幕| 色婷婷av一区二区三区大白胸| 国产成人精品网址| 老司机精品视频一区二区三区| 亚洲国产精品久久人人爱蜜臀| 中文一区二区在线观看| 欧美精品一区二区三区高清aⅴ| 欧美日韩精品专区| 91精品办公室少妇高潮对白| 成人永久免费视频| 国产成人啪免费观看软件| 精品夜夜嗨av一区二区三区| 日韩精品乱码免费| 日韩精品乱码免费| 丝袜亚洲精品中文字幕一区| 亚洲自拍欧美精品| 樱花草国产18久久久久| 亚洲欧美激情小说另类| 国产精品免费久久| 国产精品久久久久四虎| 国产精品美女久久久久久2018| 久久久久99精品国产片| 久久免费午夜影院| 国产日韩亚洲欧美综合| 久久精品视频免费| 日本一区二区三区在线不卡| 国产欧美一区二区精品性| 久久久久国产精品麻豆| 中文字幕第一区综合| 中文字幕成人av| 亚洲免费在线视频| 亚洲主播在线播放| 水蜜桃久久夜色精品一区的特点| 亚洲超碰97人人做人人爱| 天堂成人免费av电影一区| 免费观看一级特黄欧美大片| 久久国产综合精品| 国产精品一区二区三区99| 不卡视频在线观看| 91麻豆免费视频| 欧美精品1区2区| 精品电影一区二区三区| 国产情人综合久久777777| 亚洲欧美色图小说| 亚洲一本大道在线| 久久成人麻豆午夜电影| 国产91清纯白嫩初高中在线观看| 91婷婷韩国欧美一区二区| 欧美在线一区二区| 精品久久国产老人久久综合| 国产精品日韩精品欧美在线| 国产精品传媒在线| 亚洲成人第一页| 国产精品亚洲人在线观看| av激情亚洲男人天堂| 欧美精品乱码久久久久久按摩 | 99视频精品免费视频| 成人app网站| 欧美中文字幕一区二区三区| 亚洲福利一二三区| 一区二区三区在线免费| 男男成人高潮片免费网站| 国内久久精品视频| 日本高清不卡aⅴ免费网站| 欧美一区二区精品在线| 久久精品亚洲麻豆av一区二区| 亚洲视频一区在线观看| 麻豆中文一区二区| 一本久道久久综合中文字幕| 这里只有精品99re| 国产精品视频一二三区| 日韩精品每日更新| 岛国一区二区三区| 91精品视频网| 亚洲欧美日韩国产一区二区三区| 免费看欧美女人艹b| 日本乱人伦一区| 久久精品亚洲精品国产欧美 | 欧美国产欧美综合| 日日夜夜免费精品视频| 91在线云播放| 久久丝袜美腿综合| 爽好久久久欧美精品| 9i看片成人免费高清| 久久亚洲二区三区| 视频精品一区二区| 在线观看国产日韩| 日韩一区欧美小说| 国内成人免费视频| 日韩午夜av电影| 亚洲国产一区二区三区| 色综合色狠狠天天综合色| 欧美激情一二三区| 激情偷乱视频一区二区三区| 69精品人人人人| 亚洲成人资源网| 在线亚洲高清视频| 亚洲激情在线播放| 99精品欧美一区| 中文字幕五月欧美| 岛国av在线一区| 国产欧美精品一区二区三区四区 | 日本高清不卡一区| 亚洲日本va在线观看| 丁香一区二区三区| 久久精品夜色噜噜亚洲aⅴ| 韩国三级在线一区| 日韩免费成人网| 日本女优在线视频一区二区| 欧美系列一区二区| 一级女性全黄久久生活片免费| 91在线视频观看| 中文字幕中文字幕中文字幕亚洲无线| 国产成人亚洲综合色影视| 久久婷婷一区二区三区| 国产激情精品久久久第一区二区 | 久久久久久久久99精品| 国产精品资源站在线| 国产亚洲欧美中文| 国产99一区视频免费| 国产精品免费aⅴ片在线观看| 国产成人精品www牛牛影视| 国产精品少妇自拍| 91婷婷韩国欧美一区二区| 一区二区成人在线视频| 欧美视频一区二区三区四区| 天堂影院一区二区| 精品欧美一区二区在线观看| 国产在线视频不卡二| 亚洲国产精品精华液ab| 99久久婷婷国产综合精品 | 日韩不卡手机在线v区| 日韩欧美你懂的| 国产高清精品久久久久| 亚洲欧美国产高清| 在线成人小视频| 国产一区二区三区在线观看免费视频 | 欧美一区日韩一区| 久久国产精品99久久人人澡| 国产亚洲精品7777| 99久久婷婷国产| 日韩av一区二区三区四区| 久久综合av免费| a亚洲天堂av| 日本欧洲一区二区| 国产女同互慰高潮91漫画| 色网综合在线观看| 狠狠色丁香婷婷综合久久片| 亚洲欧美综合网| 日韩一区二区三区在线|