1.27k likes | 1.54k Views
Sound Device Driver in Linux. 경희대학교 컴퓨터공학과 조 진 성. 주요 내용. 주요내용 사운드 디바이스 드라이버 제작 디바이스 드라이버를 이용한 응용 프로그램 제작 인터럽트 /DMA 등을 활용한 디바이스 드라이버 이해. 디바이스 드라이버 제작 과정. Study Hardware manual 장치 인터페이스 이해 (Registers) 인터럽트 발생의 원인 인지 (vector number) 입출력 경로를 알아야 함
E N D
Sound Device Driver in Linux 경희대학교 컴퓨터공학과조 진 성
주요 내용 • 주요내용 • 사운드 디바이스 드라이버 제작 • 디바이스 드라이버를 이용한 응용 프로그램 제작 • 인터럽트/DMA 등을 활용한 디바이스 드라이버 이해
디바이스 드라이버 제작 과정 • Study Hardware manual • 장치 인터페이스 이해 (Registers) • 인터럽트 발생의 원인 인지(vector number) • 입출력 경로를 알아야 함 • Define objective of applications using device • Understand interface to related utilities • Device setup • Device 등록 및 해제 • ioctl command • Design to adapt to future changes • Module
Sound 디바이스 드라이버 • Sound 용 Codec chip architecture • CS4202 • AC’97 Controller Unit • Sound Device Driver의 원리 • Audio 구동 • Mixer • madplayer • OSS(Open Sound System) Interface를 이용한 Sound Programming
AC’97 Controller Unit(ACUNIT) • Overview • AC97 Controller Unit (ACUNIT) of the PXA250 and PXA210 application processors supports the AC97 revision 2.0 features. • The ACUNIT also supports audio controller link (AC-link). • AC-link is a serial interface for transferring digital audio, modem, Mic-in, Codec register control, and status information. • The AC97 Codec • sends the digitized audio samples that the ACUNIT stores in memory. • For playback or synthesized audio production, the processor retrieves stored audio samples and sends them to the Codec through the AC-link. • The external digital-to-analog converter (DAC) in the Codec then converts the audio sample to an analog audio waveform.
AC’97 Controller Unit(ACUNIT) • Supported AC’97 Features • Independent channels for stereo Pulse Code Modulated (PCM) In, Stereo PCM Out, Modem • Out, Modem-In and mono Mic-in • All of the above channels support only 16-bit samples in hardware. Samples less than 16 bits • are supported through software. • • Multiple sample rate AC97 2.0 Codecs (48 kHz and below). The ACUNIT depends on the • Codec to control the varying rate. • • Read/write access to AC97 registers • • Secondary Codec support • • Two Receive FIFOs (32-bit, 16 entries) • • Three Transmit FIFOs (32-bit, 16 entries)
AC’97 Controller Unit(ACUNIT) • Signal Description • The AC97 signals form the AC-link, which is a point-to-point synchronous serial interconnect that supports full-duplex data transfers. • All digital audio streams, Modem line Codec streams, and command/status information are communicated over the AC-link. • The AC-link uses General Purpose I/Os (GPIOs). • Software must reconfigure the GPIOs to use them as the AC-link.
AC’97 Controller Unit(ACUNIT) • Signal Configuration Steps • Configure SYNC and SDATA_OUT as outputs. • Configure BITCLK, SDATA_IN_0, and SDATA_IN_1 as inputs. • nACRESET is a dedicated output. It remains asserted on power-up. Complete these steps to deassert nACRESET: • Configure the other AC97 signals as previously described. • In the Global Control Register (GCR), Set the GCR[COLD_RST] bit. Refer to
AC-Link 예 • The ACUNIT supports one or two Codecs on the AC-link. SDATA_IN_1 is not needed if only a Primary Codec is connected.
AC-link Digital Serial Interface Protocol • Each AC97 Codec incorporates a five-pin digital serial interface that links it to the ACUNIT. • AC-link is a full-duplex, fixed-clock, PCM digital stream. It employs a time division multiplexed (TDM) scheme to handle control register accesses and multiple input and output audio streams. • The AC-link architecture divides each audio frame into 12 outgoing and 12 incoming data streams. • Each stream has 20-bit sample resolution and requires a DAC and an analog-to-digital converter(ADC) with a minimum 16-bit resolution.
AC-link Digital Serial Interface Protocol • The ACUNIT provides synchronization for all data transaction on the AC-link. • A data transaction is made up of 256 bits of information broken up into groups of 13 time slots and is called a frame. • Time slot 0 is called the Tag Phase and is 16 bits long. • The Tag Phase contains one bit that identifies a valid frame and 12 bits that identify the time slots in the Data Phase that contain valid data. • The other 12 time slots are called the Data Phase. Each time slot in the Data Phase is 20 bits long. • A frame begins when SYNC goes high. The amount of time that SYNC is high corresponds to the Tag Phase. • AC97 frames occur at fixed 48 kHz intervals and are synchronous to the 12.288 MHz bit rate clock, BITCLK. • The controller and the Codec use the SYNC and BITCLK to determine when to send transmit data and when to sample receive data. A transmitter transitions the serial data stream on each rising edge of BITCLK and a receiver samples the serial data stream on falling edges of BITCLK.
AC-link Digital Serial Interface Protocol • The transmitter must tag the valid slots in its serial data stream. The valid slots are tagged in slot 0. • Serial data on the AC-link is ordered most significant bit (MSB) to least significant bit (LSB). • The Tag Phase’s first bit is bit 15 and the first bit of each slot in Data Phase is bit 19. The last bit in any slot is bit 0. • Frame = Tag Phase + Data Phase = 13 Slots = 256 bits • Tag Phase = Slot 0 = 16 bits, Data Phase = Slot 1 - 12(각20bits)
AC’97 Controller Unit • AC-link Audio Output Frame(SDATA_OUT) • The audio output frame data stream corresponds to the multiplexed bundles that make up the digital output data that targets the AC97 DAC inputs and control registers. • Each audio output frame supports up to twelve 20-bit outgoing data time slots.
AC’97 Controller Unit • Start of Audio Output Frame
AC’97 Controller Unit • Slot 0: Tag Phase • In slot 0, the first bit is a global bit (SDATA_OUT slot 0, bit 15) that flags the validity for the entire audio frame. • If the valid frame bit is a 1, the current audio frame contains at least one slot time of valid data. • The next 12 bit positions sampled by AC97 indicate which of the corresponding 12 time slots contain valid data. • Bits 0 and 1 of slot 0 are used as Codec ID bits for I/O reads and writes to the Codec registers as described in the next section. • Data streams of differing sample rates can be transmitted across AC-link at its fixed 48 kHz audio frame rate. • The Codec can control the output sample rate of the controller using the SLOTREQ bits as described later (in the Input frame description).
AC’97 Controller Unit • Slot 1: Command Address Port • The command port controls features and monitors status for AC97 functions including mixer settings and power management. • The control-interface architecture supports up to sixty-four16-bit read/write registers, addressable on even byte boundaries. • Audio output frame slot 1 communicates control register address and write/read command information to the ACUNIT. • Two Codecs are connected to the single SDATA_OUT. To address the primary and secondary Codecs individually, follow these steps: • To access the primary(secondary) Codec: • 1. Set the Valid Frame bit (slot 0, bit 15) • 2. Set the valid bits for slots 1 and 2 (slot 0, bits 14 and 13) • 3. Write 0b00 to the Codec ID field (slot 0, bits 1 and 0) • secondary 인경우: Write a non-zero value (0b01, 0b10, 0b11) to the Codec ID field (slot 0, bits 1 and 0) • 4. Specify the read/write direction of the access (slot 1, bit 19). • 5. Specify the index to the Codec register (slot 1, bits 18-12) • 6. If the access is a write, write the data to the command data port (slot 2, bits 19-4)
AC’97 Controller Unit • Slot 1: Command Address Port • For CODEC reads, the ACUNIT gives the CODEC a maximum of four subsequent frames to respond. • if no response is received, the ACUNIT returns a dummy read completion (0xFFFF_FFFF) to the CPU and sets the Read Completion Status (RDCS) bit of the Global Status Register (GSR). • The CAIP bit of the CODEC Access Register (CAR) is used to assure that only one I/O cycle occurs across the AC-link at any time. • Software must read the CAIP bit before initiating an I/O cycle. • If the CAIP bit reads as a one, another driver is performing an I/O cycle. • If the CAIP bit reads as a zero, a new I/O cycle can be initiated. • The exception to posted accesses is reads to the CODEC GPIO Pin Status register (address 0x54). • CODEC GPIO Pin Status read data is sent by the CODEC over the AC-link in the same frame that the read request was sent to the CODEC. • The CODEC GPIO Pin Status read data is sent in Slot 12 of the incoming stream. A CODEC with a GPIO Pin Status register must constantly send the status of the register in slot 12.
AC’97 Controller Unit • Slot 2: Command Data Port • Slot 2 (in conjunction with the Command Address Port of Slot 1) delivers 16-bit control register write data in the event that the current command port operation is a write cycle (as indicated by slot 1, bit 19).
AC’97 Controller Unit • Slot 3: PCM Playback Left Channel • Slot 3 contains the composite digital audio left playback stream. • If the playback stream contains an audio sample with a resolution that is less than 20 bits, the ACUNIT fills all trailing non-valid bit positions with zeroes. • Slot 4: PCM Playback Right Channel • Slot 4 is the composite digital audio right playback stream. • If the playback stream contains an audio sample with a resolution that is less than 20 bits, the ACUNIT fills all trailing non-valid bit positions with zeroes.
AC’97 Controller Unit • Slot 5: Modem Line CODEC • Slot 5 contains the MSB justified modem DAC input data if the modem line CODEC is supported. • Slot 6-11: Reserved • Slot 12: I/O Control • Slot 12 contains 16 MSB bits for GPO Status (output). • The following rules govern the use of Slot 12: 1. Slot 12 is initially marked invalid by default. 2. A write to address 0x54 in CODEC IO space (using Slot 1 and Slot 2 in the outgoing stream of the present frame) results in the same write data (sent in Slot 2 of the present outgoing frame) being sent in Slot 12 of the next outgoing frame, where Slot 12 is then marked as valid. 3. After the first write to address 0x54, Slot 12 remains valid for all subsequent frames. The data transmitted on Slot 12 is the data last written to address 0x54. Any subsequent write to the register sends the new data out on the next frame. 4. Following a system reset or AC’97 cold reset, Slot 12 is invalidated. Slot 12 remains invalid until the next write to address 0x54.
AC’97 Controller Unit • AC-link Audio Input Frame(SDATA_IN) • The ACUNIT has two SDATA_IN lines, one primary and one secondary. • Each line can have CODECs attached. • The type of CODEC attached determines which slots are valid or invalid. • The data slots on the two inputs are completely orthogonal, i.e., no two data slots at the same location will be valid on both lines. • Multiple input data streams are received and multiplexed on slot boundaries as dictated by the slot valid bits in each stream. • Each AC-link audio input frame consists of twelve 20-bit time slots. • Slot 0 is reserved and contains 16 bits that are used for AC-link protocol infrastructure. • Software must poll the first bit in the audio input frame (SDATA_IN slot 0, bit 15) for an indication that the CODEC is in the CODEC ready state before it places the ACUNIT into data transfer operation. • When the “CODEC is ready” state is sampled, the next 12 sampled bits indicate which of the 12 time slots are assigned to input data streams and whether they contain valid data.
AC’97 Controller Unit • AC’97 Input Frame • Start of an Audio Input Frame
AC’97 Controller Unit • Slot 0: Tag Phase • In Slot 0, the first bit is a global bit (SDATA_IN slot 0, bit 15) that indicates whether or not the CODEC is in the CODEC ready state. • If the CODEC Ready bit is a 0, the CODEC is not ready for operation. This condition is normal after power is asserted on reset, i.e., while the CODEC voltage references are settling. • When the AC-link CODEC Ready indicator bit is a one, the AC-link and AC’97 control and status registers are fully operational. • The ACUNIT must probe the CODEC Powerdown Control/Status register to determine which subsections are ready. • The ACUNIT stores CODEC Ready in the PCR bit of the GSR for a primary CODEC and SCR bit of the GSR for a secondary CODEC. Software should monitor PCR or SCR to trigger a DMA or a programmed I/O operation. • The ACUNIT only samples CODEC Ready valid once and then ignores it for subsequent frames. CODEC Ready is only resampled after a PR state change.
AC’97 Controller Unit • Slot 1: Status Address Port/SLOTREQ bits • Slot 1 monitors the status of ACUNIT functions including, but not limited to, mixer settings and power management. • Slot 1 echoes the control register index for the data to be returned in Slot 2, if the ACUNIT tags Slot 1 and Slot 2 as valid during Slot 0. • The ACUNIT only accepts status data (Slot 2 of incoming stream) if the accompanying control register index (Slot 1 of incoming stream) matches the last valid control register index that was sent in Slot 1 of the outgoing stream of the most recent previous frame. • For multiple sample rate output, the CODEC examines its sample-rate control registers, its FIFOs’ states, and the incoming SDATA_OUT tag bits at the beginning of each audio output frame to determine which SLOTREQ bits to set active (low).
AC’97 Controller Unit • Slot 1: Status Address Port/SLOTREQ bits • For multiple sample-rate input, the tag bit for each input slot indicates whether valid data is present. • Slot 1 delivers a CODEC control register index and multiple “sample-rate slot request flags” for all output slots. AC’97 defines the ten least significant bits of Slot 1 as CODEC on-demand data request flags for outgoing stream Slots 3-12.
AC’97 Controller Unit • Slot 2: Status Data Port • Slot 2 delivers 16-bit control register read data.
AC’97 Controller Unit • Slot 3: PCM Record Left Channel • Slot 3 contains the CODEC left channel output. • The CODEC transmits its ADC output data (MSB first) and fills any trailing non-valid bit positions with zeroes. • Slot 4: PCM Record Right Channel • Slot 4 contains the CODEC right-channel output. • The CODEC transmits its ADC output data (MSB first), and fills any trailing non-valid bit positions with zeroes.
AC’97 Controller Unit • Slot 5: Optional Modem Line CODEC • Slot 5 contains MSB justified line modem ADC output data (if the line modem CODEC is supported). • Slot 6: Optional Dedicated Microphone Record Data • Slot 6 contains an optional third PCM system-input channel available for dedicated use by a microphone. • This input channel supplements a true stereo output to enable a more precise echo-cancellation algorithm for speakerphone applications. • Slot 7-11: Reserved • Slot 12: I/O Status • GPIOs which are configured as inputs return their status in Slot 12 of every frame. Only the 16 MSBs are used to return GPIO status. • Bit 0 in the LSBs indicates a GPI Input Interrupt event. • The data returned on the latest frame is also accessible to software through the CODEC register at address 0x54 in the modem CODEC I/O space. • Data received in Slot 12 is stored internally in the ACUNIT.
AC’97 Controller Unit • Powering Down the AC-link • The AC-link signals enter a low power mode after the PR4 bit of the AC’97 CODEC Powerdown Register (0x26) is set to a 1 (by writing 0x1000). • Then, the Primary CODEC drives both BITCLK and SDATA_IN to a logic low voltage level.
AC’97 Controller Unit • Waking up the AC-link
AC’97 Controller Unit • Waking up the AC-link(Cont’) • To wake up the AC-link, a CODEC drives SDATA_IN to a logic high level. • The rising edge triggers the Resume Interrupt if that CODEC’s resume enable bit is set to a one. • The CPU then wakes up the CODEC using the cold or warm reset sequence. • The ACUNIT uses a warm reset to wake up the primary CODEC. • The CODEC detects a warm reset when SYNC is driven high for a minimum of one microsecond and the BITCLK is absent. • The CODEC must wait until it samples SYNC low before it can start BITCLK. • The CODEC that signaled the wake event must keep its SDATA_IN high until it detects that a warm reset has been completed. • The CODEC can then transition its SDATA_IN low.
AC’97 Controller Unit • ACUNIT Operation • The ACUNIT can be accessed through the processor or the DMA controller. • The processor uses programmed I/O instructions to access the ACUNIT, and it can access four register types: • ACUNIT registers: Accessible at 32-bit boundaries. • CODEC registers: An audio or modem CODEC can contain up to sixty-four 16-bit registers. A CODEC uses a 16-bit address boundary for registers. The ACUNIT supplies access to the CODEC registers by mapping them to its 32-bit address domain boundary. • Modem CODEC GPIO register: If the ACUNIT is connected to a modem CODEC, the CODEC GPIO register can also be accessed. The CODEC GPIO register uses access address 0x0054 in the CODEC domain. • ACUNIT FIFO data: The ACUNIT has two Transmit FIFOs for audio-out and modem-out and three receive FIFOs for audio-in, modem-in, and mic-in. Data enters the transmit FIFOs by writing to either the PCM Data Register (PCDR) or the Modem Data Register (MODR).
AC’97 Controller Unit • ACUNIT Operation • Only the DMA can access the FIFOs. • The DMA controller accesses FIFO data in 8-, 16-, or 32- byte blocks. • The ACUNIT makes a transmit DMA request when the transmit FIFO has less than 32 bytes. • The ACUNIT makes a receive DMA request when the receive FIFO has 32 bytes or more. • Regardless of burst size, the DMA descriptor length must be a multiple of 32 bytes to prevent audio artifacts from being introduced onto the AC-link. • The DMA controller responds to the following ACUNIT DMA requests: • PCM FIFO transmit and receive DMA requests made when the PCM transmit and receive FIFOs are half full. • Modem FIFO transmit and receive DMA requests made when the modem transmit and receive FIFOs are half full. • Mic-in receive DMA requests made when the Mic-in receive FIFO is half full.
AC’97 Controller Unit • Initialization • After power up, the nACRESET signal remains asserted until the audio or modem driver sets the COLD_RST bit of the GCR to one. • To initialize the ACUNIT follow theses steps: 1. Program the GPIO Direction register and GPIO Alternate Function Select register to assign proper pin directions for the ACUNIT ports. 2. Set the COLD_RST bit of the GCR to one to deassert nACRESET. Deasserting nACRESET has the following effects: a. Frames filled with zeroes are transmitted because the transmit FIFO is still empty. This situation does not cause an error condition. b. The ACUNIT records zeroes until the CODEC sends valid data. c. DMA requests are enabled. 3. Enable the Primary Ready Interrupt Enable and/or the Secondary Ready Interrupt Enable by setting the PRIRDY_IEN bit and/or the SECRDY_IEN bit of the GCR to one. 4. Software enables DMA operation in response to primary and secondary ready interrupts. 5. The ACUNIT triggers transmit DMA requests. The DMA fills the transmit FIFO in response. 6. The ACUNIT continues to transmit zeroes until the transmit FIFO is half full. When it is half full, valid transmit FIFO data is sent across the AC-link.
AC’97 Controller Unit • Operational Flow for Accessing CODEC Registers • Software accesses the CODEC registers by translating a 32-bit processor physical address to a 7-bit CODEC address. • Software must read the CODEC Access Register (CAR) to lock the AC-link. The AC-link is free if the CAIP bit of the CAR is zero. • A read access to the CAR sets the CAIP bit. • The ACUNIT clears the CAIP bit when the CODEC-write or CODEC-read operation completes. Software can also clear the CAIP bit by writing a zero to it. • After it locks the AC-link, software can write or read a CODEC register using the appropriate processor physical address. • The ACUNIT sets the CDONE bit of the GSR to one after the completion of a CODEC write operation. Software clears this bit by writing a 1 to it.
AC’97 Controller Unit • Operational Flow for Accessing CODEC Registers • To read a CODEC, the software must complete the following steps: 1. Software issues a dummy read to the CODEC register. • The ACUNIT responds to this read operation with invalid data. • The ACUNIT then initiates the read access across the AC-link. 2. When the CODEC read operation completes, the ACUNIT sets the SDONE bit of the GSR to one. Software clears this bit by writing a 1 it. 3. Software repeats the read operation as detailed in Step 1. The ACUNIT now returns the data sent by the CODEC. The second read operation also initiates a read access across the AC-link. 4. The ACUNIT times-out the read operation if the CODEC fails to respond in four SYNC frames. In this case, the second read operation returns a timed-out data value of 0x0000_FFFF.
ACUNIT: Functional Description • FIFOs • The ACUNIT has five FIFOs: • PCM Transmit FIFO, with sixteen 32-bit entries. • PCM Receive FIFO, with sixteen 32-bit entries. • Modem Transmit FIFO, with sixteen 32-bit entries (upper 16 bits must always be zero). • Modem Receive FIFO, with sixteen 32-bit entries (upper 16 bits are always zero). • Mic-in Receive FIFO, with sixteen 32-bit entries (upper 16 bits are always zero). • A receive FIFO triggers a DMA request when the FIFO has eight or more entries. A transmit FIFO triggers a DMA request when it holds less than eight entries. A transmit FIFO must be half full (filled with eight entries) before any data is transmitted across the AC-link.
ACUNIT: Functional Description • Interrupts • The following status bits interrupt the processor when the interrupts are enabled: • Mic-in FIFO error: Mic-in Receive FIFO’s over-run or under-run error. • Modem-in FIFO error: Modem Receive FIFO’s over-run or under-run error. • PCM-in FIFO error: Audio Receive FIFO’s over-run or under-run error. • Modem-out FIFO error: Modem Transmit FIFO’s over-run or under-run error. • PCM-out FIFO error: Audio Transmit FIFO’s over-run or under-run error. • Modem CODEC GPI status change interrupt: Interrupts the CPU if bit 0 of Slot 12 is set. This indicates a change in one of the bits in the modem CODEC’s GPIO register. • Primary CODEC resume interrupt: Sets a status register bit when the Primary CODEC resumes from a lower power mode. Software writes a one to this bit to clear it.
ACUNIT: Functional Description • Interrupts(2) • Secondary CODEC resume interrupt: Sets a status register bit when the Secondary CODEC resumes from a lower power mode. Software writes a one to this bit to clear it. • CODEC command done interrupt: Interrupts the CPU when a CODEC register’s command is completed. Software writes a one to this bit to clear it. • CODEC status done interrupt: Interrupts the CPU when a CODEC register’s status address and data reception are completed. Software writes a one to this bit to clear it. • Primary CODEC ready interrupt: Sets a status register bit when the Primary CODEC is ready. The CODEC sets bit 0 of Slot 0 on the input frame to signal that it is ready. Software clears the PRIRDY_IEN bit of the GCR to clear this interrupt. • Secondary CODEC ready interrupt: Sets a status register bit when the Secondary CODEC is ready. The CODEC sets bit 0 of Slot 0 on the input frame to signal that it is ready. Software clears the SECRDY_IEN bit of the GCR to clear this interrupt.
ACUNIT: Functional Description • Registers • The ACUNIT and CODEC registers are mapped in addresses ranging from 0x4050_0000 through 0x405F_FFFF. • They are accessed via a 32-bit address map and translated to 16-bits for the CODEC. • Programmed I/O and DMA bursts can access the following registers: • Global registers: The ACUNIT has three global registers: • Status, Control, and CODEC access registers that are common to the audio and modem domains. • Channel-specific audio ACUNIT registers refer to PCM-out, PCM-in, and mic-in channels. • Channel-specific Modem ACUNIT registers refer to modem-out and modem-in channels. • Audio CODEC registers • Modem CODEC registers
AC’97 Controller Unit • Codec Access Register
Sound Device Driver 함수 개요 pxa_ac97_init pxa_ac97_get pxa_ac97_irq(IRQ_AC97, pxa_ac97_irq,…) ac97_audio_state.dev_dsp = register_sound_dsp(&ac97_audio_fops) pxa_ac97_codec.dev_mixer = register_sound_mixer(&mixer_fops) ac97_audio_fops ac97_audio_open ac97_audio_attach pxa_audio_attach pxa_request_dma(.. audio_dma_irq...) filep->f_op->release,write,read,mmap,poll,ioctl,llseek = audio_release, audio_write, audio_read, audio_mmap, audio_ioctl,.. mixer_fops mixer_ioctl
Sound Device Driver의 원리 • pxa-ac97.c source 분석 static u16 pxa_ac97_read(struct ac97_codec *codec, u8 reg) { u16 val = -1; down(&CAR_mutex); if (!(CAR & CAR_CAIP)) { volatile u32 *reg_addr = (u32 *)&PAC_REG_BASE + (reg >> 1); waitingForMask=GSR_SDONE; init_completion(&CAR_completion); //start read access across the ac97 link (void)*reg_addr; wait_for_completion(&CAR_completion); 0x40500200 : primary audio codec
Sound Device Driver의 원리 • pxa-ac97.c source 분석 (Cont’) • Each CODEC has up to sixty-four 16-bit registers that are addressable internal to the CODEC at half-word boundaries(16-bit boundaries). Because the processor only supports internal register accesses at word boundaries (32-bit boundaries), software must select the one of the following formulas to translate a 7-bit CODEC address into a 32-bit processor address: • Processor physical address for a Primary Audio CODEC = 0x4050-0200 + Shift_Left_Once(Internal 7-bit CODEC Register Address) • Processor physical address for a Secondary Audio CODEC = 0x4050-0300 + Shift_Left_Once(Internal 7-bit CODEC Register Address) • Processor physical address for a Primary Modem CODEC = 0x4050-0400 + Shift_Left_Once(Internal 7-bit CODEC Register Address) • Processor physical address for a Secondary Modem CODEC = 0x4050-0500 + Shift_Left_Once(Internal 7-bit CODEC Register Address)
Sound Device Driver의 원리 • pxa-ac97.c source 분석 (Cont’) if (GSR & GSR_RDCS) { GSR |= GSR_RDCS; printk(KERN_CRIT __FUNCTION__": read codec register timeout.\n"); } init_completion(&CAR_completion); val = *reg_addr; wait_for_completion(&CAR_completion); } else { printk(KERN_CRIT __FUNCTION__": CAR_CAIP already set\n"); } up(&CAR_mutex); return val; } cleared by software writing a ‘1’ to this location
Sound Device Driver의 원리 • pxa-ac97.c source 분석 (Cont’) static void pxa_ac97_write(struct ac97_codec *codec, u8 reg, u16 val){ down(&CAR_mutex); if (!(CAR & CAR_CAIP)) { volatile u32 *reg_addr= (u32 *)&PAC_REG_BASE + reg >>1); waitingForMask=GSR_CDONE; init_completion(&CAR_completion); *reg_addr = val; wait_for_completion(&CAR_completion); } else { printk(KERN_CRIT __FUNCTION__": CAR_CAIP already set\n"); } up(&CAR_mutex); } 0x40500200 : primary audio codec
Sound Device Driver의 원리 • pxa-ac97.c source 분석 (Cont’) static void pxa_ac97_irq(int irq, void *dev_id, struct pt_regs *regs) { int gsr = GSR; GSR = gsr & (GSR_SDONE|GSR_CDONE); if (gsr & waitingForMask) { complete(&CAR_completion); } }
Sound Device Driver의 원리 • pxa-ac97.c source 분석 (Cont’) static struct ac97_codec pxa_ac97_codec = { codec_read: pxa_ac97_read, codec_write: pxa_ac97_write, }; static DECLARE_MUTEX(pxa_ac97_mutex); static int pxa_ac97_refcount;