Changeset 9dd79bc7 in mainline for uspace/drv/audio/sb16/sb16.c
- Timestamp:
- 2011-09-24T16:32:12Z (14 years ago)
- Branches:
- lfn, master, serial, ticket/834-toolchain-update, topic/msim-upgrade, topic/simplify-dev-export
- Children:
- 61013bd
- Parents:
- b956810
- File:
-
- 1 edited
-
uspace/drv/audio/sb16/sb16.c (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
uspace/drv/audio/sb16/sb16.c
rb956810 r9dd79bc7 28 28 29 29 #include <errno.h> 30 #include <libarch/ddi.h> 30 31 32 #include "ddf_log.h" 33 #include "dsp_commands.h" 31 34 #include "sb16.h" 35 36 37 static 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 48 static 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 32 58 33 59 /* ISA interrupts should be edge-triggered so there should be no need for … … 45 71 int sb16_init_sb16(sb16_drv_t *drv, void *regs, size_t size) 46 72 { 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 50 114 // TODO Initialize mixer 51 115 return EOK;
Note:
See TracChangeset
for help on using the changeset viewer.
