极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 8525|回复: 0

cubieboard的uboot的GPIO的驱动详解

[复制链接]
发表于 2014-7-28 17:42:43 | 显示全部楼层 |阅读模式
转发自我的博客:http://blog.sina.com.cn/s/blog_b5020b670101ft49.html

uboot的GPIO相当简单,其就是三层结构。分别为: 1、顶层接口层,其只定义了通用的接口,并不负责实现,实现是我们具体根据具体的芯片来实现的。
2、中间接口实现层,用具体的板子的GPIO来实现顶层的接口
3、 底层具体芯片GPIO的实现层 。

现在具体分析:
顶层接口层

int gpio_request(unsigned gpio, const char *label); //申请GPIO资源
int gpio_free(unsigned gpio); //释放申请的GPIO资源
int gpio_direction_input(unsigned gpio); //设置GPIO为输入模式
int gpio_direction_output(unsigned gpio, int value); //设置GPIO为输出模式
int gpio_get_value(unsigned gpio); //得到GPIO的值
int gpio_set_value(unsigned gpio, int value);//设置GPIO的值
说明:unsigned gpio为逻辑号,虽然和实际的物理GPIO地址有一定的关系,但并不是实际的物理GPIO地址。

中间接口实现层:
用具体的芯片的GPIO来实现其顶层接口

int gpio_request(unsigned gpio, const char *label)
{
return 0;
}

int gpio_free(unsigned gpio)
{
return 0;
}

int gpio_direction_input(unsigned gpio)
{
sunxi_gpio_set_cfgpin(gpio, SUNXI_GPIO_INPUT);

return sunxi_gpio_input(gpio);
}

int gpio_direction_output(unsigned gpio, int value)
{
sunxi_gpio_set_cfgpin(gpio, SUNXI_GPIO_OUTPUT);

return sunxi_gpio_output(gpio, value);
}

int gpio_get_value(unsigned gpio)
{
return sunxi_gpio_input(gpio);
}

int gpio_set_value(unsigned gpio, int value)
{
return sunxi_gpio_output(gpio, value);
}

底层具体芯片GPIO的实现层:
在实现的时候,其用了一个小技巧,其目的是把GPIO的物理寄存器放到结构体里面来,从而把物理的地址操作转换为数据结构的操作。
其实现如下:
把SUNXI_PIO_BASE 强制转换为sunxi_gpio_reg *指针来实现。
#define SUNXI_PIO_BASE 0x01c20800



struct sunxi_gpio {
u32 cfg[4];
u32 dat;
u32 drv[2];
u32 pull[2];
};


struct sunxi_gpio_int {
u32 cfg[3];
u32 ctl;
u32 sta;
u32 deb;
};

struct sunxi_gpio_reg {
struct sunxi_gpio gpio_bank[9];
u8 res[0xbc];
struct sunxi_gpio_int gpio_int;
};


我们实现具体的芯片的GPIO的操作的思想是:
使用逻辑符号unsigned gpio,通过SUNXI_PIO_BASE 强制转换为sunxi_gpio_reg *指针的指针来操作相关寄存器

但是逻辑符号unsigned gpio要通过SUNXI_PIO_BASE 强制转换为sunxi_gpio_reg *指针的指针来操作相关寄存器,必须要解决一个问题,即如何在众多的寄存器的中,找到指定的那个寄存器,并且在该寄存器上找到指定的那些相关位。
即gpio---->bank------>bank中的offset

这个映射关系和具体的芯片有关。
这里只讨论全志的a10芯片。




后面的写不了了,想看完整版的请看我的博客:http://blog.sina.com.cn/s/blog_b5020b670101ft49.html


原文作者:毅哥
原文链接:http://forum.cubietech.com/forum ... &extra=page%3D1

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-20 02:40 , Processed in 0.043165 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表