转发自我的博客:
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 0x01c20800struct 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://forum.cubietech.com/forum.php?mod=viewthread&tid=1791&extra=page%3D1