Changeset 9dd79bc7 in mainline for uspace/drv/audio/sb16/sb16.c


Ignore:
Timestamp:
2011-09-24T16:32:12Z (14 years ago)
Author:
Jan Vesely <jano.vesely@…>
Branches:
lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
Children:
61013bd
Parents:
b956810
Message:

sb16: Add hw DSP initialization.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • uspace/drv/audio/sb16/sb16.c

    rb956810 r9dd79bc7  
    2828
    2929#include <errno.h>
     30#include <libarch/ddi.h>
    3031
     32#include "ddf_log.h"
     33#include "dsp_commands.h"
    3134#include "sb16.h"
     35
     36
     37static inline void sb16_dsp_command(sb16_drv_t *drv, dsp_command_t command)
     38{
     39        assert(drv);
     40        uint8_t status;
     41        do {
     42                status = pio_read_8(&drv->regs->dsp_write);
     43        } while ((status & DSP_WRITE_READY) == 0);
     44
     45        pio_write_8(&drv->regs->dsp_write, command);
     46}
     47
     48static inline uint8_t sb16_dsp_read(sb16_drv_t *drv)
     49{
     50        assert(drv);
     51        uint8_t status;
     52        do {
     53                status = pio_read_8(&drv->regs->dsp_read_status);
     54        } while ((status & DSP_READ_READY) == 0);
     55        return pio_read_8(&drv->regs->dsp_data_read);
     56}
     57
    3258
    3359/* ISA interrupts should be edge-triggered so there should be no need for
     
    4571int sb16_init_sb16(sb16_drv_t *drv, void *regs, size_t size)
    4672{
    47         // TODO Setup registers
    48         // TODO Initialize dsp: get version number
    49         // TODO Initialize dsp: reset DSP
     73        assert(drv);
     74        /* Setup registers */
     75        int ret = pio_enable(regs, size, (void**)&drv->regs);
     76        if (ret != EOK)
     77                return ret;
     78        ddf_log_debug("PIO registers at %p accessible.\n", drv->regs);
     79
     80        /* Reset DSP, see Chapter 2 of Sound Blaster HW programming guide */
     81        pio_write_16(&drv->regs->dsp_reset, 1);
     82        udelay(3);
     83        pio_write_16(&drv->regs->dsp_reset, 0);
     84        udelay(100);
     85
     86        unsigned attempts = 100;
     87        uint8_t status;
     88        do {
     89                status = pio_read_8(&drv->regs->dsp_read_status);
     90                udelay(10);
     91        } while (--attempts && ((status & DSP_READ_READY) == 0));
     92
     93        if (status & DSP_READ_READY) {
     94                const uint8_t response = sb16_dsp_read(drv);
     95                if (response != 0xaa) {
     96                        ddf_log_error("Invalid DSP reset response: %x.\n",
     97                            response);
     98                        return EIO;
     99                }
     100        } else {
     101                ddf_log_error("Failed to reset Sound Blaster DSP.\n");
     102                return EIO;
     103        }
     104        ddf_log_note("Sound blaster reset!\n");
     105
     106
     107        /* Get DSP version number */
     108        sb16_dsp_command(drv, DSP_VERSION);
     109        const uint8_t major = sb16_dsp_read(drv);
     110        const uint8_t minor = sb16_dsp_read(drv);
     111        ddf_log_note("Sound blaster DSP version: %x.%x.\n", major, minor);
     112
     113
    50114        // TODO Initialize mixer
    51115        return EOK;
Note: See TracChangeset for help on using the changeset viewer.