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

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

?? virtex.c

?? 一個2.4.21版本的嵌入式linux內(nèi)核
?? C
字號:
/*!****************************************************************************!*! FILE NAME  : vertex.c*!*! DESCRIPTION: Implements an interface towards virtex FPGA (mounted on one of our*!              evaluation boards) from userspace using ioctl()'s*!*!              The FPGA can be programmed by copying the bit-file to /dev/fpga.*!*!                cp fpga.bit > /dev/fpga*!*!                Kernel log should look like:*!                  69900 bytes written*!                  FPGA-configuration completed, no errors*!*!              Number of bytes written depends on the FPGA*!*!                From Xilinx data sheet:*!                XCV50    559,200 bits*!                XCV100   781,216 bits*!                XCV800 4,715,616 bits*!*!              Accepted file type is the design.bit generated by Alliance*!              Design Manager.*!              This software just sends the bitfile into the device without*!              checking device type etc.*!*!              Sync-header 0xff 0xff 0xff 0xff defines the start for the*!              byte stream, everything from that position is written to the FPGA.*!*!  *! Jul 19 2002  Stefan Lundberg    Initial version.*! $Log: virtex.c,v $*! Revision 1.1  2002/06/25 09:58:58  stefanl*! New FPGA driver for Platoon*!*!*! ---------------------------------------------------------------------------*!*! (C) Copyright 2002 Axis Communications AB, LUND, SWEDEN*!*!***************************************************************************//* $Id: virtex.c,v 1.1 2002/06/25 09:58:58 stefanl Exp $ *//****************** INCLUDE FILES SECTION ***********************************/#include <linux/module.h>#include <linux/sched.h>#include <linux/slab.h>#include <linux/errno.h>#include <linux/major.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/string.h>#include <linux/init.h>#include <linux/config.h>#include <linux/hdreg.h>#include <linux/mm.h>#include <asm/etraxvirtex.h>#include <asm/system.h>#include <asm/svinto.h>#include <asm/uaccess.h>#include <asm/io.h>#include <asm/delay.h>#include "virtex.h"/******************* VIRTEX DEFINITION SECTION **************************/#define VIRTEX_DEBUG(x)#define VIRTEX_MAJOR 246  /* EXPERIMENTAL */static const char virtex_name[] = "virtex";/****************** FUNCTION DEFINITION SECTION *************************///// Read register interface for FPGA programming:////   FPGA_DONE is connected to S1CD_N G28//   FPGA_INIT_N is connected to S1IO_N G27//// Write register interface for FPGA programming:////  Bit:       15         14      13    12      9   8   7   0//        ____________________________________________________//       | fpga_write | program | cclk | reserved | cs | data |//       |____________|_________|______|__________|____|______|//// csp0 = cs_fpga1 = FPGA programming interface// csr0 = cs_fpga2 = register interface towards FPGA constructionstatic volatile short *port_csp0_word_addr;static volatile short *port_csr0_word_addr;static volatile unsigned char open_count;static volatile unsigned char bytes_written;static volatile unsigned long bytes_written_cnt;static volatile unsigned char sync_found;static volatile unsigned char sync_count;static volatile unsigned char sync_ff_count;#define WRITE_FPGA_PROG_REG(data) *port_csp0_word_addr=(data)#define SET_PROGRAM_BIT(data) (data)|(1<<14)#define SET_WRITE_BIT(data) (data)|(1<<15)#define CLR_WRITE_BIT(data) (data)&(~(1<<15))#define SET_CS_BIT(data) (data)|(1<<8)#define CLR_CS_BIT(data) (data)&(~(1<<8))#define SET_CCLK_BIT(data) (data)|(1<<13)#define CLR_CCLK_BIT(data) (data)&(~(1<<13))// Bit in read port G (always inputs)#define READ_INIT  (*R_PORT_G_DATA)&(1<<27)#define READ_DONE  (*R_PORT_G_DATA)&(1<<28)void start_virtex_program(void){  unsigned short reg_data=0;  printk("Start writing to FPGA\n");  reg_data = SET_CS_BIT(reg_data); // FPGA unselected  reg_data = SET_PROGRAM_BIT(reg_data);  WRITE_FPGA_PROG_REG(reg_data);  while(!READ_INIT); // Wait for init    reg_data = SET_WRITE_BIT(reg_data);  WRITE_FPGA_PROG_REG(reg_data);  reg_data = CLR_CS_BIT(reg_data); // FPGA selected, CS is active low  WRITE_FPGA_PROG_REG(reg_data);  return;}// According to datasheet, bytes should be reversed, it is unknown to me why.unsigned char bit_reverse(unsigned char data) {  unsigned char in=data;  unsigned short out=0;  unsigned int i=0;  for(i=0;i<8;i++) {    if(in&0x1) {      out|=0x1;    }    in=in>>1;    out=out<<1;  }  return(out>>1);  }void virtex_program(char* ptr,size_t count){  int c;  char *p;  unsigned char data;    unsigned short reg_data=0;//  short tmp_cnt;    c=count;  p=ptr;  if(!sync_found) {    c=count;    p=ptr;    while(c--) {      data=(unsigned char)*p++;      sync_count++;      if(sync_count>=256) {        printk("Sync not found, aborting\n");        return;      }      if(data==0xff) {        sync_ff_count++;      } else {        sync_ff_count=0;      }      if(sync_ff_count==4) {        sync_found=1;        VIRTEX_DEBUG(printk("Sync found at offset %d\n",sync_count));        p--;p--;p--;p--;        c++;c++;c++;c++;        break;      }    }  }  if(sync_found) {    if(bytes_written==0) {      start_virtex_program();    }    bytes_written=1;      reg_data = SET_PROGRAM_BIT(reg_data);    reg_data = SET_WRITE_BIT(reg_data);    reg_data = CLR_CS_BIT(reg_data);  //    tmp_cnt=0;        printk("*");    while(c--) {      data=(unsigned char)*p++;      data=bit_reverse(data);/* debug      tmp_cnt++;      if(tmp_cnt<=32 || c<=32 ) {        printk("0x%x ",data);       }      if(tmp_cnt==32 || c==0 ) {        printk("\n");       }*/      bytes_written_cnt++;      reg_data = CLR_CCLK_BIT(reg_data);      WRITE_FPGA_PROG_REG(reg_data|(data&0xff));      reg_data = SET_CCLK_BIT(reg_data);      WRITE_FPGA_PROG_REG(reg_data|(data&0xff));      reg_data = CLR_CCLK_BIT(reg_data);      WRITE_FPGA_PROG_REG(reg_data|(data&0xff));      }  }     return;}void stop_virtex_program(void){  unsigned short reg_data=0;  reg_data = SET_PROGRAM_BIT(reg_data);  reg_data = SET_WRITE_BIT(reg_data);  reg_data = CLR_CCLK_BIT(reg_data);  reg_data = SET_CS_BIT(reg_data); // release CS  WRITE_FPGA_PROG_REG(reg_data);  reg_data = CLR_WRITE_BIT(reg_data); // release write, important to do!  WRITE_FPGA_PROG_REG(reg_data);  printk("%d bytes written\n",bytes_written_cnt);  if(READ_DONE) {    printk("FPGA-configuration completed, no errors\n");  } else {    printk("Error, FPGA-configuration failed\n");  }  return;}static intvirtex_open(struct inode *inode, struct file *filp){  port_csp0_word_addr = port_csp0_addr;  if(open_count>=1) {    printk("FPGA Device busy, aborting\n");    return(-EBUSY);  }  open_count++;  bytes_written=0;  sync_found=0;  sync_count=0;  sync_ff_count=0;  bytes_written_cnt=0;  return(0);}static intvirtex_release(struct inode *inode, struct file *filp){  open_count--;  if(bytes_written!=0)stop_virtex_program();  return 0;}// FPGA programming interfacestatic ssize_t virtex_write(struct file * file, const char * buf,                                  size_t count, loff_t *ppos){  char *ptr;  VIRTEX_DEBUG(printk("Write FPGA count %d\n", count));    ptr=kmalloc(count, GFP_KERNEL);  if(!ptr) {    printk("FPGA device, kernel malloc failed (%d) bytes\n",count);    return -EFAULT;  }  if(copy_from_user(ptr, buf, count)) {    printk("copy_from_user failed\n");    return -EFAULT;  }    virtex_program(ptr,count);    kfree(ptr);  return count;}/* Main device API. ioctl's to write or read to/from registers. */int virtex_writereg(unsigned short theReg, unsigned short theValue){  port_csr0_word_addr[theReg]=theValue;  return(0);}unsigned short virtex_readreg(unsigned short theReg){  return(port_csr0_word_addr[theReg]);}static intvirtex_ioctl(struct inode *inode, struct file *file,	  unsigned int cmd, unsigned long arg){  if(_IOC_TYPE(cmd) != ETRAXVIRTEX_FPGA_IOCTYPE) {    return -EINVAL;  }    switch (_IOC_NR(cmd)) {    case VIRTEX_FPGA_WRITEREG:      /* write to an FPGA register */      VIRTEX_DEBUG(printk("virtex wr %d %d\n",                VIRTEX_FPGA_ARGREG(arg),               VIRTEX_FPGA_ARGVALUE(arg)));            return virtex_writereg(VIRTEX_FPGA_ARGREG(arg),                             VIRTEX_FPGA_ARGVALUE(arg));    case VIRTEX_FPGA_READREG:    {      unsigned char val;      /* read from an FPGA register */      VIRTEX_DEBUG(printk("virtex rd %d ",               VIRTEX_FPGA_ARGREG(arg)));      val = virtex_readreg(VIRTEX_FPGA_ARGREG(arg));      VIRTEX_DEBUG(printk("= %d\n", val));      return val;    }					        default:      return -EINVAL;    }return 0;}static struct file_operations virtex_fops = {	owner:    THIS_MODULE,	ioctl:    virtex_ioctl,	open:     virtex_open,        write:    virtex_write,	release:  virtex_release,};static int __initvirtex_init(void){  int res;    /* register char device */  res = register_chrdev(VIRTEX_MAJOR, virtex_name, &virtex_fops);  if(res < 0) {          printk(KERN_ERR "virtex: couldn't get a major number.\n");          return res;  }    port_csr0_word_addr = (volatile unsigned short *)                         ioremap((unsigned long)(MEM_CSR0_START |                                                MEM_NON_CACHEABLE), 16);     // see ~/platoon/rel2/platoon/os/linux/arch/cris/mm/init.c//              port_csp0_addr = (volatile unsigned long *)//                 ioremap((unsigned long)(MEM_CSP0_START |//                                         MEM_NON_CACHEABLE), 16);    open_count=0;    printk("VIRTEX(TM) FPGA driver v1.0, (c) 2002 Axis Communications AB\n");    return 0;}/* this makes sure that virtex_init is called during boot */module_init(virtex_init);/****************** END OF FILE virtex.c ********************************/

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美日韩国产综合久久| 91精品国产丝袜白色高跟鞋| 日韩欧美高清dvd碟片| 日韩综合一区二区| 欧美日韩国产欧美日美国产精品| 亚洲人成小说网站色在线| 丁香激情综合国产| 亚洲国产另类精品专区| 欧美一三区三区四区免费在线看 | 欧美日韩在线不卡| 欧美剧在线免费观看网站 | 亚洲一区影音先锋| 欧洲人成人精品| 亚洲欧美二区三区| 色婷婷av一区| 亚洲国产精品久久人人爱| 欧美日韩一区二区三区视频| 亚洲一区在线播放| 51精品秘密在线观看| 视频一区视频二区中文字幕| 日韩亚洲欧美在线| 精品一区二区三区蜜桃| 久久婷婷色综合| 成人18视频日本| 亚洲视频在线一区| 精品视频123区在线观看| 午夜精品福利在线| 精品国产精品网麻豆系列 | 欧美二区乱c少妇| 日韩免费观看高清完整版在线观看| 水蜜桃久久夜色精品一区的特点| 日韩欧美的一区| 国产激情偷乱视频一区二区三区 | 久久精品网站免费观看| 国产成人h网站| 亚洲男人的天堂一区二区| 欧美日韩一区精品| 国产一区二区网址| 中文字幕字幕中文在线中不卡视频| 色综合网色综合| 午夜久久久影院| 久久蜜臀精品av| 在线观看日韩av先锋影音电影院| 日韩高清一区在线| 欧美日韩成人综合天天影院| 蜜臀av性久久久久蜜臀aⅴ四虎 | 国产乱码一区二区三区| 亚洲日本va午夜在线电影| 欧美日韩国产首页| 高清不卡在线观看| 日日摸夜夜添夜夜添精品视频| 久久久亚洲高清| 欧美喷水一区二区| 成人av第一页| 精品亚洲免费视频| 亚洲成va人在线观看| 国产精品天天看| 欧美一区二区三级| 97精品国产露脸对白| 美国av一区二区| 亚洲免费电影在线| 欧美一卡在线观看| 欧美精品色综合| 91丝袜呻吟高潮美腿白嫩在线观看| 亚洲午夜日本在线观看| 国产日韩欧美精品在线| 欧美一级专区免费大片| 色婷婷久久99综合精品jk白丝| 国产在线麻豆精品观看| 亚洲成国产人片在线观看| 亚洲欧美福利一区二区| 国产午夜三级一区二区三| 日韩欧美国产综合在线一区二区三区| 97久久超碰国产精品电影| 国产成人精品综合在线观看| 亚洲一区二区三区四区在线| 国产性色一区二区| 亚洲精品一区二区三区精华液 | 成人国产精品免费观看视频| 日本中文字幕一区| 亚洲一区二区三区四区不卡| 国产欧美日韩视频在线观看| 精品国产网站在线观看| 欧美一区二区三区小说| 欧美性大战久久久久久久蜜臀| 国产精品1024| 另类小说欧美激情| 亚洲男人的天堂av| 国产无一区二区| 国产无一区二区| 国产欧美视频一区二区| 26uuu亚洲| 久久影视一区二区| 久久综合精品国产一区二区三区| 欧美成人官网二区| 欧美一级日韩免费不卡| 欧美一级二级在线观看| 日韩一区二区三区免费看| 日韩一卡二卡三卡| 欧美一区二区高清| 久久综合九色综合97婷婷女人 | 欧美巨大另类极品videosbest | 色拍拍在线精品视频8848| 99久久久无码国产精品| 94-欧美-setu| 欧美三级韩国三级日本三斤| 久久狠狠亚洲综合| 亚洲sss视频在线视频| 一区二区在线看| 亚洲婷婷综合久久一本伊一区 | 欧美在线免费播放| 欧美性做爰猛烈叫床潮| 欧美系列日韩一区| 欧美精品少妇一区二区三区| 日韩情涩欧美日韩视频| 日韩一区二区免费电影| 精品国产不卡一区二区三区| 久久网站热最新地址| 国产日韩成人精品| 中文字幕在线不卡| 亚洲欧美另类图片小说| 亚洲图片欧美一区| 91片在线免费观看| 精品国产91乱码一区二区三区 | 99久久精品国产一区二区三区| 不卡欧美aaaaa| 欧美亚洲尤物久久| 日韩精品专区在线影院观看| 国产日韩高清在线| 亚洲一区自拍偷拍| 九色综合狠狠综合久久| kk眼镜猥琐国模调教系列一区二区| 91福利小视频| 精品久久久三级丝袜| 亚洲少妇30p| 蜜臀久久99精品久久久久久9| 国产美女主播视频一区| 色悠久久久久综合欧美99| 5566中文字幕一区二区电影| 久久精品视频一区二区| 亚洲免费毛片网站| 日韩精品一卡二卡三卡四卡无卡| 麻豆精品国产传媒mv男同| 成人免费毛片高清视频| 欧美亚洲国产bt| 国产亚洲欧美日韩俺去了| 一区二区三区日韩欧美| 国产一区不卡视频| 欧美日韩国产123区| 欧美国产成人在线| 免费人成网站在线观看欧美高清| 99精品桃花视频在线观看| 91精品久久久久久蜜臀| 亚洲视频一区在线观看| 国产尤物一区二区在线| 欧美精品久久99久久在免费线| 国产亚洲欧洲997久久综合 | 久久精品国产亚洲5555| 欧美午夜精品免费| 亚洲人成7777| 成人免费看片app下载| 日韩欧美中文字幕制服| 亚洲影视在线播放| 91亚洲精品久久久蜜桃| 久久久五月婷婷| 久久国产欧美日韩精品| 8v天堂国产在线一区二区| 亚洲精品菠萝久久久久久久| 成人污污视频在线观看| 日韩欧美卡一卡二| 亚洲免费在线观看| 国产黄色精品视频| 精品国产一区二区三区久久久蜜月| 亚洲一区在线观看免费观看电影高清 | 亚洲国产激情av| 国产综合成人久久大片91| 久久久三级国产网站| 国产精品资源站在线| 日本一区二区三区免费乱视频| 国产a区久久久| 国产精品视频在线看| 91麻豆国产在线观看| 亚洲一区二区欧美日韩| 久久国产剧场电影| 日本美女一区二区三区| 欧美sm美女调教| 亚洲一区二区三区中文字幕在线| 国产精品综合二区| 日韩理论片中文av| 欧美做爰猛烈大尺度电影无法无天| 亚洲综合丝袜美腿| 亚洲免费电影在线| 欧美丰满嫩嫩电影| 国产乱码精品一区二区三区忘忧草| 日本一区二区三区视频视频| 色婷婷av一区二区三区大白胸| 午夜一区二区三区视频| 精品福利一区二区三区| 成人免费看的视频| 天堂蜜桃91精品|