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

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

?? s3c2410_can_drv.c

?? CAN總線驅(qū)動程序和測試程序
?? C
字號:
/

#include <linux/config.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sched.h>
#include <linux/interrupt.h>    /* for in_interrupt */
#include <linux/timer.h>
#include <linux/init.h>
#include <linux/delay.h>        /* for udelay */
#include <linux/modversions.h>
#include <linux/version.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/hardware.h>

#include <asm/uaccess.h>

#include "can_bus.h"


#define IRQ_BUTTON_CTL 		IRQ_EINT19


#define canbus_MAJOR    98
#define DEVICE_NAME "can_bus"


#define IRQ_CAN_BUS IRQ_EINT2
#define GPIO_CAN_BUS_EINT2           (GPIO_MODE_ALT0 | GPIO_PULLUP_EN | GPIO_F2) //For ringing detect


#define DATA_GONE       1
#define DATA_NOT_GONE   0

static int READ_DATA_STATUS = DATA_NOT_GONE;

wait_queue_head_t       CAN_wq;	//define the wait queue

devfs_handle_t  dev_handle;     /* register handle to store device fs */

static void CAN_BUS_interrupt(int nr, void *devid, struct pt_regs *regs);
static int CAN_BUS_temp_count=0;


//define for the cpld
static int CPLD_CTL_ADDR;
static int XGPIO_OUT_ADDR;
static int ADDR_SJA1000_ADDR;
static int ADDR_SJA1000_DATA;

ssize_t canbus_read (struct file * file ,char * buf, size_t count, loff_t * f_ops)
{	
	int ret,i;
	char CAN_BUS_BUF[11];
        DECLARE_WAITQUEUE(wait, current);	// declare the wait queue
	#ifdef BUTTON_DEBUG
        printk ("canbus_read\n");
        #endif

	enable_irq(IRQ_CAN_BUS);
	READ_DATA_STATUS = DATA_GONE;	//If you don't do this ,the interrupt may come before you begain to read,and
					//it may die here.
	sleep_on(&CAN_wq);
	disable_irq(IRQ_CAN_BUS);
	#ifdef BUTTON_DEBUG
        printk("read interrupt\n");
        #endif
	
	// Read the data
        CAN_BUS_BUF[1] = read_can_reg(RxBuffer1);
        CAN_BUS_BUF[2] = read_can_reg(RxBuffer2);
        CAN_BUS_BUF[3] = read_can_reg(RxBuffer3);
        CAN_BUS_BUF[4] = read_can_reg(RxBuffer4);
        CAN_BUS_BUF[5] = read_can_reg(RxBuffer5);
        CAN_BUS_BUF[6] = read_can_reg(RxBuffer6);
        CAN_BUS_BUF[7] = read_can_reg(RxBuffer7);
        CAN_BUS_BUF[8] = read_can_reg(RxBuffer8);
        CAN_BUS_BUF[9] = read_can_reg(RxBuffer9);
        CAN_BUS_BUF[10] = read_can_reg(RxBuffer10);

        write_can_reg(0x04, CommandReg);


//******************************************************************
        copy_to_user(buf,CAN_BUS_BUF,11);

        return 0 ;
}


ssize_t canbus_write (struct file * file ,const char * buf, size_t count, loff_t * f_ops)
{
	#ifdef LIDUO_CAN_DEBUG
                printk ("canbus_write [ --kernel--]\n");
        #endif


        write_can_reg(buf[1], TxBuffer1);
        write_can_reg(buf[2], TxBuffer2);
        write_can_reg(buf[3], TxBuffer3);
        write_can_reg(buf[4] , TxBuffer4);
        write_can_reg(buf[5] , TxBuffer5);
        write_can_reg(buf[6] , TxBuffer6);
        write_can_reg(buf[7] , TxBuffer7);
        write_can_reg(buf[8] , TxBuffer8);
        write_can_reg(buf[9] , TxBuffer9);
        write_can_reg(buf[10] , TxBuffer10);

        write_can_reg(0x01, CommandReg);

        return 0;

}

ssize_t canbus_ioctl (struct inode * inode ,struct file * file, unsigned int cmd, long data)
{
     
        return 0;
}

ssize_t canbus_open (struct inode * inode ,struct file * file)
{
        int ret;

        #ifdef BUTTON_DEBUG
        printk ("canbus_open\n");
        #endif

        MOD_INC_USE_COUNT;

        
        init_waitqueue_head(&CAN_wq);	//initialize the queue

        return 0;
}

ssize_t canbus_release (struct inode  * inode ,struct file * file)
{
       

        MOD_DEC_USE_COUNT;

        return 0;
}



// -------------------------------------------------
struct file_operations CAN_ctl_ops ={


        open:           canbus_open,

        read:           canbus_read,

        write:          canbus_write,

        ioctl:          canbus_ioctl,

        release:        canbus_release,

};

static void CAN_BUS_interrupt(int nr, void *devid, struct pt_regs *regs)
{

      
        #ifdef BUTTON_DEBUG
        printk ("canbus_interrupt\n");
        printk(".....StatusReg is %x\n", read_can_reg(StatusReg));
        printk(".....InterruptReg is %x\n", read_can_reg(InterruptReg));
        printk(".....ControlReg is %x\n", read_can_reg(ControlReg));
	#endif

	read_can_reg(StatusReg);
	read_can_reg(InterruptReg);
	read_can_reg(ControlReg);
	

        if (READ_DATA_STATUS == DATA_GONE)
        {
                READ_DATA_STATUS = DATA_NOT_GONE;
	#ifdef  DEBUG
                printk("INT call read!\n");
	#endif
	        wake_up(&CAN_wq);

        }

}

int init_sja1000(void)
{

        int i;

        printk("ControlReg is %x\n", read_can_reg(ControlReg));
        write_can_reg(0x01, ControlReg);
        printk("ControlReg is %x\n", read_can_reg(ControlReg));

        printk("StatusReg is %x\n", read_can_reg(StatusReg));

        udelay(10);


        printk("ClockDivideReg is %x\n", read_can_reg(ClockDivideReg));
        write_can_reg(0x48, ClockDivideReg);
        printk("ClockDivideReg is %x\n", read_can_reg(ClockDivideReg));

        printk("StatusReg is %x\n", read_can_reg(StatusReg));

        udelay(10);


        printk("AcceptCodeReg is %x\n", read_can_reg(AcceptCodeReg));
        write_can_reg(0, AcceptCodeReg);
        printk("AcceptCodeReg is %x\n", read_can_reg(AcceptCodeReg));

        printk("AcceptMaskReg is %x\n", read_can_reg(AcceptMaskReg));
        write_can_reg(0xff, AcceptMaskReg);
        printk("AcceptMaskReg is %x\n", read_can_reg(AcceptMaskReg));

        printk("BusTiming0Reg is %x\n", read_can_reg(BusTiming0Reg));
        write_can_reg(0x85, BusTiming0Reg);
        printk("BusTiming0Reg is %x\n", read_can_reg(BusTiming0Reg));

        printk("BusTiming1Reg is %x\n", read_can_reg(BusTiming1Reg));
        write_can_reg(0xb4, BusTiming1Reg);
        printk("BusTiming1Reg is %x\n", read_can_reg(BusTiming1Reg));

        printk("OutControlReg is %x\n", read_can_reg(OutControlReg));
        write_can_reg(0x1a, OutControlReg);
        printk("OutControlReg is %x\n", read_can_reg(OutControlReg));

        printk("ControlReg is %x\n", read_can_reg(ControlReg));
        write_can_reg(0x1e, ControlReg);
        printk("ControlReg is %x\n", read_can_reg(ControlReg));

	udelay(10);

        printk("StatusReg is %x\n", read_can_reg(StatusReg));

        udelay(10);


        return 0;

}

     

static int __init HW_CAN_CTL_init(void)
{
    int ret = -ENODEV;
    int delay ;


        unsigned int cpld_ctl_data = 0;

        
        char can_data;
        int i;
        char temp_rw_addr;
       
        CAN_BUS_temp_count=0;

        // set bus width
        BWSCON = (BWSCON & ~(BWSCON_ST5 | BWSCON_WS5 | BWSCON_DW5)) | (BWSCON_ST5 | BWSCON_WS5 | BWSCON_DW(5, BWSCON_DW_8));
        //BANKCON5= BANKCON_Tacs0 | BANKCON_Tcos4 | BANKCON_Tacc14 | BANKCON_Toch1 | BANKCON_Tcah4 | BANKCON_Tacp6 | BANKCON_PMC1;


        // ---------------------------------------------------------------------------

	// ----------------- add for can bus ctl , cpld init
        CPLD_CTL_ADDR   = ioremap(0x21000000,0x0f);
        XGPIO_OUT_ADDR  = ioremap(0x21400000,0x0f);
        //printk("XGPIO_OUT_ADDR = %x\n",XGPIO_OUT_ADDR);

        // set cpld, connect can bus interrupt pin to cpu
        cpld_ctl_data = inw(CPLD_CTL_ADDR);
       
        cpld_ctl_data |= CAN_BUS_INT_ENABLE;

        

        outw(cpld_ctl_data,CPLD_CTL_ADDR);

        cpld_ctl_data = inw(CPLD_CTL_ADDR);

        outw(cpld_ctl_data|0x20, CPLD_CTL_ADDR);

        cpld_ctl_data = inw(CPLD_CTL_ADDR);

        


        // set cpld, let xgpio22 output = 1, set the sja1000 work in Intel mode
        cpld_ctl_data = inw(XGPIO_OUT_ADDR);
       

        cpld_ctl_data |= CAN_BUS_MODE;

        

        outw(cpld_ctl_data,XGPIO_OUT_ADDR);
        // -----------------

        ADDR_SJA1000_ADDR = ioremap(0x28000002,0x01);
        ADDR_SJA1000_DATA = ioremap(0x28000003,0x01);

        printk("ADDR_SJA1000_ADDR = %x\n",ADDR_SJA1000_ADDR);
        printk("ADDR_SJA1000_DATA = %x\n",ADDR_SJA1000_DATA);

//*************************************************************************************************************
		

        set_external_irq(IRQ_CAN_BUS, EXT_FALLING_EDGE, GPIO_PULLUP_EN);
	set_gpio_ctrl(GPIO_CAN_BUS_EINT2);
        ret = devfs_register_chrdev(canbus_MAJOR, DEVICE_NAME, &CAN_ctl_ops);

        if( ret < 0 )
        {
                printk (" s3c2410: init_module failed with %d\n", ret);
                return ret;
        }
        else
        {
                printk(" S3c2410 canbus register success!!!\n");
        }

        dev_handle = devfs_register( NULL, DEVICE_NAME, DEVFS_FL_DEFAULT, canbus_MAJOR, 0, S_IFCHR, &CAN_ctl_ops, NULL);
        
	ret = request_irq(IRQ_CAN_BUS, CAN_BUS_interrupt, SA_INTERRUPT, "CAN_BUS", NULL);
        
	if (ret)
        {
                printk(KERN_INFO "request CANBUS IRQ failed (%d)\n", IRQ_CAN_BUS);
                return ret;
        }

        disable_irq(IRQ_BUTTON_CTL);

        #ifdef BUTTON_DEBUG
        printk("ret=%d\n",ret);
        #endif
	
	init_sja1000();

        return ret;
}




static int __init s3c2410_CAN_CTL_init(void)
{
    int  ret = -ENODEV;

    ret = HW_CAN_CTL_init();
    if (ret)
      return ret;
    return 0;

}



static void __exit cleanup_can_ctl(void)
{
	#ifdef BUTTON_DEBUG
        printk ("cleanup_canbus\n");
        #endif

        free_irq(IRQ_CAN_BUS, NULL);
	devfs_unregister_chrdev (canbus_MAJOR, DEVICE_NAME );
        devfs_unregister (dev_handle);

}


MODULE_DESCRIPTION("canbus control module");
MODULE_LICENSE("GPL");

module_init(s3c2410_CAN_CTL_init);
module_exit(cleanup_can_ctl);

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品国产精品国产专区不蜜| 国产精品综合久久| 国产一区二区不卡老阿姨| 色婷婷久久综合| 久久先锋影音av鲁色资源| 亚洲美腿欧美偷拍| 国产精品一区二区三区四区| 欧美日韩一区二区三区免费看| 国产农村妇女毛片精品久久麻豆| 日韩精品电影一区亚洲| 97se亚洲国产综合在线| 337p日本欧洲亚洲大胆精品| 性感美女久久精品| 日本精品一区二区三区四区的功能| 久久这里只有精品6| 美洲天堂一区二卡三卡四卡视频| 在线观看日韩一区| 亚洲精品中文在线影院| 福利一区在线观看| 久久久一区二区三区捆绑**| 亚洲成人av福利| 欧美综合视频在线观看| 中文字幕一区二区三区在线不卡 | 岛国一区二区三区| 久久久久久久久一| 国产老妇另类xxxxx| 精品国内二区三区| 免费观看一级欧美片| 欧美一区二区三区视频在线观看| 一区二区三区**美女毛片| 在线免费av一区| 亚洲国产精品久久久男人的天堂 | 亚洲成av人片www| 欧美日韩国产色站一区二区三区| 一区二区三区中文字幕精品精品| 色综合中文字幕国产 | 欧美日韩国产一二三| 亚洲一区二区三区影院| 在线看不卡av| 日日夜夜精品视频天天综合网| 欧美精品久久天天躁| 肉肉av福利一精品导航| 日韩手机在线导航| 国产一区二区在线视频| 国产日韩欧美激情| 91麻豆6部合集magnet| 樱桃国产成人精品视频| 4438x亚洲最大成人网| 麻豆国产欧美日韩综合精品二区| 26uuu精品一区二区| 成人影视亚洲图片在线| 亚洲综合激情小说| 欧美一区二区久久久| 国产精品中文有码| 综合激情网...| 欧美一区二区三区在线观看| 精品一区二区三区在线观看| 国产欧美精品一区aⅴ影院| 97se亚洲国产综合自在线观| 日精品一区二区三区| 久久久高清一区二区三区| av综合在线播放| 日韩av在线发布| 国产精品五月天| 欧美精品tushy高清| 国产成人综合在线播放| 亚洲国产日日夜夜| 国产视频一区在线播放| 欧洲精品一区二区三区在线观看| 蜜桃一区二区三区在线| 中文字幕字幕中文在线中不卡视频| 欧美剧情电影在线观看完整版免费励志电影 | 欧美自拍偷拍一区| 韩国毛片一区二区三区| 亚洲午夜私人影院| 国产亚洲精久久久久久| 欧美吞精做爰啪啪高潮| 国产精品原创巨作av| 一区二区三区日韩欧美精品| 精品国产91九色蝌蚪| 欧美日韩中文字幕一区二区| 黑人精品欧美一区二区蜜桃| 亚洲国产精品一区二区久久| 亚洲国产高清不卡| 欧美电视剧免费全集观看| 色88888久久久久久影院按摩| 国内欧美视频一区二区| 亚洲午夜在线视频| 国产精品不卡在线| 久久综合九色综合97婷婷| 欧美电影在哪看比较好| 91麻豆免费看片| 成人综合婷婷国产精品久久蜜臀| 免费av成人在线| 亚洲6080在线| 亚洲自拍另类综合| 亚洲男帅同性gay1069| 亚洲国产精品传媒在线观看| 欧美r级在线观看| 欧美人xxxx| 欧美喷潮久久久xxxxx| 色综合久久综合网97色综合| 岛国av在线一区| 国产jizzjizz一区二区| 久久 天天综合| 老司机免费视频一区二区| 人禽交欧美网站| 免费在线观看一区二区三区| 亚洲国产日韩精品| 亚洲大尺度视频在线观看| 亚洲一区二区三区四区五区中文| 国产精品每日更新在线播放网址| 中文成人综合网| 国产精品天天摸av网| 日本一区二区久久| 亚洲人成影院在线观看| 亚洲麻豆国产自偷在线| 一区二区日韩av| 一区二区欧美在线观看| 亚洲女厕所小便bbb| 一二三四区精品视频| 午夜欧美视频在线观看 | 国产suv精品一区二区883| 福利91精品一区二区三区| 国产福利一区二区三区| 懂色av中文一区二区三区| 成人涩涩免费视频| 91网站黄www| 欧美嫩在线观看| 26uuu欧美| 综合网在线视频| 视频精品一区二区| 国产真实精品久久二三区| 成人激情视频网站| 日本电影亚洲天堂一区| 在线综合亚洲欧美在线视频| 日韩精品一区二区三区在线播放| 国产午夜亚洲精品不卡| 一区二区三区在线视频观看 | 午夜精品影院在线观看| 精品在线播放免费| av综合在线播放| 9191精品国产综合久久久久久| 精品国产一二三区| 亚洲人xxxx| 蜜桃av一区二区| 97精品国产97久久久久久久久久久久| 欧美色综合网站| 久久精品夜色噜噜亚洲a∨| 亚洲精品中文字幕在线观看| 青青草97国产精品免费观看无弹窗版| 国产一区 二区| 欧美高清视频在线高清观看mv色露露十八 | 欧美aaa在线| 94-欧美-setu| 精品国产伦一区二区三区免费 | 国产精品国产精品国产专区不片| 亚洲国产另类精品专区| 国产乱码一区二区三区| 欧美丝袜丝交足nylons图片| 国产欧美一区二区精品久导航| 亚洲大片一区二区三区| 成人手机在线视频| 欧美xxxx老人做受| 夜夜精品浪潮av一区二区三区| 国内精品在线播放| 91麻豆精品国产自产在线| 亚洲丝袜另类动漫二区| 激情偷乱视频一区二区三区| 精品视频1区2区| 亚洲同性同志一二三专区| 国产中文字幕一区| 日韩一本二本av| 亚洲国产欧美日韩另类综合 | 91精品麻豆日日躁夜夜躁| 国产精品丝袜在线| 久久精品久久综合| 6080午夜不卡| 亚洲妇熟xx妇色黄| 91免费版pro下载短视频| 久久精品网站免费观看| 激情五月激情综合网| 欧美一卡在线观看| 午夜久久电影网| 在线观看视频一区| 亚洲综合成人网| 一本到一区二区三区| 亚洲欧洲在线观看av| 成人福利视频在线| 欧美国产日韩亚洲一区| 国产精品99精品久久免费| 精品女同一区二区| 麻豆成人免费电影| 欧美成va人片在线观看| 麻豆91在线播放| 久久综合视频网| 国产精品一品二品| 国产精品全国免费观看高清| 成人午夜av影视| 亚洲素人一区二区|