Linux GPIO控制

参考:https://developer.ridgerun.com/wiki/index.php/How_to_use_GPIO_signals


#!/bin/sh

show_usage()
{
    printf "\ngpio.sh <gpio pin number> [in|out [<value>]]\n"
}

if [ \( $# -eq 0 \) -o \( $# -gt 3 \) ] ; then
    show_usage
    printf "\n\nERROR: incorrect number of parameters\n"
    exit 255
fi

#doesn't hurt to export a gpio more than once
echo $1 > /sys/class/gpio/export

if [  $# -eq 1 ] ; then
   cat /sys/class/gpio/gpio$1/value
   exit 0
fi

if [ \( "$2" != "in" \) -a  \( "$2" != "out" \) ] ; then
    show_usage
    printf "\n\nERROR: second parameter must be 'in' or 'out'\n"
    exit 255
fi

echo $2 > /sys/class/gpio/gpio$1/direction

if [  $# -eq 2 ] ; then
   cat /sys/class/gpio/gpio$1/value
   exit 0
fi


VAL=$3

if [ $VAL -ne 0 ] ; then
    VAL=1
fi

echo $VAL > /sys/class/gpio/gpio$1/value

问题:1、GPIO value值设置无反应?

解:(1) Linux加打印查看值是否有设下去,打印出GPIO相关寄存器的值;

static int davinci_gpio_get(struct gpio_chip *chip, unsigned offset)
{
    int tmp;
	struct davinci_gpio *d = container_of(chip, struct davinci_gpio, chip);
	struct gpio_controller *__iomem g = d->regs;

	/* return (1 << offset) & __raw_readl(&g->in_data); */
    tmp = (1 << offset) & __raw_readl(&g->in_data);
    printk("##### GPIO_GET val[0x%08x] ####\n", tmp);
    printk("########set_data[0x%08x], out_data[0x%08x], dir[0x%08x], in_data[0x%08x], clr_data[0x%08x]####\n", 
           g->set_data,
           g->out_data,
           g->dir,
           g->in_data,
           g->clr_data
           );
    return tmp;
}

/*
 * Assuming the pin is muxed as a gpio output, set its output value.
 */
static void
davinci_gpio_set(struct gpio_chip *chip, unsigned offset, int value)
{
	struct davinci_gpio *d = container_of(chip, struct davinci_gpio, chip);
	struct gpio_controller *__iomem g = d->regs;

    printk("########GPIO_SET Val[0x%08x] ####\n", value);
    printk("########set_data[0x%08x], out_data[0x%08x], dir[0x%08x], in_data[0x%08x], clr_data[0x%08x]####\n", 
           g->set_data,
           g->out_data,
           g->dir,
           g->in_data,
           g->clr_data
           );
	__raw_writel((1 << offset), value ? &g->set_data : &g->clr_data);
}


(2) 对应的GPIO PIN MUX是否设置正确;

(3) GPIO方向是否设置正确;



GPIO 参考:

DM365 GPIO
http://blog.163.com/laorenyuhai126@126/blog/static/193507792011328213983/

sys接口概述
http://processors.wiki.ti.com/index.php/Linux_PSP_GPIO_Driver_Guide
https://blackfin.uclinux.org/doku.php?id=linux-kernel:drivers:gpio-sysfs


你可能感兴趣的:(linux)