⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 emuproc.c

📁 linux-2.6.15.6
💻 C
📖 第 1 页 / 共 2 页
字号:
static long snd_emu10k1_fx8010_read(snd_info_entry_t *entry, void *file_private_data,				    struct file *file, char __user *buf,				    unsigned long count, unsigned long pos){	long size;	emu10k1_t *emu = entry->private_data;	unsigned int offset;	int tram_addr = 0;		if (!strcmp(entry->name, "fx8010_tram_addr")) {		offset = TANKMEMADDRREGBASE;		tram_addr = 1;	} else if (!strcmp(entry->name, "fx8010_tram_data")) {		offset = TANKMEMDATAREGBASE;	} else if (!strcmp(entry->name, "fx8010_code")) {		offset = emu->audigy ? A_MICROCODEBASE : MICROCODEBASE;	} else {		offset = emu->audigy ? A_FXGPREGBASE : FXGPREGBASE;	}	size = count;	if (pos + size > entry->size)		size = (long)entry->size - pos;	if (size > 0) {		unsigned int *tmp;		long res;		unsigned int idx;		if ((tmp = kmalloc(size + 8, GFP_KERNEL)) == NULL)			return -ENOMEM;		for (idx = 0; idx < ((pos & 3) + size + 3) >> 2; idx++)			if (tram_addr && emu->audigy) {				tmp[idx] = snd_emu10k1_ptr_read(emu, offset + idx + (pos >> 2), 0) >> 11;				tmp[idx] |= snd_emu10k1_ptr_read(emu, 0x100 + idx + (pos >> 2), 0) << 20;			} else 				tmp[idx] = snd_emu10k1_ptr_read(emu, offset + idx + (pos >> 2), 0);		if (copy_to_user(buf, ((char *)tmp) + (pos & 3), size))			res = -EFAULT;		else {			res = size;		}		kfree(tmp);		return res;	}	return 0;}static void snd_emu10k1_proc_voices_read(snd_info_entry_t *entry, 				  snd_info_buffer_t * buffer){	emu10k1_t *emu = entry->private_data;	emu10k1_voice_t *voice;	int idx;		snd_iprintf(buffer, "ch\tuse\tpcm\tefx\tsynth\tmidi\n");	for (idx = 0; idx < NUM_G; idx++) {		voice = &emu->voices[idx];		snd_iprintf(buffer, "%i\t%i\t%i\t%i\t%i\t%i\n",			idx,			voice->use,			voice->pcm,			voice->efx,			voice->synth,			voice->midi);	}}#ifdef CONFIG_SND_DEBUGstatic void snd_emu_proc_io_reg_read(snd_info_entry_t *entry,				     snd_info_buffer_t * buffer){	emu10k1_t *emu = entry->private_data;	unsigned long value;	unsigned long flags;	int i;	snd_iprintf(buffer, "IO Registers:\n\n");	for(i = 0; i < 0x40; i+=4) {		spin_lock_irqsave(&emu->emu_lock, flags);		value = inl(emu->port + i);		spin_unlock_irqrestore(&emu->emu_lock, flags);		snd_iprintf(buffer, "%02X: %08lX\n", i, value);	}}static void snd_emu_proc_io_reg_write(snd_info_entry_t *entry,                                      snd_info_buffer_t * buffer){	emu10k1_t *emu = entry->private_data;	unsigned long flags;	char line[64];	u32 reg, val;	while (!snd_info_get_line(buffer, line, sizeof(line))) {		if (sscanf(line, "%x %x", &reg, &val) != 2)			continue;		if ((reg < 0x40) && (reg >=0) && (val <= 0xffffffff) ) {			spin_lock_irqsave(&emu->emu_lock, flags);			outl(val, emu->port + (reg & 0xfffffffc));			spin_unlock_irqrestore(&emu->emu_lock, flags);		}	}}static unsigned int snd_ptr_read(emu10k1_t * emu,				 unsigned int iobase,				 unsigned int reg,				 unsigned int chn){	unsigned long flags;	unsigned int regptr, val;	regptr = (reg << 16) | chn;	spin_lock_irqsave(&emu->emu_lock, flags);	outl(regptr, emu->port + iobase + PTR);	val = inl(emu->port + iobase + DATA);	spin_unlock_irqrestore(&emu->emu_lock, flags);	return val;}static void snd_ptr_write(emu10k1_t *emu,			  unsigned int iobase,			  unsigned int reg,			  unsigned int chn,			  unsigned int data){	unsigned int regptr;	unsigned long flags;	regptr = (reg << 16) | chn;	spin_lock_irqsave(&emu->emu_lock, flags);	outl(regptr, emu->port + iobase + PTR);	outl(data, emu->port + iobase + DATA);	spin_unlock_irqrestore(&emu->emu_lock, flags);}static void snd_emu_proc_ptr_reg_read(snd_info_entry_t *entry,				      snd_info_buffer_t * buffer, int iobase, int offset, int length, int voices){	emu10k1_t *emu = entry->private_data;	unsigned long value;	int i,j;	if (offset+length > 0x80) {		snd_iprintf(buffer, "Input values out of range\n");		return;	}	snd_iprintf(buffer, "Registers 0x%x\n", iobase);	for(i = offset; i < offset+length; i++) {		snd_iprintf(buffer, "%02X: ",i);		for (j = 0; j < voices; j++) {			if(iobase == 0)                		value = snd_ptr_read(emu, 0, i, j);			else                		value = snd_ptr_read(emu, 0x20, i, j);			snd_iprintf(buffer, "%08lX ", value);		}		snd_iprintf(buffer, "\n");	}}static void snd_emu_proc_ptr_reg_write(snd_info_entry_t *entry,				       snd_info_buffer_t * buffer, int iobase){	emu10k1_t *emu = entry->private_data;	char line[64];	unsigned int reg, channel_id , val;	while (!snd_info_get_line(buffer, line, sizeof(line))) {		if (sscanf(line, "%x %x %x", &reg, &channel_id, &val) != 3)			continue;		if ((reg < 0x80) && (reg >=0) && (val <= 0xffffffff) && (channel_id >=0) && (channel_id <= 3) )			snd_ptr_write(emu, iobase, reg, channel_id, val);	}}static void snd_emu_proc_ptr_reg_write00(snd_info_entry_t *entry,					 snd_info_buffer_t * buffer){	snd_emu_proc_ptr_reg_write(entry, buffer, 0);}static void snd_emu_proc_ptr_reg_write20(snd_info_entry_t *entry,					 snd_info_buffer_t * buffer){	snd_emu_proc_ptr_reg_write(entry, buffer, 0x20);}	static void snd_emu_proc_ptr_reg_read00a(snd_info_entry_t *entry,					 snd_info_buffer_t * buffer){	snd_emu_proc_ptr_reg_read(entry, buffer, 0, 0, 0x40, 64);}static void snd_emu_proc_ptr_reg_read00b(snd_info_entry_t *entry,					 snd_info_buffer_t * buffer){	snd_emu_proc_ptr_reg_read(entry, buffer, 0, 0x40, 0x40, 64);}static void snd_emu_proc_ptr_reg_read20a(snd_info_entry_t *entry,					 snd_info_buffer_t * buffer){	snd_emu_proc_ptr_reg_read(entry, buffer, 0x20, 0, 0x40, 4);}static void snd_emu_proc_ptr_reg_read20b(snd_info_entry_t *entry,					 snd_info_buffer_t * buffer){	snd_emu_proc_ptr_reg_read(entry, buffer, 0x20, 0x40, 0x40, 4);}#endifstatic struct snd_info_entry_ops snd_emu10k1_proc_ops_fx8010 = {	.read = snd_emu10k1_fx8010_read,};int __devinit snd_emu10k1_proc_init(emu10k1_t * emu){	snd_info_entry_t *entry;#ifdef CONFIG_SND_DEBUG	if (! snd_card_proc_new(emu->card, "io_regs", &entry)) {		snd_info_set_text_ops(entry, emu, 1024, snd_emu_proc_io_reg_read);		entry->c.text.write_size = 64;		entry->c.text.write = snd_emu_proc_io_reg_write;		entry->mode |= S_IWUSR;	}	if (! snd_card_proc_new(emu->card, "ptr_regs00a", &entry)) {		snd_info_set_text_ops(entry, emu, 65536, snd_emu_proc_ptr_reg_read00a);		entry->c.text.write_size = 64;		entry->c.text.write = snd_emu_proc_ptr_reg_write00;		entry->mode |= S_IWUSR;	}	if (! snd_card_proc_new(emu->card, "ptr_regs00b", &entry)) {		snd_info_set_text_ops(entry, emu, 65536, snd_emu_proc_ptr_reg_read00b);		entry->c.text.write_size = 64;		entry->c.text.write = snd_emu_proc_ptr_reg_write00;		entry->mode |= S_IWUSR;	}	if (! snd_card_proc_new(emu->card, "ptr_regs20a", &entry)) {		snd_info_set_text_ops(entry, emu, 65536, snd_emu_proc_ptr_reg_read20a);		entry->c.text.write_size = 64;		entry->c.text.write = snd_emu_proc_ptr_reg_write20;		entry->mode |= S_IWUSR;	}	if (! snd_card_proc_new(emu->card, "ptr_regs20b", &entry)) {		snd_info_set_text_ops(entry, emu, 65536, snd_emu_proc_ptr_reg_read20b);		entry->c.text.write_size = 64;		entry->c.text.write = snd_emu_proc_ptr_reg_write20;		entry->mode |= S_IWUSR;	}#endif		if (! snd_card_proc_new(emu->card, "emu10k1", &entry))		snd_info_set_text_ops(entry, emu, 2048, snd_emu10k1_proc_read);	if (emu->card_capabilities->emu10k2_chip) {		if (! snd_card_proc_new(emu->card, "spdif-in", &entry))			snd_info_set_text_ops(entry, emu, 2048, snd_emu10k1_proc_spdif_read);	}	if (emu->card_capabilities->ca0151_chip) {		if (! snd_card_proc_new(emu->card, "capture-rates", &entry))			snd_info_set_text_ops(entry, emu, 2048, snd_emu10k1_proc_rates_read);	}	if (! snd_card_proc_new(emu->card, "voices", &entry))		snd_info_set_text_ops(entry, emu, 2048, snd_emu10k1_proc_voices_read);	if (! snd_card_proc_new(emu->card, "fx8010_gpr", &entry)) {		entry->content = SNDRV_INFO_CONTENT_DATA;		entry->private_data = emu;		entry->mode = S_IFREG | S_IRUGO /*| S_IWUSR*/;		entry->size = emu->audigy ? A_TOTAL_SIZE_GPR : TOTAL_SIZE_GPR;		entry->c.ops = &snd_emu10k1_proc_ops_fx8010;	}	if (! snd_card_proc_new(emu->card, "fx8010_tram_data", &entry)) {		entry->content = SNDRV_INFO_CONTENT_DATA;		entry->private_data = emu;		entry->mode = S_IFREG | S_IRUGO /*| S_IWUSR*/;		entry->size = emu->audigy ? A_TOTAL_SIZE_TANKMEM_DATA : TOTAL_SIZE_TANKMEM_DATA ;		entry->c.ops = &snd_emu10k1_proc_ops_fx8010;	}	if (! snd_card_proc_new(emu->card, "fx8010_tram_addr", &entry)) {		entry->content = SNDRV_INFO_CONTENT_DATA;		entry->private_data = emu;		entry->mode = S_IFREG | S_IRUGO /*| S_IWUSR*/;		entry->size = emu->audigy ? A_TOTAL_SIZE_TANKMEM_ADDR : TOTAL_SIZE_TANKMEM_ADDR ;		entry->c.ops = &snd_emu10k1_proc_ops_fx8010;	}	if (! snd_card_proc_new(emu->card, "fx8010_code", &entry)) {		entry->content = SNDRV_INFO_CONTENT_DATA;		entry->private_data = emu;		entry->mode = S_IFREG | S_IRUGO /*| S_IWUSR*/;		entry->size = emu->audigy ? A_TOTAL_SIZE_CODE : TOTAL_SIZE_CODE;		entry->c.ops = &snd_emu10k1_proc_ops_fx8010;	}	if (! snd_card_proc_new(emu->card, "fx8010_acode", &entry)) {		entry->content = SNDRV_INFO_CONTENT_TEXT;		entry->private_data = emu;		entry->mode = S_IFREG | S_IRUGO /*| S_IWUSR*/;		entry->c.text.read_size = 128*1024;		entry->c.text.read = snd_emu10k1_proc_acode_read;	}	return 0;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -