xhyper255b.c

来自「linux嵌入式课程实践中的一个关于声卡驱动程序 。」· C语言 代码 · 共 195 行

C
195
字号
/* * linux/drivers/pcmcia/pxa/xhyper255B.c * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 as * published by the Free Software Foundation. * * Copyright (c) 2002 Accelent Systems, Inc. All Rights Reserved *  * Platform specific routines for the Accelent PXA250 IDP, based on those * first done for the Lubbock. * * Version 1.0 2002-05-02  Jeff Sutherland <jeffs@accelent.com> * */#include <linux/kernel.h>#include <linux/sched.h>#include <asm/delay.h>#include <asm/hardware.h>#include <asm/irq.h>#include <asm/arch/pcmcia.h>#define DEBUG 1#ifdef DEBUG#define  PRINTK(x...) printk(x)#endifstatic int xhyper255B_pcmcia_init(struct pcmcia_init *init){	int return_val=0;	PRINTK("X-Hyper250 PCMCIA INIT\n");	GPDR(IRQ_TO_GPIO_2_80(PCMCIA_CD)) &= ~GPIO_bit(IRQ_TO_GPIO_2_80(PCMCIA_CD));	GPDR(IRQ_TO_GPIO_2_80(CF_CD)) &= ~GPIO_bit(IRQ_TO_GPIO_2_80(CF_CD));	set_GPIO_IRQ_edge(IRQ_TO_GPIO_2_80(PCMCIA_CD),GPIO_BOTH_EDGES);	set_GPIO_IRQ_edge(IRQ_TO_GPIO_2_80(CF_CD),GPIO_BOTH_EDGES);	//irq's for slots:	GPDR(IRQ_TO_GPIO_2_80(PCMCIA_IREQ)) &= ~GPIO_bit(IRQ_TO_GPIO_2_80(PCMCIA_IREQ));	GPDR(IRQ_TO_GPIO_2_80(CF_IREQ)) &= ~GPIO_bit(IRQ_TO_GPIO_2_80(CF_IREQ));	set_GPIO_IRQ_edge(IRQ_TO_GPIO_2_80(PCMCIA_IREQ),GPIO_FALLING_EDGE);	set_GPIO_IRQ_edge(IRQ_TO_GPIO_2_80(CF_IREQ),GPIO_FALLING_EDGE);			return_val = request_irq(PCMCIA_CD, init->handler, SA_INTERRUPT, "PXA PCMCIA CD", NULL);  	return_val += request_irq(CF_CD, init->handler, SA_INTERRUPT, "PXA CF CD", NULL);  	return (return_val<0) ? -1 : 2;}static intxhyper255B_pcmcia_shutdown(void){		PRINTK("X-Hyper250 PCMCIA SHUTDOWN\n");	free_irq(PCMCIA_CD, NULL);	free_irq(CF_CD, NULL);	return 0;}static intxhyper255B_pcmcia_socket_state(struct pcmcia_state_array *state_array){	unsigned long status;	int return_val=1;	if (state_array->size < 2) return -1;	memset(state_array->state, 0, (state_array->size)*sizeof(struct pcmcia_state));	// PCMCIA state	state_array->state[0].detect = ((GPLR0 		& GPIO_bit(3)) 	== 0) 	? 1 : 0;	state_array->state[0].ready  = ((GPLR0 		& GPIO_bit(2)) 	== 0)	? 0 : 1;	state_array->state[0].bvd1   = ((EXT_PORT1 	& PCMCIA_BVD1) 	== 0)	? 0 : 1;	state_array->state[0].bvd2   = ((EXT_PORT1 	& PCMCIA_BVD2) 	== 0)	? 0 : 1;	state_array->state[0].wrprot = 0;	state_array->state[0].vs_3v  = ((EXT_PORT1 	& PCMCIA_VS1) 	== 0) 	? 1 : 0;	state_array->state[0].vs_Xv  = ((EXT_PORT1	& PCMCIA_VS2) 	== 0) 	? 1 : 0;	// CF state	state_array->state[1].detect = ((GPLR0 		& GPIO_bit(17))	== 0) 	? 1 : 0;	state_array->state[1].ready  = ((GPLR0 		& GPIO_bit(16))	== 0)	? 0 : 1;	state_array->state[1].bvd1   = ((EXT_PORT1 	& CF_BVD1) 		== 0)	? 0 : 1;	state_array->state[1].bvd2   = ((EXT_PORT1 	& CF_BVD2) 		== 0)	? 0 : 1;	state_array->state[1].wrprot = 0;	state_array->state[1].vs_3v  = ((EXT_PORT1 	& CF_VS1) 		== 0) 	? 1 : 0;	state_array->state[1].vs_Xv  = ((EXT_PORT1	& CF_VS2) 		== 0) 	? 1 : 0;	return return_val;}static intxhyper255B_pcmcia_get_irq_info(struct pcmcia_irq_info *info){	switch (info->sock) {	    case 0:		info->irq=PCMCIA_IREQ;		break;	    case 1:		info->irq=CF_IREQ;		break;	    default:		return -1;	}	return 0;}static intxhyper255B_pcmcia_configure_socket(const struct pcmcia_configure *configure){	switch(configure->sock){	    case 0://        	PRINTK("PCMCIA  Vcc : %d, Vpp : %d, reset : %d\n",configure->vcc, configure->vpp, configure->reset);		switch(configure->vcc){		    case 0:			XHYPER255_ClearBit(0, PCMCIA_EN0 | PCMCIA_EN1 | PCMCIA_VCC3_EN | PCMCIA_VCC5_EN);			break;		    case 33:			XHYPER255_ClearBit(0, PCMCIA_EN0 | PCMCIA_EN1 | PCMCIA_VCC3_EN);			XHYPER255_SetBit(0, PCMCIA_VCC5_EN);			break;		    case 50:			XHYPER255_ClearBit(0, PCMCIA_EN0 | PCMCIA_EN1 | PCMCIA_VCC5_EN);			XHYPER255_SetBit(0, PCMCIA_VCC3_EN);			break;		    default:			printk(KERN_ERR "%s(): unrecognized Vcc %u\n", __FUNCTION__,configure->vcc);			return -1;		} 		if (configure->reset){				XHYPER255_SetBit(0,PCMCIA_RESET); // PCMCIA RESET		} else  {				XHYPER255_ClearBit(0,PCMCIA_RESET); // PCMCIA RESET		}			    break;	case 1://        	PRINTK("CF  Vcc : %d, Vpp : %d, reset : %d\n",configure->vcc, configure->vpp, configure->reset);		switch(configure->vcc){		    case 0:			XHYPER255_ClearBit(0, CF_VCC_EN);			break;		    case 50:        	printk(KERN_WARNING __FUNCTION__"(): CS asked for 5V, applying 3.3V..\n");		    case 33:			XHYPER255_SetBit(0, CF_VCC_EN);			break;		    default:			printk(KERN_ERR "%s(): unrecognized Vcc %u\n", __FUNCTION__,configure->vcc);			return -1;		}		if (configure->reset){				XHYPER255_SetBit(0,CF_RESET); // CF RESET		} else  {				XHYPER255_ClearBit(0,CF_RESET); // CF RESET		}	    break;	}	return 0;}struct pcmcia_low_level xhyper255B_pcmcia_ops = {   xhyper255B_pcmcia_init,  xhyper255B_pcmcia_shutdown,  xhyper255B_pcmcia_socket_state,  xhyper255B_pcmcia_get_irq_info,  xhyper255B_pcmcia_configure_socket};

⌨️ 快捷键说明

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