diff --git a/src/add-ons/kernel/drivers/audio/ice1712/debug.h b/src/add-ons/kernel/drivers/audio/ice1712/debug.h index a8564661f4..ed985014da 100644 --- a/src/add-ons/kernel/drivers/audio/ice1712/debug.h +++ b/src/add-ons/kernel/drivers/audio/ice1712/debug.h @@ -15,8 +15,8 @@ # undef TRACE #endif -#define TRACE_MULTI_AUDIO -#ifdef TRACE_MULTI_AUDIO +//#define ICE1712_VERBOSE +#ifdef ICE1712_VERBOSE # define TRACE(a...) dprintf("\33[34mice1712:\33[0m " a) #else # define TRACE(a...) ; diff --git a/src/add-ons/kernel/drivers/audio/ice1712/ice1712.c b/src/add-ons/kernel/drivers/audio/ice1712/ice1712.c index 378c9ca3a0..14f8899109 100644 --- a/src/add-ons/kernel/drivers/audio/ice1712/ice1712.c +++ b/src/add-ons/kernel/drivers/audio/ice1712/ice1712.c @@ -75,7 +75,7 @@ init_hardware(void) pci_info info; memset(cards, 0, sizeof(ice1712) * NUM_CARDS); - TRACE("ice1712: init_hardware()\n"); + TRACE("@@init_hardware()\n"); if (get_module(B_PCI_MODULE_NAME, (module_info **)&pci)) return ENOSYS; @@ -102,7 +102,7 @@ ice_1712_int(void *arg) uint16 reg16 = 0; uint32 status = B_UNHANDLED_INTERRUPT; -// interrupt from DMA PATH + // interrupt from DMA PATH reg8 = read_mt_uint8(ice, MT_DMA_INT_MASK_STATUS); if (reg8 != 0) { ice->buffer++; @@ -114,14 +114,33 @@ ice_1712_int(void *arg) status = B_HANDLED_INTERRUPT; } -// interrupt from Controller Registers + // interrupt from Controller Registers reg8 = read_ccs_uint8(ice, CCS_INTERRUPT_STATUS); if (reg8 != 0) { - write_ccs_uint8(ice, CCS_INTERRUPT_STATUS, reg8); - status = B_HANDLED_INTERRUPT; + bool ret; + if (reg8 & CCS_INTERRUPT_MIDI_1) { + ret = (*mpu401->interrupt_hook)(ice->midi_interf[0].mpu401device); + if (ret) { + //Do not ack, cause more datas are available + reg8 &= ~CCS_INTERRUPT_MIDI_1; + } + } + + if (reg8 & CCS_INTERRUPT_MIDI_2) { + ret = (*mpu401->interrupt_hook)(ice->midi_interf[1].mpu401device); + if (ret) { + //Do not ack, cause more datas are available + reg8 &= ~CCS_INTERRUPT_MIDI_2; + } + } + + if (reg8 != 0) { + write_ccs_uint8(ice, CCS_INTERRUPT_STATUS, reg8); + status = B_HANDLED_INTERRUPT; + } } -// interrupt from DS PATH + // interrupt from DS PATH reg16 = read_ds_uint16(ice, DS_DMA_INT_STATUS); if (reg16 != 0) { //Ack interrupt @@ -137,7 +156,6 @@ static status_t ice1712_setup(ice1712 *ice) { int result, i; - status_t status = B_OK; uint8 reg8 = 0; uint16 mute; @@ -225,10 +243,34 @@ ice1712_setup(ice1712 *ice) reg8 >>= 1; ice->config.nb_MPU401 = (reg8 & 0x1) + 1; - for (i = 0; i < ice->config.nb_MPU401; i++) { - sprintf(ice->midi_interf[i].name, "midi/ice1712/%ld/%d", - ice - cards + 1, i + 1); - names[num_names++] = ice->midi_interf[i].name; + if (ice->config.nb_MPU401 > 0) { + sprintf(ice->midi_interf[0].name, "midi/ice1712/%ld/1", + ice - cards + 1); + + (*mpu401->create_device)(ice->Controller + CCS_MIDI_1_DATA, + &ice->midi_interf[0].mpu401device, + 0x14121712, + ice_1712_midi_interrupt_op, + &ice->midi_interf[0]); + + names[num_names++] = ice->midi_interf[0].name; + ice->midi_interf[0].card = ice; + ice->midi_interf[0].int_mask = CCS_INTERRUPT_MIDI_1; + } + + if (ice->config.nb_MPU401 > 1) { + sprintf(ice->midi_interf[1].name, "midi/ice1712/%ld/2", + ice - cards + 1); + + (*mpu401->create_device)(ice->Controller + CCS_MIDI_2_DATA, + &ice->midi_interf[1].mpu401device, + 0x14121712, + ice_1712_midi_interrupt_op, + &ice->midi_interf[1]); + + names[num_names++] = ice->midi_interf[1].name; + ice->midi_interf[1].card = ice; + ice->midi_interf[1].int_mask = CCS_INTERRUPT_MIDI_2; } TRACE("E2PROM_MAP_SPDIF : 0x%x\n", ice->eeprom_data[E2PROM_MAP_SPDIF]); @@ -279,11 +321,7 @@ ice1712_setup(ice1712 *ice) } // TRACE("installing interrupt : %0x\n", ice->irq); - status = install_io_interrupt_handler(ice->irq, ice_1712_int, ice, 0); - if (status == B_OK) - TRACE("Install Interrupt Handler == B_OK\n"); - else - TRACE("Install Interrupt Handler != B_OK\n"); + install_io_interrupt_handler(ice->irq, ice_1712_int, ice, 0); ice->mem_id_pb = alloc_mem(&ice->phys_addr_pb, &ice->log_addr_pb, PLAYBACK_BUFFER_TOTAL_SIZE, @@ -353,7 +391,7 @@ ice1712_setup(ice1712 *ice) reg8 = read_ccs_uint8(ice, CCS_INTERRUPT_MASK); TRACE("-----CCS----- = %x\n", reg8); - write_ccs_uint8(ice, CCS_INTERRUPT_MASK, 0x6F); + write_ccs_uint8(ice, CCS_INTERRUPT_MASK, 0xEF); /* reg16 = read_ds_uint16(ice, DS_DMA_INT_MASK); TRACE("-----DS_DMA----- = %x\n", reg16); @@ -374,7 +412,7 @@ init_driver(void) status_t err; num_cards = 0; - TRACE("ice1712: init_driver()\n"); + TRACE("@@init_driver()\n"); if (get_module(B_PCI_MODULE_NAME, (module_info **)&pci)) return ENOSYS; @@ -430,15 +468,9 @@ init_driver(void) static void ice_1712_shutdown(ice1712 *ice) { - status_t result; - delete_sem(ice->buffer_ready_sem); - result = remove_io_interrupt_handler(ice->irq, ice_1712_int, ice); - if (result == B_OK) - TRACE("remove Interrupt result == B_OK\n"); - else - TRACE("remove Interrupt result != B_OK\n"); + remove_io_interrupt_handler(ice->irq, ice_1712_int, ice); if (ice->mem_id_pb != B_ERROR) delete_area(ice->mem_id_pb); @@ -455,7 +487,7 @@ uninit_driver(void) { int ix, cnt = num_cards; - TRACE("===uninit_driver()===\n"); + TRACE("@@uninit_driver()\n"); num_cards = 0; @@ -476,7 +508,7 @@ const char ** publish_devices(void) { int ix = 0; - TRACE("===publish_devices()===\n"); + TRACE("@@publish_devices()\n"); for (ix=0; names[ix]; ix++) { TRACE("publish %s\n", names[ix]); @@ -490,7 +522,7 @@ ice_1712_open(const char *name, uint32 flags, void **cookie) { int ix; ice1712 *card = NULL; - TRACE("===open()===\n"); + TRACE("**open()\n"); for (ix=0; ix #include #include #include #include "ice1712.h" +#include "ice1712_reg.h" #include "io.h" -#include "midi_driver.h" #include "util.h" - #include "debug.h" extern generic_mpu401_module * mpu401; -void midi_interrupt_op(int32 op, void * data) + +void +ice_1712_midi_interrupt_op(int32 op, void *data) { -// midi_dev * port = (midi_dev *)data; - if (op == B_MPU_401_ENABLE_CARD_INT) - { - // sample code - cpu_status cp; -// ddprintf(("sonic_vibes: B_MPU_401_ENABLE_CARD_INT\n")); - cp = disable_interrupts(); -// acquire_spinlock(&port->card->hardware); -// increment_interrupt_handler(port->card); -// set_direct(port->card, 0x01, 0x00, 0x80); -// set_indirect(port->card, 0x2A, 0x04, 0xff); -// release_spinlock(&port->card->hardware); - restore_interrupts(cp); + cpu_status status; + uint8 int_status = 0; + midi_dev *midi = (midi_dev *)data; - //real code - cp = lock(); -// emuxki_reg_write_32(&(port->card->config), EMU_INTE, -// emuxki_reg_read_32(&(port->card->config), EMU_INTE) | -// EMU_INTE_MIDITXENABLE | EMU_INTE_MIDIRXENABLE ); - unlock(cp); - } - else if (op == B_MPU_401_DISABLE_CARD_INT) - { - // sample code - /* turn off MPU interrupts */ - cpu_status cp; -// ddprintf(("sonic_vibes: B_MPU_401_DISABLE_CARD_INT\n")); - cp = disable_interrupts(); -// acquire_spinlock(&port->card->hardware); -// set_direct(port->card, 0x01, 0x80, 0x80);*/ - /* remove interrupt handler if necessary */ -// decrement_interrupt_handler(port->card); -// release_spinlock(&port->card->hardware); - restore_interrupts(cp); + if (op == B_MPU_401_ENABLE_CARD_INT) { + status = lock(); - //real code -// cpu_status status; - cp = lock(); -// emuxki_reg_write_32(&port->card->config, EMU_INTE, -// emuxki_reg_read_32(&port->card->config, EMU_INTE) & -// ~ (EMU_INTE_MIDITXENABLE | EMU_INTE_MIDIRXENABLE ) ); - unlock(cp); + int_status = read_ccs_uint8(midi->card, CCS_INTERRUPT_MASK); + int_status &= ~(midi->int_mask); + write_ccs_uint8(midi->card, CCS_INTERRUPT_MASK, int_status); + + TRACE("B_MPU_401_ENABLE_CARD_INT: %s\n", midi->name); + + unlock(status); + } else if (op == B_MPU_401_DISABLE_CARD_INT) { + status = lock(); + + int_status = read_ccs_uint8(midi->card, CCS_INTERRUPT_MASK); + int_status |= midi->int_mask; + write_ccs_uint8(midi->card, CCS_INTERRUPT_MASK, int_status); + + TRACE("B_MPU_401_DISABLE_CARD_INT: %s\n", midi->name); + + unlock(status); } + + TRACE("New mask status 0x%x\n", int_status); } -static status_t midi_open(const char *name, uint32 flags, void **cookie); -static status_t midi_close(void *cookie); -static status_t midi_free(void *cookie); -static status_t midi_control(void *cookie, uint32 op, void *data, size_t len); -static status_t midi_read(void *cookie, off_t pos, void *data, size_t *len); -static status_t midi_write(void *cookie, off_t pos, const void *data, - size_t *len); -device_hooks midi_hooks = { - &midi_open, - &midi_close, - &midi_free, - &midi_control, - &midi_read, - &midi_write, - NULL, /* select */ - NULL, /* deselect */ - NULL, /* readv */ - NULL /* writev */ -}; - -static status_t midi_open(const char * name, uint32 flags, void ** cookie) +status_t +ice_1712_midi_open(const char *name, uint32 flags, void **cookie) { - int i, ix, used_midi = -1; - int ret; - - TRACE("midi_open()\n"); + int midi, card; + status_t ret = ENODEV; + TRACE("**midi_open()\n"); *cookie = NULL; - for (ix = 0; ix < num_cards; ix++) { - for (i = 0; i < cards[ix].config.nb_MPU401; i++) - if (!strcmp(name, cards[ix].midi_interf[i].name)) { - used_midi = i; + + for (card = 0; card < num_cards; card++) { + for (midi = 0; midi < cards[card].config.nb_MPU401; midi++) { + if (!strcmp(name, cards[card].midi_interf[midi].name)) { + midi_dev *dev = &(cards[card].midi_interf[midi]); + ret = (*mpu401->open_hook)(dev->mpu401device, flags, cookie); + if (ret >= B_OK) { + *cookie = dev->mpu401device; + } break; } + } } - if (ix >= num_cards) { - TRACE("bad device\n"); - return ENODEV; - } - - TRACE("mpu401: %p open(): %p driver: %p\n", mpu401, - mpu401->open_hook, cards[ix].midi_interf[used_midi].driver); - ret = (*mpu401->open_hook)(cards[ix].midi_interf[used_midi].driver, - flags, cookie); - if (ret >= B_OK) { - cards[ix].midi_interf[used_midi].cookie = *cookie; - atomic_add(&cards[ix].midi_interf[used_midi].count, 1); - } - TRACE("mpu401: open returns %x / %p\n", ret, *cookie); return ret; - } -static status_t midi_close(void * cookie) +status_t +ice_1712_midi_close(void* cookie) { - TRACE("midi_close()\n"); + TRACE("**midi_close()\n"); return (*mpu401->close_hook)(cookie); } -static status_t midi_free(void * cookie) +status_t +ice_1712_midi_free(void* cookie) { - int i, ix; - status_t f; - TRACE("midi_free()\n"); - f = (*mpu401->free_hook)(cookie); - for (ix = 0; ix < num_cards; ix++) { - for (i = 0; i < cards[ix].config.nb_MPU401; i++) - if (cards[ix].midi_interf[i].cookie == cookie) { - if (atomic_add(&cards[ix].midi_interf[i].count, -1) == 1) { - cards[ix].midi_interf[i].cookie = NULL; - TRACE("cleared %p card %d\n", cookie, ix); - } + int midi, card; + status_t ret; + + TRACE("**midi_free()\n"); + + ret = (*mpu401->free_hook)(cookie); + + for (card = 0; card < num_cards; card++) { + for (midi = 0; midi < cards[card].config.nb_MPU401; midi++) { + if (cookie == cards[card].midi_interf[midi].mpu401device) { + cards[card].midi_interf[midi].mpu401device = NULL; + TRACE("Cleared %p card %d, midi %d\n", cookie, card, midi); break; } + } } - TRACE("midi_free() done\n"); - return f; + + return ret; } -static status_t midi_control(void * cookie, uint32 iop, void * data, size_t len) +status_t +ice_1712_midi_control(void* cookie, + uint32 iop, void* data, size_t len) { + TRACE("**midi_control()\n"); return (*mpu401->control_hook)(cookie, iop, data, len); } -static status_t midi_read(void * cookie, off_t pos, void * ptr, size_t * nread) +status_t +ice_1712_midi_read(void * cookie, off_t pos, void * ptr, size_t * nread) { - return (*mpu401->read_hook)(cookie, pos, ptr, nread); + status_t ret = B_ERROR; + + ret = (*mpu401->read_hook)(cookie, pos, ptr, nread); + //TRACE("**midi_read(%ld)\n", ret); + + return ret; } -static status_t midi_write(void * cookie, off_t pos, const void * ptr, +status_t +ice_1712_midi_write(void * cookie, off_t pos, const void * ptr, size_t * nwritten) { - return (*mpu401->write_hook)(cookie, pos, ptr, nwritten); -} + status_t ret = B_ERROR; + ret = (*mpu401->write_hook)(cookie, pos, ptr, nwritten); + //TRACE("**midi_write(%ld)\n", ret); -bool midi_interrupt(ice1712 *card) -{ - TRACE("midi_interrupt\n"); - if (!card->midi_interf[0].driver) { -// kprintf("aiigh\n"); - return false; - } - return (*mpu401->interrupt_hook)(card->midi_interf[0].driver); + return ret; }