|
音频驱动问题,大家指教。在线等!!!!!!!!!
[复制链接]
lock_kernel();
mixer.busy = 0;
module_put(dmasound.mach.owner);
unlock_kernel();
--------------lock_kernel(); unlock_kernel();--------------这个是干什么的,有什么用?
==============================================================================================
问:file inode module fileoperations都是什么关系?怎么关联起来的?
typedef struct {
int offset; /* current offset */
char *data; /* points to actual buffer */
dma_addr_t dma_addr; /* physical buffer address */
int dma_ref; /* DMA refcount */
int master; /* owner for buffer allocation, contain size when true */
} audio_buf_t;
--------------这种没在struct后面定义结构体名而只在后面定义了一个名字,是怎么回事?前面定义代表什么?后面代表什么?
==============================================================================================
上层的open read是怎么关联到驱动的open read的?如何用从源码中找到ioctl的函数说明?
==============================================================================================
channel和物理上的line有什么区别和联系?各种bass mono等是什么关系和line,bass mono是只能用一个还是要组合的?
channel的定义如下:
mixerRegs[] = {
{ AC97_MASTER_VOL_STEREO, SOUND_MIXER_VOLUME, 0x3f, ST, SOUND_MASK_VOLUME, 5, 0x0000, INV },
{ AC97_MASTER_VOL_MONO, SOUND_MIXER_PHONEOUT, 0x3f, MO, SOUND_MASK_PHONEOUT, 6, 0x0000, INV },
{ AC97_MASTER_TONE, SOUND_MIXER_TREBLE, 0x0f, MO, SOUND_MASK_TREBLE, -1, 0x00ff, INV },
{ AC97_MASTER_TONE, SOUND_MIXER_BASS, 0x0f, MO, SOUND_MASK_BASS, -1, 0xff00, INV },
{ AC97_PCBEEP_VOL, SOUND_MIXER_SPEAKER, 0x0f, MO, SOUND_MASK_SPEAKER, -1, 0x001e, INV },
{ AC97_PHONE_VOL, SOUND_MIXER_PHONEIN, 0x1f, MO, SOUND_MASK_PHONEIN, 7, 0x0000, INV },
{ AC97_MIC_VOL, SOUND_MIXER_MIC, 0x1f, MO, SOUND_MASK_MIC, 0, 0x0000, INV },
{ AC97_LINEIN_VOL, SOUND_MIXER_LINE, 0x1f, ST, SOUND_MASK_LINE, 4, 0x0000, INV },
{ AC97_CD_VOL, SOUND_MIXER_CD, 0x1f, ST, SOUND_MASK_CD, 1, 0x0000, INV },
{ AC97_VIDEO_VOL, SOUND_MIXER_VIDEO, 0x1f, ST, SOUND_MASK_VIDEO, 2, 0x0000, INV },
{ AC97_AUX_VOL, SOUND_MIXER_LINE1, 0x1f, ST, SOUND_MASK_LINE1, 3, 0x0000, INV },
{ AC97_PCMOUT_VOL, SOUND_MIXER_PCM, 0x1f, ST, SOUND_MASK_PCM, -1, 0x0000, INV },
{ AC97_RECORD_GAIN, SOUND_MIXER_IGAIN, 0x0f, ST, SOUND_MASK_IGAIN, -1, 0x0000, NINV },
{ -1, -1, 0xff, 0, 0, -1, 0x0000, 0 },
};
==============================================================================================
spin_lock_irqsave(&devc->lock, flags);
if (devc->opened)
{
spin_unlock_irqrestore(&devc->lock, flags);---------如果有设备已经打开了设备,那么自旋锁也是打开设备的那个进程拥有,不可能在上面获得自旋锁时成功,这个是怎么回事?
return -EBUSY;
}
devc->opened = 1;
spin_unlock_irqrestore(&devc->lock, flags);
==============================================================================================
volatile-------这个东西是c还是c++的,是怎么回事?
==============================================================================================
static struct midi_operations sb_midi_operations = -----------------------等号是怎么回事?
{
.owner = THIS_MODULE,
.info = {"Sound Blaster", 0, 0, SNDCARD_SB},
.converter = &std_midi_synth,
.in_info = {0},
.open = sb_midi_open,
.close = sb_midi_close,
.ioctl = sb_midi_ioctl,
.outputc = sb_midi_out,
.start_read = sb_midi_start_read,
.end_read = sb_midi_end_read,
};
==============================================================================================
问题:fileoperations结构体中module拥有该结构的模块的指针,模块是什么东西,在这个之上吗?是什么东西完成了什么操作。
==============================================================================================
void sb_dsp_midi_init(sb_devc * devc, struct module *owner)-----------------设备在初始化时传进来的两个参数都是什么? 这个module结构体是什么,在内核中的机理、作用是什么?
==============================================================================================
==============================================================================================
|
|