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

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

?? peak_pci.c

?? socket can driver, for s3c2440 using sja100, enjoy it!
?? C
字號:
/* * Copyright (C) 2007 Wolfgang Grandegger <wg@grandegger.com> * * Derived from the PCAN project file driver/src/pcan_pci.c: * * Copyright (C) 2001-2006  PEAK System-Technik GmbH * * This program is free software; you can redistribute it and/or modify * it under the terms of the version 2 of the GNU General Public License * as published by the Free Software Foundation * * 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. */#include <linux/kernel.h>#include <linux/module.h>#include <linux/interrupt.h>#include <linux/netdevice.h>#include <linux/delay.h>#include <linux/pci.h>#include <linux/can.h>#include <linux/can/dev.h>#if LINUX_VERSION_CODE >= KERNEL_VERSION(2,6,16)#include <linux/io.h>#else#include <asm/io.h>#endif#include "sja1000.h"#define DRV_NAME  "peak_pci"MODULE_AUTHOR("Wolfgang Grandegger <wg@grandegger.com>");MODULE_DESCRIPTION("Socket-CAN driver for PEAK PCAN PCI cards");MODULE_SUPPORTED_DEVICE("PEAK PCAN PCI CAN card");MODULE_LICENSE("GPL v2");struct peak_pci {	int channel;	struct pci_dev *pci_dev;	struct net_device *slave_dev;	volatile void __iomem *conf_addr;};#define PEAK_PCI_SINGLE	     0	/* single channel device */#define PEAK_PCI_MASTER	     1	/* multi channel master device */#define PEAK_PCI_SLAVE	     2	/* multi channel slave device */#define PEAK_PCI_CAN_CLOCK   (16000000 / 2)#define PEAK_PCI_CDR_SINGLE  (CDR_CBP | CDR_CLKOUT_MASK | CDR_CLK_OFF)#define PEAK_PCI_CDR_MASTER  (CDR_CBP | CDR_CLKOUT_MASK)#define PEAK_PCI_OCR 	     OCR_TX0_PUSHPULL/* * Important PITA registers */#define PITA_ICR	     0x00	/* interrupt control register */#define PITA_GPIOICR	     0x18	/* general purpose I/O interface					   control register */#define PITA_MISC	     0x1C	/* miscellanoes register */#define PCI_CONFIG_PORT_SIZE 0x1000	/* size of the config io-memory */#define PCI_PORT_SIZE        0x0400	/* size of a channel io-memory */#define PEAK_PCI_VENDOR_ID   0x001C	/* the PCI device and vendor IDs */#define PEAK_PCI_DEVICE_ID   0x0001static struct pci_device_id peak_pci_tbl[] = {	{PEAK_PCI_VENDOR_ID, PEAK_PCI_DEVICE_ID, PCI_ANY_ID, PCI_ANY_ID,},	{0,}};MODULE_DEVICE_TABLE(pci, peak_pci_tbl);static u8 peak_pci_read_reg(struct net_device *dev, int port){	u8 val;	val = readb((const volatile void __iomem *)		    (dev->base_addr + (port << 2)));	return val;}static void peak_pci_write_reg(struct net_device *dev, int port, u8 val){	writeb(val, (volatile void __iomem *)	       (dev->base_addr + (port << 2)));}static void peak_pci_post_irq(struct net_device *dev){	struct sja1000_priv *priv = netdev_priv(dev);	struct peak_pci *board = priv->priv;	u16 icr_low;	/* Select and clear in Pita stored interrupt */	icr_low = readw(board->conf_addr + PITA_ICR);	if (board->channel == PEAK_PCI_SLAVE) {		if (icr_low & 0x0001)			writew(0x0001, board->conf_addr + PITA_ICR);	} else {		if (icr_low & 0x0002)			writew(0x0002, board->conf_addr + PITA_ICR);	}}static void peak_pci_del_chan(struct net_device *dev, int init_step){	struct sja1000_priv *priv = netdev_priv(dev);	struct peak_pci *board;	u16 icr_high;	if (!dev)		return;	priv = netdev_priv(dev);	if (!priv)		return;	board = priv->priv;	if (!board)		return;	switch (init_step) {	case 0:		/* Full cleanup */		printk(KERN_INFO "Removing %s device %s\n",		       DRV_NAME, dev->name);		unregister_sja1000dev(dev);	case 4:		icr_high = readw(board->conf_addr + PITA_ICR + 2);		if (board->channel == PEAK_PCI_SLAVE)			icr_high &= ~0x0001;		else			icr_high &= ~0x0002;		writew(icr_high, board->conf_addr + PITA_ICR + 2);	case 3:		iounmap((void *)dev->base_addr);	case 2:		if (board->channel != PEAK_PCI_SLAVE)			iounmap((void *)board->conf_addr);	case 1:		free_sja1000dev(dev);		break;	}}static int peak_pci_add_chan(struct pci_dev *pdev, int channel,			     struct net_device **master_dev){	struct net_device *dev;	struct sja1000_priv *priv;	struct peak_pci *board;	u16 icr_high;	unsigned long addr;	int err, init_step;	dev = alloc_sja1000dev(sizeof(struct peak_pci));	if (dev == NULL)		return -ENOMEM;	init_step = 1;	priv = netdev_priv(dev);	board = priv->priv;	board->pci_dev = pdev;	board->channel = channel;	if (channel != PEAK_PCI_SLAVE) {		addr = pci_resource_start(pdev, 0);		board->conf_addr = ioremap(addr, PCI_CONFIG_PORT_SIZE);		if (board->conf_addr == 0) {			err = -ENODEV;			goto failure;		}		init_step = 2;		/* Set GPIO control register */		writew(0x0005, board->conf_addr + PITA_GPIOICR + 2);		/* Enable single or dual channel */		if (channel == PEAK_PCI_MASTER)			writeb(0x00, board->conf_addr + PITA_GPIOICR);		else			writeb(0x04, board->conf_addr + PITA_GPIOICR);		/* Toggle reset */		writeb(0x05, board->conf_addr + PITA_MISC + 3);		mdelay(5);		/* Leave parport mux mode */		writeb(0x04, board->conf_addr + PITA_MISC + 3);	} else {		struct sja1000_priv *master_priv = netdev_priv(*master_dev);		struct peak_pci *master_board = master_priv->priv;		master_board->slave_dev = dev;		board->conf_addr = master_board->conf_addr;	}	addr = pci_resource_start(pdev, 1);	if (channel == PEAK_PCI_SLAVE)		addr += PCI_PORT_SIZE;	dev->base_addr = (unsigned long)ioremap(addr, PCI_PORT_SIZE);	if (dev->base_addr == 0) {		err = -ENOMEM;		goto failure;	}	init_step = 3;	priv->read_reg = peak_pci_read_reg;	priv->write_reg = peak_pci_write_reg;	priv->post_irq = peak_pci_post_irq;	priv->can.bittiming.clock = PEAK_PCI_CAN_CLOCK;	priv->ocr = PEAK_PCI_OCR;	if (channel == PEAK_PCI_MASTER)		priv->cdr = PEAK_PCI_CDR_MASTER;	else		priv->cdr = PEAK_PCI_CDR_SINGLE;	/* Register and setup interrupt handling */	dev->irq = pdev->irq;	icr_high = readw(board->conf_addr + PITA_ICR + 2);	if (channel == PEAK_PCI_SLAVE)		icr_high |= 0x0001;	else		icr_high |= 0x0002;	writew(icr_high, board->conf_addr + PITA_ICR + 2);	init_step = 4;	SET_NETDEV_DEV(dev, &pdev->dev);	/* Register SJA1000 device */	err = register_sja1000dev(dev);	if (err) {		printk(KERN_ERR "Registering %s device failed (err=%d)\n",		       DRV_NAME, err);		goto failure;	}	if (channel != PEAK_PCI_SLAVE)		*master_dev = dev;	printk(KERN_INFO "%s: %s at base_addr=%#lx conf_addr=%p irq=%d\n",	       DRV_NAME, dev->name, dev->base_addr, board->conf_addr, dev->irq);	return 0;failure:	peak_pci_del_chan(dev, init_step);	return err;}static int __devinit peak_pci_init_one(struct pci_dev *pdev,				       const struct pci_device_id *ent){	int err;	u16 sub_sys_id;	struct net_device *master_dev = NULL;	printk(KERN_INFO "%s: initializing device %04x:%04x\n",	       DRV_NAME, pdev->vendor, pdev->device);	err = pci_enable_device(pdev);	if (err)		goto failure;	err = pci_request_regions(pdev, DRV_NAME);	if (err)		goto failure;	err = pci_read_config_word(pdev, 0x2e, &sub_sys_id);	if (err)		goto failure_cleanup;	err = pci_write_config_word(pdev, 0x44, 0);	if (err)		goto failure_cleanup;	if (sub_sys_id > 3) {		err = peak_pci_add_chan(pdev,					PEAK_PCI_MASTER, &master_dev);		if (err)			goto failure_cleanup;		err = peak_pci_add_chan(pdev,					PEAK_PCI_SLAVE, &master_dev);		if (err)			goto failure_cleanup;	} else {		err = peak_pci_add_chan(pdev, PEAK_PCI_SINGLE,					     &master_dev);		if (err)			goto failure_cleanup;	}	pci_set_drvdata(pdev, master_dev);	return 0;failure_cleanup:	if (master_dev)		peak_pci_del_chan(master_dev, 0);	pci_release_regions(pdev);failure:	return err;}static void __devexit peak_pci_remove_one(struct pci_dev *pdev){	struct net_device *dev = pci_get_drvdata(pdev);	struct sja1000_priv *priv = netdev_priv(dev);	struct peak_pci *board = priv->priv;	if (board->slave_dev)		peak_pci_del_chan(board->slave_dev, 0);	peak_pci_del_chan(dev, 0);	pci_release_regions(pdev);	pci_disable_device(pdev);	pci_set_drvdata(pdev, NULL);}static struct pci_driver peak_pci_driver = {	.name = DRV_NAME,	.id_table = peak_pci_tbl,	.probe = peak_pci_init_one,	.remove = __devexit_p(peak_pci_remove_one),};static int __init peak_pci_init(void){	return pci_register_driver(&peak_pci_driver);}static void __exit peak_pci_exit(void){	pci_unregister_driver(&peak_pci_driver);}module_init(peak_pci_init);module_exit(peak_pci_exit);

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美视频一区二区三区| 国产精品理伦片| 国产精品乱码一区二区三区软件 | 亚洲6080在线| 国产成人综合亚洲91猫咪| 欧美男男青年gay1069videost| 国产丝袜在线精品| 日韩av一区二区在线影视| 97久久超碰精品国产| 久久精品欧美日韩| 久久99日本精品| 欧美乱熟臀69xxxxxx| 亚洲人成电影网站色mp4| 国产精品乡下勾搭老头1| 欧美一区二区三区婷婷月色| 一区二区三区丝袜| 色乱码一区二区三区88| 欧美高清在线视频| 国产99久久久国产精品潘金| 欧美成人a∨高清免费观看| 亚洲黄色尤物视频| 91麻豆精东视频| 亚洲日韩欧美一区二区在线| 懂色av中文字幕一区二区三区 | 国产精品乱码一区二区三区软件| 久久精品国产精品青草| 欧美日韩在线播放| 亚洲综合激情另类小说区| 91免费在线看| 亚洲男帅同性gay1069| 成人激情小说乱人伦| 国产欧美精品一区二区色综合朱莉| 麻豆精品国产91久久久久久| 欧美一区二区三区免费视频| 婷婷六月综合网| 欧美一区二区黄色| 美国十次综合导航| 精品国产免费视频| 国产伦精品一区二区三区视频青涩| 欧美大黄免费观看| 国产成人精品亚洲日本在线桃色| 亚洲精品一区二区三区蜜桃下载| 激情综合色综合久久综合| 国产亚洲精品aa午夜观看| 国产·精品毛片| 亚洲男人的天堂一区二区| 色综合久久久久| 午夜国产不卡在线观看视频| 欧美一区二区三区免费在线看| 久久成人免费电影| 亚洲国产激情av| 一本大道久久a久久综合婷婷| 亚洲毛片av在线| 日韩一卡二卡三卡四卡| 国产精品1区2区| 亚洲精品国产a久久久久久| 欧美伦理电影网| 福利91精品一区二区三区| 亚洲人成网站影音先锋播放| 欧美揉bbbbb揉bbbbb| 麻豆精品在线播放| 国产精品黄色在线观看| 欧美色视频在线| 国产精品 日产精品 欧美精品| 国产精品久久福利| 欧美一区二区三区免费在线看 | 青青青伊人色综合久久| 久久精品一区二区三区不卡 | 日韩欧美你懂的| 成人激情图片网| 爽好久久久欧美精品| 国产午夜精品在线观看| 欧美午夜精品理论片a级按摩| 蜜桃免费网站一区二区三区| 亚洲私人黄色宅男| 欧美成人三级在线| 色欧美日韩亚洲| 激情文学综合插| 一区二区在线免费观看| 久久亚洲综合色一区二区三区| 91色九色蝌蚪| 国产精品一线二线三线| 亚洲小说春色综合另类电影| 久久精品日韩一区二区三区| 欧美日韩精品一区二区天天拍小说| 国产 日韩 欧美大片| 水野朝阳av一区二区三区| 国产精品久久久久一区| 日韩一二三区视频| 在线观看不卡视频| 成人综合在线观看| 久久99精品国产.久久久久久| 中文字幕综合网| 国产午夜精品久久久久久久| 欧美日韩一级二级三级| 波多野洁衣一区| 激情五月播播久久久精品| 亚洲成a人片综合在线| 最新高清无码专区| 精品国产乱码久久| 欧美区视频在线观看| 91免费版在线| 成人黄动漫网站免费app| 激情深爱一区二区| 激情五月婷婷综合网| 老司机精品视频一区二区三区| 丝袜美腿亚洲综合| 亚洲综合精品久久| 亚洲欧美日韩在线不卡| 国产精品乱人伦中文| 久久久午夜精品理论片中文字幕| 日韩免费成人网| 欧美精品丝袜久久久中文字幕| 97超碰欧美中文字幕| 高清国产一区二区三区| 国产精品亚洲视频| 国产精品亚洲专一区二区三区 | 91丨porny丨户外露出| av激情综合网| www.av精品| 风间由美一区二区av101| 国产精品一区免费视频| 国产不卡免费视频| 成人高清伦理免费影院在线观看| 国产在线精品不卡| 国产成人精品免费网站| 国产精品一区二区三区乱码| 国产精品888| 懂色av一区二区夜夜嗨| eeuss鲁片一区二区三区在线看| 99视频精品在线| 欧美艳星brazzers| 日韩亚洲欧美一区| 久久九九久久九九| 一色屋精品亚洲香蕉网站| 一区二区激情小说| 日韩国产欧美在线观看| 国产一区二区三区香蕉| 国产aⅴ综合色| 色爱区综合激月婷婷| 欧美日韩一区不卡| 精品免费国产二区三区| 国产精品午夜电影| 亚洲成在人线在线播放| 男女视频一区二区| 成人av在线看| 91极品视觉盛宴| 久久免费精品国产久精品久久久久| 日本一区二区高清| 午夜精品一区在线观看| 国产福利不卡视频| 欧美少妇一区二区| 久久精品综合网| 亚洲福利一区二区三区| 国产在线国偷精品免费看| 在线视频你懂得一区二区三区| 制服.丝袜.亚洲.中文.综合| 国产日韩视频一区二区三区| 亚洲一区自拍偷拍| 狠狠色狠狠色综合日日91app| 91免费看视频| 精品日韩99亚洲| 亚洲制服丝袜在线| 国产91丝袜在线播放| 日韩一区二区三区在线视频| 国产精品视频一区二区三区不卡| 亚洲一区影音先锋| 国产精品99久久久久久久vr| 日本韩国欧美国产| 久久精品网站免费观看| 视频一区二区三区在线| 97成人超碰视| 日本一区二区久久| 久久国产三级精品| 欧美日韩在线电影| 亚洲男人的天堂网| 99久免费精品视频在线观看 | 久久久亚洲精品石原莉奈| 亚洲不卡一区二区三区| 99久久久久久| 欧美韩日一区二区三区| 国内精品自线一区二区三区视频| 欧美无乱码久久久免费午夜一区| 国产精品美女久久久久久久久久久 | 中文字幕亚洲区| 国产精品91一区二区| 欧美成人精精品一区二区频| 香蕉成人啪国产精品视频综合网| 成人av资源在线观看| 国产无遮挡一区二区三区毛片日本| 蜜臀av性久久久久蜜臀aⅴ| 欧美精品九九99久久| 亚洲福利视频导航| 欧美日韩视频第一区| 亚洲高清三级视频| 欧美卡1卡2卡| 视频一区视频二区在线观看| 欧美久久久久中文字幕| 亚洲va国产天堂va久久en| 欧美色倩网站大全免费|