1/* 2 * ice1712 BeOS/Haiku Driver for VIA - VT1712 Multi Channel Audio Controller 3 * 4 * Copyright (c) 2002, Jerome Duval (jerome.duval@free.fr) 5 * Copyright (c) 2003, Marcus Overhagen (marcus@overhagen.de) 6 * Copyright (c) 2007, Jerome Leveque (leveque.jerome@neuf.fr) 7 * 8 * All rights reserved 9 * Distributed under the terms of the MIT license. 10 */ 11 12#include <midi_driver.h> 13#include <string.h> 14#include <stdlib.h> 15#include <signal.h> 16 17#include "ice1712.h" 18#include "ice1712_reg.h" 19#include "io.h" 20#include "util.h" 21#include "debug.h" 22 23extern generic_mpu401_module * mpu401; 24 25 26void 27ice_1712_midi_interrupt_op(int32 op, void *data) 28{ 29 cpu_status status; 30 uint8 int_status = 0; 31 midi_dev *midi = (midi_dev *)data; 32 33 if (op == B_MPU_401_ENABLE_CARD_INT) { 34 status = lock(); 35 36 int_status = read_ccs_uint8(midi->card, CCS_INTERRUPT_MASK); 37 int_status &= ~(midi->int_mask); 38 write_ccs_uint8(midi->card, CCS_INTERRUPT_MASK, int_status); 39 40 TRACE("B_MPU_401_ENABLE_CARD_INT: %s\n", midi->name); 41 42 unlock(status); 43 } else if (op == B_MPU_401_DISABLE_CARD_INT) { 44 status = lock(); 45 46 int_status = read_ccs_uint8(midi->card, CCS_INTERRUPT_MASK); 47 int_status |= midi->int_mask; 48 write_ccs_uint8(midi->card, CCS_INTERRUPT_MASK, int_status); 49 50 TRACE("B_MPU_401_DISABLE_CARD_INT: %s\n", midi->name); 51 52 unlock(status); 53 } 54 55 TRACE("New mask status 0x%x\n", int_status); 56} 57 58 59status_t 60ice_1712_midi_open(const char *name, uint32 flags, void **cookie) 61{ 62 int midi, card; 63 status_t ret = ENODEV; 64 65 TRACE("**midi_open()\n"); 66 *cookie = NULL; 67 68 for (card = 0; card < num_cards; card++) { 69 for (midi = 0; midi < cards[card].config.nb_MPU401; midi++) { 70 if (!strcmp(name, cards[card].midi_interf[midi].name)) { 71 midi_dev *dev = &(cards[card].midi_interf[midi]); 72 ret = (*mpu401->open_hook)(dev->mpu401device, flags, cookie); 73 if (ret >= B_OK) { 74 *cookie = dev->mpu401device; 75 } 76 break; 77 } 78 } 79 } 80 81 return ret; 82} 83 84 85status_t 86ice_1712_midi_close(void* cookie) 87{ 88 TRACE("**midi_close()\n"); 89 return (*mpu401->close_hook)(cookie); 90} 91 92 93status_t 94ice_1712_midi_free(void* cookie) 95{ 96 int midi, card; 97 status_t ret; 98 99 TRACE("**midi_free()\n"); 100 101 ret = (*mpu401->free_hook)(cookie); 102 103 for (card = 0; card < num_cards; card++) { 104 for (midi = 0; midi < cards[card].config.nb_MPU401; midi++) { 105 if (cookie == cards[card].midi_interf[midi].mpu401device) { 106 cards[card].midi_interf[midi].mpu401device = NULL; 107 TRACE("Cleared %p card %d, midi %d\n", cookie, card, midi); 108 break; 109 } 110 } 111 } 112 113 return ret; 114} 115 116 117status_t 118ice_1712_midi_control(void* cookie, 119 uint32 iop, void* data, size_t len) 120{ 121 TRACE("**midi_control()\n"); 122 return (*mpu401->control_hook)(cookie, iop, data, len); 123} 124 125 126status_t 127ice_1712_midi_read(void * cookie, off_t pos, void * ptr, size_t * nread) 128{ 129 status_t ret = B_ERROR; 130 131 ret = (*mpu401->read_hook)(cookie, pos, ptr, nread); 132 //TRACE("**midi_read(%ld)\n", ret); 133 134 return ret; 135} 136 137 138status_t 139ice_1712_midi_write(void * cookie, off_t pos, const void * ptr, 140 size_t * nwritten) 141{ 142 status_t ret = B_ERROR; 143 144 ret = (*mpu401->write_hook)(cookie, pos, ptr, nwritten); 145 //TRACE("**midi_write(%ld)\n", ret); 146 147 return ret; 148} 149