mirror of
https://github.com/rdolbeau/NuBusFPGA.git
synced 2024-06-16 22:29:27 +00:00
HDMIAudio pick HW info from RSRC
This commit is contained in:
parent
49868b404b
commit
b90dfb229e
|
@ -67,6 +67,12 @@ struct goblin_csr {
|
||||||
u_int32_t goblin_goblin_audio_buf_desc;
|
u_int32_t goblin_goblin_audio_buf_desc;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct goblin_hdmi_audio_info {
|
||||||
|
u_int32_t csr_goblin_base; /* where to find the CSR */
|
||||||
|
u_int32_t goblin_audiobuffer_offset;
|
||||||
|
u_int32_t goblin_audiobuffer_size;
|
||||||
|
};
|
||||||
|
|
||||||
#define GOBLIN_AUDIOBUFFER_OFFSET 0x00920000
|
#define GOBLIN_AUDIOBUFFER_OFFSET 0x00920000
|
||||||
#define GOBLIN_AUDIOBUFFER_SIZE 0x00002000
|
#define GOBLIN_AUDIOBUFFER_SIZE 0x00002000
|
||||||
// we currently have 8 KiB (0x2000) of SRAM there, but perhaps we could move that to the SDRAM?
|
// we currently have 8 KiB (0x2000) of SRAM there, but perhaps we could move that to the SDRAM?
|
||||||
|
@ -147,6 +153,8 @@ typedef struct {
|
||||||
SlotIntQElement *siqel;
|
SlotIntQElement *siqel;
|
||||||
struct goblin_bt_regs* bt; // for debug
|
struct goblin_bt_regs* bt; // for debug
|
||||||
struct goblin_csr* csr; // CSR, including audio control
|
struct goblin_csr* csr; // CSR, including audio control
|
||||||
|
u_int32_t audiobuffer_offset;
|
||||||
|
u_int32_t audiobuffer_size;
|
||||||
u_int32_t* buf0; // primary address for first buffer (host view)
|
u_int32_t* buf0; // primary address for first buffer (host view)
|
||||||
u_int32_t* buf1; // primary address for second buffer (host view)
|
u_int32_t* buf1; // primary address for second buffer (host view)
|
||||||
unsigned char lastbuf;
|
unsigned char lastbuf;
|
||||||
|
@ -363,7 +371,9 @@ pascal ComponentResult __ComponentRegister(GlobalsPtr globals)
|
||||||
// Check for hardware here. We are always installed, so we return 0
|
// Check for hardware here. We are always installed, so we return 0
|
||||||
OSErr ret = noErr;
|
OSErr ret = noErr;
|
||||||
SpBlock mySpBlock;
|
SpBlock mySpBlock;
|
||||||
|
SpBlockPtr mySpBlockPtr = &mySpBlock;
|
||||||
SInfoRecord mySInfoRecord;
|
SInfoRecord mySInfoRecord;
|
||||||
|
struct goblin_hdmi_audio_info ghai;
|
||||||
|
|
||||||
mySpBlock.spResult = (long)&mySInfoRecord;
|
mySpBlock.spResult = (long)&mySInfoRecord;
|
||||||
mySpBlock.spSlot = 0x9;
|
mySpBlock.spSlot = 0x9;
|
||||||
|
@ -375,7 +385,7 @@ pascal ComponentResult __ComponentRegister(GlobalsPtr globals)
|
||||||
mySpBlock.spDrvrHW = 0xbeed;
|
mySpBlock.spDrvrHW = 0xbeed;
|
||||||
mySpBlock.spTBMask = 0;
|
mySpBlock.spTBMask = 0;
|
||||||
|
|
||||||
ret = SNextTypeSRsrc(&mySpBlock);
|
ret = SNextTypeSRsrc(mySpBlockPtr);
|
||||||
if (ret)
|
if (ret)
|
||||||
return 1; // oups
|
return 1; // oups
|
||||||
|
|
||||||
|
@ -390,10 +400,27 @@ pascal ComponentResult __ComponentRegister(GlobalsPtr globals)
|
||||||
(*(*globals).bt).debug = 'slot';
|
(*(*globals).bt).debug = 'slot';
|
||||||
(*(*globals).bt).debug = mySpBlock.spSlot;
|
(*(*globals).bt).debug = mySpBlock.spSlot;
|
||||||
#endif
|
#endif
|
||||||
|
// now find where the audio hardware really is
|
||||||
(*globals).csr = (struct goblin_csr*)(0xF0000000 |
|
// Litex CSR will move around when config changes...
|
||||||
((unsigned long)mySpBlock.spSlot)<<24 |
|
|
||||||
GOBLIN_CSR_OFFSET);
|
mySpBlock.spID = 0xd0;
|
||||||
|
if (SFindStruct(mySpBlockPtr) == noErr) {
|
||||||
|
mySpBlock.spSize = sizeof(struct goblin_hdmi_audio_info);
|
||||||
|
mySpBlock.spResult = (long)&ghai;
|
||||||
|
SReadStruct(mySpBlockPtr);
|
||||||
|
(*globals).csr = (struct goblin_csr*)(0xF0000000 |
|
||||||
|
((unsigned long)mySpBlock.spSlot)<<24 |
|
||||||
|
ghai.csr_goblin_base);
|
||||||
|
(*globals).audiobuffer_offset = ghai.goblin_audiobuffer_offset;
|
||||||
|
(*globals).audiobuffer_size = ghai.goblin_audiobuffer_size;
|
||||||
|
} else {
|
||||||
|
// fall back to NuBusFPGA original default
|
||||||
|
(*globals).csr = (struct goblin_csr*)(0xF0000000 |
|
||||||
|
((unsigned long)mySpBlock.spSlot)<<24 |
|
||||||
|
GOBLIN_CSR_OFFSET);
|
||||||
|
(*globals).audiobuffer_offset = GOBLIN_AUDIOBUFFER_OFFSET;
|
||||||
|
(*globals).audiobuffer_size = GOBLIN_AUDIOBUFFER_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef BT_DEBUG
|
#ifdef BT_DEBUG
|
||||||
(*(*globals).bt).debug = 'csr ';
|
(*(*globals).bt).debug = 'csr ';
|
||||||
|
@ -582,7 +609,9 @@ pascal ComponentResult __InitOutputDevice(GlobalsPtr globals, long actions)
|
||||||
PreferencesPtr prefsPtr;
|
PreferencesPtr prefsPtr;
|
||||||
OSErr ret = noErr;
|
OSErr ret = noErr;
|
||||||
SpBlock mySpBlock;
|
SpBlock mySpBlock;
|
||||||
|
SpBlockPtr mySpBlockPtr = &mySpBlock;
|
||||||
SInfoRecord mySInfoRecord;
|
SInfoRecord mySInfoRecord;
|
||||||
|
struct goblin_hdmi_audio_info ghai;
|
||||||
|
|
||||||
mySpBlock.spResult = (long)&mySInfoRecord;
|
mySpBlock.spResult = (long)&mySInfoRecord;
|
||||||
mySpBlock.spSlot = 0x9;
|
mySpBlock.spSlot = 0x9;
|
||||||
|
@ -594,7 +623,7 @@ pascal ComponentResult __InitOutputDevice(GlobalsPtr globals, long actions)
|
||||||
mySpBlock.spDrvrHW = 0xbeed;
|
mySpBlock.spDrvrHW = 0xbeed;
|
||||||
mySpBlock.spTBMask = 0;
|
mySpBlock.spTBMask = 0;
|
||||||
|
|
||||||
ret = SNextTypeSRsrc(&mySpBlock);
|
ret = SNextTypeSRsrc(mySpBlockPtr);
|
||||||
if (ret)
|
if (ret)
|
||||||
return notEnoughHardware; // oups
|
return notEnoughHardware; // oups
|
||||||
|
|
||||||
|
@ -610,9 +639,27 @@ pascal ComponentResult __InitOutputDevice(GlobalsPtr globals, long actions)
|
||||||
(*(*globals).bt).debug = mySpBlock.spSlot;
|
(*(*globals).bt).debug = mySpBlock.spSlot;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
(*globals).csr = (struct goblin_csr*)(0xF0000000 |
|
// now find where the audio hardware really is
|
||||||
((unsigned long)mySpBlock.spSlot)<<24 |
|
// Litex CSR will move around when config changes...
|
||||||
GOBLIN_CSR_OFFSET);
|
|
||||||
|
mySpBlock.spID = 0xd0;
|
||||||
|
if (SFindStruct(mySpBlockPtr) == noErr) {
|
||||||
|
mySpBlock.spSize = sizeof(struct goblin_hdmi_audio_info);
|
||||||
|
mySpBlock.spResult = (long)&ghai;
|
||||||
|
SReadStruct(mySpBlockPtr);
|
||||||
|
(*globals).csr = (struct goblin_csr*)(0xF0000000 |
|
||||||
|
((unsigned long)mySpBlock.spSlot)<<24 |
|
||||||
|
ghai.csr_goblin_base);
|
||||||
|
(*globals).audiobuffer_offset = ghai.goblin_audiobuffer_offset;
|
||||||
|
(*globals).audiobuffer_size = ghai.goblin_audiobuffer_size;
|
||||||
|
} else {
|
||||||
|
// fall back to NuBusFPGA original default
|
||||||
|
(*globals).csr = (struct goblin_csr*)(0xF0000000 |
|
||||||
|
((unsigned long)mySpBlock.spSlot)<<24 |
|
||||||
|
GOBLIN_CSR_OFFSET);
|
||||||
|
(*globals).audiobuffer_offset = GOBLIN_AUDIOBUFFER_OFFSET;
|
||||||
|
(*globals).audiobuffer_size = GOBLIN_AUDIOBUFFER_SIZE;
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef BT_DEBUG
|
#ifdef BT_DEBUG
|
||||||
(*(*globals).bt).debug = 'CSR ';
|
(*(*globals).bt).debug = 'CSR ';
|
||||||
|
@ -1069,13 +1116,22 @@ OSErr SetupHardware(GlobalsPtr globals)
|
||||||
// in fact, I'm not sure how MacOS would handle it, but it could be in host memory
|
// in fact, I'm not sure how MacOS would handle it, but it could be in host memory
|
||||||
// using the wishbone DMA word-by-word
|
// using the wishbone DMA word-by-word
|
||||||
// (or using a more sophisticated approach and using block request for 8/16/32/64 bytes)
|
// (or using a more sophisticated approach and using block request for 8/16/32/64 bytes)
|
||||||
|
/*
|
||||||
(*globals).buf0 = (u_int32_t*)(0xF0000000 |
|
(*globals).buf0 = (u_int32_t*)(0xF0000000 |
|
||||||
((unsigned long)(*globals).slot)<<24 |
|
((unsigned long)(*globals).slot)<<24 |
|
||||||
GOBLIN_AUDIOBUFFER_OFFSET);
|
GOBLIN_AUDIOBUFFER_OFFSET);
|
||||||
(*globals).buf1 = (u_int32_t*)(0xF0000000 |
|
(*globals).buf1 = (u_int32_t*)(0xF0000000 |
|
||||||
((unsigned long)(*globals).slot)<<24 |
|
((unsigned long)(*globals).slot)<<24 |
|
||||||
GOBLIN_AUDIOBUFFER_OFFSET |
|
GOBLIN_AUDIOBUFFER_OFFSET |
|
||||||
(GOBLIN_AUDIOBUFFER_SIZE >> 1)); // offset by 4 KiB
|
(GOBLIN_AUDIOBUFFER_SIZE >> 1));
|
||||||
|
*/
|
||||||
|
(*globals).buf0 = (u_int32_t*)(0xF0000000 |
|
||||||
|
((unsigned long)(*globals).slot)<<24 |
|
||||||
|
(*globals).audiobuffer_offset);
|
||||||
|
(*globals).buf1 = (u_int32_t*)(0xF0000000 |
|
||||||
|
((unsigned long)(*globals).slot)<<24 |
|
||||||
|
(*globals).audiobuffer_offset |
|
||||||
|
((*globals).audiobuffer_size >> 1));
|
||||||
|
|
||||||
#ifdef BT_DEBUG
|
#ifdef BT_DEBUG
|
||||||
(*(*globals).bt).debug = 'bufX';
|
(*(*globals).bt).debug = 'bufX';
|
||||||
|
@ -1086,11 +1142,18 @@ OSErr SetupHardware(GlobalsPtr globals)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// HW view (internal Wishbone addresses, so w/o the slot number)
|
// HW view (internal Wishbone addresses, so w/o the slot number)
|
||||||
|
/*
|
||||||
(*(*globals).csr).goblin_goblin_audio_buf0_addr = brev((unsigned long)(0xF0000000 |
|
(*(*globals).csr).goblin_goblin_audio_buf0_addr = brev((unsigned long)(0xF0000000 |
|
||||||
GOBLIN_AUDIOBUFFER_OFFSET));
|
GOBLIN_AUDIOBUFFER_OFFSET));
|
||||||
(*(*globals).csr).goblin_goblin_audio_buf1_addr = brev((unsigned long)(0xF0000000 |
|
(*(*globals).csr).goblin_goblin_audio_buf1_addr = brev((unsigned long)(0xF0000000 |
|
||||||
GOBLIN_AUDIOBUFFER_OFFSET |
|
GOBLIN_AUDIOBUFFER_OFFSET |
|
||||||
(GOBLIN_AUDIOBUFFER_SIZE >> 1)));
|
(GOBLIN_AUDIOBUFFER_SIZE >> 1)));
|
||||||
|
*/
|
||||||
|
(*(*globals).csr).goblin_goblin_audio_buf0_addr = brev((unsigned long)(0xF0000000 |
|
||||||
|
(*globals).audiobuffer_offset));
|
||||||
|
(*(*globals).csr).goblin_goblin_audio_buf1_addr = brev((unsigned long)(0xF0000000 |
|
||||||
|
(*globals).audiobuffer_offset |
|
||||||
|
((*globals).audiobuffer_size >> 1)));
|
||||||
|
|
||||||
(*(*globals).siqel).sqType = sIQType;
|
(*(*globals).siqel).sqType = sIQType;
|
||||||
(*(*globals).siqel).sqPrio = 6;
|
(*(*globals).siqel).sqPrio = 6;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user