odroidXu4 GPIO

</pre>             <span style="font-size:18px;">Odroid-XU4/3<span style="font-family:宋体;">提供</span><span style="font-family:Calibri;">1</span><span style="font-family:宋体;">个</span><span style="font-family:Calibri;">30</span><span style="font-family:宋体;">针的双排扩展头“</span><span style="font-family:Calibri;">CON10</span><span style="font-family:宋体;">”。下面是对这些扩展引脚的说明。在扩展报头的所有信号都只是</span><span style="font-family:Calibri;">PWRON</span><span style="font-family:宋体;">信号</span><span style="font-family:Calibri;">1.8V</span></span><span style="font-family:宋体;"><span style="font-size:18px;">。 <img src="https://img-blog.csdn.net/20160515212753850?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="" /></span></span></p><p><span style="font-family:宋体;"><span style="font-size:18px;"></span></span></p><p><span style="font-size:18px;">    如上图,扩展的引脚功能分别有<span style="font-family:Calibri;">ADC</span><span style="font-family:宋体;">、</span><span style="font-family:Calibri;">UART</span><span style="font-family:宋体;">、</span><span style="font-family:Calibri;">SPI</span><span style="font-family:宋体;">、</span><span style="font-family:Calibri;">I2C</span><span style="font-family:宋体;">、</span><span style="font-family:Calibri;">GPIO</span><span style="font-family:宋体;">,每个</span><span style="font-family:Calibri;">gpio</span><span style="font-family:宋体;">都会有相应的扩展号在内核中标识,所以对</span><span style="font-family:Calibri;">GPIO </span><span style="font-family:宋体;">的自定义设置都是通过它这个扩展号去标识。</span></span></p><p><span style="font-family:宋体;"><span style="font-size:18px;">    </span></span></p><p><span style="font-size:18px;">     对于<span style="font-family:Calibri;">GPIO</span><span style="font-family:宋体;">驱动的开发在官网</span><span style="font-family:Calibri;">WIKI</span><span style="font-family:宋体;">中只介绍了上图中扩展引脚和扩展号,经过笔者不断地搜素寻找,终于在它的内核里面找到相应的</span><span style="font-family:Calibri;">GPIO</span><span style="font-family:宋体;">驱动。在</span><span style="font-family:Calibri;">ioboard-keyled.c</span><span style="font-family:宋体;">中:</span></span><pre name="code" class="html">// GPIO Export Number define
#define GPX2_5_EXPORT_NUM   29
#define GPX2_6_EXPORT_NUM   30
#define GPX1_6_EXPORT_NUM   22
#define GPX1_2_EXPORT_NUM   18
#define GPX2_7_EXPORT_NUM   31
#define GPX2_4_EXPORT_NUM   28
#define GPX1_3_EXPORT_NUM   19
#define GPB3_2_EXPORT_NUM   209
#define GPX2_0_EXPORT_NUM   24

以上是它对GPIO引脚扩展号的声明。

static struct {
	int		gpio_index;		// Control Index
	int 	gpio;			// GPIO Number
	char	*name;			// GPIO Name == sysfs attr name (must)
	bool 	output;			// 1 = Output, 0 = Input
	int 	value;			// Default Value(only for output)
	int		pud;			// Pull up/down register setting : S3C_GPIO_PULL_DOWN, UP, NONE
} sControlGpios[] = {
	{	IOBOARD_SW1,  	GPX2_5_EXPORT_NUM,  "sw1",	0,	0,	S3C_GPIO_PULL_NONE	},
	{	IOBOARD_SW2,  	GPX2_6_EXPORT_NUM,  "sw2",	0,	0,	S3C_GPIO_PULL_NONE	},
	{	IOBOARD_SW3,  	GPX1_6_EXPORT_NUM,  "sw3",	0,	0,	S3C_GPIO_PULL_NONE	},
	{	IOBOARD_SW4,  	GPX1_2_EXPORT_NUM,  "sw4",	0,	0,	S3C_GPIO_PULL_NONE	},
	{	IOBOARD_LED1,  	GPX2_7_EXPORT_NUM,  "led1",	1,	0,	S3C_GPIO_PULL_NONE	},
	{	IOBOARD_LED2,  	GPX2_4_EXPORT_NUM,  "led2",	1,	0,	S3C_GPIO_PULL_NONE	},
	{	IOBOARD_LED3,  	GPX1_3_EXPORT_NUM,  "led3",	1,	0,	S3C_GPIO_PULL_NONE	},
	{	IOBOARD_LED4,  	GPB3_2_EXPORT_NUM,  "led4",	1,	0,	S3C_GPIO_PULL_NONE	},
	{	IOBOARD_LED5,  	GPX2_0_EXPORT_NUM,  "led5",	1,	1,	S3C_GPIO_PULL_NONE	},
};

这是GPIO的结构体声明gpio_index是一个枚举的标识,gpio是该GPIO对应的扩展号,name及是一个名字,output是对该引脚设置输入还是输出, value是设置输出的情况下的值,0还是1

    此外该文件代码里的探测函数ioboard_keyled_probe对引脚作了相应的初始化设置,主体代码如下:

// Control GPIO Init
	for (i = 0; i < ARRAY_SIZE(sControlGpios); i++) {

		if(sControlGpios[i].gpio)	{
			if(gpio_request(sControlGpios[i].gpio, sControlGpios[i].name))	{
				printk("%s : %s gpio reqest err!\n", __FUNCTION__, sControlGpios[i].name);
			}
			else	{
				if(sControlGpios[i].output)		gpio_direction_output	(sControlGpios[i].gpio, sControlGpios[i].value);
				else							gpio_direction_input	(sControlGpios[i].gpio);
	
				s3c_gpio_setpull		(sControlGpios[i].gpio, sControlGpios[i].pud);
			}
		}
	}

代码中还有设置gpio的函数,都很简单,就不做详细介绍,代码如下所示:

static 	ssize_t set_gpio		(struct device *dev, struct device_attribute *attr, const char *buf, size_t count)
{
    unsigned int	val, i;

    if(!(sscanf(buf, "%d\n", &val))) 	return	-EINVAL;

	for (i = 0; i < ARRAY_SIZE(sControlGpios); i++) {
		if(sControlGpios[i].gpio)	{
			if(!strcmp(sControlGpios[i].name, attr->attr.name))	{
				if(sControlGpios[i].output)
    				gpio_set_value(sControlGpios[i].gpio, ((val != 0) ? 1 : 0));
				else
					printk("This GPIO Configuration is INPUT!!\n");
			    return count;
			}
		}
	}

	printk("%s[%d] : undefined gpio!\n", __func__,__LINE__);
    return 	count;
}

通过以上内核的代码,我们就可以模仿的写我们自己的GPIO驱动了,我们只需要知道我们所要设置的GPIO的扩展号即可,不需要对设备树等做什么更改。




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值