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

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

?? fpga_spi.c

?? omap5912 spi interface driver
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * linux/arch/arm/omap/omap1/fpga_spi.c * * Copyright (C) 2006 GE Corporation * Author: Yang Yong <yongyoung.yang@ge.com> *  * Download FPGA data to Ateral stratix2 FPGA via SPI * *//* * linux/arch/arm/omap/omap1/fpga_spi.c * * Copyright (C) 2006 GE Corporation * Author: Yang Yong <yongyoung.yang@ge.com> *  * Download FPGA data to Ateral stratix2 FPGA via SPI * */#include <linux/module.h>#include <linux/init.h>#include <linux/device.h>#include <linux/wait.h>#include <linux/completion.h>#include <linux/interrupt.h>#include <linux/err.h>#include <linux/time.h>#include <linux/types.h> #include  <linux/slab.h>#include <asm/io.h>#include <asm/semaphore.h>#include <asm/delay.h>#include <asm/irq.h>#include <asm/arch/dma.h>#include <asm/arch/mux.h>#include <asm/arch/irqs.h>#include <asm/arch/dsp_common.h>#include <asm/arch/mcbsp.h>#include  <asm/arch/gpio.h>#include <asm/hardware/clock.h>#include <asm/mach-types.h>/// merged from TI omap5912osk CSL(Chip support library).#include <asm/arch/spi/csl_spi.h>#include <asm/arch/spi/soc.h>#include  "fpga_spi.h"/// omap memeory map//Flash physical Memmap [0x00000000, 0x02000000]#define EMIFS_FLASH_START 0x00000000#define EMIFS_FLASH_END   0x02000000#define EMIFS_FLASH_SIZE  (EMIFS_FLASH_END - EMIFS_FLASH_START)//SDRAM physical Memmap [0x10000000, 0x12000000]#define EMIFF_DRAM_START 0x10000000#define EMIFF_DRAM_END   0x12000000#define EMIFF_DRAM_SIZE  (EMIFF_DRAM_END - EMIFF_DRAM_START)// fpga file info#define FPGA_FILE_BASE 0x01000000#define FPGA_FILE_SIZE (1205084)#define GPIO11	(11)#define GPIO12	(12)#define GPIO15	(15)	#define FPGA_CONF_DONE     GPIO12#define FPGA_nSTATUS       GPIO11#define FPGA_nCONFIG	   GPIO15#define GPIO_OUT	(0)#define GPIO_IN		(1)#define	enable          (1)#define   disable	(0)///////////////////////////////////////////////////////////////////////////////////////////////#undef    CONFIG_SPI_DEBUG//#define CONFIG_SPI_DEBUG#ifdef CONFIG_SPI_DEBUG#define DBG(x...)       printk(KERN_INFO "OMAP-SPI:" x)#else#define DBG(x...)       do { } while (0)#endif#define SPI_HALT()  { do {} while(1); }#define SPI_TRACE_CURRENTPOS() DBG("->Go to %s, %s line %d\n",  __func__, __FILE__, __LINE__)#define SPI_TRACE_ENTER() DBG("--->Entering %s, %s line %d\n",  __func__, __FILE__, __LINE__)#define SPI_TRACE_LEAVE() DBG("<---Leaving  %s, %s line %d\n",  __func__, __FILE__, __LINE__)#define SPI_ASSERT(x)	\	{\		if(!(x)) \			DBG("Assert <%s> Failed! [%s, %s line %d]\n", #x, __func__, __FILE__, __LINE__);\	}/////////////////////////////////////////////////////////////////////////////////////////////static inline int RecordTime(void){#if defined(CONFIG_SPI_DEBUG)        #define MAX_SPI_DMA_TV  256        static struct timeval spi_dma_tv[ MAX_SPI_DMA_TV ];        static int index = 0;        int msvalue;        if(index >= MAX_SPI_DMA_TV)        {             index = 1;             spi_dma_tv[0] = spi_dma_tv[MAX_SPI_DMA_TV];        }        do_gettimeofday(&(spi_dma_tv[index]));        DBG("[%d]SPI Time Stub:[%6ds:%7dus]\n", index,                            (int)spi_dma_tv[index].tv_sec,                            (int)spi_dma_tv[index].tv_usec);        if(index > 0)        {              msvalue = (spi_dma_tv[index].tv_sec  - spi_dma_tv[index - 1].tv_sec) * 1000 +                         (spi_dma_tv[index].tv_usec - spi_dma_tv[index - 1].tv_usec) / 1000;              printk(KERN_INFO "OMAP-SPI:" "%d: %d ms\n", index + 1, msvalue);        }        return index++;#else        return 0;#endif}/////////////////////////////////////////////////////////////////////////////////// static CSL_SpiObj        spiObj;static CSL_SpiHandle     hSpi = NULL;static int    dma_tx_lch;static struct completion tx_irq_completion;static struct completion tx_dma_completion;DECLARE_MUTEX(omap_spi_sem);#define OMAP_SPI_ENTER_CRITICALSECTION() \		do { down(&omap_spi_sem); } while(0);#define OMAP_SPI_LEAVE_CRITICALSECTION() \		do { up(&omap_spi_sem); } while(0);////////////////////////////////////////////////////////////////////////////////////check the spi registersstatic void omap_spi_dump_registers(CSL_SpiHandle hSpi){#if defined(CONFIG_SPI_DEBUG)	unsigned int spi_regbase;	SPI_ASSERT(hSpi != (CSL_SpiHandle)NULL);	spi_regbase = (unsigned int)hSpi->regs;	DBG("##################################\n");	DBG("#[0x%x]SPI_REV:  0x%x\n", (unsigned int)&(hSpi->regs->SPI_REV),  hSpi->regs->SPI_REV);	DBG("#[0x%x]SPI_SCR:  0x%x\n", (unsigned int)&(hSpi->regs->SPI_SCR),  hSpi->regs->SPI_SCR);        DBG("#[0x%x]SPI_SSR:  0x%x\n", (unsigned int)&(hSpi->regs->SPI_SSR),  hSpi->regs->SPI_SSR);        DBG("#[0x%x]SPI_ISR:  0x%x\n", (unsigned int)&(hSpi->regs->SPI_ISR),  hSpi->regs->SPI_ISR);        DBG("#[0x%x]SPI_IER:  0x%x\n", (unsigned int)&(hSpi->regs->SPI_IER),  hSpi->regs->SPI_IER);        DBG("#[0x%x]SPI_SET1: 0x%x\n", (unsigned int)&(hSpi->regs->SPI_SET1), hSpi->regs->SPI_SET1);        DBG("#[0x%x]SPI_SET2: 0x%x\n", (unsigned int)&(hSpi->regs->SPI_SET2), hSpi->regs->SPI_SET2);        DBG("#[0x%x]SPI_CTRL: 0x%x\n", (unsigned int)&(hSpi->regs->SPI_CTRL), hSpi->regs->SPI_CTRL);        DBG("#[0x%x]SPI_DSR:  0x%x\n", (unsigned int)&(hSpi->regs->SPI_DSR),  hSpi->regs->SPI_DSR);        DBG("#[0x%x]SPI_TX:   0x%x\n", (unsigned int)&(hSpi->regs->SPI_TX),   hSpi->regs->SPI_TX);        DBG("#[0x%x]SPI_RX:   0x%x\n", (unsigned int)&(hSpi->regs->SPI_RX),   hSpi->regs->SPI_RX);        DBG("#[0x%x]SPI_TEST: 0x%x\n", (unsigned int)&(hSpi->regs->SPI_TEST), hSpi->regs->SPI_TEST);	DBG("##################################\n");#endif}     ////////////////////////////////////////////////////////////////////////////////////////// xfer without dma via spi. when the transmission  is completed ,an interrupt occuredstatic irqreturn_t omap_spi_tx_irq_handler(int irq, void *dev_id, struct pt_regs *regs){    SPI_TRACE_ENTER();        {             CSL_Status status;             unsigned short spi_isr;             unsigned short spi_cmd;             status = CSL_spiGetHwStatus(hSpi, CSL_SPI_QUERY_EVT_STATUS, &spi_isr);             SPI_ASSERT(status == CSL_SOK);             spi_cmd = CSL_SPI_INT_TX_MASK;             status = CSL_spiHwControl(hSpi, CSL_SPI_CMD_EVT_CLEAR, &spi_cmd);//SPI_ISR: WE is set	     SPI_ASSERT(status == CSL_SOK);	             complete(&tx_irq_completion);        }	SPI_TRACE_LEAVE();	return IRQ_HANDLED;}///////////////////////////////////////////////////////////////////////////////////////////xfer without dma typedef unsigned int XFERTYPE;#define XFERSIZE sizeof(XFERTYPE)static int _omap_spi_xfer_buffer(CSL_SpiHandle hSpi, unsigned int *buffer, unsigned int len /*bytes*/){	    SPI_ASSERT(buffer != NULL);    SPI_ASSERT(len % XFERSIZE == 0);    SPI_TRACE_ENTER();    {              CSL_Status     status;              unsigned short spi_cmd;              unsigned char  spi_cmd8;              // Enable TX interrupt              spi_cmd = CSL_SPI_INT_TX_MASK;              status = CSL_spiHwControl (hSpi, CSL_SPI_CMD_INT_ENABLE, &spi_cmd );//SPI_IER:MSK1 is set               SPI_ASSERT(status == CSL_SOK);                            {//xfer body                    int i;                    XFERTYPE *pbuf = buffer;                    for(i = 0; i < (len / XFERSIZE); i++)                    {//for each xfer                         CSL_SpiXevArg xevArg;                         // Write data to TX register                         XFERTYPE tmpdata = *pbuf;                         xevArg.data = &tmpdata;                         xevArg.nBytes = XFERSIZE;                         status = CSL_spiWrite(hSpi, &xevArg);                         SPI_ASSERT(status == CSL_SOK);                         // Write process active                         spi_cmd = CSL_SPI_INT_TX_MASK;                         status = CSL_spiHwControl (hSpi, CSL_SPI_CMD_XFER_ENABLE, &spi_cmd );//SPI_CTRL:WR is set                         SPI_ASSERT(status == CSL_SOK);				                         wait_for_completion(&tx_irq_completion);                         omap_spi_dump_registers( hSpi);                         pbuf++;                   }// for_each xfer              }// xfer body      }//     SPI_TRACE_LEAVE();      return len; }static void do_omap_spi_xfer(CSL_SpiHandle hSpi, unsigned int *buffer, unsigned int len){      SPI_TRACE_ENTER();	      {// spi xfer without dma.             {// get SPI IRQ                  int err;                 err = request_irq(INT_1610_SPI, omap_spi_tx_irq_handler, 0,  "SPI TX", NULL);                  if (err != 0)                   {                        printk(KERN_ERR "OMAP-SPI: Unable to request TX IRQ %d for SPI%d\n",INT_1610_SPI, 0);                        return;                 }                 DBG("OMAP-SPI: request TX IRQ %d for SPI\n", INT_1610_SPI);                 //init  SPI IRQ completion                 init_completion(&tx_irq_completion);             }             _omap_spi_xfer_buffer(hSpi, buffer, len);                         //free SPI IRQ             free_irq(INT_1610_SPI, NULL);      }        SPI_TRACE_LEAVE();}static void test_omap_spi_xfer(CSL_SpiHandle hSpi){                SPI_TRACE_ENTER();                   #define BUFSIZE   (256)      unsigned int   *buf;      XFERTYPE   i,_left, loopnum, xferlen;       	       xferlen =BUFSIZE * sizeof(XFERTYPE);	buf =(unsigned int * )kmalloc(xferlen,GFP_KERNEL);	//remap flash address        void * ptr = ioremap(FPGA_FILE_BASE, FPGA_FILE_SIZE);                    	 loopnum = FPGA_FILE_SIZE/xferlen;        for( i=0; i<loopnum; i++)	{	 //copy fpga file data from flash 

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久综合999| 欧美国产日韩a欧美在线观看| 欧美mv日韩mv国产网站| 亚洲美女在线国产| 国产一区二区三区国产| 91福利视频网站| 中文字幕巨乱亚洲| 精品一区二区三区视频| 欧美午夜精品久久久久久孕妇| 国产拍揄自揄精品视频麻豆| 日本色综合中文字幕| 欧美午夜精品一区二区三区| 亚洲视频一区二区免费在线观看| 精品一二三四在线| 日韩一区二区三区免费看| 亚洲va国产va欧美va观看| 一本色道久久综合精品竹菊 | 91尤物视频在线观看| 欧美精品一区在线观看| 人妖欧美一区二区| 欧美日韩亚洲国产综合| 亚洲图片欧美色图| 欧美三级资源在线| 亚洲图片自拍偷拍| 精品视频一区二区不卡| 亚洲国产日日夜夜| 欧美三区在线视频| 首页亚洲欧美制服丝腿| 欧美丰满美乳xxx高潮www| 丝袜美腿成人在线| 日韩一区二区在线看| 日本不卡高清视频| 26uuu精品一区二区| 国产一区激情在线| 国产精品天干天干在观线| youjizz久久| 亚洲欧美激情小说另类| 欧美午夜宅男影院| 日日夜夜免费精品| 精品久久久久久久久久久院品网| 国产一区二区三区免费| 国产精品午夜久久| 91丨九色porny丨蝌蚪| 亚洲综合av网| 欧美大片顶级少妇| 国产老肥熟一区二区三区| 国产精品久久久久久亚洲毛片| 色综合久久六月婷婷中文字幕| 亚洲h精品动漫在线观看| 欧美一区二区精美| 成人一道本在线| 亚洲精品va在线观看| 制服丝袜日韩国产| 高清日韩电视剧大全免费| 亚洲欧美日韩国产手机在线| 欧美色欧美亚洲另类二区| 久久国产人妖系列| 亚洲婷婷在线视频| 欧美一区二区三区在| 粉嫩一区二区三区在线看| 一区二区三区四区国产精品| 日韩一区二区在线观看视频| 成人毛片老司机大片| 亚洲国产成人av| 国产视频一区二区在线| 欧美在线观看视频在线| 国产一区二区三区最好精华液| 一区二区三区在线播| 精品免费日韩av| 欧美性感一类影片在线播放| 精品午夜一区二区三区在线观看| 亚洲天堂网中文字| 久久一区二区视频| 777色狠狠一区二区三区| 风间由美一区二区三区在线观看 | 欧美日韩精品久久久| 国产精品亚洲一区二区三区妖精| 亚洲一区二区三区四区五区中文| 日韩欧美一二三四区| 色偷偷久久人人79超碰人人澡| 精品系列免费在线观看| 性久久久久久久久久久久| 国产区在线观看成人精品| 91精品国产综合久久精品| 91香蕉视频黄| 国产精品一区二区在线播放| 日韩成人av影视| 亚洲综合色噜噜狠狠| 国产精品你懂的在线欣赏| 久久综合狠狠综合久久激情| 91精品国产乱码| 欧美日本在线看| 日本精品视频一区二区| 成人毛片老司机大片| 国产精品一区二区三区四区| 久久99国产精品麻豆| 日韩精品电影一区亚洲| 亚洲制服欧美中文字幕中文字幕| 国产精品卡一卡二| 国产日韩欧美精品综合| 久久综合国产精品| www激情久久| 久久综合九色综合欧美亚洲| 欧美videos中文字幕| 欧美成人午夜电影| 欧美xxxxx牲另类人与| 日韩三级精品电影久久久| 欧美一级黄色大片| 欧美一级片免费看| 欧美一区二区国产| 欧美变态tickle挠乳网站| 精品久久久久久无| 久久久激情视频| 国产欧美日产一区| 国产精品国产自产拍高清av王其| 亚洲激情在线激情| 亚洲精品国产成人久久av盗摄| 亚洲另类色综合网站| 亚洲免费av网站| 香蕉久久夜色精品国产使用方法 | 亚洲日本欧美天堂| 亚洲精品自拍动漫在线| 亚洲图片自拍偷拍| 日韩电影免费在线观看网站| 开心九九激情九九欧美日韩精美视频电影| 奇米777欧美一区二区| 精品夜夜嗨av一区二区三区| 国产v综合v亚洲欧| 91在线免费看| 6080国产精品一区二区| 精品国产自在久精品国产| 国产日韩欧美不卡在线| 亚洲日本成人在线观看| 香蕉久久一区二区不卡无毒影院| 麻豆国产精品视频| 成人午夜在线免费| 欧美在线观看视频在线| 精品粉嫩aⅴ一区二区三区四区| 国产日韩欧美在线一区| 亚洲综合免费观看高清完整版 | 91麻豆免费看| 欧美日韩免费在线视频| 精品久久久久av影院 | 久久久久免费观看| 中文字幕在线观看一区| 午夜精品一区在线观看| 国产成人夜色高潮福利影视| 欧美日韩专区在线| 欧美国产乱子伦| 日韩精品五月天| 99精品桃花视频在线观看| 在线电影一区二区三区| 国产精品毛片高清在线完整版| 五月天网站亚洲| 成人h动漫精品一区二区| 欧美一区二区三区免费大片| 18欧美亚洲精品| 国产精品亚洲第一区在线暖暖韩国| 在线看不卡av| 中国av一区二区三区| heyzo一本久久综合| 日韩一区二区三区在线观看| 中文字幕一区二区5566日韩| 老汉av免费一区二区三区| 日本高清视频一区二区| 欧美国产日产图区| 蜜臀av一区二区在线免费观看| 日本精品裸体写真集在线观看| 久久久综合精品| 美女网站色91| 欧美日韩国产经典色站一区二区三区| 国产精品青草综合久久久久99| 狠狠色狠狠色综合系列| 欧美精品vⅰdeose4hd| 亚洲综合色噜噜狠狠| 波多野结衣中文字幕一区二区三区| 日韩精品一区二区三区中文不卡| 亚洲国产日韩一区二区| 一本色道久久综合亚洲aⅴ蜜桃| 日本一区二区不卡视频| 国产一区二区三区四区五区入口| 欧美一区二区播放| 午夜精品免费在线| 欧美揉bbbbb揉bbbbb| 一个色在线综合| 欧洲av一区二区嗯嗯嗯啊| 亚洲人亚洲人成电影网站色| 白白色亚洲国产精品| 国产精品久久久久久妇女6080| 国产a精品视频| 欧美激情综合五月色丁香小说| 国产精品一级黄| 国产精品免费观看视频| 成人自拍视频在线| 国产精品女人毛片| 99久久免费国产| 亚洲美女少妇撒尿| 色综合亚洲欧洲| 亚洲午夜视频在线| 777xxx欧美|