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

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

?? sound.c

?? 基于AT91RM9200 板卡的LM4390音頻驅動程序LM4390連接于9200的SSC0接口
?? C
字號:
/*  * sound GPIO interface for Linux on Atmel AT91RM9200 * Copyright (c) 2006 Ligang Wang * wangzitan@163.com *//* include some file */ #include <linux/module.h>#include <linux/sched.h>#include <linux/slab.h>#include <linux/ioport.h>#include <linux/errno.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/string.h>#include <linux/poll.h>#include <linux/init.h>#include <asm/io.h>#include <asm/system.h>#include <asm/arch/hardware.h>#include <asm/segment.h>#include "sound.h"/* define some macro for this module*/static AT91PS_SYS AT91_SYS1 = (AT91PS_SYS) AT91C_VA_BASE_SYS;static AT91PS_TWI pTWI = (AT91PS_TWI) AT91C_VA_BASE_TWI;static AT91PS_SSC pSSC0 = (AT91PS_SSC) AT91C_VA_BASE_SSC0; int AT91F_TWI_Write(int address, char *data2send, int size)
{
	unsigned int status;
	// Set the TWI Master Mode Register
	pTWI->TWI_MMR = ((address <<16) | AT91C_TWI_IADRSZ_NO ) & ~AT91C_TWI_MREAD;	
	// Set TWI Internal Address Register
	status = pTWI->TWI_SR;
	pTWI->TWI_THR = *(data2send++);
	pTWI->TWI_CR = AT91C_TWI_START;
	while (size-- >1)	{
		// Wait THR Holding register to be empty
		while (!(pTWI->TWI_SR & AT91C_TWI_TXRDY));
		// Send first byte
		pTWI->TWI_THR = *(data2send++);
	}

	pTWI->TWI_CR = AT91C_TWI_STOP;		
	status = pTWI->TWI_SR;
	// Wait transfer is finished
    while (!(pTWI->TWI_SR & AT91C_TWI_TXCOMP));
	return 0;
}
//*=========================================================
//*		READ
//*=========================================================
//*----------------------------------------------------------------------------
//* \fn    AT91F_TWI_Read
//* \brief Read n bytes from a slave device
//*----------------------------------------------------------------------------
int AT91F_TWI_Read(int address, char *data, int size)
{
	unsigned int status;
	char temp;
	
	// Set the TWI Master Mode Register
	pTWI->TWI_MMR = address | AT91C_TWI_IADRSZ_NO | AT91C_TWI_MREAD;	
	// Set TWI Internal Address Register
	//pTWI->TWI_IADR = address;
	// Start transfer
	pTWI->TWI_CR = AT91C_TWI_START;
	status = pTWI->TWI_SR;
	temp	=	pTWI->TWI_RHR;	
	while (size-- >1)	{
		// Wait RHR Holding register is full
		while (!(pTWI->TWI_SR & AT91C_TWI_RXRDY))
		{
			//print(pTWI->TWI_SR);
		};
		// Read byte
		*(data++) = pTWI->TWI_RHR;
	}
	pTWI->TWI_CR = AT91C_TWI_STOP;
	status = pTWI->TWI_SR;
	// Wait transfer is finished
    while (!(pTWI->TWI_SR & AT91C_TWI_TXCOMP));
	// Read last byte
	*data = pTWI->TWI_RHR;	
	return 0;
}/* * Read funcation for vfs */ssize_t at91_sound_read(struct file * file, char *buf, size_t count, loff_t * ppos){	//int retval;	return 0;}/* * Write funcation for vfs */
static char * data;ssize_t at91_sound_write(struct file * file, const char * buf, size_t count, loff_t * ppos){
	int loop;	int retval = 0;
	unsigned short * pdata;
	int data_size;
	if(count > 1024 * sizeof(int))
	{
		retval = copy_from_user((char *)data,buf,1024 * sizeof(int));
		data_size = 1024 * sizeof(int);	}
	else
	{
		retval = copy_from_user((char *)data,buf,count);
		data_size = count;
	}	if (retval)		return retval;	
	pdata = (unsigned short *)data;
	
	for(loop = 0; loop < data_size/(sizeof(unsigned short)); loop++)
	{
		pSSC0->SSC_THR = *pdata;   /* Write the TD data */
		while((pSSC0->SSC_SR & AT91C_SSC_TXRDY)==0){ } /* Wait ready */	
		pdata++;  
	}
	return data_size;
}		/* open a device */static int at91_sound_open(struct inode* inode,struct file* file){	MOD_INC_USE_COUNT;
	return 0;	}/* * Handle commands from user-space. */static int at91_sound_ioctl(struct inode *inode, struct file *file,		unsigned int cmd, unsigned long arg){		unsigned arg_data = 0;		switch(cmd) 		{			//handle select dev and port command			case 48000:
				pSSC0->SSC_CMR = 20;				break;			case 44100:				pSSC0->SSC_CMR = 21;
				break;
			case 22050:
				pSSC0->SSC_CMR = 43;
				break;
			case 16000:
				pSSC0->SSC_CMR = 59;
				break;
			case 8000:
				pSSC0->SSC_CMR = 117;
				break;
			default:
				return;		}	return 0;
}void set_twi_clock()
{
	int sclock;

	/* Here, CKDIV = 1 and CHDIV=CLDIV  ==> CLDIV = CHDIV = 1/4*((Fmclk/FTWI) -6)*/

	sclock = (10*AT91C_MASTER_CLOCK /AT91C_TWI_CLOCK);
	if (sclock % 10 >= 5)
		sclock = (sclock /10) - 5;
	else
		sclock = (sclock /10)- 6;
	sclock = (sclock + (4 - sclock %4)) >> 2;	// div 4

    pTWI->TWI_CWGR	=(AT91C_TWI_CLDIV|AT91C_TWI_CHDIV|(0x02 <<16));// 0x00010000 | sclock | (sclock << 8);
}
void TWI_Configure ()
{
    //* Disable interrupts
	pTWI->TWI_IDR = (unsigned int) -1;
    //* Reset peripheral
	pTWI->TWI_CR = AT91C_TWI_SWRST;
	//* Set Master mode
	pTWI->TWI_CR = AT91C_TWI_MSEN;
}/* * setup sound hardware */static void at91_sound_setup(void){	// Configure TWI PIOs	char write[2];	int loop;	unsigned short * tmp;
	//AT91_CfgPIO_TWI();	AT91_SYS1->PIOA_PDR = AT91C_PA25_TWD|AT91C_PA26_TWCK;	AT91_SYS1->PIOA_ASR = AT91C_PA25_TWD|AT91C_PA26_TWCK;	AT91_SYS1->PIOA_MDDR = ~AT91C_PA25_TWD;	AT91_SYS1->PIOA_MDER = AT91C_PA25_TWD;		// Configure PMC by enabling TWI clock	AT91_SYS1->PMC_PCER = (unsigned int) (1 << AT91C_ID_TWI);		// Configure TWI in master mode	TWI_Configure();		// Set TWI Clock Waveform Generator Register	set_twi_clock();		//I2S setup;	// Configure I2S PIOs	AT91_SYS1->PIOB_PDR = ((unsigned int) AT91C_PB1_TK0     ) |
			 ((unsigned int) AT91C_PB2_TD0     ) |
			 ((unsigned int) AT91C_PB0_TF0     );	//* Configure PMC by enabling SSC1 clock  	AT91_SYS1->PMC_PCER = (unsigned int) (1 << AT91C_ID_SSC0);		//* Reset All the Peripheral 	pSSC0->SSC_CR = AT91C_SSC_SWRST ;	pSSC0->SSC_CMR = 21;		pSSC0->SSC_TCMR =  ((((BITS_BY_SLOT*SLOT_BY_FRAME)/2) -1) <<24) |
   		   ((1<<16) & AT91C_SSC_STTDLY) |
		   AT91C_SSC_START_FALL_RF | 
		   AT91C_SSC_CKO_CONTINOUS | 	// continuous transmit clock
		   AT91C_SSC_CKS_DIV; 		// Divided clock     //set AT91C_SSC_STTOUT in TCMT +\  with out no work FOR VERSION BEFORE Rev F
     pSSC0->SSC_TFMR =  
     		AT91C_SSC_FSOS_LOW 	|
		(((BITS_BY_SLOT-1)<<16) & AT91C_SSC_FSLEN)  |   // Fslen => 16 Clock
		(((SLOT_BY_FRAME-1)<<8) & AT91C_SSC_DATNB) |   // 2 Data by frame
		 AT91C_SSC_MSBF	    		|	// MSB in first
		 (BITS_BY_SLOT-1) ;		// 16 bits
		//* Enable TX
	pSSC0->SSC_CR = AT91C_SSC_TXEN;    /* Enable Tx */		//configure lm4930	write[0] = 0x0;
	write[1] = 0x10;
	AT91F_TWI_Write(BASIC_CONFIG, write, 2);
	for (loop=0; loop<1000; loop++);
	
	write[0] = 0x00;
	write[1] = 0x06;
	AT91F_TWI_Write(BASIC_CONFIG, write, 2);
	for (loop=0; loop<1000; loop++);
	
	write[0] = 0x0;
	write[1] = 0x16;
	AT91F_TWI_Write(VOICETEST, write, 2);
	for (loop=0; loop<1000; loop++);
	
	write[0] = 0xff;
	write[1] = 0xff;
	AT91F_TWI_Write(GAINCONFIG, write, 2);
	for (loop=0; loop<1000; loop++);
	printk("Init complate\n");	return;}static int at91_sound_release(struct inode* inode,struct file* file){	MOD_DEC_USE_COUNT;	return 0;}struct file_operations at91_sound_fops = {	owner:       THIS_MODULE,
	write:		at91_sound_write,
	read:			at91_sound_read,	open:     at91_sound_open,	ioctl:		at91_sound_ioctl,	release:  at91_sound_release,};/* * Initialize and install sound driver */static int __init at91_sound_init(void){	at91_sound_setup();	if(register_chrdev(DEV_MAJOR,"sound",&at91_sound_fops))
	{		printk("sound: Can not register led driver \n");
		return -1;
	}	data = kmalloc(1024*sizeof(int),GFP_KERNEL);	if(!data)
	{
		printk("Kmalloc mem error\n");		return -1;
	}
	printk("soundboard: the sound is working now\n");	return 0;}/* * Disable and remove the sound driver */static void __exit at91_sound_exit(void){	printk("sound: at91_sound_exit has been called\n");	unregister_chrdev(DEV_MAJOR,"sound");
	kfree(data);	return;}module_init(at91_sound_init);module_exit(at91_sound_exit);MODULE_AUTHOR("Ligang Wang");MODULE_DESCRIPTION("AT91 rm9200 8255a driver");MODULE_LICENSE("GPL");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区精品久久91| 亚洲高清免费观看 | 韩国一区二区在线观看| 亚洲午夜激情av| 亚洲在线观看免费视频| 一区二区三区中文字幕精品精品| 亚洲欧洲无码一区二区三区| 亚洲成av人综合在线观看| 亚洲午夜久久久久久久久电影院| 亚洲精品久久久蜜桃| 亚洲最色的网站| 亚洲成人tv网| 蜜臀久久久久久久| 精品午夜久久福利影院| 国产一区二区三区高清播放| 国产高清久久久| www.av精品| 91成人在线免费观看| 欧美色男人天堂| 日韩一级精品视频在线观看| 精品成人免费观看| 中文字幕五月欧美| 亚洲高清久久久| 狠狠网亚洲精品| eeuss影院一区二区三区 | 亚洲综合视频在线观看| 午夜精品爽啪视频| 国产精一区二区三区| 99久久久精品免费观看国产蜜| 欧美综合天天夜夜久久| 日韩欧美视频在线| 综合中文字幕亚洲| 免费观看成人鲁鲁鲁鲁鲁视频| 国产成人精品免费网站| 欧洲一区二区三区在线| 日韩精品自拍偷拍| 亚洲私人影院在线观看| 日韩不卡一区二区| 99久久99久久精品国产片果冻 | 免费在线看成人av| 国产不卡视频一区二区三区| 欧美日韩综合在线免费观看| 久久久国产精华| 国产精品电影院| 热久久久久久久| 91蝌蚪porny| 久久精品亚洲乱码伦伦中文| 亚洲第一电影网| 播五月开心婷婷综合| 欧美一级欧美三级| 尤物视频一区二区| 成人在线视频首页| 精品免费视频一区二区| 亚洲成人综合在线| 91玉足脚交白嫩脚丫在线播放| 精品久久久久久久人人人人传媒| 一区二区视频在线| 成人禁用看黄a在线| 欧美成人在线直播| 午夜av一区二区三区| 91在线视频观看| 欧美极品另类videosde| 久久综合综合久久综合| 欧美群妇大交群的观看方式| 亚洲精品久久久蜜桃| proumb性欧美在线观看| 国产日韩v精品一区二区| 日韩不卡手机在线v区| 欧美精选午夜久久久乱码6080| 国产乱码一区二区三区| 日韩一区二区三区免费观看| 亚洲国产精品一区二区久久恐怖片 | 99久久婷婷国产| 国产亚洲婷婷免费| 激情六月婷婷久久| 久久久精品蜜桃| 国产一本一道久久香蕉| 久久久五月婷婷| 国产一区二区按摩在线观看| 精品国产乱码久久久久久免费| 麻豆成人久久精品二区三区红 | 国产精品亚洲视频| 久久精品免视看| 国产ts人妖一区二区| 国产精品视频一二| 不卡av在线免费观看| 亚洲免费毛片网站| 欧美浪妇xxxx高跟鞋交| 日韩中文字幕区一区有砖一区| 91精品国产品国语在线不卡| 蜜臀久久99精品久久久久久9 | 亚洲国产成人在线| 99久久伊人网影院| 亚洲午夜视频在线观看| 在线不卡中文字幕播放| 久久电影网站中文字幕| 久久精品视频在线免费观看| 成人高清免费在线播放| 亚洲色图20p| 欧美一区二区三区的| 国产在线视频精品一区| 亚洲欧美自拍偷拍| 7777精品伊人久久久大香线蕉完整版| 日韩专区一卡二卡| 国产亚洲成av人在线观看导航| www.99精品| 日本在线不卡视频| 国产精品白丝在线| 欧美日韩一区久久| 国产大陆a不卡| 亚洲自拍另类综合| 久久久噜噜噜久久人人看 | 亚洲乱码日产精品bd| 欧美高清视频www夜色资源网| 国内一区二区视频| 亚洲猫色日本管| 精品福利在线导航| 色婷婷av久久久久久久| 另类小说综合欧美亚洲| 国产精品第13页| 精品欧美一区二区三区精品久久 | 在线观看亚洲一区| 精品亚洲porn| 亚洲小少妇裸体bbw| 国产亚洲自拍一区| 69p69国产精品| 91色porny| 国产成人精品aa毛片| 热久久免费视频| 亚洲一区二区影院| 亚洲欧洲色图综合| 国产丝袜欧美中文另类| 欧美一级日韩一级| 欧美色图免费看| 一本色道久久加勒比精品| 国产福利一区在线| 久久电影国产免费久久电影| 亚洲一区二区美女| 亚洲精品成人a在线观看| 亚洲国产成人在线| 久久精品综合网| 日韩亚洲欧美在线| 91精品国产综合久久久蜜臀粉嫩| 色偷偷久久一区二区三区| 成人精品小蝌蚪| 国产成人av电影| 国产成人综合在线观看| 国产自产2019最新不卡| 蜜臀精品一区二区三区在线观看| 亚洲一区二区综合| 亚洲一区在线电影| 亚洲一区二区偷拍精品| 亚洲综合丁香婷婷六月香| 亚洲精品v日韩精品| 亚洲免费色视频| 一片黄亚洲嫩模| 亚洲成av人片一区二区| 午夜精品在线看| 免费成人av在线| 精品一区二区久久| 风间由美一区二区av101| 国产精品一卡二卡| 成人性色生活片| 91视频免费播放| 欧美区视频在线观看| 欧美一区国产二区| 精品久久久三级丝袜| 国产欧美一区二区三区网站| 中文字幕第一页久久| 亚洲日本青草视频在线怡红院| 亚洲免费观看在线视频| 亚洲成人动漫在线免费观看| 日本欧美在线看| 韩国在线一区二区| 99精品黄色片免费大全| 国产欧美一二三区| 亚洲精品乱码久久久久久 | 欧美成人三级在线| 国产精品视频在线看| 亚洲免费视频中文字幕| 日韩精品欧美精品| 国产精品18久久久久| 色婷婷精品久久二区二区蜜臀av| 欧美日韩三级一区二区| 久久久99精品久久| 一区二区三区在线看| 蜜臀av性久久久久蜜臀aⅴ四虎 | 色婷婷激情综合| 欧美一区二区在线免费播放| 久久久久国产精品人| 一区二区三区四区不卡在线 | 成人18精品视频| 欧美精品在线观看播放| 国产日韩高清在线| 视频一区欧美日韩| 不卡一区中文字幕| 欧美电影免费观看高清完整版在 | 不卡在线观看av| 精品国产乱码久久久久久浪潮 | 欧美性极品少妇|