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

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

?? mcbsp.c

?? linux2.6.16版本
?? C
?? 第 1 頁 / 共 2 頁
字號:
/* * linux/arch/arm/plat-omap/mcbsp.c * * Copyright (C) 2004 Nokia Corporation * Author: Samuel Ortiz <samuel.ortiz@nokia.com> * * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Multichannel mode not supported. */#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/clk.h>#include <asm/delay.h>#include <asm/io.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>#ifdef CONFIG_MCBSP_DEBUG#define DBG(x...)	printk(x)#else#define DBG(x...)	do { } while (0)#endifstruct omap_mcbsp {	u32                          io_base;	u8                           id;	u8                           free;	omap_mcbsp_word_length       rx_word_length;	omap_mcbsp_word_length       tx_word_length;	/* IRQ based TX/RX */	int                          rx_irq;	int                          tx_irq;	/* DMA stuff */	u8                           dma_rx_sync;	short                        dma_rx_lch;	u8                           dma_tx_sync;	short                        dma_tx_lch;	/* Completion queues */	struct completion            tx_irq_completion;	struct completion            rx_irq_completion;	struct completion            tx_dma_completion;	struct completion            rx_dma_completion;	spinlock_t                   lock;};static struct omap_mcbsp mcbsp[OMAP_MAX_MCBSP_COUNT];static struct clk *mcbsp_dsp_ck = 0;static struct clk *mcbsp_api_ck = 0;static struct clk *mcbsp_dspxor_ck = 0;static void omap_mcbsp_dump_reg(u8 id){	DBG("**** MCBSP%d regs ****\n", mcbsp[id].id);	DBG("DRR2:  0x%04x\n", OMAP_MCBSP_READ(mcbsp[id].io_base, DRR2));	DBG("DRR1:  0x%04x\n", OMAP_MCBSP_READ(mcbsp[id].io_base, DRR1));	DBG("DXR2:  0x%04x\n", OMAP_MCBSP_READ(mcbsp[id].io_base, DXR2));	DBG("DXR1:  0x%04x\n", OMAP_MCBSP_READ(mcbsp[id].io_base, DXR1));	DBG("SPCR2: 0x%04x\n", OMAP_MCBSP_READ(mcbsp[id].io_base, SPCR2));	DBG("SPCR1: 0x%04x\n", OMAP_MCBSP_READ(mcbsp[id].io_base, SPCR1));	DBG("RCR2:  0x%04x\n", OMAP_MCBSP_READ(mcbsp[id].io_base, RCR2));	DBG("RCR1:  0x%04x\n", OMAP_MCBSP_READ(mcbsp[id].io_base, RCR1));	DBG("XCR2:  0x%04x\n", OMAP_MCBSP_READ(mcbsp[id].io_base, XCR2));	DBG("XCR1:  0x%04x\n", OMAP_MCBSP_READ(mcbsp[id].io_base, XCR1));	DBG("SRGR2: 0x%04x\n", OMAP_MCBSP_READ(mcbsp[id].io_base, SRGR2));	DBG("SRGR1: 0x%04x\n", OMAP_MCBSP_READ(mcbsp[id].io_base, SRGR1));	DBG("PCR0:  0x%04x\n", OMAP_MCBSP_READ(mcbsp[id].io_base, PCR0));	DBG("***********************\n");}static irqreturn_t omap_mcbsp_tx_irq_handler(int irq, void *dev_id, struct pt_regs *regs){	struct omap_mcbsp * mcbsp_tx = (struct omap_mcbsp *)(dev_id);	DBG("TX IRQ callback : 0x%x\n", OMAP_MCBSP_READ(mcbsp_tx->io_base, SPCR2));	complete(&mcbsp_tx->tx_irq_completion);	return IRQ_HANDLED;}static irqreturn_t omap_mcbsp_rx_irq_handler(int irq, void *dev_id, struct pt_regs *regs){	struct omap_mcbsp * mcbsp_rx = (struct omap_mcbsp *)(dev_id);	DBG("RX IRQ callback : 0x%x\n", OMAP_MCBSP_READ(mcbsp_rx->io_base, SPCR2));	complete(&mcbsp_rx->rx_irq_completion);	return IRQ_HANDLED;}static void omap_mcbsp_tx_dma_callback(int lch, u16 ch_status, void *data){	struct omap_mcbsp * mcbsp_dma_tx = (struct omap_mcbsp *)(data);	DBG("TX DMA callback : 0x%x\n", OMAP_MCBSP_READ(mcbsp_dma_tx->io_base, SPCR2));	/* We can free the channels */	omap_free_dma(mcbsp_dma_tx->dma_tx_lch);	mcbsp_dma_tx->dma_tx_lch = -1;	complete(&mcbsp_dma_tx->tx_dma_completion);}static void omap_mcbsp_rx_dma_callback(int lch, u16 ch_status, void *data){	struct omap_mcbsp * mcbsp_dma_rx = (struct omap_mcbsp *)(data);	DBG("RX DMA callback : 0x%x\n", OMAP_MCBSP_READ(mcbsp_dma_rx->io_base, SPCR2));	/* We can free the channels */	omap_free_dma(mcbsp_dma_rx->dma_rx_lch);	mcbsp_dma_rx->dma_rx_lch = -1;	complete(&mcbsp_dma_rx->rx_dma_completion);}/* * omap_mcbsp_config simply write a config to the * appropriate McBSP. * You either call this function or set the McBSP registers * by yourself before calling omap_mcbsp_start(). */void omap_mcbsp_config(unsigned int id, const struct omap_mcbsp_reg_cfg * config){	u32 io_base = mcbsp[id].io_base;	DBG("OMAP-McBSP: McBSP%d  io_base: 0x%8x\n", id+1, io_base);	/* We write the given config */	OMAP_MCBSP_WRITE(io_base, SPCR2, config->spcr2);	OMAP_MCBSP_WRITE(io_base, SPCR1, config->spcr1);	OMAP_MCBSP_WRITE(io_base, RCR2, config->rcr2);	OMAP_MCBSP_WRITE(io_base, RCR1, config->rcr1);	OMAP_MCBSP_WRITE(io_base, XCR2, config->xcr2);	OMAP_MCBSP_WRITE(io_base, XCR1, config->xcr1);	OMAP_MCBSP_WRITE(io_base, SRGR2, config->srgr2);	OMAP_MCBSP_WRITE(io_base, SRGR1, config->srgr1);	OMAP_MCBSP_WRITE(io_base, MCR2, config->mcr2);	OMAP_MCBSP_WRITE(io_base, MCR1, config->mcr1);	OMAP_MCBSP_WRITE(io_base, PCR0, config->pcr0);}static int omap_mcbsp_check(unsigned int id){	if (cpu_is_omap730()) {		if (id > OMAP_MAX_MCBSP_COUNT - 1) {		       printk(KERN_ERR "OMAP-McBSP: McBSP%d doesn't exist\n", id + 1);		       return -1;		}		return 0;	}	if (cpu_is_omap1510() || cpu_is_omap16xx()) {		if (id > OMAP_MAX_MCBSP_COUNT) {			printk(KERN_ERR "OMAP-McBSP: McBSP%d doesn't exist\n", id + 1);			return -1;		}		return 0;	}	return -1;}static void omap_mcbsp_dsp_request(void){	if (cpu_is_omap1510() || cpu_is_omap16xx()) {		clk_enable(mcbsp_dsp_ck);		clk_enable(mcbsp_api_ck);		/* enable 12MHz clock to mcbsp 1 & 3 */		clk_enable(mcbsp_dspxor_ck);		/*		 * DSP external peripheral reset		 * FIXME: This should be moved to dsp code		 */		__raw_writew(__raw_readw(DSP_RSTCT2) | 1 | 1 << 1,			     DSP_RSTCT2);	}}static void omap_mcbsp_dsp_free(void){	if (cpu_is_omap1510() || cpu_is_omap16xx()) {		clk_disable(mcbsp_dspxor_ck);		clk_disable(mcbsp_dsp_ck);		clk_disable(mcbsp_api_ck);	}}int omap_mcbsp_request(unsigned int id){	int err;	if (omap_mcbsp_check(id) < 0)		return -EINVAL;	/*	 * On 1510, 1610 and 1710, McBSP1 and McBSP3	 * are DSP public peripherals.	 */	if (id == OMAP_MCBSP1 || id == OMAP_MCBSP3)		omap_mcbsp_dsp_request();	spin_lock(&mcbsp[id].lock);	if (!mcbsp[id].free) {		printk (KERN_ERR "OMAP-McBSP: McBSP%d is currently in use\n", id + 1);		spin_unlock(&mcbsp[id].lock);		return -1;	}	mcbsp[id].free = 0;	spin_unlock(&mcbsp[id].lock);	/* We need to get IRQs here */	err = request_irq(mcbsp[id].tx_irq, omap_mcbsp_tx_irq_handler, 0,			  "McBSP",			  (void *) (&mcbsp[id]));	if (err != 0) {		printk(KERN_ERR "OMAP-McBSP: Unable to request TX IRQ %d for McBSP%d\n",		       mcbsp[id].tx_irq, mcbsp[id].id);		return err;	}	init_completion(&(mcbsp[id].tx_irq_completion));	err = request_irq(mcbsp[id].rx_irq, omap_mcbsp_rx_irq_handler, 0,			  "McBSP",			  (void *) (&mcbsp[id]));	if (err != 0) {		printk(KERN_ERR "OMAP-McBSP: Unable to request RX IRQ %d for McBSP%d\n",		       mcbsp[id].rx_irq, mcbsp[id].id);		free_irq(mcbsp[id].tx_irq, (void *) (&mcbsp[id]));		return err;	}	init_completion(&(mcbsp[id].rx_irq_completion));	return 0;}void omap_mcbsp_free(unsigned int id){	if (omap_mcbsp_check(id) < 0)		return;	if (id == OMAP_MCBSP1 || id == OMAP_MCBSP3)		omap_mcbsp_dsp_free();	spin_lock(&mcbsp[id].lock);	if (mcbsp[id].free) {		printk (KERN_ERR "OMAP-McBSP: McBSP%d was not reserved\n", id + 1);		spin_unlock(&mcbsp[id].lock);		return;	}	mcbsp[id].free = 1;	spin_unlock(&mcbsp[id].lock);	/* Free IRQs */	free_irq(mcbsp[id].rx_irq, (void *) (&mcbsp[id]));	free_irq(mcbsp[id].tx_irq, (void *) (&mcbsp[id]));}/* * Here we start the McBSP, by enabling the sample * generator, both transmitter and receivers, * and the frame sync. */void omap_mcbsp_start(unsigned int id){	u32 io_base;	u16 w;	if (omap_mcbsp_check(id) < 0)		return;	io_base = mcbsp[id].io_base;	mcbsp[id].rx_word_length = ((OMAP_MCBSP_READ(io_base, RCR1) >> 5) & 0x7);	mcbsp[id].tx_word_length = ((OMAP_MCBSP_READ(io_base, XCR1) >> 5) & 0x7);	/* Start the sample generator */	w = OMAP_MCBSP_READ(io_base, SPCR2);	OMAP_MCBSP_WRITE(io_base, SPCR2, w | (1 << 6));	/* Enable transmitter and receiver */	w = OMAP_MCBSP_READ(io_base, SPCR2);	OMAP_MCBSP_WRITE(io_base, SPCR2, w | 1);	w = OMAP_MCBSP_READ(io_base, SPCR1);	OMAP_MCBSP_WRITE(io_base, SPCR1, w | 1);	udelay(100);	/* Start frame sync */	w = OMAP_MCBSP_READ(io_base, SPCR2);	OMAP_MCBSP_WRITE(io_base, SPCR2, w | (1 << 7));	/* Dump McBSP Regs */	omap_mcbsp_dump_reg(id);}void omap_mcbsp_stop(unsigned int id){	u32 io_base;	u16 w;	if (omap_mcbsp_check(id) < 0)		return;	io_base = mcbsp[id].io_base;        /* Reset transmitter */	w = OMAP_MCBSP_READ(io_base, SPCR2);	OMAP_MCBSP_WRITE(io_base, SPCR2, w & ~(1));	/* Reset receiver */	w = OMAP_MCBSP_READ(io_base, SPCR1);	OMAP_MCBSP_WRITE(io_base, SPCR1, w & ~(1));	/* Reset the sample rate generator */	w = OMAP_MCBSP_READ(io_base, SPCR2);	OMAP_MCBSP_WRITE(io_base, SPCR2, w & ~(1 << 6));}/* polled mcbsp i/o operations */int omap_mcbsp_pollwrite(unsigned int id, u16 buf){	u32 base = mcbsp[id].io_base;	writew(buf, base + OMAP_MCBSP_REG_DXR1);	/* if frame sync error - clear the error */	if (readw(base + OMAP_MCBSP_REG_SPCR2) & XSYNC_ERR) {		/* clear error */		writew(readw(base + OMAP_MCBSP_REG_SPCR2) & (~XSYNC_ERR),		       base + OMAP_MCBSP_REG_SPCR2);		/* resend */		return -1;	} else {		/* wait for transmit confirmation */		int attemps = 0;		while (!(readw(base + OMAP_MCBSP_REG_SPCR2) & XRDY)) {			if (attemps++ > 1000) {				writew(readw(base + OMAP_MCBSP_REG_SPCR2) &				       (~XRST),				       base + OMAP_MCBSP_REG_SPCR2);				udelay(10);				writew(readw(base + OMAP_MCBSP_REG_SPCR2) |				       (XRST),				       base + OMAP_MCBSP_REG_SPCR2);				udelay(10);				printk(KERN_ERR				       " Could not write to McBSP Register\n");				return -2;			}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
91精品国产一区二区三区香蕉| 日本一区二区不卡视频| 91精品国产综合久久精品图片 | 亚洲男女一区二区三区| 日韩一区二区三区精品视频| 国产精品麻豆网站| 久久成人久久爱| 欧美三级中文字幕在线观看| 中文在线一区二区| 麻豆91精品91久久久的内涵| 色视频欧美一区二区三区| 精品国产网站在线观看| 亚洲一区二区欧美| aa级大片欧美| 久久久综合视频| 免费观看一级欧美片| 在线视频国内自拍亚洲视频| 亚洲国产精品v| 国产精品亚洲第一| 日韩免费高清av| 午夜精品123| 在线亚洲一区二区| 中文字幕一区二区不卡 | 亚洲欧洲一区二区三区| 精品系列免费在线观看| 91精品国产91久久久久久一区二区| 亚洲另类春色国产| 99国产精品99久久久久久| 中文一区在线播放| 国产成人啪午夜精品网站男同| 日韩一级成人av| 日韩国产一区二| 欧美肥妇bbw| 五月婷婷色综合| 色哟哟一区二区在线观看| 激情综合网最新| 日韩精品色哟哟| 69堂精品视频| 五月天激情综合| 日韩欧美电影一区| 成人sese在线| 麻豆国产欧美一区二区三区| 国产成人午夜99999| 久久99精品久久只有精品| 麻豆一区二区99久久久久| 久国产精品韩国三级视频| 日韩电影一二三区| 美国欧美日韩国产在线播放| 国产美女娇喘av呻吟久久| 国产69精品一区二区亚洲孕妇| 日本欧美久久久久免费播放网| 国产精品人妖ts系列视频| 精品99久久久久久| 欧美精品v国产精品v日韩精品| 91丨九色丨黑人外教| 国产成人精品一区二| 久久精品久久精品| 日韩不卡一区二区三区| 中文字幕综合网| 欧美在线免费观看亚洲| 一区二区三区中文在线| 欧美日韩一区二区三区高清 | 91黄色激情网站| 亚洲一区免费观看| 欧美年轻男男videosbes| 视频精品一区二区| 精品国产伦一区二区三区免费| 国产一区二区三区免费播放| 国产亚洲欧美一区在线观看| 成人黄色a**站在线观看| 亚洲同性gay激情无套| 欧美亚洲动漫精品| 奇米影视7777精品一区二区| 欧美精品一区二区久久久| 成人激情动漫在线观看| 亚洲精品精品亚洲| 欧美一区二区三区在线电影| 国内精品伊人久久久久av影院| 国产精品女上位| 在线亚洲一区观看| 久久99精品久久久久久动态图| 国产日韩高清在线| 在线亚洲+欧美+日本专区| 日韩精品一级中文字幕精品视频免费观看 | 国产色婷婷亚洲99精品小说| 欧美一区二区福利在线| 精品日本一线二线三线不卡| 精品国产露脸精彩对白| 91理论电影在线观看| 欧洲中文字幕精品| 中文字幕不卡三区| 国产精品一二三四区| 欧美成人艳星乳罩| 午夜激情久久久| 色悠悠亚洲一区二区| 国产日韩一级二级三级| 精品在线播放免费| 欧美一区二区网站| 中文字幕乱码久久午夜不卡| 一区二区三区四区乱视频| 亚洲成人动漫av| 国产乱码精品一区二区三区av | 国产视频911| 国产精品久久久久精k8 | 欧美无人高清视频在线观看| 午夜精品免费在线观看| 2023国产精品视频| 欧美性xxxxxx少妇| 国产精品一品二品| 天堂在线一区二区| 亚洲三级免费电影| 久久久久国色av免费看影院| 欧美色综合久久| 成人在线综合网站| 日韩国产欧美在线视频| 亚洲欧美另类小说| 久久久久国产一区二区三区四区| 欧美日韩在线播放三区| 成人国产精品免费观看动漫 | 亚洲三级免费电影| 久久久综合九色合综国产精品| 欧美日韩电影在线播放| 成人动漫一区二区三区| 青青草原综合久久大伊人精品| 一色桃子久久精品亚洲| 26uuu亚洲综合色| 91精品久久久久久蜜臀| 91香蕉视频污在线| 成人在线视频首页| 国产一区二区网址| 美女www一区二区| 亚洲3atv精品一区二区三区| 亚洲人成在线播放网站岛国| 国产清纯白嫩初高生在线观看91 | 亚洲欧美视频在线观看视频| 天天综合天天做天天综合| 97se狠狠狠综合亚洲狠狠| 久久色视频免费观看| 国产精品1024| 日本一区二区久久| 一本久久综合亚洲鲁鲁五月天| 91香蕉视频污| 日韩电影在线免费| 亚洲国产精品二十页| 日韩一区二区三| 在线视频一区二区三区| 国产 日韩 欧美大片| 奇米精品一区二区三区四区| 亚洲一区二区免费视频| 一区二区三区成人在线视频| 伊人一区二区三区| 国产色综合一区| 欧美高清视频不卡网| 国产一区欧美日韩| 亚洲制服丝袜在线| 日韩欧美电影一区| 日本久久一区二区| 久热成人在线视频| 亚洲美腿欧美偷拍| 欧美久久一二区| 在线观看亚洲专区| 奇米在线7777在线精品| 欧美精品一二三| 99久久精品费精品国产一区二区| 成人av电影在线观看| 成人教育av在线| av福利精品导航| 91在线免费播放| 91久久精品一区二区三区| 色婷婷综合久久| 欧美日韩在线观看一区二区| 欧美人与性动xxxx| 日韩午夜激情电影| 精品成人在线观看| 国产夜色精品一区二区av| 欧美激情一区不卡| 亚洲欧洲日本在线| 亚洲综合免费观看高清在线观看| 亚洲网友自拍偷拍| 日本中文字幕一区二区有限公司| 麻豆国产精品一区二区三区| 国产乱码精品一区二区三区忘忧草| 国产1区2区3区精品美女| 不卡的av电影在线观看| 色偷偷一区二区三区| 欧美三区在线视频| 欧美v国产在线一区二区三区| 国产欧美视频在线观看| 亚洲欧美日韩久久| 天堂一区二区在线| 国产裸体歌舞团一区二区| 成人av免费在线播放| 欧美亚洲一区二区在线观看| 日韩三级视频在线观看| 日韩三级精品电影久久久| 欧美伦理影视网| 中文字幕中文字幕一区二区| 日韩高清在线不卡| 亚洲国产日韩a在线播放| 亚洲成人tv网|