亚洲欧美第一页_禁久久精品乱码_粉嫩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一区二区三区免费野_久草精品视频
久久精品欧美一区二区三区麻豆| 亚洲综合图片区| 日本久久电影网| 久久99精品久久久久久| 亚洲精品视频免费观看| 久久综合成人精品亚洲另类欧美 | 六月丁香婷婷久久| 亚洲欧美日韩成人高清在线一区| 精品免费视频.| 欧美日韩一区二区三区高清| 国产精品一卡二卡| 免费亚洲电影在线| 一区二区三区丝袜| 日本一区二区视频在线观看| 欧美一区二区福利在线| 在线一区二区观看| jlzzjlzz欧美大全| 国产美女久久久久| 精品亚洲国产成人av制服丝袜| 亚洲国产精品精华液网站| 国产精品大尺度| 日韩免费视频一区二区| 欧美精品日韩精品| 欧美亚洲免费在线一区| 国产精品自拍av| 韩国三级电影一区二区| 青青草成人在线观看| 亚洲va国产va欧美va观看| 一二三区精品福利视频| 18成人在线观看| 日韩一区有码在线| 综合av第一页| 日韩码欧中文字| 中文字幕在线不卡一区二区三区| 久久精品视频免费观看| 国产婷婷色一区二区三区四区 | 久久精品国产精品青草| 日本美女视频一区二区| 午夜精品免费在线观看| 午夜精品在线看| 日韩电影在线一区二区| 免费人成黄页网站在线一区二区| 美女高潮久久久| 黑人精品欧美一区二区蜜桃| 国产毛片精品视频| 国产999精品久久久久久绿帽| 成人免费毛片片v| 99精品在线免费| 91美女在线观看| 欧美午夜精品久久久| 欧美三区在线视频| 日韩欧美一区中文| 久久久久国产成人精品亚洲午夜| 久久久久国产精品免费免费搜索| 国产精品污www在线观看| 中文字幕视频一区| 亚洲精品国产视频| 日韩精品成人一区二区三区| 九九国产精品视频| 国产suv精品一区二区三区| 波波电影院一区二区三区| 色老汉一区二区三区| 宅男噜噜噜66一区二区66| 精品国产免费久久| 国产精品久久久久久久久免费桃花| 国产日韩欧美制服另类| 亚洲色大成网站www久久九九| 亚洲国产精品自拍| 紧缚捆绑精品一区二区| 99久久婷婷国产综合精品电影| 在线观看国产精品网站| 欧美一级欧美一级在线播放| 国产欧美日韩精品一区| 一区二区三区久久| 六月丁香综合在线视频| 99久久综合色| 欧美一二三区在线| 国产精品国产三级国产专播品爱网| 一区二区在线看| 韩国三级在线一区| 色噜噜狠狠成人网p站| 精品国产91亚洲一区二区三区婷婷 | 中文字幕亚洲一区二区av在线| 婷婷久久综合九色综合绿巨人 | 另类综合日韩欧美亚洲| 成人app网站| 日韩欧美在线一区二区三区| 中文字幕亚洲综合久久菠萝蜜| 日韩成人免费在线| 91麻豆精品一区二区三区| 91麻豆精品国产91久久久久久| 国产精品天干天干在观线| 午夜精品在线看| 不卡的av电影| 精品国产不卡一区二区三区| 一区二区三区在线免费视频| 国产精品456| 欧美一区二视频| 一区二区三区精品久久久| 国产在线精品一区二区夜色| 欧美图片一区二区三区| 国产精品天天看| 精品写真视频在线观看 | 国产精品免费网站在线观看| 全部av―极品视觉盛宴亚洲| 91蜜桃婷婷狠狠久久综合9色| 精品国产乱码久久久久久免费| 亚洲亚洲精品在线观看| 不卡的av网站| 欧美激情一区三区| 久久成人免费电影| 91.xcao| 亚洲小说春色综合另类电影| 97se亚洲国产综合在线| 国产欧美日韩另类视频免费观看| 精品一区二区成人精品| 日韩午夜中文字幕| 肉丝袜脚交视频一区二区| 色婷婷久久一区二区三区麻豆| 欧美国产成人精品| 国产91在线观看丝袜| 精品国产乱码久久久久久久久 | 中文字幕一区二区三区av| 精品中文av资源站在线观看| 一本一道波多野结衣一区二区| 久久色在线观看| 玖玖九九国产精品| 91精品国产一区二区三区蜜臀| 亚洲大片一区二区三区| 欧美三级视频在线观看| 一区二区久久久久久| 欧洲生活片亚洲生活在线观看| 亚洲欧美日韩久久精品| 一本久久a久久免费精品不卡| 亚洲欧洲无码一区二区三区| av在线一区二区三区| 国产精品美女一区二区在线观看| 高清beeg欧美| 国产精品久久久久久亚洲伦 | 成人免费视频app| 国产欧美日韩一区二区三区在线观看| 激情综合色播激情啊| 欧美精品一区二区不卡| 精品一区二区三区在线观看| 欧美成人精品1314www| 精品一区二区免费在线观看| 久久午夜电影网| 国产suv一区二区三区88区| 欧美激情一二三区| 91精品欧美综合在线观看最新| 亚洲精品美腿丝袜| 在线观看国产精品网站| 青青草成人在线观看| 极品美女销魂一区二区三区免费| av电影在线观看一区| 18成人在线视频| 欧美精品视频www在线观看 | 日韩一区二区免费电影| 久久精品国产澳门| 国产女人aaa级久久久级| 成人成人成人在线视频| 一区二区三区四区不卡视频| 91精品福利在线一区二区三区 | 亚洲二区在线观看| 欧美日韩中文一区| 久久国产精品99精品国产| 中文字幕久久午夜不卡| 色婷婷狠狠综合| 国产精品久久久久久久午夜片| 一区二区三区加勒比av| 欧美精品v国产精品v日韩精品| 天天综合色天天| 国产视频一区不卡| 在线区一区二视频| 久久97超碰色| 亚洲美女免费在线| 精品播放一区二区| 91网站在线播放| 精品一区二区久久| 一区二区三区精品久久久| 欧美精品一区二区久久久| 91美女精品福利| 韩国理伦片一区二区三区在线播放| 成人免费在线视频观看| 日韩一区二区在线观看| 成人国产精品免费| 奇米综合一区二区三区精品视频| 国产精品国产精品国产专区不片| 7777精品伊人久久久大香线蕉超级流畅 | 亚洲狠狠爱一区二区三区| 在线看日本不卡| 久久国产精品免费| 色综合久久中文综合久久牛| 欧美mv和日韩mv国产网站| 国产精品乱人伦中文| 色欧美片视频在线观看| 国产剧情一区二区三区| 亚洲国产精品久久久久婷婷884| wwwwxxxxx欧美| 777色狠狠一区二区三区|