⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ide-jasper.c

📁 这是一个SIGMA方案的PMP播放器的UCLINUX程序,可播放DVD,VCD,CD MP3...有很好的参考价值.
💻 C
字号:
/* ide-jasper.c *//* jasper specific initialization stuff for ide */#include <linux/init.h>#include <asm/io.h>#include <asm/hardware.h>#include <linux/ide.h>#include "ide_modes.h"extern int printk(const char *fmt,...);extern void ide_setup_dma (ide_hwif_t *hwif, unsigned long dma_base, unsigned int num_ports);#define ENABLE_BMDMA // #undef ENABLE_BMDMA//#define ENABLE_UDMA #undef ENABLE_UDMAint ide_config_drive_speed (ide_drive_t *drive, byte speed);//Setup register 0x54 and 0x58a for UDMA timing//Values assume 100Mhz system busstatic int jasper_tune_chipset(ide_drive_t *drive, byte speed){	ide_hwif_t *hwif = HWIF(drive);	char channel     = hwif->channel;	unsigned short reg54, reg58;	int slave = 0;	printk("jasper_tune_chipset: speed = %02x\n", speed);		reg54=inw(JASPER_IDE_BASE + 0x54);	reg58=inw(JASPER_IDE_BASE + 0x58);#ifdef ENABLE_UDMA 	if(speed>=XFER_UDMA_0 && speed<=XFER_UDMA_5){		// ---- This assume 100Mhz system bus - for UDMA		if(slave) {			reg54 |= 0x2;			reg58 |= (speed-XFER_UDMA_0)<<4;		}else {			reg54 |= 0x1;			reg58 |= (speed-XFER_UDMA_0);		}		// ---- 	} else#endif // ENABLE_UDMA				{		if(slave) {			reg54 &= ~0x2;		} else {			reg54 &= ~0x1;		}	}		outw(reg54, JASPER_IDE_BASE + 0x54);	outw(reg58, JASPER_IDE_BASE + 0x58);	return ide_config_drive_speed(drive, speed);}static int jasper_config_drive_for_dma (ide_drive_t *drive){	struct hd_driveid *id = drive->id;	ide_hwif_t *hwif = HWIF(drive);	int autodma = hwif->autodma;	ide_dma_action_t dma_func = ide_dma_on;	byte speed;	byte udma_66 = eighty_ninty_three(drive); // 80 c ribbon ?	printk ("jasper_config_drive_for_dma:\n");	printk (" capability    = 0x%04x\n", id->capability);	printk (" field_valid   = 0x%04x\n", id->field_valid);	printk (" dma_ultra     = 0x%04x\n", id->dma_ultra);	printk (" dma_1word (s) = 0x%04x\n", id->dma_1word);	printk (" dma_mword (m) = 0x%04x\n", id->dma_mword);	printk (" autodma       = 0x%04x\n", autodma);	if (id && (id->capability & 1) && autodma) {		if (ide_dmaproc(ide_dma_bad_drive, drive)) {			// consult list of known "bad" drives			dma_func = ide_dma_off;// Ultra DMA support			#ifdef ENABLE_UDMA		} else if ((id->field_valid & 4) && (id->dma_ultra & 0x3F)) {			// Enable DMA on any drive that is UltraDMA (mode 0-5) capable			// mode3/4/5 needs 80c ribbon			if((id->dma_ultra & 0x20) && udma_66)				speed = XFER_UDMA_5; 			else if((id->dma_ultra & 0x10) && udma_66)				speed = XFER_UDMA_4;			else if((id->dma_ultra & 0x08) && udma_66)				speed = XFER_UDMA_3;			else if(id->dma_ultra & 0x04)				speed = XFER_UDMA_2;			else if(id->dma_ultra & 0x02)				speed = XFER_UDMA_1;			else if(id->dma_ultra & 0x01)				speed = XFER_UDMA_0;#endif			//Busmaster DMA support#ifdef ENABLE_BMDMA		} else if((id->field_valid & 2) &&	(id->dma_mword & 0x7)) {			// Multiword DMA			if(id->dma_mword & 0x4)				speed = XFER_MW_DMA_2;			else if (id->dma_mword & 0x2)				speed = XFER_MW_DMA_1;			else				speed = XFER_MW_DMA_0;		} else if((id->field_valid & 2) && (id->dma_1word & 0x7)) {			// Single word DMA			if(id->dma_1word & 0x4)				speed = XFER_SW_DMA_2;			else if (id->dma_1word & 0x2)				speed = XFER_SW_DMA_1;			else 				speed = XFER_SW_DMA_0;#endif					} else {			speed = XFER_PIO_0 + ide_get_best_pio_mode(drive, 255, 5, NULL);			dma_func = ide_dma_off_quietly;		}		if(jasper_tune_chipset(drive, speed)) {			printk("Error in jasper_tune_chipset, disbale DMA\n");			dma_func = ide_dma_off;		}				return hwif->dmaproc(dma_func, drive);	}		printk ("DMA disabled quietly\n");	return hwif->dmaproc(ide_dma_off_quietly, drive);}static int jasper_dmaproc(ide_dma_action_t func, ide_drive_t *drive){	unsigned char dma_stat;	unsigned long dma_base = HWIF(drive)->dma_base;	unsigned long dma_count, dma_address;	int i;		switch (func) {		case ide_dma_check:			return jasper_config_drive_for_dma(drive);		case ide_dma_end:			drive->waiting_for_dma=0;			for(i=0; i<100; i++) {				dma_stat = inb(dma_base + 0x4);  /* get DMA status */				if((dma_stat & 0x4) ==4)					break;				dma_count = inl(dma_base + 0xe4);				dma_address = inl(dma_base + 0xe0);				printk("J %1x %08x %04x\n", dma_stat & 0xF, dma_address, dma_count);			}			outb(inb(dma_base)&~1, dma_base); /* stop DMA */			outb(dma_stat|6, dma_base + 0x4); /* clear the INTR & ERROR bits */			ide_destroy_dmatable(drive); /* purge DMA mappings */			return (dma_stat & 4) != 4 ? (0x10 | dma_stat) : 0;		default :			break;	}	/* Other cases are done by generic IDE-DMA code. */	return ide_dmaproc(func, drive);}void __init jasper_ide_init(void){	ide_hwif_t *hwif;	unsigned long dma_base = JASPER_IDE_DMA_BASE;	// enable ide interface 		//set pio4 to 1		outl(0x0010FFFF, JASPER_PIO0_BASE + PIO_DIR);	outl(0x0010FFFF, JASPER_PIO0_BASE + PIO_DATA);	//	choose ide over dvd loader (DVD_AV_CONTROL)	//	write 0x8000 to IDETIM	outl(0x00, JASPER_DVD_BASE + DVD_AV_CTRL);			//0x00 select IDE over DVD-loader	outl(0x8000, JASPER_IDE_BASE + IDE_TIM);//	outl(0xb301, JASPER_IDE_BASE + IDE_TIM);		//0x40 IDE decode enable	printk("JASPER ide controller activated\n");		// grab hwif,	hwif = &ide_hwifs[0];	// setup busmaster dma	ide_setup_dma(hwif, dma_base, 16);	// override dmaproc 	hwif->dmaproc = &jasper_dmaproc;	// autodma on	hwif->autodma = 1;}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -