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

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

?? sja1000.c

?? sja1000在linux下面的驅(qū)動(dòng)程序。
?? C
字號(hào):
/* 
 * sja1000.c
 * Linux CAN-bus device driver.
 * Written by Arnaud Westenberg email:arnaud@wanadoo.nl
 * This software is released under the GPL-License.
 */

#include <linux/delay.h>
#include <asm/irq.h>
#include "sysdep.h"
#include "candrv.h"
#include "sja1000.h"

///////////////////////////////////////////////////////////////////////////////
// sja1000_enable_configuration

int sja1000_enable_configuration( struct chip_t *pchip )
{
  int i=0;
  unsigned flags;

  disable_irq( pchip->irq );

  flags = pchip->read_register( pchip->vbase_addr + SJACR );

  while ( ( !(flags & CR_RR) ) && (i<=10) ) {
    pchip->write_register( flags | CR_RR, pchip->vbase_addr + SJACR );
    udelay(100 );
    i++;
    flags = pchip->read_register( pchip->vbase_addr + SJACR );
    
  }
  if (i>=10) {
    CANMSG("Reset error\n");
    enable_irq( pchip->irq );
    return -ENODEV;
  }

  return 0;
}

///////////////////////////////////////////////////////////////////////////////
// sja1000_disable_configuration

int sja1000_disable_configuration( struct chip_t *pchip )
{
  int i=0;
  unsigned flags;

  flags = pchip->read_register( pchip->vbase_addr + SJACR );

  while ( (flags & CR_RR) && (i<=10) ) {
    pchip->write_register( flags & (CR_RIE|CR_TIE|CR_EIE|CR_OIE ), 
			   pchip->vbase_addr + SJACR );
    udelay(100);
    i++;
    flags = pchip->read_register( pchip->vbase_addr + SJACR );
  }
  if (i>=10) {
    CANMSG("Error leaving reset status\n");
    return -ENODEV;
  }

  enable_irq( pchip->irq );

  return 0;
}

///////////////////////////////////////////////////////////////////////////////
// sja1000_disable_configuration

int sja1000_chip_config( struct chip_t *pchip )
{
  if ( sja1000_enable_configuration( pchip ) )
    return -ENODEV;

  // Set mode, clock out, comparator 
  pchip->write_register( pchip->sja_cdr_reg, pchip->vbase_addr + SJACDR ); 

  // Set driver output configuration 
  pchip->write_register( pchip->sja_ocr_reg, pchip->vbase_addr + SJAOCR ); 

  if ( sja1000_standard_mask( pchip, 0x0000, 0xffff ) )
    return -ENODEV;
	
  if (!baudrate)
    baudrate=1000;

  if ( sja1000_baud_rate( pchip, 1000*baudrate, pchip->clock, 0, 75, 0 ) )
    return -ENODEV;

  // Enable hardware interrupts 
  pchip->write_register( ( CR_RIE | CR_TIE | CR_EIE | CR_OIE ), 
			 pchip->vbase_addr + SJACR ); 

  sja1000_disable_configuration( pchip );
	
  return 0;
}

///////////////////////////////////////////////////////////////////////////////
// sja1000_disable_configuration

int sja1000_standard_mask( struct chip_t *pchip, 
			   u16 code, 
			   u16 mask)
{
  u8 write_code, write_mask;

  if ( sja1000_enable_configuration( pchip ) )
    return -ENODEV;

  /* The acceptance code bits (SJAACR bits 0-7) and the eight most 
   * significant bits of the message identifier (id.10 to id.3) must be
   * equal to those bit positions which are marked relevant by the 
   * acceptance mask bits (SJAAMR bits 0-7).
   * (id.10 to id.3) = (SJAACR.7 to SJAACR.0) v (SJAAMR.7 to SJAAMR.0)
   * (Taken from Philips sja1000 Data Sheet)
   */
  write_code = (u8) code >> 3;
  write_mask = (u8) mask >> 3;
	
  pchip->write_register( write_code, pchip->vbase_addr + SJAACR );
  pchip->write_register( write_mask, pchip->vbase_addr + SJAAMR );

  DEBUGMSG( "Setting acceptance code to 0x%lx\n",
	    (unsigned long)code);
  DEBUGMSG( "Setting acceptance mask to 0x%lx\n",
	    (unsigned long)mask);

  sja1000_disable_configuration( pchip );

  return 0;
}

///////////////////////////////////////////////////////////////////////////////
// sja1000_baud_rate

/* Set communication parameters.
 * param rate baud rate in Hz
 * param clock frequency of sja1000 clock in Hz (ISA osc is 14318000)
 * param sjw synchronization jump width (0-3) prescaled clock cycles
 * param sampl_pt sample point in % (0-100) sets (TSEG1+2)/(TSEG1+TSEG2+3) 
 * ratio param flags fields BTR1_SAM, OCMODE, OCPOL, OCTP, OCTN, CLK_OFF, CBP
 */

int sja1000_baud_rate( struct chip_t *pchip, 
		       u32 rate, 
		       u32 clock, 
		       u32 sjw,
		       u32 sampl_pt, 
		       u32 flags)
{
  int best_error = 1000000000, error;
  int best_tseg=0, best_brp=0, best_rate=0, brp=0;
  int tseg=0, tseg1=0, tseg2=0;
	
  if ( sja1000_enable_configuration( pchip ) )
    return -ENODEV;

  clock /=2;

  /* tseg even = round down, odd = round up */
  for (tseg=(0+0+2)*2; tseg<=(MAX_TSEG2+MAX_TSEG1+2)*2+1; tseg++) {
    brp = clock/((1+tseg/2)*rate)+tseg%2;
    if (brp == 0 || brp > 64)
      continue;
    error = rate - clock/(brp*(1+tseg/2));
    if (error < 0)
      error = -error;
    if (error <= best_error) {
      best_error = error;
      best_tseg = tseg/2;
      best_brp = brp-1;
      best_rate = clock/(brp*(1+tseg/2));
    }
  }
  if (best_error && (rate/best_error < 10)) {
    CANMSG("baud rate %d is not possible with %d Hz clock\n",
	   rate, 2*clock);
    CANMSG("%d bps. brp=%d, best_tseg=%d, tseg1=%d, tseg2=%d\n",
	   best_rate, best_brp, best_tseg, tseg1, tseg2);
    return -EINVAL;
  }
  tseg2 = best_tseg-(sampl_pt*(best_tseg+1))/100;
  if (tseg2 < 0)
    tseg2 = 0;
  if (tseg2 > MAX_TSEG2)
    tseg2 = MAX_TSEG2;
  tseg1 = best_tseg-tseg2-2;
  if (tseg1 > MAX_TSEG1) {
    tseg1 = MAX_TSEG1;
    tseg2 = best_tseg-tseg1-2;
  }

  DEBUGMSG("Setting %d bps.\n", best_rate);
  DEBUGMSG("brp=%d, best_tseg=%d, tseg1=%d, tseg2=%d, sampl_pt=%d\n",
	   best_brp, best_tseg, tseg1, tseg2,
	   (100*(best_tseg-tseg2)/(best_tseg+1)));


  pchip->write_register( sjw<<6 | best_brp, pchip->vbase_addr + SJABTR0 );
  pchip->write_register( ((flags & BTR1_SAM) != 0)<<7 | tseg2<<4 | tseg1,
		 pchip->vbase_addr + SJABTR1);
  //	can_write_reg( pchip, OCR_MODE_NORMAL | OCR_TX0_LH | OCR_TX1_ZZ, 
  //                   SJAOCR);
  /* BASIC mode, bypass input comparator */
  //	pchip->write_register( CDR_CBP| /* CDR_CLK_OFF | */ 7, pchip->vbase_addr + SJACDR);

  sja1000_disable_configuration( pchip );

  return 0;
}

///////////////////////////////////////////////////////////////////////////////
// sja1000_pre_read_config
//

int sja1000_pre_read_config( struct chip_t *pchip )
{
  int i;
  int id;
  i = pchip->read_register( pchip->vbase_addr + SJASR );
	
  if ( !( i&SR_RBS ) ) {
    //Temp
    for (i=0; i<0x20; i++)
      CANMSG("0x%x is 0x%x\n",
	     i,
	     pchip->read_register( pchip->vbase_addr + i ) );
    return 0;
  }
  sja1000_start_chip( pchip );

  pchip->write_register( 0, pchip->vbase_addr + SJACR); // disable interrupts for a moment
  
  // TODO: this would be best sja1000_irq_read_handler( pchip );
  // now just duplicate the code.
  
  do {
    id = ( pchip->read_register( pchip->vbase_addr + 
				 SJARXID1)<<8) + 
      pchip->read_register( pchip->vbase_addr + SJARXID0 );
    ( ( struct canmsg_t *)pchip->fifo.prxbuf )[ pchip->fifo.head ].length = (id>>8) & 0x0f;
    ( ( struct canmsg_t *)pchip->fifo.prxbuf )[ pchip->fifo.head ].id = id>>5;
    ( ( struct canmsg_t *)pchip->fifo.prxbuf )[ pchip->fifo.head ].flags = id&ID0_RTR ?
      MSG_RTR : 0;
    ( ( struct canmsg_t *)pchip->fifo.prxbuf )[ pchip->fifo.head ].timestamp = 0;
    ( ( struct canmsg_t *)pchip->fifo.prxbuf )[ pchip->fifo.head ].cob = 0;
    for (i=0; i < ( ( struct canmsg_t *)pchip->fifo.prxbuf )[ pchip->fifo.head ].length; i++) {
      ( ( struct canmsg_t *)pchip->fifo.prxbuf )[ pchip->fifo.head ].data[ i ] = 
	pchip->read_register( pchip->vbase_addr + SJARXDAT0 + i);
    }
    pchip->fifo.head++;
    if ( pchip->fifo.head == MAX_BUF_LENGTH -1)
      pchip->fifo.head = 0;
    pchip->write_register( CMR_RRB, pchip->vbase_addr + SJACMR );
  } while ( pchip->read_register( pchip->vbase_addr + SJASR ) & SR_RBS );

  // enable interrupts
  pchip->write_register( CR_OIE | CR_EIE | CR_TIE | CR_RIE, 
			 pchip->vbase_addr + SJACR );

  return 1;
}

///////////////////////////////////////////////////////////////////////////////
// sja1000_pre_write_config

#define MAX_TRANSMIT_WAIT_LOOPS 200

int sja1000_pre_write_config( struct chip_t *pchip, 
			      struct canmsg_t *pmsg )
{
  int i=0, id=0;

  //sja1000 goes automatically into reset mode on errors
  sja1000_start_chip( pchip ); 

  /* Wait until Transmit Buffer Status is released */
  while ( !( pchip->read_register( pchip->vbase_addr + SJASR) & SR_TBS) && 
	  i++<MAX_TRANSMIT_WAIT_LOOPS) {
    udelay(i);
  }
	
  if ( ! ( pchip->read_register( pchip->vbase_addr + SJASR ) & SR_TBS ) ) {
    CANMSG("Transmit timed out, cancelling\n");
    pchip->write_register( CMR_AT, pchip->vbase_addr + SJACMR);
    i=0;
    while ( !( pchip->read_register( pchip->vbase_addr + SJASR) & SR_TBS) &&
	    i++<MAX_TRANSMIT_WAIT_LOOPS) {
      udelay(i);
    }
    if ( !( pchip->read_register( pchip->vbase_addr +  SJASR) & SR_TBS)) {
      CANMSG("Could not cancel, please reset\n");
      return -EIO;
    }
  }

  id = (pmsg->id<<5) | ((pmsg->flags&MSG_RTR)?ID0_RTR:0) | pmsg->length;

  pchip->write_register( id>>8, pchip->vbase_addr + SJATXID1);
  pchip->write_register( id & 0xff, pchip->vbase_addr + SJATXID0);

  for (i=0; i<pmsg->length; i++)
    pchip->write_register( pmsg->data[i], pchip->vbase_addr + SJATXDAT0+i);

  return 0;
}

///////////////////////////////////////////////////////////////////////////////
// sja1000_send_msg

int sja1000_send_msg( struct chip_t *pchip, int bRtr )
{
  pchip->write_register( CMR_TR, pchip->vbase_addr + SJACMR);
  return 0;
}

///////////////////////////////////////////////////////////////////////////////
// sja1000_check_tx_stat

int sja1000_check_tx_stat( struct chip_t *pchip )
{
  if ( pchip->read_register( pchip->vbase_addr + SJASR ) & SR_TCS)
    return 0;
  else
    return 1;
}

///////////////////////////////////////////////////////////////////////////////
// sja1000_send_msg

int sja1000_set_btregs( struct chip_t *pchip, 
			unsigned short btr0, 
			unsigned short btr1 )
{
  if (sja1000_enable_configuration( pchip ) )
    return -ENODEV;

  pchip->write_register( btr0, pchip->vbase_addr + SJABTR0);
  pchip->write_register( btr1, pchip->vbase_addr + SJABTR1 );

  sja1000_disable_configuration( pchip );

  return 0;
}

///////////////////////////////////////////////////////////////////////////////
// sja1000_start_chip

int sja1000_start_chip( struct chip_t *pchip )
{
  unsigned short flags = 0;

  flags = pchip->read_register( pchip->vbase_addr + SJACR) & (CR_RIE|CR_TIE|CR_EIE|CR_OIE);
  pchip->write_register( flags, pchip->vbase_addr + SJACR);

  return 0;
}

///////////////////////////////////////////////////////////////////////////////
// sja1000_stop_chip

int sja1000_stop_chip( struct chip_t *pchip )
{
  unsigned short flags = 0;

  flags = pchip->read_register( pchip->vbase_addr + SJACR) & 
    (CR_RIE|CR_TIE|CR_EIE|CR_OIE);
  pchip->write_register( flags | CR_RR, pchip->vbase_addr + SJACR );

  return 0;
}

///////////////////////////////////////////////////////////////////////////////
// sja1000_remote_request

int sja1000_remote_request( struct chip_t *pchip )
{
  CANMSG("sja1000_remote_request not implemented\n");
  return -ENOSYS;
}

///////////////////////////////////////////////////////////////////////////////
// sja1000_extended_mask

int sja1000_extended_mask( struct chip_t *pchip, 
			   u32 code,
			   u32 mask)
{
  CANMSG("sja1000_extended_mask not implemented\n");
  return -ENOSYS;
}

///////////////////////////////////////////////////////////////////////////////
// sja1000_clear_objects

int sja1000_clear_objects( struct chip_t *pchip )
{
  CANMSG("sja1000_clear_objects not implemented\n");
  return -ENOSYS;
}

///////////////////////////////////////////////////////////////////////////////
// sja1000_config_irqs

int sja1000_config_irqs( struct chip_t *pchip, u16 irqs )
{
  CANMSG("sja1000_config_irqs not implemented\n");
  return -ENOSYS;
}

///////////////////////////////////////////////////////////////////////////////
// sja1000_register

int sja1000_register( struct chip_t *pchip )
{
  pchip->chip_config = sja1000_chip_config;
  pchip->set_baud_rate = sja1000_baud_rate;
  pchip->set_standard_mask = sja1000_standard_mask;
  pchip->set_extended_mask = sja1000_extended_mask;
  pchip->set_message15_mask = sja1000_extended_mask;
  pchip->clear_objects = sja1000_clear_objects;
  pchip->config_irqs = sja1000_config_irqs;
  pchip->pre_read_config = sja1000_pre_read_config;
  pchip->pre_write_config = sja1000_pre_write_config;
  pchip->send_msg = sja1000_send_msg;
  pchip->check_tx_stat = sja1000_check_tx_stat;
  pchip->remote_request = sja1000_remote_request;
  pchip->enable_configuration = sja1000_enable_configuration;
  pchip->disable_configuration = sja1000_disable_configuration;
  pchip->set_btregs = sja1000_set_btregs;
  pchip->start_chip = sja1000_start_chip;
  pchip->stop_chip = sja1000_stop_chip;
  pchip->irq_handler = sja1000_irq_handler;
  return 0;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
性做久久久久久久免费看| 日韩国产高清影视| 成人av在线影院| 国产亚洲人成网站| 精品一区二区在线免费观看| 欧美一区在线视频| 五月婷婷色综合| 91精品国产综合久久久久| 天堂资源在线中文精品| 欧美日韩一二区| 亚洲成av人片| 欧美久久久久久久久| 五月综合激情网| 欧美一区二区三区白人| 日韩二区三区在线观看| 91精品婷婷国产综合久久性色| 亚洲成人激情自拍| 欧美精品在线一区二区三区| 婷婷六月综合亚洲| 日韩一区和二区| 国产伦精品一区二区三区视频青涩 | 亚洲精品在线观看视频| 久久精品国产精品亚洲精品| 日韩欧美在线网站| 精品一区二区三区免费视频| 精品国产乱码久久久久久久久| 国产精品一级在线| 中文一区在线播放| 色偷偷久久人人79超碰人人澡| 亚洲国产美国国产综合一区二区| 欧美老年两性高潮| 久久国产婷婷国产香蕉| 久久久久久久久99精品| 成人h动漫精品一区二| 亚洲免费av在线| 欧美精品18+| 韩国精品主播一区二区在线观看 | 粉嫩绯色av一区二区在线观看| 国产精品久久久久国产精品日日| 色婷婷亚洲一区二区三区| 亚洲国产欧美在线人成| 日韩久久久久久| 国产成人精品www牛牛影视| 1024成人网色www| 欧美日韩精品综合在线| 奇米影视一区二区三区| 国产日韩欧美精品在线| 一本色道久久综合亚洲91 | 亚洲免费电影在线| 欧美老肥妇做.爰bbww视频| 国产自产视频一区二区三区| 国产日韩三级在线| 欧美伊人久久大香线蕉综合69 | 欧美男男青年gay1069videost | 国产呦精品一区二区三区网站| 国产精品免费aⅴ片在线观看| 日本精品视频一区二区三区| 免费久久精品视频| 国产精品伦理在线| 在线播放日韩导航| 成人小视频在线| 午夜久久福利影院| 国产视频一区二区在线观看| 91国内精品野花午夜精品| 久久99精品久久久久久动态图| 亚洲天堂成人在线观看| 欧美一区二区国产| thepron国产精品| 人禽交欧美网站| 国产精品久久久久精k8| 日韩一本二本av| 99久久精品国产一区| 蜜臀久久99精品久久久画质超高清 | 狠狠色综合日日| 亚洲免费av网站| 精品国产欧美一区二区| 色吧成人激情小说| 国产精品亚洲午夜一区二区三区 | 一区二区三区在线免费| 久久伊99综合婷婷久久伊| 色天天综合久久久久综合片| 精品一区二区综合| 五月综合激情日本mⅴ| 国产精品对白交换视频| 精品区一区二区| 欧美日韩久久不卡| 色综合色综合色综合| 国产在线麻豆精品观看| 亚洲成人三级小说| 亚洲欧洲无码一区二区三区| 精品久久人人做人人爱| 欧美日韩精品高清| 99久久免费国产| 国产一区二区三区最好精华液| 视频一区中文字幕国产| 亚洲视频网在线直播| 久久久精品国产免大香伊 | 这里只有精品电影| 日本韩国欧美一区| 成人精品免费视频| 激情综合网最新| 日韩精品电影在线观看| 亚洲精品ww久久久久久p站| 欧美国产一区在线| 久久久久久久久久看片| 91精品婷婷国产综合久久性色| 欧美自拍丝袜亚洲| 91麻豆.com| 99热99精品| 成人网在线免费视频| 国产一区久久久| 久久99精品久久久久婷婷| 丝袜亚洲另类欧美| 亚洲18女电影在线观看| 伊人色综合久久天天人手人婷| 日本一区二区三区久久久久久久久不 | 亚洲123区在线观看| 亚洲自拍偷拍网站| 亚洲激情在线播放| 亚洲女性喷水在线观看一区| 国产精品国产自产拍高清av | 国产曰批免费观看久久久| 久久精品国产免费| 久久99国产精品久久99| 日本伊人精品一区二区三区观看方式| 亚洲国产综合色| 一区二区三区国产豹纹内裤在线| 亚洲人亚洲人成电影网站色| 亚洲欧洲精品一区二区三区不卡 | 综合电影一区二区三区| 中文字幕精品一区二区精品绿巨人 | 成人免费看视频| 成人黄色在线网站| 91一区二区在线| 91蜜桃网址入口| 欧美专区日韩专区| 欧美人伦禁忌dvd放荡欲情| 欧美精品aⅴ在线视频| 欧美一区二区三区视频在线观看| 欧美精品九九99久久| 在线播放中文一区| 精品久久人人做人人爽| 国产视频一区不卡| 久久精品欧美一区二区三区不卡| 久久久99久久| 国产精品五月天| 亚洲欧美在线高清| 亚洲制服丝袜一区| 偷窥少妇高潮呻吟av久久免费| 日日夜夜精品免费视频| 麻豆成人久久精品二区三区小说| 精品一区二区在线观看| 国产成人aaaa| 一本一本久久a久久精品综合麻豆 一本一道波多野结衣一区二区 | 欧美女孩性生活视频| 日韩欧美中文字幕公布| 欧美精品一区二区三区很污很色的| 久久久久久电影| 国产精品夫妻自拍| 亚洲成人免费在线| 久久99热99| 成人免费视频一区二区| 色婷婷av久久久久久久| 91精品婷婷国产综合久久性色| 久久影音资源网| 中文字幕视频一区| 丝袜亚洲另类丝袜在线| 国产精品羞羞答答xxdd| 99久久免费精品高清特色大片| 欧美亚洲一区二区在线观看| 日韩欧美在线不卡| 中文久久乱码一区二区| 亚洲一区免费视频| 国内偷窥港台综合视频在线播放| 成人激情动漫在线观看| 精品污污网站免费看| 久久众筹精品私拍模特| 亚洲天堂网中文字| 日本网站在线观看一区二区三区 | 精品日韩一区二区| 亚洲欧美另类图片小说| 青青青伊人色综合久久| 成人18视频在线播放| 欧美军同video69gay| 国产色综合一区| 亚洲国产综合在线| 国产成人日日夜夜| 欧美精品粉嫩高潮一区二区| 久久九九全国免费| 亚洲成人午夜影院| 国产成人午夜片在线观看高清观看| 色素色在线综合| 久久精品视频免费| 天天色综合成人网| 99久久精品国产导航| 日韩欧美久久久| 亚洲精品国产视频| 国产aⅴ精品一区二区三区色成熟| 欧美亚洲动漫另类| 国产欧美日韩激情|