/* * File: sysinit.c * Purpose: Power-on Reset configuration of the COLDARI board. * * Notes: * */ #include "MCF5475.h" #include "startcf.h" #include "RuntimeConfig.h" extern unsigned long far __VRAM; extern unsigned long far __BOOT_FLASH[]; extern void warte_10us(); extern void warte_1ms(); extern void set_ide_access_mode(); extern unsigned long far rt_cacr; extern unsigned long far rt_acr0; extern unsigned long far rt_acr1; extern unsigned long far rt_acr2; extern unsigned long far rt_acr3; extern unsigned long far rt_mmubar; /********************************************************************/ // init SLICE TIMER 0 // all = 32.538 sec = 30.736mHz // BYT0 = 127.1ms/tick = 7.876Hz offset 0 // BYT1 = 496.5us/tick = 2.014kHz offset 1 // BYT2 = 1.939us/tick = 515.6kHz offset 2 // BYT3 = 7.576ns/tick = 132.00MHz offset 3 // count down!!! 132MHz!!! /********************************************************************/ void init_slt(void) { asm { lea MCF_SLT0_STCNT,a0 move.l #0xffffffff,(a0) lea MCF_SLT0_SCR,a0 move.b #0x05,(a0) } MCF_PSC0_PSCTB_8BIT = 'SLT '; MCF_PSC0_PSCTB_8BIT = 'OK! '; MCF_PSC0_PSCTB_8BIT = 0x0a0d; } /********************************************************************/ // init GPIO ETC. /********************************************************************/ void init_gpio(void) { // PAD REGISTER P.S.:FBCTL UND FBCS WERDEN RICHTIG GESETZT BEIM RESET MCF_PAD_PAR_DMA = 0b11111111; // NORMAL ALS DREQ DACK MCF_PAD_PAR_FECI2CIRQ = 0b1111001111001111; // FEC0 NORMAL, FEC1 ALS I/O, I2C, #INT5..6 MCF_PAD_PAR_PCIBG = 0b0000001000111111; // #PCI_BG4=#TBST,#PIC_BG3=I/O,#PCI_BG2..0=NORMAL MCF_PAD_PAR_PCIBR = 0b0000001000111111; // #PCI_BR4=#INT4,#PIC_BR3=INPUT,#PCI_BR2..0=NORMAL MCF_PAD_PAR_PSC3 = 0b00001100; // PSC3=TX,RX CTS+RTS=I/O MCF_PAD_PAR_PSC1 = 0b11111100; // PSC1 NORMAL SERIELL MCF_PAD_PAR_PSC0 = 0b11111100; // PSC0 NORMAL SERIELL MCF_PAD_PAR_DSPI = 0b0001111111111111; // DSPI NORMAL MCF_PAD_PAR_TIMER = 0b00101101; // TIN3..2=#IRQ3..2;TOUT3..2=NORMAL // ALLE OUTPUTS NORMAL LOW // ALLE DIR NORMAL INPUT = 0 MCF_GPIO_PDDR_FEC1L = 0b00011110; // OUT: 4=LED,3=PRG_DQ0,2=#FPGA_CONFIG,1=PRG_CLK(FPGA) } /********************************************************************/ // init seriel /********************************************************************/ void init_seriel(void) { // PSC0: SER1 ---------- MCF_PSC0_PSCSICR = 0; // UART MCF_PSC0_PSCCSR = 0xDD; MCF_PSC0_PSCCTUR = 0x00; MCF_PSC0_PSCCTLR = 36; // BAUD RATE = 115200 MCF_PSC0_PSCCR = 0x20; MCF_PSC0_PSCCR = 0x30; MCF_PSC0_PSCCR = 0x40; MCF_PSC0_PSCCR = 0x50; MCF_PSC0_PSCCR = 0x10; MCF_PSC0_PSCIMR = 0x8700; MCF_PSC0_PSCACR = 0x03; MCF_PSC0_PSCMR1= 0xb3; MCF_PSC0_PSCMR2= 0x07; MCF_PSC0_PSCRFCR = 0x0F; MCF_PSC0_PSCTFCR = 0x0F; MCF_PSC0_PSCRFAR = 0x00F0; MCF_PSC0_PSCTFAR = 0x00F0; MCF_PSC0_PSCOPSET = 0x01; MCF_PSC0_PSCCR = 0x05; // PSC3: PIC ---------- MCF_PSC3_PSCSICR = 0; // UART MCF_PSC3_PSCCSR = 0xDD; MCF_PSC3_PSCCTUR = 0x00; MCF_PSC3_PSCCTLR = 36; // BAUD RATE = 115200 MCF_PSC3_PSCCR = 0x20; MCF_PSC3_PSCCR = 0x30; MCF_PSC3_PSCCR = 0x40; MCF_PSC3_PSCCR = 0x50; MCF_PSC3_PSCCR = 0x10; MCF_PSC3_PSCIMR = 0x0200; // receiver interrupt enable MCF_PSC3_PSCACR = 0x03; MCF_PSC3_PSCMR1= 0xb3; MCF_PSC3_PSCMR2= 0x07; MCF_PSC3_PSCRFCR = 0x0F; MCF_PSC3_PSCTFCR = 0x0F; MCF_PSC3_PSCRFAR = 0x00F0; MCF_PSC3_PSCTFAR = 0x00F0; MCF_PSC3_PSCOPSET = 0x01; MCF_PSC3_PSCCR = 0x05; MCF_INTC_ICR32 = 0x3F; //MAXIMALE PRIORITY/**********/ MCF_PSC0_PSCTB_8BIT = 0x0a0a0a0d; MCF_PSC0_PSCTB_8BIT = 'BaS '; MCF_PSC0_PSCTB_8BIT = '13.0'; MCF_PSC0_PSCTB_8BIT = '5.20'; MCF_PSC0_PSCTB_8BIT = '17'; MCF_PSC0_PSCTB_8BIT = 0x0a0d; MCF_PSC0_PSCTB_8BIT = '===='; MCF_PSC0_PSCTB_8BIT = '===='; MCF_PSC0_PSCTB_8BIT = '===='; MCF_PSC0_PSCTB_8BIT = '=='; MCF_PSC0_PSCTB_8BIT = 0x0a0d; MCF_PSC0_PSCTB_8BIT = 'SERI'; MCF_PSC0_PSCTB_8BIT = 'AL O'; MCF_PSC0_PSCTB_8BIT = 'K! '; MCF_PSC0_PSCTB_8BIT = 0x0a0d; } /********************************************************************/ /* Initialize DDR DIMMs on the EVB board */ /********************************************************************/ /* * Check to see if the SDRAM has already been initialized * by a run control tool */ void init_ddram(void) { MCF_PSC0_PSCTB_8BIT = 'DDRA'; if (!(MCF_SDRAMC_SDCR & MCF_SDRAMC_SDCR_REF)) { /* Basic configuration and initialization */ MCF_SDRAMC_SDRAMDS = 0x000002AA; // SDRAMDS configuration MCF_SDRAMC_CS0CFG = 0x0000001A; // SDRAM CS0 configuration (128Mbytes 0000_0000 - 07FF_FFFF) MCF_SDRAMC_CS1CFG = 0x0800001A; // SDRAM CS1 configuration (128Mbytes 0800_0000 - 0FFF_FFFF) MCF_SDRAMC_CS2CFG = 0x1000001A; // SDRAM CS2 configuration (128Mbytes 1000_0000 - 07FF_FFFF) MCF_SDRAMC_CS3CFG = 0x1800001A; // SDRAM CS3 configuration (128Mbytes 1800_0000 - 1FFF_FFFF) // MCF_SDRAMC_SDCFG1 = 0x53722938; // SDCFG1 MCF_SDRAMC_SDCFG1 = 0x73622830; // SDCFG1 // MCF_SDRAMC_SDCFG2 = 0x24330000; // SDCFG2 MCF_SDRAMC_SDCFG2 = 0x46770000; // SDCFG2 // MCF_SDRAMC_SDCR = 0xE10F0002; // SDCR + IPALL MCF_SDRAMC_SDCR = 0xE10D0002; // SDCR + IPALL MCF_SDRAMC_SDMR = 0x40010000; // SDMR (write to LEMR) // MCF_SDRAMC_SDMR = 0x05890000; // SDRM (write to LMR) MCF_SDRAMC_SDMR = 0x048D0000; // SDRM (write to LMR) // MCF_SDRAMC_SDCR = 0xE10F0002; // SDCR + IPALL MCF_SDRAMC_SDCR = 0xE10D0002; // SDCR + IPALL // MCF_SDRAMC_SDCR = 0xE10F0004; // SDCR + IREF (first refresh) MCF_SDRAMC_SDCR = 0xE10D0004; // SDCR + IREF (first refresh) // MCF_SDRAMC_SDCR = 0xE10F0004; // SDCR + IREF (second refresh) MCF_SDRAMC_SDCR = 0xE10D0004; // SDCR + IREF (second refresh) /// MCF_SDRAMC_SDMR = 0x01890000; // SDMR (write to LMR) MCF_SDRAMC_SDMR = 0x008D0000; // SDMR (write to LMR) // MCF_SDRAMC_SDCR = 0x710F0F00; // SDCR (lock SDMR and enable refresh) MCF_SDRAMC_SDCR = 0x710D0F00; // SDCR (lock SDMR and enable refresh) } MCF_PSC0_PSCTB_8BIT = 'M OK'; MCF_PSC0_PSCTB_8BIT = '! '; MCF_PSC0_PSCTB_8BIT = 0x0a0d; } /********************************************************************/ /* init FB_CSx /* /********************************************************************/ void init_fbcs() { MCF_PSC0_PSCTB_8BIT = 'FBCS'; MCF_FBCS1_CSAR = 0xFFF80000; // FFF8'0000-FFFF'FFFF: ATARI I/O ADRESS MCF_FBCS1_CSCR = MCF_FBCS_CSCR_PS_16 // 16BIT PORT | MCF_FBCS_CSCR_WS(63) // DEFAULT 63WS | MCF_FBCS_CSCR_AA; // AA MCF_FBCS1_CSMR = (MCF_FBCS_CSMR_BAM_512K | MCF_FBCS_CSMR_V); MCF_FBCS2_CSAR = 0xF0000000; // NEUER I/O ADRESS-BEREICH MCF_FBCS2_CSCR = MCF_FBCS_CSCR_PS_32 // 32BIT PORT | MCF_FBCS_CSCR_WS(8) // DEFAULT 8WS | MCF_FBCS_CSCR_AA; // AA MCF_FBCS2_CSMR = (MCF_FBCS_CSMR_BAM_128M // F000'0000-F7FF'FFFF | MCF_FBCS_CSMR_V); MCF_FBCS3_CSAR = 0xFFF00000; // IDE I/O ADRESS-BEREICH BURST! MCF_FBCS3_CSCR = MCF_FBCS_CSCR_PS_16 // 16BIT PORT | MCF_FBCS_CSCR_WS(16) // DEFAULT 16WS | MCF_FBCS_CSCR_BSTR // Burst read enable | MCF_FBCS_CSCR_BSTW // Burst write enable | MCF_FBCS_CSCR_AA; // AA MCF_FBCS3_CSMR = (MCF_FBCS_CSMR_BAM_512K // FFF0'0000-FFF7'FFFF | MCF_FBCS_CSMR_V); MCF_FBCS4_CSAR = 0x40000000; // VIDEO RAM BEREICH, MCF_FBCS4_CSCR = MCF_FBCS_CSCR_PS_32 // 32BIT PORT | MCF_FBCS_CSCR_BSTR // BURST READ ENABLE | MCF_FBCS_CSCR_BSTW; // BURST WRITE ENABLE MCF_FBCS4_CSMR = (MCF_FBCS_CSMR_BAM_1G // 4000'0000-7FFF'FFFF | MCF_FBCS_CSMR_V); /* Flash */ MCF_FBCS0_CSAR = 0xE0000000; // FLASH ADRESS MCF_FBCS0_CSCR = 0x00001180; // 16 bit 4ws aa MCF_FBCS0_CSMR = 0x007F0001; // 8MB on MCF_PSC0_PSCTB_8BIT = ' OK!'; MCF_PSC0_PSCTB_8BIT = 0x0a0d; } /********************************************************************/ /* FPGA LADEN /* /********************************************************************/ void init_fpga(void) { MCF_PSC0_PSCTB_8BIT = 'FPGA'; asm { lea MCF_GPIO_PODR_FEC1L,a1 // register adresse:write lea MCF_GPIO_PPDSDR_FEC1L,a2 // reads bclr #1,(a1) // clk auf low bclr #2,(a1) // #config=low test_nSTATUS: btst #0,(a2) // nSTATUS==0 bne test_nSTATUS // nein-> btst #5,(a2) // conf done==0 bne test_nSTATUS // nein-> jsr warte_10us // warten bset #2,(a1) // #config=high jsr warte_10us // warten test_STATUS: btst #0,(a2) // status high? beq test_STATUS // nein-> jsr warte_10us // warten lea 0xE0700000,a0 // startadresse fpga daten moveq #0x4,d2 moveq #0x6,d3 moveq #0xc,d4 moveq #0xe,d5 word_send_loop: cmp.l #0xE0800000,a0 bgt fpga_error move.b (a0)+,d0 // 32 bit holen lsr.l #1,d0 // bit rausschieben bcs bit_is_10 // data bit3, #config bit2, clock bit1 move.b d2,(a1) // data low, config high, clk low move.b d3,(a1) // data low, config high, clk high bra bit_send0 bit_is_10: move.b d4,(a1) // clk low, config high, data high move.b d5,(a1) // clk high, config high, data high bit_send0: lsr.l #1,d0 // bit rausschieben bcs bit_is_11 // data bit3, #config bit2, clock bit1 move.b d2,(a1) // data low, config high, clk low move.b d3,(a1) // data low, config high, clk high bra bit_send1 bit_is_11: move.b d4,(a1) // clk low, config high, data high move.b d5,(a1) // clk high, config high, data high bit_send1: lsr.l #1,d0 // bit rausschieben bcs bit_is_12 // data bit3, #config bit2, clock bit1 move.b d2,(a1) // data low, config high, clk low move.b d3,(a1) // data low, config high, clk high bra bit_send2 bit_is_12: move.b d4,(a1) // clk low, config high, data high move.b d5,(a1) // clk high, config high, data high bit_send2: lsr.l #1,d0 // bit rausschieben bcs bit_is_13 // data bit3, #config bit2, clock bit1 move.b d2,(a1) // data low, config high, clk low move.b d3,(a1) // data low, config high, clk high bra bit_send3 bit_is_13: move.b d4,(a1) // clk low, config high, data high move.b d5,(a1) // clk high, config high, data high bit_send3: lsr.l #1,d0 // bit rausschieben bcs bit_is_14 // data bit3, #config bit2, clock bit1 move.b d2,(a1) // data low, config high, clk low move.b d3,(a1) // data low, config high, clk high bra bit_send4 bit_is_14: move.b d4,(a1) // clk low, config high, data high move.b d5,(a1) // clk high, config high, data high bit_send4: lsr.l #1,d0 // bit rausschieben bcs bit_is_15 // data bit3, #config bit2, clock bit1 move.b d2,(a1) // data low, config high, clk low move.b d3,(a1) // data low, config high, clk high bra bit_send5 bit_is_15: move.b d4,(a1) // clk low, config high, data high move.b d5,(a1) // clk high, config high, data high bit_send5: lsr.l #1,d0 // bit rausschieben bcs bit_is_16 // data bit3, #config bit2, clock bit1 move.b d2,(a1) // data low, config high, clk low move.b d3,(a1) // data low, config high, clk high bra bit_send6 bit_is_16: move.b d4,(a1) // clk low, config high, data high move.b d5,(a1) // clk high, config high, data high bit_send6: lsr.l #1,d0 // bit rausschieben bcs bit_is_17 // data bit3, #config bit2, clock bit1 move.b d2,(a1) // data low, config high, clk low move.b d3,(a1) // data low, config high, clk high bra bit_send7 bit_is_17: move.b d4,(a1) // clk low, config high, data high move.b d5,(a1) // clk high, config high, data high bit_send7: // test auf fertig btst #5,(a2) // fpga fertig, conf_done=high? beq word_send_loop // nein, next word-> move.l #4000,d1 overclk: bset #1,(a1) // clock=high nop bclr #1,(a1) // clock=low subq.l #1,d1 bne overclk // weiter bis fertig // datum des FPGA files ausgeben jsr warte_10us // warten lea MCF_PSC0_PSCTB_8BIT,a3 move.l #': Da',(a3) move.l #'te: ',(a3) move.l 0xf0040100,d1 moveq #8,d0 date_loop: btst #0,d0 bne kein_punkt btst #2,d0 beq kein_punkt move.b #'.',(a3) kein_punkt: move.l d0,d3 // index subq.l #1,d3 // -1 lsl.l #2,d3 // *2 move.l d1,d2 lsr.l d3,d2 // und schieben and.l #0x0f,d2 add.l #'0',d2 move.b d2,(a3) subq.l #1,d0 bgt date_loop bra init_fpga_end //--------------------------------------------------------- wait_pll: lea MCF_SLT0_SCNT,a3 move.l (a3),d0 move.l #100000,d6 // ca 1ms wait_pll_loop: tst.w (a1) bpl wait_pll_ok move.l (a3),d1 sub.l d0,d1 add.l d6,d1 bpl wait_pll_loop wait_pll_ok: rts // fertig fpga_error: } MCF_PSC0_PSCTB_8BIT = ' NOT'; init_fpga_end: MCF_PSC0_PSCTB_8BIT = ' OK!'; MCF_PSC0_PSCTB_8BIT = 0x0a0d; // init pll MCF_PSC0_PSCTB_8BIT = 'PLL '; asm { lea 0xf0000600,a0 lea 0xf0000800,a1 bsr wait_pll move.w #27,0x48(a0) // loopfilter r bsr wait_pll move.w #1,0x08(a0) // charge pump I bsr wait_pll move.w #12,0x0(a0) // N counter high = 12 bsr wait_pll move.w #12,0x40(a0) // N counter low = 12 bsr wait_pll move.w #1,0x114(a0) // ck1 bypass bsr wait_pll move.w #1,0x118(a0) // ck2 bypass bsr wait_pll move.w #1,0x11c(a0) // ck3 bypass bsr wait_pll move.w #1,0x10(a0) // ck0 high = 1 bsr wait_pll move.w #1,0x50(a0) // ck0 low = 1 bsr wait_pll move.w #1,0x144(a0) // M odd division bsr wait_pll move.w #1,0x44(a0) // M low = 1 bsr wait_pll move.w #65,0x04(a0) // M high = 65 = 65MHz bsr wait_pll clr.b (a1) // set } MCF_PSC0_PSCTB_8BIT = 'SET!'; MCF_PSC0_PSCTB_8BIT = 0x0a0d; } /********************************************************************/ /* INIT VIDEO DDR RAM /* /********************************************************************/ void init_video_ddr(void) { asm { // init video ram moveq.l #0xB,d0 move.w d0,0xF0000400 //set cke=1, cs=1 config=1 nop lea __VRAM,a0 //zeiger auf video ram nop move.l #0x00050400,(a0) //IPALL nop move.l #0x00072000,(a0) //load EMR pll on nop move.l #0x00070122,(a0) //load MR: reset pll, cl=2 BURST=4lw nop move.l #0x00050400,(a0) //IPALL nop move.l #0x00060000,(a0) //auto refresh nop move.l #0x00060000,(a0) //auto refresh nop move.l #0000070022,(a0) //load MR dll on nop move.l #0x01070002,d0 // fifo on, refresh on, ddrcs und cke on, video dac on, move.l d0,0xf0000400 } } /********************************************************************/ /* video mit auflösung 1280x1000 137MHz /* /********************************************************************/ /* void video_1280_1024(void) { extern int wait_pll; asm { // SPEICHER FÜLLEM //testmuster 1 lea __VRAM,a2 lea __VRAM+0x120000,a3 clr.l d0 move.l #0x1000102,d1 loop5: move.l d0,(a2)+ move.l d0,(a2)+ move.l d0,(a2)+ move.l d0,(a2)+ move.l d0,(a2)+ move.l d0,(a2)+ move.l d0,(a2)+ move.l d0,(a2)+ move.l d0,(a2)+ move.l d0,(a2)+ move.l d0,(a2)+ move.l d0,(a2)+ move.l d0,(a2)+ move.l d0,(a2)+ move.l d0,(a2)+ move.l d0,(a2)+ move.l d0,(a2)+ move.l d0,(a2)+ move.l d0,(a2)+ move.l d0,(a2)+ add.l d1,d0 flo6: cmp.l a2,a3 bgt loop5 // screen setzen //horizontal 1024 lea 0xffff8282,a0 move.w #1344,(a0)+ move.w #1184,(a0)+ move.w #159,(a0)+ move.w #160,(a0)+ move.w #1183,(a0)+ move.w #1208,(a0) //vertical 768 lea 0xffff82a2,a0 move.w #806,(a0)+ move.w #797,(a0)+ move.w #28,(a0)+ move.w #29,(a0)+ move.w #796,(a0)+ move.w #800,(a0)+ // acp video on move.l #0x0107820b,d0 // acp video, color1, pll pixelclk, dac on move.l d0,0xf0000400 lea 0xffff8200,a0 clr.w (a0) clr.b 3(a0) clr.b 0xd(a0) move.w #0x400,10(a0) move.w #0x182,0xc0(a0) clr.w 0xc2(a0) // clut setzen lea 0xf0000000,a0 move.l #0xffffffff,(a0)+ move.l #0xff,(a0)+ move.l #0xff00,(a0)+ move.l #0xff0000,(a0) /* lea 0xffff8200,a0 move.w #6,0xc0(a0) move.w #7,0x40(a0) move.w #7,0x42(a0) move.w #7,0x44(a0) move.w #7,0x46(a0) move.b #1,0x60(a0) halt } } /********************************************************************/ /* INIT PCI /* /********************************************************************/ #define PCI_MEMORY_OFFSET (0x80000000) #define PCI_MEMORY_SIZE (0x40000000) #define PCI_IO_OFFSET (0xD0000000) #define PCI_IO_SIZE (0x10000000) void init_PCI(void) { MCF_PSC0_PSCTB_8BIT = 'PCI '; asm { // Setup the arbiter move.l #MCF_PCIARB_PACR_INTMPRI \ + MCF_PCIARB_PACR_EXTMPRI(0x1F) \ + MCF_PCIARB_PACR_INTMINTEN \ + MCF_PCIARB_PACR_EXTMINTEN(0x1F),D0 move.l D0,MCF_PCIARB_PACR // Setup burst parameters move.l #MCF_PCI_PCICR1_CACHELINESIZE(4) + MCF_PCI_PCICR1_LATTIMER(32),D0 move.l D0,MCF_PCI_PCICR1 move.l #MCF_PCI_PCICR2_MINGNT(16) + MCF_PCI_PCICR2_MAXLAT(16),D0 move.l D0,MCF_PCI_PCICR2 // Turn on error signaling move.l #MCF_PCI_PCIICR_TAE + MCF_PCI_PCIICR_IAE + MCF_PCI_PCIICR_REE + 32,D0 move.l D0,MCF_PCI_PCIICR move.l #MCF_PCI_PCIGSCR_SEE,D0 or.l D0,MCF_PCI_PCIGSCR // Configure Initiator Windows */ move.l #PCI_MEMORY_OFFSET + ((PCI_MEMORY_SIZE - 1) >> 8),D0 clr.w D0 move.l D0,MCF_PCI_PCIIW0BTAR // Initiator Window 0 Base / Translation Address Register move.l #PCI_IO_OFFSET+((PCI_IO_SIZE-1)>>8),D0 clr.w D0 move.l D0,MCF_PCI_PCIIW1BTAR // Initiator Window 1 Base / Translation Address Register clr.l MCF_PCI_PCIIW2BTAR // not used move.l #MCF_PCI_PCIIWCR_WINCTRL0_MEMRDLINE + MCF_PCI_PCIIWCR_WINCTRL1_IO,D0 move.l D0,MCF_PCI_PCIIWCR // Initiator Window Configuration Register /* Clear PCI Reset and wait for devices to reset */ move.l #~MCF_PCI_PCIGSCR_PR,D0 and.l D0,MCF_PCI_PCIGSCR } MCF_PSC0_PSCTB_8BIT = 'OK! '; MCF_PSC0_PSCTB_8BIT = 0x0a0d; } /********************************************************************/ /* test UPC720101 (USB) /* /********************************************************************/ void test_upd720101(void) { MCF_PSC0_PSCTB_8BIT = 'NEC '; asm { // SELECT UPD720101 AD17 MOVE.L #MCF_PCI_PCICAR_E+MCF_PCI_PCICAR_DEVNUM(17)+MCF_PCI_PCICAR_FUNCNUM(0)+MCF_PCI_PCICAR_DWORD(0),D0 MOVE.L D0,MCF_PCI_PCICAR LEA PCI_IO_OFFSET,A0 MOVE.L (A0),D1 move.l #0x33103500,d0 cmp.l d0,d1 beq nec_ok } MCF_PSC0_PSCTB_8BIT = 'NOT '; goto nec_not_ok; nec_ok: asm { MOVE.L #MCF_PCI_PCICAR_E+MCF_PCI_PCICAR_DEVNUM(17)+MCF_PCI_PCICAR_FUNCNUM(0)+MCF_PCI_PCICAR_DWORD(57),D0 MOVE.L D0,MCF_PCI_PCICAR move.b #0x20,(a0) } nec_not_ok: asm { MOVE.L #MCF_PCI_PCICAR_DEVNUM(17)+MCF_PCI_PCICAR_FUNCNUM(0)+MCF_PCI_PCICAR_DWORD(57),D0 MOVE.L D0,MCF_PCI_PCICAR } MCF_PSC0_PSCTB_8BIT = 'OK! '; MCF_PSC0_PSCTB_8BIT = 0x0a0d; } /********************************************************************/ /* TFP410 (vdi) einschalten /* /********************************************************************/ void vdi_on(void) { uint8 RBYT, DBYT; int versuche, startzeit; MCF_PSC0_PSCTB_8BIT = 'DVI '; MCF_I2C_I2FDR = 0x3c; // 100kHz standard versuche = 0; loop_i2c: if (versuche++>10) goto next; MCF_I2C_I2ICR = 0x0; MCF_I2C_I2CR = 0x0; MCF_I2C_I2CR = 0xA; RBYT = MCF_I2C_I2DR; MCF_I2C_I2SR = 0x0; MCF_I2C_I2CR = 0x0; MCF_I2C_I2ICR = 0x01; MCF_I2C_I2CR = 0xb0; MCF_I2C_I2DR = 0x7a; // ADRESSE TFP410 while(!(MCF_I2C_I2SR & MCF_I2C_I2SR_IIF)) ; // warten auf fertig MCF_I2C_I2SR &= 0xfd; // clear bit if (MCF_I2C_I2SR & MCF_I2C_I2SR_RXAK) goto loop_i2c; // ack erhalten? -> nein tpf_410_ACK_OK: MCF_I2C_I2DR = 0x00; // SUB ADRESS 0 while(!(MCF_I2C_I2SR & MCF_I2C_I2SR_IIF)) ; MCF_I2C_I2SR &= 0xfd; MCF_I2C_I2CR |= 0x4; // repeat start MCF_I2C_I2DR = 0x7b; // beginn read while(!(MCF_I2C_I2SR & MCF_I2C_I2SR_IIF)) ; // warten auf fertig MCF_I2C_I2SR &= 0xfd; // clear bit if (MCF_I2C_I2SR & MCF_I2C_I2SR_RXAK) goto loop_i2c; // ack erhalten? -> nein MCF_I2C_I2CR &= 0xef; // switch to rx DBYT = MCF_I2C_I2DR; // dummy read while(!(MCF_I2C_I2SR & MCF_I2C_I2SR_IIF)) ; MCF_I2C_I2SR &= 0xfd; MCF_I2C_I2CR |= 0x08; // txak=1 RBYT = MCF_I2C_I2DR; while(!(MCF_I2C_I2SR & MCF_I2C_I2SR_IIF)) ; MCF_I2C_I2SR &= 0xfd; MCF_I2C_I2CR = 0x80; // stop DBYT = MCF_I2C_I2DR; // dummy read if (RBYT!=0x4c) goto loop_i2c; i2c_ok: MCF_I2C_I2CR = 0x0; // stop MCF_I2C_I2SR = 0x0; // clear sr while((MCF_I2C_I2SR & MCF_I2C_I2SR_IBB)) ; // wait auf bus free MCF_I2C_I2CR = 0xb0; // on tx master MCF_I2C_I2DR = 0x7A; while(!(MCF_I2C_I2SR & MCF_I2C_I2SR_IIF)) ; // warten auf fertig MCF_I2C_I2SR &= 0xfd; // clear bit if (MCF_I2C_I2SR & MCF_I2C_I2SR_RXAK) goto loop_i2c; // ack erhalten? -> nein MCF_I2C_I2DR = 0x08; // SUB ADRESS 8 while(!(MCF_I2C_I2SR & MCF_I2C_I2SR_IIF)) ; MCF_I2C_I2SR &= 0xfd; MCF_I2C_I2DR = 0xbf; // ctl1: power on, T:M:D:S: enable while(!(MCF_I2C_I2SR & MCF_I2C_I2SR_IIF)) ; // warten auf fertig MCF_I2C_I2SR &= 0xfd; // clear bit MCF_I2C_I2CR = 0x80; // stop DBYT = MCF_I2C_I2DR; // dummy read MCF_I2C_I2SR = 0x0; // clear sr while((MCF_I2C_I2SR & MCF_I2C_I2SR_IBB)) ; // wait auf bus free MCF_I2C_I2CR = 0xb0; MCF_I2C_I2DR = 0x7A; while(!(MCF_I2C_I2SR & MCF_I2C_I2SR_IIF)) ; // warten auf fertig MCF_I2C_I2SR &= 0xfd; // clear bit if (MCF_I2C_I2SR & MCF_I2C_I2SR_RXAK) goto loop_i2c; // ack erhalten? -> nein MCF_I2C_I2DR = 0x08; // SUB ADRESS 8 while(!(MCF_I2C_I2SR & MCF_I2C_I2SR_IIF)) ; MCF_I2C_I2SR &= 0xfd; MCF_I2C_I2CR |= 0x4; // repeat start MCF_I2C_I2DR = 0x7b; // beginn read while(!(MCF_I2C_I2SR & MCF_I2C_I2SR_IIF)) ; // warten auf fertig MCF_I2C_I2SR &= 0xfd; // clear bit if (MCF_I2C_I2SR & MCF_I2C_I2SR_RXAK) goto loop_i2c; // ack erhalten? -> nein MCF_I2C_I2CR &= 0xef; // switch to rx DBYT = MCF_I2C_I2DR; // dummy read while(!(MCF_I2C_I2SR & MCF_I2C_I2SR_IIF)) ; MCF_I2C_I2SR &= 0xfd; MCF_I2C_I2CR |= 0x08; // txak=1 warte_50us(); RBYT = MCF_I2C_I2DR; while(!(MCF_I2C_I2SR & MCF_I2C_I2SR_IIF)) ; MCF_I2C_I2SR &= 0xfd; MCF_I2C_I2CR = 0x80; // stop DBYT = MCF_I2C_I2DR; // dummy read if (RBYT!=0xbf) goto loop_i2c; goto dvi_ok; next: MCF_PSC0_PSCTB_8BIT = 'NOT '; dvi_ok: MCF_PSC0_PSCTB_8BIT = 'OK! '; MCF_PSC0_PSCTB_8BIT = 0x0a0d; MCF_I2C_I2CR = 0x0; // i2c off } /********************************************************************/ /* AC97 /* /********************************************************************/ void init_ac97(void) { // PSC2: AC97 ---------- int i,k,zm,x,va,vb,vc; MCF_PSC0_PSCTB_8BIT = 'AC97'; MCF_PAD_PAR_PSC2 = MCF_PAD_PAR_PSC2_PAR_RTS2_RTS // PSC2=TX,RX BCLK,CTS->AC'97 | MCF_PAD_PAR_PSC2_PAR_CTS2_BCLK | MCF_PAD_PAR_PSC2_PAR_TXD2 | MCF_PAD_PAR_PSC2_PAR_RXD2; MCF_PSC2_PSCMR1 = 0x0; MCF_PSC2_PSCMR2 = 0x0; MCF_PSC2_PSCIMR = 0x0300; MCF_PSC2_PSCSICR = 0x03; //AC97 MCF_PSC2_PSCRFCR = 0x0f000000; MCF_PSC2_PSCTFCR = 0x0f000000; MCF_PSC2_PSCRFAR = 0x00F0; MCF_PSC2_PSCTFAR = 0x00F0; for ( zm = 0; zm<100000; zm++) // wiederholen bis synchron { MCF_PSC2_PSCCR = 0x20; MCF_PSC2_PSCCR = 0x30; MCF_PSC2_PSCCR = 0x40; MCF_PSC2_PSCCR = 0x05; // MASTER VOLUME -0dB MCF_PSC2_PSCTB_AC97 = 0xE0000000; //START SLOT1 + SLOT2, FIRST FRAME MCF_PSC2_PSCTB_AC97 = 0x02000000; //SLOT1:WR REG MASTER VOLUME adr 0x02 for ( i = 2; i<13; i++ ) { MCF_PSC2_PSCTB_AC97 = 0x0; //SLOT2-12:WR REG ALLES 0 } // read register MCF_PSC2_PSCTB_AC97 = 0xc0000000; //START SLOT1 + SLOT2, FIRST FRAME MCF_PSC2_PSCTB_AC97 = 0x82000000; //SLOT1:master volume for ( i = 2; i<13; i++ ) { MCF_PSC2_PSCTB_AC97 = 0x00000000; //SLOT2-12:RD REG ALLES 0 } warte_50us(); va = MCF_PSC2_PSCTB_AC97; if ((va & 0x80000fff)==0x80000800) { vb = MCF_PSC2_PSCTB_AC97; vc = MCF_PSC2_PSCTB_AC97; if ((va & 0xE0000fff)==0xE0000800 & vb==0x02000000 & vc==0x00000000) { goto livo; } } } MCF_PSC0_PSCTB_8BIT = ' NOT'; livo: // AUX VOLUME ->-0dB MCF_PSC2_PSCTB_AC97 = 0xE0000000; //START SLOT1 + SLOT2, FIRST FRAME MCF_PSC2_PSCTB_AC97 = 0x16000000; //SLOT1:WR REG AUX VOLUME adr 0x16 MCF_PSC2_PSCTB_AC97 = 0x06060000; //SLOT1:VOLUME for ( i = 3; i<13; i++ ) { MCF_PSC2_PSCTB_AC97 = 0x0; //SLOT2-12:WR REG ALLES 0 } // line in VOLUME +12dB MCF_PSC2_PSCTB_AC97 = 0xE0000000; //START SLOT1 + SLOT2, FIRST FRAME MCF_PSC2_PSCTB_AC97 = 0x10000000; //SLOT1:WR REG MASTER VOLUME adr 0x02 for ( i = 2; i<13; i++ ) { MCF_PSC2_PSCTB_AC97 = 0x0; //SLOT2-12:WR REG ALLES 0 } // cd in VOLUME 0dB MCF_PSC2_PSCTB_AC97 = 0xE0000000; //START SLOT1 + SLOT2, FIRST FRAME MCF_PSC2_PSCTB_AC97 = 0x12000000; //SLOT1:WR REG MASTER VOLUME adr 0x02 for ( i = 2; i<13; i++ ) { MCF_PSC2_PSCTB_AC97 = 0x0; //SLOT2-12:WR REG ALLES 0 } // mono out VOLUME 0dB MCF_PSC2_PSCTB_AC97 = 0xE0000000; //START SLOT1 + SLOT2, FIRST FRAME MCF_PSC2_PSCTB_AC97 = 0x06000000; //SLOT1:WR REG MASTER VOLUME adr 0x02 MCF_PSC2_PSCTB_AC97 = 0x00000000; //SLOT1:WR REG MASTER VOLUME adr 0x02 for ( i = 3; i<13; i++ ) { MCF_PSC2_PSCTB_AC97 = 0x0; //SLOT2-12:WR REG ALLES 0 } MCF_PSC2_PSCTFCR |= MCF_PSC_PSCTFCR_WFR; //set EOF MCF_PSC2_PSCTB_AC97 = 0x00000000; //last data ac97_end: MCF_PSC0_PSCTB_8BIT = ' OK!'; MCF_PSC0_PSCTB_8BIT = 0x0a0d; } /********************************************************************/ void __initialize_hardware(void) { _init_hardware: init_ddram(); asm { // instruction cache on move.l #0x007fe000,d0 movec d0,acr0 move.l d0,rt_acr0 movec d0,acr2 move.l d0,rt_acr2 clr.l d0 movec d0,acr1 move.l d0,rt_acr1 movec d0,acr3 move.l d0,rt_acr3 move.l d0,MCF_MMU_MMUCR move.l #0x050c8120,d0 move.l d0,rt_cacr movec d0,cacr nop } init_gpio(); init_seriel(); init_slt(); init_fbcs(); init_fpga(); init_video_ddr(); vdi_on(); // Ports nicht initialisieren wenn DIP Switch 6 = on asm { // IDE reset lea 0xffff8802,a0 // IDE reset move.b #14,-2(a0) move.b #0x80,(a0) bsr warte_1ms clr.b (a0) // dip switch move.b DIP_SWITCH,d0 // dip schalter adresse move.b d0,0xF0040002 // acp conf +2 // ACP_CONF setzen und Ports nicht initialisieren wenn DIP Switch 6 = on btst.b #6,d0 beq not_init_ports } init_PCI(); //pci braucht zeit init_ac97(); test_upd720101(); // video_1280_1024(); asm { not_init_ports: } set_ide_access_mode(); }