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 + -
显示快捷键?