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

📄 ar5312_gpio.c

📁 Atheros wifi driver source code
💻 C
字号:
/* * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting * Copyright (c) 2002-2004 Atheros Communications, Inc. * All rights reserved. * * $Id: ar5312_gpio.c,v 1.1.1.1 2006/09/12 03:45:23 steven Exp $ */#include "opt_ah.h"#ifdef AH_SUPPORT_AR5312#include "ah.h"#include "ah_internal.h"#include "ah_devid.h"#include "ar5312/ar5312.h"#include "ar5312/ar5312reg.h"#include "ar5312/ar5312phy.h"#define	AR_NUM_GPIO	7		/* 7 GPIO pins */#define	AR_GPIOD_MASK	0x0000007F	/* GPIO data reg r/w mask *//*  * XXX Divy. Should we change the file name,  * or create a specific file per target ? */ /* Macros to get platform independent code */#define IS_FREEDOM(ah) \	(AH_PRIVATE((ah))->ah_devid == AR5212_AR5312_REV7)	#define	IS_COBRA(ah) \	(AH_PRIVATE((ah))->ah_macVersion == AR_SREV_VERSION_COBRA)#define GET_GPIO_BASE(ah, base) do {			\	if (IS_FREEDOM(ah))				\		(base) = AR_GPIO_BASE;			\	else if (IS_COBRA(ah)) 				\		(base) = AR5315_GPIO_BASE;		\} while (0)#define GET_GPIO_CR(ah, cr) do {			\	if (IS_FREEDOM(ah))				\		(cr) = AR_GPIOCR;			\	else if (IS_COBRA(ah)) 				\		(cr) = AR5315_GPIOCR;			\} while (0)#define GET_GPIO_DO(ah, _do) do {			\	if (IS_FREEDOM(ah))				\		(_do) = AR_GPIODO;			\	else if (IS_COBRA(ah)) 				\		(_do) = AR5315_GPIODO;			\} while (0)#define GET_GPIO_DI(ah, di) do {			\	if (IS_FREEDOM(ah))				\		(di) = AR_GPIODI;			\	else if (IS_COBRA(ah)) 				\		(di) = AR5315_GPIODI;			\} while (0)#define GET_GPIO_CR_0(ah, pin, out) do {		\	if (IS_FREEDOM(ah))				\		(out) = GPIO_CR_O(pin);			\	else if (IS_COBRA(ah)) 				\		(out) = GPIO_CR_I(pin);			\} while (0)#define GET_GPIO_CR_I(ah, pin, out) do {		\	if (IS_FREEDOM(ah))				\		(out) = GPIO_CR_I(pin);			\	else if (IS_COBRA(ah)) 				\		(out) = GPIO_CR_O(pin);			\} while (0)extern struct ar531x_boarddata *ar5312_boardConfig;/* * Configure GPIO Output lines */HAL_BOOLar5312GpioCfgOutput(struct ath_hal *ah, u_int32_t gpio){	u_int32_t gpio_base, gpio_cr, gpio_offset;	u_int32_t gpio_pin;	u_int32_t gpio_cr_o;	u_int32_t reg_val;		HALASSERT(gpio < AR_NUM_GPIO);			GET_GPIO_BASE(ah, gpio_base);	GET_GPIO_CR(ah, gpio_cr);	gpio_offset = gpio_base - ((u_int32_t)ah->ah_sh);	if (ar5312_boardConfig)		gpio_pin = ar5312_boardConfig->sysLedGpio;	else		gpio_pin = gpio;		reg_val = OS_REG_READ(ah, gpio_offset + gpio_cr);		reg_val &= ~(GPIO_CR_M(gpio_pin) | 		     GPIO_CR_UART(gpio_pin) | 		     GPIO_CR_INT(gpio_pin));		GET_GPIO_CR_0(ah, gpio_pin, gpio_cr_o);	reg_val |= gpio_cr_o; 		OS_REG_WRITE(ah, gpio_offset + gpio_cr, reg_val);	OS_REG_READ(ah, gpio_offset + gpio_cr);	return AH_TRUE;}/* * Configure GPIO Input lines */HAL_BOOLar5312GpioCfgInput(struct ath_hal *ah, u_int32_t gpio){	u_int32_t gpio_base, gpio_cr, gpio_offset;	u_int32_t gpio_pin;	u_int32_t gpio_cr_i;	u_int32_t reg_val;			HALASSERT(gpio < AR_NUM_GPIO);		GET_GPIO_BASE(ah, gpio_base);	GET_GPIO_CR(ah, gpio_cr);	gpio_offset = gpio_base - ((u_int32_t)ah->ah_sh);			if (ar5312_boardConfig)		gpio_pin = ar5312_boardConfig->sysLedGpio;	else		gpio_pin = gpio;	reg_val = OS_REG_READ(ah, gpio_offset + gpio_cr);	reg_val &= ~(GPIO_CR_M(gpio_pin) | 		     GPIO_CR_UART(gpio_pin) | 		     GPIO_CR_INT(gpio_pin));		GET_GPIO_CR_I(ah, gpio_pin, gpio_cr_i);	reg_val |= gpio_cr_i; 		OS_REG_WRITE(ah, gpio_offset + gpio_cr, reg_val);	OS_REG_READ(ah, gpio_offset + gpio_cr);		return AH_TRUE;}/* * Once configured for I/O - set output lines */HAL_BOOLar5312GpioSet(struct ath_hal *ah, u_int32_t gpio, u_int32_t val){	u_int32_t gpio_base, gpio_do, gpio_offset;	u_int32_t gpio_pin;	u_int32_t reg_val;	HALASSERT(gpio < AR_NUM_GPIO);		GET_GPIO_BASE(ah, gpio_base);	GET_GPIO_DO(ah, gpio_do);		gpio_offset = gpio_base - ((u_int32_t)ah->ah_sh);		       	if (ar5312_boardConfig)		gpio_pin = ar5312_boardConfig->sysLedGpio;	else		gpio_pin = gpio;		reg_val =  OS_REG_READ(ah, gpio_offset + gpio_do);		reg_val &= ~(1 << gpio_pin);	reg_val |= (val&1) << gpio_pin;		OS_REG_WRITE(ah, gpio_offset + gpio_do, reg_val);	OS_REG_READ(ah, gpio_offset + gpio_do);	return AH_TRUE;}/* * Once configured for I/O - get input lines */u_int32_tar5312GpioGet(struct ath_hal *ah, u_int32_t gpio){	u_int32_t gpio_base, gpio_di, gpio_offset;	u_int32_t gpio_pin;	u_int32_t reg_val;		HALASSERT(gpio < AR_NUM_GPIO);		GET_GPIO_BASE(ah, gpio_base);	GET_GPIO_DI(ah, gpio_di);		gpio_offset = gpio_base - ((u_int32_t)ah->ah_sh);		if (ar5312_boardConfig)		gpio_pin = ar5312_boardConfig->sysLedGpio;	else		gpio_pin = gpio;				if (gpio_pin < AR_NUM_GPIO) {		reg_val = OS_REG_READ(ah, gpio_offset + gpio_di);		reg_val = ((reg_val & AR_GPIOD_MASK) >> gpio_pin) & 0x1;		return reg_val;	} else  {		return 0xffffffff;	}}/* * Set the GPIO Interrupt */voidar5312GpioSetIntr(struct ath_hal *ah, u_int gpio, u_int32_t ilevel){	u_int32_t gpio_base, gpio_cr, gpio_offset;	u_int32_t gpio_pin;	u_int32_t gpio_cr_i;	u_int32_t reg_val;	HALASSERT(gpio < AR_NUM_GPIO);			GET_GPIO_BASE(ah, gpio_base);	GET_GPIO_CR(ah, gpio_cr);	gpio_offset = gpio_base - ((u_int32_t)ah->ah_sh);			/* XXX bounds check gpio */	if (ar5312_boardConfig)		gpio_pin = ar5312_boardConfig->sysLedGpio;	else		gpio_pin = gpio;			reg_val = OS_REG_READ(ah, gpio_offset+AR_GPIOCR);	/* XXX Divy. Check platform dependancy for these macros */	reg_val &= ~(GPIO_CR_M(gpio_pin) | 		     GPIO_CR_UART(gpio_pin) | 		     GPIO_CR_INT(gpio_pin));		     	GET_GPIO_CR_I(ah, gpio_pin, gpio_cr_i);	reg_val |= gpio_cr_i; 	reg_val |= GPIO_CR_INT(gpio_pin);	/* Don't need to change anything for low level interrupt. */	OS_REG_WRITE(ah, gpio_offset + gpio_cr, reg_val);	OS_REG_READ(ah, gpio_offset + gpio_cr);		/* Change the interrupt mask. */	(void) ar5212SetInterrupts(ah, AH5212(ah)->ah_maskReg | HAL_INT_GPIO);}#undef IS_FREEDOM#undef IS_COBRA#undef GET_GPIO_BASE#undef GET_GPIO_CR#undef GET_GPIO_CR_0#undef GET_GPIO_CR_I#undef GET_GPIO_D0#undef GET_GPIO_DI#endif /* AH_SUPPORT_AR5312 */

⌨️ 快捷键说明

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