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

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

?? pxa-wm8971.c

?? 聲音播放器新片驅動
?? C
?? 第 1 頁 / 共 3 頁
字號:

#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/version.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/delay.h>
#include <linux/i2c.h>
#include <linux/pm.h>
//#include <sound/driver.h>
//#include <sound/core.h>
//#include <sound/pcm.h>
//#include <sound/pcm_params.h>
//#include <sound/soc.h>
//#include <sound/soc-dpm.h>
//#include <sound/initval.h>
#include <linux/slab.h>#include <linux/pci.h>#include <linux/completion.h>#include <linux/poll.h>#include <linux/sound.h>#include <linux/soundcard.h>#include <linux/proc_fs.h>#include <asm-arm/arch-pxa/pxa-regs.h>
#include <asm/hardware.h>#include <asm/arch/ssp.h>#include <asm/irq.h>#include <asm/uaccess.h>#include <asm/semaphore.h>#include <asm/arch/system.h>#include <asm/dma.h>

#include "wm8971.h"#include "pxa-audio.h"extern int ssp_init(struct ssp_dev *dev, u32 port, u32 mode, u32 flags, u32 psp_flags,u32 speed);

#define AUDIO_NAME "wm8971"
#define WM8971_VERSION "0.2"
#define CONFIG_PROC_FS

#define PFX AUDIO_NAME
#undef	WM8971_DEBUG

#ifdef WM8971_DEBUG
#define dbg(format, arg...) printk(KERN_DEBUG PFX ": " format "\n" , ## arg)
#else
#define dbg(format, arg...) do {} while (0)
#endif
#define err(format, arg...) printk(KERN_ERR PFX ": " format "\n" , ## arg)
#define info(format, arg...) printk(KERN_INFO PFX ": " format "\n" , ## arg)
#define warn(format, arg...) printk(KERN_WARNING PFX ": " format "\n" , ## arg)


#define WM8971_2W_ADDR1			0x1a
#define	WM8971_2W_ADDR2			0x1b#define SSP_PORT2 (u32)2

#define I2C_DRIVERID_WM8971		0xfdfd		/* need to get a real ID */


static unsigned short normal_i2c[] = { WM8971_2W_ADDR1, WM8971_2W_ADDR2, I2C_CLIENT_END };
static unsigned short normal_i2c_range[] = { I2C_CLIENT_END };	/* (required for kernel 2.6.10) */


/* magic definition of all other variables and things */
I2C_CLIENT_INSMOD;

//static struct i2c_driver wm8971_i2c_driver;
//static struct i2c_client client_template;


#define	WM8971_REG_COUNT		43

/*
 * wm8971 register cache
 * We can't read the WM8971 register space when we 
 * are using 2 wire for device control, so we cache them instead. 
 */  	/*	0x32f0,0x3580,0x35f8,0x0097,0x0297,
	0x0440,0x0640,0x1400,0x1600,0x0579,
	0x0779,0x0a00,0x0e02,0x1000,0x15e0,
	0x17e0,0x180f,0x1a0f,0x227b,0x2400,
	0x2632,0x2800,0x2ac3,0x2cc3,0x2ec0,
	0x3050,0x3e00,0x4000,0x4200,0x4550,
	0x4650,0x4850,0x4b50,0x4c50,0x4e50,
	0x5179,0x5379,0x5479*/		
static u16 wm8971_reg[] = {
	0x0097, 0x0097, 0x0179, 0x0179,  /*  0 */
	0x0000, 0x0a00, 0x0000, 0x0e02,  /*  4 */
	0x0000, 0x0000, 0x01e0, 0x01ff,  /*  8 */
	0x000f, 0x000f, 0x0000, 0x0000,  /* 12 */
	0x0000, 0x007b, 0x0000, 0x0032,  /* 16 */
	0x0000, 0x00c3, 0x00c3, 0x00c0,  /* 20 */
	0x0000, 0x0000, 0x0000, 0x0000,  /* 24 */
	0x0000, 0x0000, 0x0000, 0x0000,  /* 28 */
	0x0000, 0x0000, 0x0050, 0x0050,  /* 32 */
	0x0050, 0x0150, 0x0050, 0x0050,  /* 36 */
	0x0179, 0x0179, 0x0079,          /* 40 */
};

/* OSS interface to WM8971 */#define WM8971_STEREO_MASK (SOUND_MASK_VOLUME | SOUND_MASK_IGAIN)#define WM8971_SUPPORTED_MASK (WM8971_STEREO_MASK | \	SOUND_MASK_BASS|SOUND_MASK_TREBLE|SOUND_MASK_MIC)//#define WM8971_RECORD_MASK (SOUND_MASK_MIC | SOUND_MASK_IGAIN)
//add by tony 8/31

/* I2S sample rates */#define WM8971_I2S_8K		SADIV_513K#define WM8971_I2S_12K		SADIV_702K#define WM8971_I2S_16K		SADIV_1_026M#define WM8971_I2S_22K		SADIV_1_405M#define WM8971_I2S_44K		SADIV_2_836M#define WM8971_I2S_48K		12//SADIV_3_058M#define WM8971_I2S_441K		13//SADIV_3_058M//#define SSP_MODE_PSP 0x00000030
///////have not been configed/* SSP Port settings * We need to put the SSP port into 17bit mode because of corruption in* the MSB of the audio stream. The codec is in 16 bit mode and ignores * the corrupted bit 17. bug#1190412*/#define WM8971_SSP_MODE 	SSCR0_FRF | SSCR0_DSS | SSCR0_EDSS#define WM8971_SSP_SETUP 	SSCR1_RFT | SSCR1_TFT | SSCR1_TRAIL |SSCR1_TSRE | SSCR1_RSRE | SSCR1_TIE |SSCR1_RIE | SSCR1_SCLKDIR | SSCR1_SFRMDIR | SSCR1_RWOT#define WM8971_SSP_PSP		SSPSP_SCMODE(3) | SSPSP_SFRMP#define WM8971_SSP_8K		101#define WM8971_SSP_12K		66#define WM8971_SSP_16K		50#define WM8971_SSP_24K		33#define WM8971_SSP_32K		24#define WM8971_SSP_48K		16#define WM8971_SSP_96K		7#define WM8971_SSP_44_1K
#define WM8971_DEFAULT_SRATE 48000//#define wm8971_reset(struct i2c_client *client)	wm8971_2w_write(client, WM8971_RESET, 0)static int wm8971_attach(struct i2c_adapter *adap, int addr, int kind);static int wm8971_detach(struct i2c_client *client);static int wm8971_probe(struct i2c_adapter *adap);static int wm8971_reset(struct i2c_client *client);static int wm8971_2w_write(struct i2c_client *client, u8 reg, u16 value);static int wm8971_psp_open(u8 speed);static int wm8971_i2s_open(int speed);static void wm8971_i2s_close(void);static int wm8971_set_adcdac_rate(int val);static u16 wm8971_read_reg_cache(u8 reg);static void wm8971_write_reg_cache(u8 reg, u16 value);static int wm8971_init(void);//static int wm8971_init_pll(void);static int wm8971_get_mixer(int cmd);static int wm8971_set_mixer(int cmd, int val);static int wm8971_mixer_ioctl( struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg);static int wm8971_power_up(void);static int wm8971_power_down(void);#ifdef CONFIG_PMstatic int wm8971_pm_event(struct pm_dev *dev, pm_request_t rqst, void *data);static void wm8971_suspend(void);static void wm8971_resume(void);#endif#ifdef CONFIG_PROC_FSstatic int wm8971_read_proc (char *page, char **start, off_t off,		    int count, int *eof, void *data);#endifstatic struct i2c_driver wm8971_driver;//static struct i2c_client wm8971_client;
struct WM8971_codec_t {	char * name;
	//char * longname;
	//int (*probe)(struct i2c_adapter *adap);
	//int (*read)(u8 reg);
	//int (*write)(struct i2c_client *client, u8 reg, u16 value);	int modcnt;	int supported_mixers;	int stereo_mixers;	//int record_sources;	int codec_rate;	unsigned int mixer_state[SOUND_MIXER_NRDEVICES];#ifdef CONFIG_PROC_FS	struct proc_dir_entry * ps;#endif#ifdef CONFIG_PM	struct pm_dev* pdev;#endif	struct ssp_dev ssp;	int is_ssp_open:1;	struct i2c_client* wm8971_2w_client;};
//WM8971_codec_t.wm8971_2w_client->addr=WM8971_2W_ADDR1;
static struct WM8971_codec_t wm8971_codec = {	name: AUDIO_NAME,	modcnt: 0,	//probe:  wm8971_probe,	//read:  wm8971_read_reg_cache,	//write:  wm8971_2w_write,	codec_rate: WM8971_DEFAULT_SRATE,	supported_mixers:  WM8971_SUPPORTED_MASK,	stereo_mixers: WM8971_STEREO_MASK,  //record_sources: WM8971_RECORD_MASK,	is_ssp_open: 0,//	wm8971_2w_client: &wm8971_client,};void set_GPIO_mode(int gpio_mode){	int gpio = gpio_mode & GPIO_MD_MASK_NR;	int fn = (gpio_mode & GPIO_MD_MASK_FN) >> 8;	int gafr;	if (gpio_mode & GPIO_MD_MASK_DIR)	{		GPDR(gpio) |= GPIO_bit(gpio);	}	else	{		GPDR(gpio) &= ~GPIO_bit(gpio);	}	gafr = GAFR(gpio) & ~(0x3 << (((gpio) & 0xf)*2));	GAFR(gpio) = gafr |  (fn  << (((gpio) & 0xf)*2));}static int wm8971_pcm_ioctl(struct inode *inode, struct file *file,		      unsigned int cmd, unsigned long arg){	int ret = 0;	long val = 0;	switch(cmd) {	case SNDCTL_DSP_STEREO:		ret = get_user(val, (int *) arg);		if (ret)			return ret;		ret = (val == 0) ? -EINVAL : 1;		return put_user(ret, (int *) arg);	case SNDCTL_DSP_CHANNELS:	case SOUND_PCM_READ_CHANNELS:		return put_user(1, (long *) arg);	case SNDCTL_DSP_SPEED:		ret = get_user(val, (long *) arg);		if (ret)			return ret;		if ((file->f_mode & FMODE_READ) || (file->f_mode & FMODE_WRITE)) {			if ((ret = wm8971_set_adcdac_rate(val)) == val)				wm8971_codec.codec_rate = val;			else				return ret;		}		/* fall through */	case SOUND_PCM_READ_RATE:		if ((file->f_mode & FMODE_READ) || (file->f_mode & FMODE_WRITE))			val = wm8971_codec.codec_rate;		return put_user(val, (long *) arg);	case SNDCTL_DSP_SETFMT:	case SNDCTL_DSP_GETFMTS:		/* FIXME: can we do other fmts? */		return put_user(AFMT_S16_LE, (long *) arg);	default:		/* Maybe this is meant for the mixer (As per OSS Docs) */		return wm8971_mixer_ioctl(inode, file, cmd, arg);	}	return 0;}static int wm8971_psp_open (u8 speed){	int i;	/* do we need to close existing connection ? */	if (wm8971_codec.is_ssp_open)		ssp_exit(&wm8971_codec.ssp);	i=ssp_init(&wm8971_codec.ssp, SSP_PORT2, WM8971_SSP_MODE, WM8971_SSP_SETUP, WM8971_SSP_PSP, SSCR0_SerClkDiv(speed));	if(i == 0)	{		wm8971_codec.is_ssp_open = 1;		return 0;	}	/* something went wrong */	err("could not open SSP port 2");	return -EIO;}
/* * WM8971 SSP Audio stuff */static audio_stream_t wm8971_audio_out = {	name:			"WM8971 audio out",	dcmd:		  (DCMD_INCSRCADDR|DCMD_FLOWTRG|DCMD_BURST32|DCMD_WIDTH4),	drcmr:		&DRCMRTXSADR,//&DRCMRTXPCDR,//&DRCMRTXSS2DR,	dev_addr:		__PREG(SADR),//__PREG(SSDR_P2),};static audio_stream_t wm8971_audio_in = {	name:			"WM8971 audio in",	dcmd:			(DCMD_INCSRCADDR|DCMD_FLOWTRG|DCMD_BURST32|DCMD_WIDTH4),	drcmr:		&DRCMRRXSADR,//&DRCMRRXPCDR,//&DRCMRRXSS2DR,	dev_addr:		__PREG(SADR),//__PREG(SSDR_P2),};static audio_state_t wm8971_pcm = {	output_stream:		&wm8971_audio_out,	input_stream:		&wm8971_audio_in,	client_ioctl:		wm8971_pcm_ioctl,	sem:			__MUTEX_INITIALIZER(wm8971_pcm.sem),};

static struct i2c_driver wm8971_driver = {	name:           "audio_driver",	id:             I2C_DRIVERID_WM8971,	flags:          I2C_DF_NOTIFY,	attach_adapter: wm8971_probe,	detach_client:  wm8971_detach,	command:        NULL,};

static struct i2c_client client_template = {	name:   "WM8971",	flags:  I2C_CLIENT_ALLOW_USE,	driver: &wm8971_driver,};

/* * open the WM8971 pcm audio driver */static int wm8971_pcm_open(struct inode *inode, struct file *file){		return pxa_audio_attach(inode, file, &wm8971_pcm);}



/* * Attach WM8971 2 wire client  */static int wm8971_attach(struct i2c_adapter *adap, int addr, int kind){	        client_template.adapter = adap;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产精品乱码妇女bbbb| 中文字幕欧美激情| 91国模大尺度私拍在线视频| 国产成人精品一区二| 韩国成人在线视频| 久久精品国产亚洲高清剧情介绍 | 国产亚洲一区二区三区| 精品日韩一区二区三区免费视频| 91精品国产综合久久香蕉麻豆| 欧美日韩国产精品自在自线| 精品婷婷伊人一区三区三| 欧美三级乱人伦电影| 欧美日韩不卡在线| 91精品国产综合久久小美女| 精品国产乱码久久久久久蜜臀 | 亚洲自拍偷拍麻豆| 亚洲在线一区二区三区| 亚洲18色成人| 捆绑调教美女网站视频一区| 国产综合色视频| 成人av中文字幕| 色综合天天综合给合国产| 欧美性色aⅴ视频一区日韩精品| 欧美日韩一卡二卡三卡| 日韩欧美一区在线| 久久精品一区四区| 亚洲人成网站影音先锋播放| 亚洲国产你懂的| 免费欧美高清视频| 国产成人免费高清| 91视频观看视频| 欧美夫妻性生活| 国产日产欧美一区二区视频| 亚洲免费资源在线播放| 日韩av在线免费观看不卡| 国产一区二区三区四区在线观看| 色综合天天天天做夜夜夜夜做| 欧美色偷偷大香| 精品少妇一区二区三区日产乱码 | 日韩国产在线一| 国产一区二区三区四| 91色综合久久久久婷婷| 欧美一区二区三区在线观看 | 天天av天天翘天天综合网| 久久91精品国产91久久小草| 国产91对白在线观看九色| 欧美亚洲日本国产| 26uuu欧美日本| 亚洲欧美乱综合| 国内成人精品2018免费看| 色婷婷久久一区二区三区麻豆| 日韩欧美综合一区| 亚洲精品乱码久久久久久| 久久精品久久精品| 一本到三区不卡视频| 精品国精品国产尤物美女| 亚洲欧美一区二区三区久本道91| 免费不卡在线视频| 色综合天天性综合| 久久精品一区四区| 日韩经典中文字幕一区| 99精品久久只有精品| 欧美tk丨vk视频| 亚洲一区二区三区四区在线| 国产精品一区二区久激情瑜伽| 欧美日韩国产在线观看| 中文字幕一区二区三区在线播放 | 亚洲五月六月丁香激情| 国产麻豆成人传媒免费观看| 欧美网站一区二区| 中文字幕中文乱码欧美一区二区| 久久精品国产精品青草| 欧美午夜寂寞影院| 亚洲欧美在线aaa| 国产在线精品一区在线观看麻豆| 欧美日韩另类国产亚洲欧美一级| 国产欧美精品一区二区三区四区| 日韩国产在线观看一区| 91国产福利在线| 日韩理论片中文av| 北条麻妃国产九九精品视频| 亚洲精品一区二区三区99| 日韩电影网1区2区| 欧美日韩成人一区二区| 亚洲在线一区二区三区| 91视视频在线观看入口直接观看www | 精品日韩一区二区| 日韩av在线发布| 欧美日韩国产一区| 亚洲一区在线观看免费| 色综合一区二区| 国产精品精品国产色婷婷| 国产成人在线色| 国产精品一区免费视频| 一区二区在线看| 天堂一区二区在线| 国产精品综合一区二区三区| 91精品国产一区二区三区 | 韩日欧美一区二区三区| 欧美刺激午夜性久久久久久久 | 成人免费黄色大片| 国产清纯美女被跳蛋高潮一区二区久久w | 国产精品五月天| 国产乱子伦视频一区二区三区 | 欧美三级在线视频| 亚洲国产精品精华液网站| 91精彩视频在线观看| 夜夜嗨av一区二区三区网页| 91亚洲精品一区二区乱码| 国产suv精品一区二区883| 国产精品电影一区二区三区| 国产精品久久久一区麻豆最新章节| 蜜臀久久久久久久| 日韩丝袜美女视频| 美女在线视频一区| 精品国产一区二区三区久久久蜜月| 精品一区二区日韩| 国产欧美日韩视频一区二区| 成人成人成人在线视频| 亚洲欧美综合网| 欧美伊人精品成人久久综合97| 亚洲一级二级在线| 欧美一区二视频| 国产老肥熟一区二区三区| 中文字幕在线观看不卡| 91成人免费在线视频| 日韩和欧美一区二区| 久久久久久久久一| yourporn久久国产精品| 亚洲在线视频免费观看| 欧美久久免费观看| 国产一区二区在线观看视频| 国产精品久久久久久久久晋中| 色94色欧美sute亚洲13| 琪琪久久久久日韩精品| 久久九九影视网| 91蝌蚪porny| 日韩avvvv在线播放| 久久精品视频在线看| 91麻豆免费视频| 麻豆国产欧美一区二区三区| 日韩高清不卡一区二区三区| 欧美成人福利视频| 国产一区二区三区国产| 亚洲色图丝袜美腿| 91精品国产综合久久香蕉的特点| 国产成人精品一区二区三区四区| 亚洲综合一区二区| 精品免费一区二区三区| 91小视频免费看| 免费人成网站在线观看欧美高清| 中文一区二区完整视频在线观看| 欧美日韩一区三区| 国产一区二区91| 亚洲高清免费一级二级三级| 国产亚洲成aⅴ人片在线观看| 在线视频中文字幕一区二区| 国产精品一区二区视频| 亚洲国产欧美另类丝袜| 欧美激情一区二区| 欧美一区三区二区| 99国产欧美久久久精品| 麻豆91在线看| 夜夜精品视频一区二区| 国产日韩欧美精品一区| 制服丝袜亚洲网站| 99久久99久久免费精品蜜臀| 老司机午夜精品| 亚洲一区二区三区三| 欧美激情综合五月色丁香小说| 欧美久久久一区| 一本一道久久a久久精品综合蜜臀| 蜜臀av一区二区在线观看 | 青椒成人免费视频| 亚洲在线视频免费观看| 欧美夫妻性生活| 亚洲最大色网站| 粉嫩高潮美女一区二区三区| 亚洲靠逼com| 国产寡妇亲子伦一区二区| 欧美日韩国产综合久久| ●精品国产综合乱码久久久久| 国产精品久久综合| 精品日韩一区二区三区免费视频| 欧美日韩国产一级| 欧日韩精品视频| 色94色欧美sute亚洲线路一久| 成人黄色小视频| 国产精品亚洲а∨天堂免在线| 青青草精品视频| 亚洲成人你懂的| 亚洲在线一区二区三区| 亚洲欧美日韩精品久久久久| 欧美国产综合一区二区| 国产片一区二区三区| 久久蜜桃av一区精品变态类天堂| 91精品国产综合久久香蕉的特点 | 91麻豆国产在线观看| 岛国一区二区在线观看| 国产一区二区免费在线|