Пример #1
0
int dm_gpio_set_dir_flags(struct gpio_desc *desc, ulong flags)
{
	struct udevice *dev = desc->dev;
	struct dm_gpio_ops *ops = gpio_get_ops(dev);
	int ret;

	ret = check_reserved(desc, "set_dir");
	if (ret)
		return ret;

	if (flags & GPIOD_IS_OUT) {
		int value = flags & GPIOD_IS_OUT_ACTIVE ? 1 : 0;

		if (flags & GPIOD_ACTIVE_LOW)
			value = !value;
		ret = ops->direction_output(dev, desc->offset, value);
	} else  if (flags & GPIOD_IS_IN) {
		ret = ops->direction_input(dev, desc->offset);
	}
	if (ret)
		return ret;
	/*
	 * Update desc->flags here, so that GPIO_ACTIVE_LOW is honoured in
	 * futures
	 */
	desc->flags = flags;

	return 0;
}
Пример #2
0
/* set GPIO port 'offset' as an input */
static int sb_gpio_direction_input(struct udevice *dev, unsigned offset)
{
	debug("%s: offset:%u\n", __func__, offset);

	if (check_reserved(dev, offset, __func__))
		return -1;

	return sandbox_gpio_set_direction(dev, offset, 0);
}
Пример #3
0
/* read GPIO IN value of port 'offset' */
static int sb_gpio_get_value(struct udevice *dev, unsigned offset)
{
	debug("%s: offset:%u\n", __func__, offset);

	if (check_reserved(dev, offset, __func__))
		return -1;

	return sandbox_gpio_get_value(dev, offset);
}
expr_rec process_literal(void)
{
	expr_rec t;
	check_reserved(token_buffer);

	/*Convert literal to a numeric representation and build semantic record*/
	t.kind = LITERALEXPR;
	(void) sscanf(token_buffer,"%d", & t.val);
	return t;
}
Пример #5
0
/* set GPIO port 'offset' as an output, with polarity 'value' */
static int sb_gpio_direction_output(struct udevice *dev, unsigned offset,
				    int value)
{
	debug("%s: offset:%u, value = %d\n", __func__, offset, value);

	if (check_reserved(dev, offset, __func__))
		return -1;

	return sandbox_gpio_set_direction(dev, offset, 1) |
		sandbox_gpio_set_value(dev, offset, value);
}
Пример #6
0
static int sb_gpio_free(struct udevice *dev, unsigned offset)
{
	struct gpio_state *state = dev_get_priv(dev);

	debug("%s: offset:%u\n", __func__, offset);

	if (check_reserved(dev, offset, __func__))
		return -1;

	state[offset].label = NULL;
	return set_gpio_flag(dev, offset, GPIOF_RESERVED, 0);
}
Пример #7
0
int dm_gpio_set_value(const struct gpio_desc *desc, int value)
{
	int ret;

	ret = check_reserved(desc, "set_value");
	if (ret)
		return ret;

	if (desc->flags & GPIOD_ACTIVE_LOW)
		value = !value;
	gpio_get_ops(desc->dev)->set_value(desc->dev, desc->offset, value);
	return 0;
}
Пример #8
0
int dm_gpio_get_value(const struct gpio_desc *desc)
{
	int value;
	int ret;

	ret = check_reserved(desc, "get_value");
	if (ret)
		return ret;

	value = gpio_get_ops(desc->dev)->get_value(desc->dev, desc->offset);

	return desc->flags & GPIOD_ACTIVE_LOW ? !value : value;
}
Пример #9
0
int dm_gpio_get_open_drain(struct gpio_desc *desc)
{
	struct dm_gpio_ops *ops = gpio_get_ops(desc->dev);
	int ret;

	ret = check_reserved(desc, "get_open_drain");
	if (ret)
		return ret;

	if (ops->set_open_drain)
		return ops->get_open_drain(desc->dev, desc->offset);
	else
		return -ENOSYS;
}
Пример #10
0
/**
 * gpio_direction_input() - [COMPAT] Set GPIO direction to input
 * gpio:	GPIO number
 *
 * This function implements the API that's compatible with current
 * GPIO API used in U-Boot. The request is forwarded to particular
 * GPIO driver. Returns 0 on success, negative value on error.
 */
int gpio_direction_input(unsigned gpio)
{
	struct gpio_desc desc;
	int ret;

	ret = gpio_to_device(gpio, &desc);
	if (ret)
		return ret;
	ret = check_reserved(&desc, "dir_input");
	if (ret)
		return ret;

	return gpio_get_ops(desc.dev)->direction_input(desc.dev, desc.offset);
}
Пример #11
0
/* write GPIO OUT value to port 'offset' */
static int sb_gpio_set_value(struct udevice *dev, unsigned offset, int value)
{
	debug("%s: offset:%u, value = %d\n", __func__, offset, value);

	if (check_reserved(dev, offset, __func__))
		return -1;

	if (!sandbox_gpio_get_direction(dev, offset)) {
		printf("sandbox_gpio: error: set_value on input gpio %u\n",
		       offset);
		return -1;
	}

	return sandbox_gpio_set_value(dev, offset, value);
}
Пример #12
0
int dm_gpio_set_open_drain(struct gpio_desc *desc, int value)
{
	struct dm_gpio_ops *ops = gpio_get_ops(desc->dev);
	int ret;

	ret = check_reserved(desc, "set_open_drain");
	if (ret)
		return ret;

	if (ops->set_open_drain)
		ret = ops->set_open_drain(desc->dev, desc->offset, value);
	else
		return 0; /* feature not supported -> ignore setting */

	return ret;
}
Пример #13
0
/*returns next token from source file*/
token scanner()
{
	char c;
	
	clear_buffer();
	
	while(TRUE)
	{
		c = getc(fin);
		
		if(c == EOF)
			return SCANEOF;
		
		else if(isspace(c))
		{
			if (c == '\n')
				line_num = line_num + 1;
		}
		
		else if (isalpha(c))
		{
			buffer_char (c);
			c = getc (fin);
			while (isalnum(c) || c == '_')
			{
				buffer_char(c);
				c = getc(fin);
			}
			ungetc(c, fin);
			return check_reserved();
		}
		
		else if (isdigit(c))
		{
			buffer_char(c);
			c = getc(fin);
			while(isdigit(c))
			{
				buffer_char(c);
				c = getc(fin);
			}
			ungetc(c,fin);
			return INTLITERAL;
		}
		
		else if (c == '(')
			return LPAREN;
		
		else if (c == ')')
			return RPAREN;
		else if (c == '{')
			return LCURL;
		
		else if (c == '}')
			return RCURL;
		else if (c == ',')
			return COMMA;
			
		else if (c == ';')
			return SEMICOLON;
			
		else if (c == '+')
			return PLUSOP;
		else if (c == '-')
			return MINUSOP;
		else if (c == '*')
			return MULTOP;	
		else if (c == '/')
			{
				c = getc(fin);
				if(c == '/')
				{
					do
						c = getc(fin);
					while (c != '\n');
					line_num = line_num + 1;
				}
				else
				{
					ungetc(c, fin);
					return DIVOP;
				}
			}
		else if (c == '=')
			{
				c = getc(fin);
				if(c == '=')
				{
					return EQUALS;
				}
				else
				{
					ungetc(c, fin);
					lexical_error();
				}
			}
		else if (c == '!')
			{
				c = getc(fin);
				if(c == '=')
				{
					return NOTEQ;
				}
				else
				{
					ungetc(c, fin);
					lexical_error();
				}
			}
		else if (c == '<')
			{
				c = getc(fin);
				if(c == '=')
				{
					return LESSEQ;
				}
				else
				{
					ungetc(c, fin);
					return LESS;
				}
			}
		else if (c == '>')
			{
				c = getc(fin);
				if(c == '=')
				{
					return GREATEQ;
				}
				else
				{
					ungetc(c, fin);
					return GREATER;
				}
			}
		else if (c == ':')
		{
			c = getc(fin);
			if(c == '=')
				return ASSIGNOP;
			else
			{
				ungetc(c, fin);
				lexical_error();
			}
		}
		
		else
			lexical_error();
	}
}
token scanner(void)
{
	int in_char,c;

	clear_buffer();
	if (feof(archivo))
		return SCANEOF;

	while (feof(archivo)==0){
		in_char=fgetc(archivo);
		if (isspace(in_char))
			continue; /*do nothing */
		else if (isalpha(in_char)){
			/*
				ID::=LETTER | ID LETTER
							| ID DIGIT
							| ID UNDERSCORE
			*/
			buffer_char(in_char);
			for (c= fgetc(archivo);isalnum(c)||c=='-';c=fgetc(archivo))
				buffer_char(c);
				//ungetc(c,stdin);
				return check_reserved();

		}else if (isdigit(in_char)){
			/*
				INTLITERAL :: = DIGIT |
								INTLITERAL DIGIT
			*/
			buffer_char(in_char);
			for (c=fgetc(archivo);isdigit(c);c=fgetc(archivo))
				buffer_char(c);
			//ungetc(c,stdin);
			return INTLITERAL;
		}else if (in_char== '(')
			return LPAREN;
		else if (in_char==')')
			return RPAREN;
		else if (in_char==';')
			return SEMICOLON ;
		else if (in_char==',')
			return COMMA ;
		else if (in_char=='+')
			return  PLUSOP;
		else if (in_char==':'){
			/*looking for ":="*/
			c=fgetc(archivo);
			if (c=='=')
				return ASSIGNOP ;
			else{
				//ungetc(c,stdin);
				lexical_error(in_char);
			}		
		}
	
		else if (in_char=='-'){
			/*is it --;comment start */
			c=fgetc(archivo);
			if (c=='-'){
				do 
					in_char=fgetc(archivo);
				while (in_char!='\n');

			} else{
				//ungetc(c,stdin);
				return MINUSOP;
			}
		}else 
			lexical_error(in_char);
		}
}