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

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

?? can.c

?? can總線的驅動程序。在Linux環境下運行。需要外接can總線電路
?? C
字號:
/****************************************Copyright (c)**************************************************
**-----------------------------------------文件信息-----------------------------------------------------
**文   件   名: cantest.c
**創   建   人: 
**最后修改日期: 2005年6月30日
**描        述: CAN模塊測試驅動程序(查詢模式)
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#ifndef __KERNEL__
#define __KERNEL__
#endif
#ifndef MODULE
#define MODULE
#endif

#include "linux/types.h"
#include "linux/fs.h"
#include "linux/mm.h"
#include "linux/errno.h"
#include "linux/major.h"
#include "linux/blkdev.h"
#include  "linux/capability.h"
#include  "linux/smp_lock.h"

#include "linux/module.h"
#include "linux/version.h"
#include "linux/kernel.h"
#include "linux/config.h"

#include "asm/uaccess.h"
#include "asm/io.h"
#include "sja1000.h"
void   *can1addr;
void   *can0addr;
char   kernel_version[]=UTS_RELEASE;

unsigned int fftcan_major=0;
/*******************************************************
**  函數原形:setcanport(unsigned char chanal, unsigned char reg, unsigned char data1)
**	參數:    chanal : can通道號
**	          reg    : 寄存器地址
**	          data   : 要寫入的數據
**  函數說明:向CAN寫數據
/*******************************************************/
void setcanport(unsigned char chanal, unsigned char reg, unsigned char data1)
{
  
   if(!chanal)                     //是通道0
   {                              /*與IOREMAP配套的使用函數*/
        writeb(reg,can0addr+8);   //模擬ALE鎖存地址,發地址信號;
        writeb(data1,can0addr);   //發送數據到地址
   }
    else
   {
        writeb(reg,can1addr+8);
        writeb(data1,can1addr);
   }
}
/*******************************************************
*函數原形:getcanport(unsigned char chanal, unsigned char reg)
*參數:        chanal  : can的通道號
*	            reg     :寄存器地址
*返回值 : 讀出寄存器的值
*函數說明:讀出寄存器的值
/*******************************************************/
unsigned char getcanport(unsigned char chanal, unsigned char reg)
{
    unsigned char temp;
    if(!chanal)
    { 
         writeb(reg,can0addr+8);     //先將地址發送出去,然后再讀出此處的值;
         temp=readb(can0addr);
    }
    else
    {
        writeb(reg,can1addr+8);
        temp=readb(can1addr);
    }
    return (temp);
}
/*******************************************************
**  函數原形:ifgetdata(unsigned char chanal)
**	參數:    chanal : can通道號	          
**	返回值  :1:有可用數據
**            0:無可用數據
**  函數說明:判斷can是否收到數據
/*******************************************************/
unsigned char ifgetdata(unsigned char chanal)
{
   unsigned char temp;
   if(((getcanport(chanal,REG_STATUS) & 0x01) != 1))
      temp = 1;
   else
      temp = 0;   
   return (temp);
}

/*******************************************************
*函數原形:read_fftcan(struct file *file, char *buf, size_t count,loff_t *f_pos)
*參數:        buf  : 傳入該函數的數據緩沖區指針
*	           count:CAN的通道號
*返回值 : 0
*函數說明:讀出接收到的CAN數據
/*******************************************************/

 int  read_fftcan(struct file *file, char *buf, size_t count,loff_t *f_pos)

{	
    int num,i;
    unsigned char chanal;
    unsigned char data[11] = {0};
    unsigned char dlc;
    buf = data;
    chanal = count;
    if((getcanport(chanal,REG_RxBuffer2) & 0x10) == 0)
    {
        dlc = (getcanport(chanal,REG_RxBuffer2) & 0x0f) + 2;
    } else {
	   dlc = 2;
    }
    for(i = 0; i < dlc ;i ++ )
    {
       *(buf + i) = getcanport(chanal,REG_RxBuffer1+i);
    }
    *(buf+i) = '\0';
    setcanport(chanal,REG_COMMAND,0x04);      //free receive memory
    setcanport(chanal,REG_COMMAND,0x08);      //free overflow memory
    return (0);

}

/*******************************************************
*函數原形:write_fftcan(struct file *file,const char *buf,size_t count,loff_t *f_pos)
*參數:    buf  : 傳入該函數的數據緩沖區指針
*	       count:CAN的通道號
*返回值 : 0 說明成功寫入
*函數說明:向CAN總線發送數據
/*******************************************************/

int  write_fftcan(struct file *file,const char *buf,size_t count,loff_t *f_pos)
{    
	unsigned char chanal;
	unsigned char temp ;
        int i;
	unsigned char dlc;
	chanal = count;                                           //在這里我們將count當成通道號來進行傳遞;
	temp = getcanport(chanal,REG_STATUS);
        while((getcanport(chanal,REG_STATUS) & 0x08) == 0)printk("send dat not finish!\n");         //檢查發送緩沖區是否釋放
	while((getcanport(chanal,REG_STATUS) & 0x04) == 0)printk("senddatreg locked\n");
	if((*(buf+1)&0x10) == 0)      
	{
	   dlc = (*(buf+1) & 0x0f) + 2; 
	}
	else 
	{
	   dlc = 2;
	}
	for(i = 0 ;i < dlc;i ++)
        {
           setcanport(chanal,REG_TxBuffer1+i,*(buf+i));
   	}
	setcanport(chanal,REG_COMMAND,0x01);                //將當前的信息發送出去
	do 
	{
	   temp = getcanport(chanal,REG_STATUS);           //如果發送完畢就退出循環
	   if((temp & 0x08) == 0x08)
           break;
        } while(1);                                        //If it is transmitted succeded?
        return (0);
	
}

/*******************************************************
*函數原形:FFT_init_can(unsigned char chanal,unsigned char ac,unsigned char am,unsigned char btr0,unsigned char btr1)
*參數:    chanel: CAN的通道號
           ac    : 驗收代碼寄存器的值
*	       am    :驗收屏蔽寄存器的值
           btr0  : 波特率設置
           btr1  :
*返回值 : 0     :說明初始化成功
*函數說明:配置CAN總線
/*******************************************************/

void FFT_init_can(unsigned char chanal,unsigned char ac,unsigned char am,unsigned char btr0,unsigned char btr1)
{
	 unsigned char temp ;
     int i;
/*Config MOD&CR register進入復位模式,同時使能發送和接收中斷*/
      do
      {  
         temp = 0x07;
         setcanport(chanal,REG_CONTROL,temp);
      } while((temp&0x01) != 0x01);
//測試波特率的值      
      setcanport(chanal, REG_BTR0, btr0);
      setcanport(chanal, REG_BTR1, btr1);
//設置驗收代碼寄存器的值
      setcanport(chanal,REG_ACR, ac);
//設置驗收濾波寄存器的值
      setcanport(chanal,REG_AMR, am);
//設置輸出控制寄存器的值	
      setcanport(chanal,REG_OCR, 0xda);
//設置始時鐘分頻寄存器的值
      setcanport(chanal, REG_CDR, 0x48);
//退出復位模式
      do
      {
	    setcanport(chanal, REG_CONTROL,0x06 );
	    temp = getcanport(chanal,REG_CONTROL);
      } while((temp & 0x01) != 0 );
      return 0;
}

/*******************************************************
*函數原形:open_fftcan(struct inode *inode,struct file *file)
*參數:               
*返回值 : 
*函數說明:
/*******************************************************/

int open_fftcan(struct inode *inode,struct file *file)
{   
    return 0;
}

/*******************************************************
*函數原形:open_fftcan(struct inode *inode,struct file *file)
*參數:               
*返回值 : 
*函數說明:
/*******************************************************/
int release_fftcan(struct inode *inode,struct file *file)
{
    return 0;
}
/***************************************************************************************************
*函數原形:ioctl_fftcan(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg)
*參數:    cmd  : 傳入該函數的命令參數
*	           0  :判斷是否CAN0收到可用數據
               1  :判斷是否CAN1收到可用數據
               3  :初始化CAN0總線
               4  :初始化CAN1總線   
           arg :傳入的參數
*返回值 :     0  :接收到有效數據 
               1  :沒有接收到有效數據
               3  :成功初始化CAN0
               4  :成功初始化CAN1
               5  :無效的命令 
*函數說明:向CAN總線發送數據
/**************************************************************************************************/
static int ioctl_fftcan(struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg)
{
   unsigned char temp1,temp2;
   unsigned char ac,am,btr0,btr1,chanal;
   switch (cmd) 
   {
	case 0:                                  
	       temp1=ifgetdata(0);
           break;		
	case 1:                                  
           temp1=ifgetdata(1);
           break;		
	case 3:                                   
           chanal = 0;
           ac = (arg & 0xff000000) >> 24 ;         
           am = (arg & 0x00ff0000) >> 16;
           btr0 = (arg & 0x0000ff00) >> 8;
           btr1 = (arg & 0x000000ff) ;
           FFT_init_can(chanal,ac,am,btr0,btr1);  
	       temp1 = 3;
           break;
	case 4:                                  
           chanal = 1;
           ac = (arg & 0xff000000) >> 24 ;
           am = (arg & 0x00ff0000) >> 16;
           btr0 = (arg & 0x0000ff00) >> 8;
           btr1 = (arg & 0x000000ff) ;
           FFT_init_can(chanal,ac,am,btr0,btr1);
           temp1 = 4;
           break;
	default:
           temp1 = 5;
	   break;
  }
    return (temp1);
}
/**************************************
** 函數指針結構: file_operations
** 說明        :
***************************************/
struct file_operations fftcan_fops={

  	read :      read_fftcan,
    write:      write_fftcan,
	ioctl:	    ioctl_fftcan,
	open :	    open_fftcan,
    release:    release_fftcan,

};
/******************************************************
**  初始化模塊:在加載模塊時候調用
**  函數原形  : init_module(void)
**  說    明  :不用修改
******************************************************/
 int  init_module(void)
{
   int result;
   result=register_chrdev(0,"fftcan",&fftcan_fops);           //注冊一個設備,得到驅動的主設備號
   if(result<0)
   {
      printk("cannot get fftcan major number\n");           //沒有成功
      return result;
   }
   printk("congraulation,fftcan are successful registed\n");
   if(fftcan_major==0)
   {
      fftcan_major=result;                                 //記錄下主設備號
   }
//映射物理地址到IO內存,可以讓軟件直接訪問IO內存
    can0addr= ioremap(0x50800000,0x20);
/*將物理地址直接映射到IO內存*/
    can1addr=ioremap(0x50c00000,0x20);                    /*第一個參數是物理地址,第2個是映射的大小,因為CAN只有32字節的地址空間,所以就0X10*/
    return 0;
}
/*******************************************************
**  函數原形 : cleanup_module(void)
**  說明     : 在卸載模塊時調用
******************************************************/
void cleanup_module(void)
{
   iounmap(can0addr);
   iounmap(can1addr);
   unregister_chrdev(fftcan_major,"fftcan");
   printk("exit fftcan\n");

}



?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
精品国产一区二区在线观看| 99九九99九九九视频精品| 一区二区视频在线看| 国产欧美日韩视频在线观看| 国产农村妇女毛片精品久久麻豆| 日韩欧美国产wwwww| 精品国产在天天线2019| 26uuu亚洲综合色| 久久综合精品国产一区二区三区| 2023国产一二三区日本精品2022| 久久综合色综合88| 中日韩av电影| 亚洲丝袜美腿综合| 亚洲国产精品久久艾草纯爱 | 琪琪久久久久日韩精品| 日本不卡的三区四区五区| 美女网站一区二区| 国产一区二区三区黄视频 | 日本一区二区三区免费乱视频| 久久久久一区二区三区四区| 久久精品人人做人人综合| 国产欧美日本一区二区三区| 丝袜亚洲另类欧美综合| 亚洲香蕉伊在人在线观| 日本成人在线电影网| 久草热8精品视频在线观看| 国产不卡一区视频| 欧美天堂亚洲电影院在线播放| 欧美一级生活片| 国产精品久久久久永久免费观看| 亚洲综合视频网| 国内精品国产成人国产三级粉色 | 欧美日韩久久一区二区| 欧美一区二区三区视频免费 | 国产精品三级av| 亚洲国产成人高清精品| 国产剧情在线观看一区二区 | 亚洲欧美怡红院| 日韩精品一卡二卡三卡四卡无卡| 国产一区二区不卡老阿姨| 99久久精品国产一区| 在线不卡一区二区| 国产精品国产三级国产aⅴ入口 | 一色桃子久久精品亚洲| 日韩电影一区二区三区四区| 国产在线观看一区二区| 久久综合狠狠综合久久综合88 | 伦理电影国产精品| 成人av在线一区二区三区| 欧美精品色一区二区三区| 国产精品狼人久久影院观看方式| 日韩高清不卡一区二区三区| 99re8在线精品视频免费播放| 精品国内二区三区| 一区二区三区 在线观看视频| 国产精品2024| 精品免费国产一区二区三区四区| 亚洲日本欧美天堂| 成人手机电影网| 久久美女艺术照精彩视频福利播放| 亚洲国产欧美在线| 在线亚洲欧美专区二区| 中文成人综合网| 国产精品1024| 26uuu成人网一区二区三区| 日韩精品欧美精品| 成人h动漫精品| 国产精品拍天天在线| 国产精品66部| 中文字幕精品三区| 国产在线一区二区综合免费视频| 在线播放中文字幕一区| 视频一区视频二区在线观看| 久久综合网色—综合色88| 蜜臀av一级做a爰片久久| 欧美精品久久99久久在免费线 | 亚洲成av人综合在线观看| 91碰在线视频| 亚洲欧美激情插| 在线观看一区日韩| 亚洲专区一二三| 国产在线观看一区二区| 欧美精品一区二| 国产成人aaa| 亚洲国产精品av| 99re66热这里只有精品3直播| 亚洲欧洲av另类| 欧美亚洲日本一区| 天使萌一区二区三区免费观看| 69堂精品视频| 国产毛片精品国产一区二区三区| 久久久久久久久久久久久夜| 成人黄色av电影| 一级精品视频在线观看宜春院| 精品视频一区二区不卡| 免费看日韩精品| 国产日韩欧美一区二区三区乱码| 成人av在线网| 亚洲bt欧美bt精品777| 欧美大尺度电影在线| 床上的激情91.| 亚洲国产婷婷综合在线精品| 日韩欧美的一区| 成人丝袜18视频在线观看| 亚洲国产中文字幕在线视频综合 | 亚洲精品一区二区精华| 国产精品一区在线观看你懂的| 中文成人综合网| 欧美日韩国产一区| 国产精品亚洲午夜一区二区三区| 日韩美女啊v在线免费观看| 欧美精品国产精品| 国产精品白丝av| 亚洲福利视频一区| 2023国产精品| 欧美无乱码久久久免费午夜一区| 日韩1区2区日韩1区2区| 中文字幕一区不卡| 日韩欧美一卡二卡| 欧美在线不卡一区| 国产精品一区二区久久不卡 | 成人综合婷婷国产精品久久 | 久久99精品久久久久婷婷| 国产片一区二区三区| 欧美日韩国产在线观看| 夫妻av一区二区| 毛片不卡一区二区| 亚洲国产成人tv| 亚洲日本中文字幕区| 久久久久国色av免费看影院| 欧美日韩国产一区| 日本高清无吗v一区| 国产精品一二三在| 美女视频一区在线观看| 亚洲超丰满肉感bbw| 亚洲伦理在线免费看| 国产精品丝袜久久久久久app| 日韩欧美一区二区久久婷婷| 欧美日韩aaa| 欧美亚洲国产bt| 色婷婷国产精品| 一本一道久久a久久精品| 国产福利91精品一区| 久久国产精品第一页| 亚洲va欧美va人人爽| 一二三区精品视频| 亚洲激情网站免费观看| 亚洲色大成网站www久久九九| 国产亚洲视频系列| 久久久久久久综合狠狠综合| 精品国产91久久久久久久妲己| 日韩一区二区精品葵司在线| 91精品欧美福利在线观看| 91麻豆精品国产91久久久更新时间| 欧美性一区二区| 欧美日本韩国一区| 91精品国产91久久久久久一区二区| 精品视频一区二区三区免费| 欧美人牲a欧美精品| 欧美喷潮久久久xxxxx| 91精品国产欧美一区二区成人 | 久久不见久久见中文字幕免费| 麻豆精品视频在线| 激情六月婷婷综合| 国产成人亚洲综合a∨婷婷图片| 国产91精品久久久久久久网曝门| 欧美一区二区不卡视频| 777午夜精品视频在线播放| 日韩免费视频线观看| 久久综合狠狠综合久久综合88| 国产喷白浆一区二区三区| 中文字幕一区二区三区四区不卡 | 久久综合九色综合97_久久久| 久久免费偷拍视频| 18欧美乱大交hd1984| 亚洲va欧美va天堂v国产综合| 日韩不卡一区二区三区| 国产一区二区三区黄视频 | 91在线一区二区| 欧美丰满一区二区免费视频 | 亚洲成人午夜电影| 麻豆成人久久精品二区三区红| 国内精品在线播放| 91免费国产在线| 欧美一级专区免费大片| 日本一区二区视频在线| 亚洲一区二区高清| 国产乱子伦视频一区二区三区 | 亚洲欧美日韩中文字幕一区二区三区| 一区二区三区免费观看| 经典三级一区二区| 91蜜桃网址入口| 精品久久久久久久久久久久包黑料 | 国产精品福利一区二区| 亚洲国产精品嫩草影院| 国产精品18久久久久久久网站| 91福利在线看| 久久久美女毛片| 午夜精品福利在线| 成人免费va视频|