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

📄 ide-m8xx.c

📁 em85xx的大硬盘修正代码包
💻 C
📖 第 1 页 / 共 2 页
字号:
/* Calculate PIO timings */static voidm8xx_ide_tuneproc(ide_drive_t *drive, byte pio){	ide_pio_data_t d;#if defined(CONFIG_IDE_8xx_PCCARD) || defined(CONFIG_IDE_8xx_DIRECT)	volatile pcmconf8xx_t	*pcmp;	ulong timing, mask, reg;#endif	pio = ide_get_best_pio_mode(drive, pio, 4, &d);#if 1	printk("%s[%d] %s: best PIO mode: %d\n",		__FILE__,__LINE__,__FUNCTION__, pio);#endif#if defined(CONFIG_IDE_8xx_PCCARD) || defined(CONFIG_IDE_8xx_DIRECT)	pcmp = (pcmconf8xx_t *)(&(((immap_t *)IMAP_ADDR)->im_pcmcia));	mask = ~(PCMCIA_SHT(0xFF) | PCMCIA_SST(0xFF) | PCMCIA_SL(0xFF));	timing  = PCMCIA_SHT(hold_time[pio]  )		| PCMCIA_SST(ide_pio_clocks[pio].setup_time )		| PCMCIA_SL (ide_pio_clocks[pio].active_time)		;#if 1	printk ("Setting timing bits 0x%08lx in PCMCIA controller\n", timing);#endif	if ((reg = pcmp->pcmc_por0 & mask) != 0)		pcmp->pcmc_por0 = reg | timing;	if ((reg = pcmp->pcmc_por1 & mask) != 0)		pcmp->pcmc_por1 = reg | timing;	if ((reg = pcmp->pcmc_por2 & mask) != 0)		pcmp->pcmc_por2 = reg | timing;	if ((reg = pcmp->pcmc_por3 & mask) != 0)		pcmp->pcmc_por3 = reg | timing;	if ((reg = pcmp->pcmc_por4 & mask) != 0)		pcmp->pcmc_por4 = reg | timing;	if ((reg = pcmp->pcmc_por5 & mask) != 0)		pcmp->pcmc_por5 = reg | timing;	if ((reg = pcmp->pcmc_por6 & mask) != 0)		pcmp->pcmc_por6 = reg | timing;	if ((reg = pcmp->pcmc_por7 & mask) != 0)		pcmp->pcmc_por7 = reg | timing;#elif defined(CONFIG_IDE_EXT_DIRECT)	printk("%s[%d] %s: not implemented yet!\n",		__FILE__,__LINE__,__FUNCTION__);#endif /* defined(CONFIG_IDE_8xx_PCCARD) || defined(CONFIG_IDE_8xx_PCMCIA */}static voidide_interrupt_ack (void *dev){#ifdef CONFIG_IDE_8xx_PCCARD	u_int pscr, pipr;#if (PCMCIA_SOCKETS_NO == 2)	u_int _slot_;#endif	/* get interrupt sources */	pscr = ((volatile immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pscr;	pipr = ((volatile immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pipr;	/*	 * report only if both card detect signals are the same	 * not too nice done,	 * we depend on that CD2 is the bit to the left of CD1...	 */	if(_slot_==-1){	  printk("PCMCIA slot has not been defined! Using A as default\n");	  _slot_=0;	}	if(((pipr & M8XX_PCMCIA_CD2(_slot_)) >> 1) ^	   (pipr & M8XX_PCMCIA_CD1(_slot_))         ) {	  printk ("card detect interrupt\n");	}	/* clear the interrupt sources */	((immap_t *)IMAP_ADDR)->im_pcmcia.pcmc_pscr = pscr;#else /* ! CONFIG_IDE_8xx_PCCARD */	/*	 * Only CONFIG_IDE_8xx_PCCARD is using the interrupt of the	 * MPC8xx's PCMCIA controller, so there is nothing to be done here	 * for CONFIG_IDE_8xx_DIRECT and CONFIG_IDE_EXT_DIRECT.	 * The interrupt is handled somewhere else.	-- Steven	 */#endif /* CONFIG_IDE_8xx_PCCARD */}/* * CIS Tupel codes */#define CISTPL_NULL		0x00#define CISTPL_DEVICE		0x01#define CISTPL_LONGLINK_CB	0x02#define CISTPL_INDIRECT		0x03#define CISTPL_CONFIG_CB	0x04#define CISTPL_CFTABLE_ENTRY_CB 0x05#define CISTPL_LONGLINK_MFC	0x06#define CISTPL_BAR		0x07#define CISTPL_PWR_MGMNT	0x08#define CISTPL_EXTDEVICE	0x09#define CISTPL_CHECKSUM		0x10#define CISTPL_LONGLINK_A	0x11#define CISTPL_LONGLINK_C	0x12#define CISTPL_LINKTARGET	0x13#define CISTPL_NO_LINK		0x14#define CISTPL_VERS_1		0x15#define CISTPL_ALTSTR		0x16#define CISTPL_DEVICE_A		0x17#define CISTPL_JEDEC_C		0x18#define CISTPL_JEDEC_A		0x19#define CISTPL_CONFIG		0x1a#define CISTPL_CFTABLE_ENTRY	0x1b#define CISTPL_DEVICE_OC	0x1c#define CISTPL_DEVICE_OA	0x1d#define CISTPL_DEVICE_GEO	0x1e#define CISTPL_DEVICE_GEO_A	0x1f#define CISTPL_MANFID		0x20#define CISTPL_FUNCID		0x21#define CISTPL_FUNCE		0x22#define CISTPL_SWIL		0x23#define CISTPL_END		0xff/* * CIS Function ID codes */#define CISTPL_FUNCID_MULTI	0x00#define CISTPL_FUNCID_MEMORY	0x01#define CISTPL_FUNCID_SERIAL	0x02#define CISTPL_FUNCID_PARALLEL	0x03#define CISTPL_FUNCID_FIXED	0x04#define CISTPL_FUNCID_VIDEO	0x05#define CISTPL_FUNCID_NETWORK	0x06#define CISTPL_FUNCID_AIMS	0x07#define CISTPL_FUNCID_SCSI	0x08/* * Fixed Disk FUNCE codes */#define CISTPL_IDE_INTERFACE	0x01#define CISTPL_FUNCE_IDE_IFACE	0x01#define CISTPL_FUNCE_IDE_MASTER	0x02#define CISTPL_FUNCE_IDE_SLAVE	0x03/* First feature byte */#define CISTPL_IDE_SILICON	0x04#define CISTPL_IDE_UNIQUE	0x08#define CISTPL_IDE_DUAL		0x10/* Second feature byte */#define CISTPL_IDE_HAS_SLEEP	0x01#define CISTPL_IDE_HAS_STANDBY	0x02#define CISTPL_IDE_HAS_IDLE	0x04#define CISTPL_IDE_LOW_POWER	0x08#define CISTPL_IDE_REG_INHIBIT	0x10#define CISTPL_IDE_HAS_INDEX	0x20#define CISTPL_IDE_IOIS16	0x40/* -------------------------------------------------------------------- */#define	MAX_TUPEL_SZ	512#define MAX_FEATURES	4static int check_ide_device (unsigned long base){	volatile unsigned char *ident = NULL;	volatile unsigned char *feature_p[MAX_FEATURES];	volatile unsigned char *p, *start;	int n_features = 0;	unsigned char func_id = ~0;	unsigned char code, len;	unsigned short config_base = 0;	int found = 0;	int i;#ifdef DEBUG	printk ("PCMCIA MEM: %08lX\n", base);#endif	start = p = (volatile unsigned char *) base;	while ((p - start) < MAX_TUPEL_SZ) {		code = *p; p += 2;		if (code == 0xFF) { /* End of chain */			break;		}		len = *p; p += 2;#ifdef	DEBUG_PCMCIA		{ volatile unsigned char *q = p;			printk ("\nTuple code %02x  length %d\n\tData:",				code, len);			for (i = 0; i < len; ++i) {				printk (" %02x", *q);				q+= 2;			}		}#endif	/* DEBUG_PCMCIA */		switch (code) {		case CISTPL_VERS_1:			ident = p + 4;			break;		case CISTPL_FUNCID:			func_id = *p;			break;		case CISTPL_FUNCE:			if (n_features < MAX_FEATURES)				feature_p[n_features++] = p;			break;		case CISTPL_CONFIG:			config_base = (*(p+6) << 8) + (*(p+4));		default:			break;		}		p += 2 * len;	}	found = identify (ident);	if (func_id != ((unsigned char)~0)) {		print_funcid (func_id);		if (func_id == CISTPL_FUNCID_FIXED)			found = 1;		else			return (1);	/* no disk drive */	}	for (i=0; i<n_features; ++i) {		print_fixed (feature_p[i]);	}	if (!found) {		printk ("unknown card type\n");		return (1);	}	/* set level mode irq and I/O mapped device in config reg*/	*((unsigned char *)(base + config_base)) = 0x41;	return (0);}/* ------------------------------------------------------------------------- */static void print_funcid (int func){	switch (func) {	case CISTPL_FUNCID_MULTI:		printk (" Multi-Function");		break;	case CISTPL_FUNCID_MEMORY:		printk (" Memory");		break;	case CISTPL_FUNCID_SERIAL:		printk (" Serial Port");		break;	case CISTPL_FUNCID_PARALLEL:		printk (" Parallel Port");		break;	case CISTPL_FUNCID_FIXED:		printk (" Fixed Disk");		break;	case CISTPL_FUNCID_VIDEO:		printk (" Video Adapter");		break;	case CISTPL_FUNCID_NETWORK:		printk (" Network Adapter");		break;	case CISTPL_FUNCID_AIMS:		printk (" AIMS Card");		break;	case CISTPL_FUNCID_SCSI:		printk (" SCSI Adapter");		break;	default:		printk (" Unknown");		break;	}	printk (" Card\n");}/* ------------------------------------------------------------------------- */static void print_fixed (volatile unsigned char *p){	if (p == NULL)		return;	switch (*p) {	case CISTPL_FUNCE_IDE_IFACE:	    {   unsigned char iface = *(p+2);		printk ((iface == CISTPL_IDE_INTERFACE) ? " IDE" : " unknown");		printk (" interface ");		break;	    }	case CISTPL_FUNCE_IDE_MASTER:	case CISTPL_FUNCE_IDE_SLAVE:	    {   unsigned char f1 = *(p+2);		unsigned char f2 = *(p+4);		printk ((f1 & CISTPL_IDE_SILICON) ? " [silicon]" : " [rotating]");		if (f1 & CISTPL_IDE_UNIQUE)			printk (" [unique]");		printk ((f1 & CISTPL_IDE_DUAL) ? " [dual]" : " [single]");		if (f2 & CISTPL_IDE_HAS_SLEEP)			printk (" [sleep]");		if (f2 & CISTPL_IDE_HAS_STANDBY)			printk (" [standby]");		if (f2 & CISTPL_IDE_HAS_IDLE)			printk (" [idle]");		if (f2 & CISTPL_IDE_LOW_POWER)			printk (" [low power]");		if (f2 & CISTPL_IDE_REG_INHIBIT)			printk (" [reg inhibit]");		if (f2 & CISTPL_IDE_HAS_INDEX)			printk (" [index]");		if (f2 & CISTPL_IDE_IOIS16)			printk (" [IOis16]");		break;	    }	}	printk ("\n");}/* ------------------------------------------------------------------------- */#define MAX_IDENT_CHARS		64#define	MAX_IDENT_FIELDS	4static unsigned char *known_cards[] = {	"ARGOSY PnPIDE D5",	NULL};static int identify  (volatile unsigned char *p){	unsigned char id_str[MAX_IDENT_CHARS];	unsigned char data;	unsigned char *t;	unsigned char **card;	int i, done;	if (p == NULL)		return (0);	/* Don't know */	t = id_str;	done =0;	for (i=0; i<=4 && !done; ++i, p+=2) {		while ((data = *p) != '\0') {			if (data == 0xFF) {				done = 1;				break;			}			*t++ = data;			if (t == &id_str[MAX_IDENT_CHARS-1]) {				done = 1;				break;			}			p += 2;		}		if (!done)			*t++ = ' ';	}	*t = '\0';	while (--t > id_str) {		if (*t == ' ')			*t = '\0';		else			break;	}	printk ("Card ID: %s\n", id_str);	for (card=known_cards; *card; ++card) {		if (strcmp(*card, id_str) == 0) {	/* found! */			return (1);		}	}	return (0);	/* don't know */}void m8xx_ide_init(void){	ppc_ide_md.default_irq          = m8xx_ide_default_irq;	ppc_ide_md.default_io_base      = m8xx_ide_default_io_base;	ppc_ide_md.ide_init_hwif        = m8xx_ide_init_hwif_ports;}

⌨️ 快捷键说明

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