学习嵌入式-迅为4412开发板的gpio是怎么操作的?

author author     2022-08-27     808

关键词:

Exynos4412所有的GPIO都有固定的地址,为了方便操作这些GPIO,Linux内核在gpio-exynos4.h里面定义了一些GPIO的宏

详情了解:http://topeetboard.com 更多了解:https://arm-board.taobao.com
例如: 
#define EXYNOS4_GPA0(_nr) (EXYNOS4_GPIO_A0_START + (_nr)) 
#define EXYNOS4_GPA1(_nr) (EXYNOS4_GPIO_A1_START + (_nr)) 
#define EXYNOS4_GPB(_nr) (EXYNOS4_GPIO_B_START + (_nr)) 
..................................... 
#define EXYNOS4_GPY5(_nr) (EXYNOS4_GPIO_Y5_START + (_nr)) 
#define EXYNOS4_GPY6(_nr) (EXYNOS4_GPIO_Y6_START + (_nr)) 
#define EXYNOS4_GPZ(_nr) (EXYNOS4_GPIO_Z_START + (_nr)) 
这些宏就是把每个GPIO的地址做了一下封装,它的好处就是方便我们使用并且根据宏的名字就能直观的知道是在操作哪个GPIO。 
Linux内核中关于GPIO的驱动在driver/gpio/gpio-exynos4.c文件里面,在这个文件中GPIO驱动初始化入口函数是exynos4_gpiolib_init,因为这个文件同时也支持4210的GPIO,所以开始先初始化了一些通用的GPIO(4412和4210都有的GPIO),代码如下: 
chip = exynos4_gpio_common_4bit; 
nr_chips = ARRAY_SIZE(exynos4_gpio_common_4bit); 
for (i = 0; i < nr_chips; i++, chip++) { 
if (chip->config == NULL) 
chip->config = &gpio_cfg; 
if (chip->base == NULL) 
pr_err("No allocation of base address for [common gpio]"); 

samsung_gpiolib_add_4bit_chips(exynos4_gpio_common_4bit, nr_chips); 
变量exynos4_gpio_common_4bit是一个数组,定义了一些通用的GPIO,nr_chips是记录的exynos4_gpio_common_4bit数组里面元素个数。 
首先使用for循环遍历exynos4_gpio_common_4bit所有的元素,为每个元素的config结构赋值: 
if (chip->config == NULL) 
chip->config = &gpio_cfg; 
gpio_cfg是类型为s3c_gpio_cfg的结构体,这个结构体的定义如下: 
struct s3c_gpio_cfg { 
unsigned int cfg_eint; 
s3c_gpio_pull_t (*get_pull)(struct s3c_gpio_chip *chip, unsigned offs); 
int (*set_pull)(struct s3c_gpio_chip *chip, unsigned offs, 
s3c_gpio_pull_t pull); 
unsigned (*get_config)(struct s3c_gpio_chip *chip, unsigned offs); 
int (*set_config)(struct s3c_gpio_chip *chip, unsigned offs, 
unsigned config); 
}; 
通过上面的代码我们可以看到这个结构体里主要是一些函数指针,get_pull是获取GPIO的上拉状态,set_pull是设置GPIO上拉或下拉的,set_config是设置GPIO的工作模式,例如:输出/输入/其他功能。下面我们来看看gpio_cfg变量的定义,如下: 
static struct s3c_gpio_cfg gpio_cfg = { 
.set_config = s3c_gpio_setcfg_s3c64xx_4bit, 
.set_pull = s3c_gpio_setpull_exynos4, 
.get_pull = s3c_gpio_getpull_exynos4, 
}; 
通过上面的代码,可以看到分别对gpio_cfg结构的三个函数指针赋值,这三个函数的定义是在gpio-config.c里面实现的,这个文件在内核源码arch/arm/plat-samsung目录下,这三个函数的作用就是根据传进来的参数,配置GPIO相应的寄存器,从而实现对GPIO的操作。 
然后我们回到gpio-exynos4.c,接着看下面的代码,完成了exynos4_gpio_common_4bit中每个元素的config结构赋值后,接着会调用函数samsung_gpiolib_add_4bit_chips(exynos4_gpio_common_4bit, 
nr_chips)来向系统注册GPIO结构体。代码如下: 
void __init samsung_gpiolib_add_4bit_chips(struct s3c_gpio_chip *chip, 
int nr_chips) 

for (; nr_chips > 0; nr_chips--, chip++) { 
samsung_gpiolib_add_4bit(chip); 
s3c_gpiolib_add(chip); 


上面的代码主要有两个函数组成分别是samsung_gpiolib_add_4bit(chip)和s3c_gpiolib_add(chip),首先我们来看下samsung_gpiolib_add_4bit(chip)函数的实现: 
void __init samsung_gpiolib_add_4bit(struct s3c_gpio_chip *chip) 

chip->chip.direction_input = samsung_gpiolib_4bit_input; 
chip->chip.direction_output = samsung_gpiolib_4bit_output; 
chip->pm = __gpio_pm(&s3c_gpio_pm_4bit); 

这个函数也是为函数指针赋值,direction_input是设置GPIO为输入模式,direction_output是设置GPIO为输出。 
s3c_gpiolib_add(chip)函数主要作用是给一些函数指针赋值,然后根据传进来的参数把对应的GPIO的信息保存到gpio_desc结构里,gpio_desc是内核里面定义的一个全局变量,用来保存每个GPIO的信息。至此GPIO的驱动初始化就完成了,其他它主要完成的功能就是为每个GPIO的结构体里面的函数指针赋值,最后把每个GPIO结构信息保存到全局变量gpio_desc里面。
上面已经完成了一些通用的GPIO驱动的初始化,我们在回到gpio-exynos4.c,下面是根据CPU的型号初始化CPU特定的GPIO了,代码如下: 
/* Only 4210 GPIO part */ 
if (soc_is_exynos4210()) { 
chip = exynos4210_gpio_4bit; 
nr_chips = ARRAY_SIZE(exynos4210_gpio_4bit); 
for (i = 0; i < nr_chips; i++, chip++) { 
if (chip->config == NULL) 
chip->config = &gpio_cfg; 
if (chip->base == NULL) 
pr_err("No allocation of base address [4210 gpio]"); 

samsung_gpiolib_add_4bit_chips(exynos4210_gpio_4bit, nr_chips); 
} else { 
/* Only 4212/4412 GPIO part */ 
chip = exynos4212_gpio_4bit; 
nr_chips = ARRAY_SIZE(exynos4212_gpio_4bit); 
for (i = 0; i < nr_chips; i++, chip++) { 
if (chip->config == NULL) 
chip->config = &gpio_cfg; 
if (chip->base == NULL) 
pr_err("No allocation of base address [4212 gpio]"); 

samsung_gpiolib_add_4bit_chips(exynos4212_gpio_4bit, nr_chips); 

通过看上面的代码,初始化过程与前面介绍的初始化通用GPIO原理是一样的,这里我们不在详细介绍。对所有GPIO的初始化完成以后内核中的其他驱动模块就可以方便的使用我们注册到gpio_desc里面的GPIO了。内核提供了几个全局函数来操作这些GPIO: 
int gpio_request(unsigned gpio, const char *label) 
void gpio_free(unsigned gpio) 
int s3c_gpio_setpull(unsigned int pin, s3c_gpio_pull_t pull) 
int s3c_gpio_cfgpin(unsigned int pin, unsigned int config) 
int gpio_direction_input(unsigned gpio) 
int gpio_direction_output(unsigned gpio, int value) 
gpio_request函数是申请GPIO操作,根据传递进来的参数gpio,会去全局变量gpio_desc里面找到对应的GPIO结构,判断desc的标志位flag有没有被设置FLAG_REQUESTED,如果有设置说明其他地方在使用这个GPIO,程序返回-EBUSY错误,如果没有设置就设置flags的标记为FLAG_REQUESTED。 
gpio_free函数是释放GPIO操作,根据传递进来的参数,在gpio_desc全局变量找到对应的GPIO结构,清除掉desc的flag标志变量的FLAG_REQUESTED位。 
s3c_gpio_setpull函数是设置GPIO的上拉或下拉的,变量pull的取值范围如下定义: 
#define S3C_GPIO_PULL_NONE ((__force s3c_gpio_pull_t)0x00) 
#define S3C_GPIO_PULL_DOWN ((__force s3c_gpio_pull_t)0x01) 
#define S3C_GPIO_PULL_UP ((__force s3c_gpio_pull_t)0x02) 
S3C_GPIO_PULL_NONE是悬空 
S3C_GPIO_PULL_DOWN是下拉 
S3C_GPIO_PULL_UP是上拉 
s3c_gpio_cfgpin函数是设置GPIO的功能:输入/输出/其他功能,第二个参数config取值范围如下: 
#define S3C_GPIO_INPUT (S3C_GPIO_SPECIAL(0)) 
#define S3C_GPIO_OUTPUT (S3C_GPIO_SPECIAL(1)) 
#define S3C_GPIO_SFN(x) (S3C_GPIO_SPECIAL(x)) 
S3C_GPIO_INPUT是输入模式,S3C_GPIO_OUTPUT是输出模式,S3C_GPIO_SFN(x)是其他模式,例如中断模式等。 
gpio_direction_input函数设置GPIO是输入功能。 
gpio_direction_output设置GPIO输出,第二个参数value取值0或1,0代表输出低电平,1代表输出高电平。 
下面我们来看几个GPIO操作的例子: 
if (gpio_request(EXYNOS4_GPX3(3), "MPU6050 INT")) 
printk(KERN_WARNING "MPU6050 INT(GPX3.3) Port request error!!! "); 
else{ 
s3c_gpio_setpull(EXYNOS4_GPX3(3), S3C_GPIO_PULL_NONE); 
s3c_gpio_cfgpin(EXYNOS4_GPX3(3), S3C_GPIO_SFN(0)); 
gpio_direction_input(EXYNOS4_GPX3(3)); 
gpio_free(EXYNOS4_GPX3(3)); 

上面的代码是设置GPIO引脚GPX3_3为输入模式,悬空。 
err = gpio_request_one(EXYNOS4_GPX0(0), GPIOF_IN, "mcp251x_INT"); 
if (err) { 
printk(KERN_ERR "failed to request mcp251x_INT "); 
return -1; 

s3c_gpio_cfgpin(EXYNOS4_GPX0(0), S3C_GPIO_SFN(0xf)); 
s3c_gpio_setpull(EXYNOS4_GPX0(0), S3C_GPIO_PULL_NONE); 
gpio_free(EXYNOS4_GPX0(0)); 
上面的代码设置GPIO引脚GPX0_0为中断模式。 
if(gpio_request(EXYNOS4_GPK1(0), "GPK1_0")) 

printk(KERN_ERR "failed to request GPK1_0 for " 
"USI control "); 
return err; 

gpio_direction_output(EXYNOS4_GPK1(0), 1); 
s3c_gpio_cfgpin(EXYNOS4_GPK1(0), S3C_GPIO_OUTPUT); 
gpio_free(EXYNOS4_GPK1(0)); 
上面的代码设置GPIO引脚GPK1_0为输出模式,并且输出高电平。 
iTOP-4412的GPIO驱动就介绍到这里,大家有兴趣的话可以去内核里面详细的查看一下整个驱动的详细实现。
 
技术分享
 
技术分享







































































































































[学习开发板怎么选]迅为4412开发板帮你入门嵌入式

  丰富选配模块 入门视频教程(购买后提供完整版高清教程)部分视频观看地址:【视频教程】iTOP-4412开发板之学习方法--致初学者http://v.youku.com/v_show/id_XNzQ5MDA4NzM2.html【视频教程】三星Exynos4412处理器开发要点http://v.y... 查看详情

嵌入式开发板迅为4412开发板初学arm开发板首选!提供教学视频!

...码实例和视频,只需要你有C语言基础,就可以快速学习嵌入式高端技术开发!搭载三星Exynos四核处理器,配备1GB内存,4GB固态硬盘EMMC存储,兼具快速读取与超大容量,纵使海量思考也能及时处理。详情了解: http://topeetboard.... 查看详情

学习嵌入式4412开发板-手把手配套视频_2000人群组在线交流

物联网学习开发板_迅为4412开发板_视频教程从入门到精通共享海量学习资料、学不会才是奇迹一.视频教程:免费视频教程(迅为一线研发工程师录制-不断更新)第一部分迅为电子开发板入门视频(数量:53节)第二部分iTOP-4412开发板... 查看详情

嵌入式开发板丨arm开发板学习必备资料-迅为电子

摘要:ARM开发板迅为三星Exynos嵌入式开发平台超强GPS模块iTOP-Exynos4412开发板采用Exynos4412的主芯片,具有更高的主频和更丰富外设,配置2GB双通道DDR3的内存及16GB存储,具有稳定性强、可靠性高,能适用于对性能和处理能力有更高... 查看详情

4418开发板和4412开发板的区别在哪里

...参考技术A俩者的区别最直接的说,4412开发板更接触于对嵌入式有兴趣的新手,4418比较实用于产品研发。至于说芯片停产的问题,我觉得可以不关注。这俩者并没有大的竞争。个人推荐学习板4412开发板 参考技术B都是三星四核cor... 查看详情

嵌入式开发板学习新手在itop4412开发板无界面linux操作系统使用can模块遇到问题,求解决方法?

最近想使用迅为的iTOP4412精英版开发板做关于CAN总线相关的程序设计。遇到的问题是,将购买的CAN模块连接到开发板上时,在系统界面使用ifconfig-a命令,没有发现can的信息。看起来系统没有识别这个模块。想请教下大神们,这个... 查看详情

[学习嵌入式开发板]itop-4412实现nfs网络文件系统

本文转自迅为:http://www.topeetboard.com 学习平台:iTOP-4412开发板 本文讲解如何在 iTOP-4412 开发板上实现 NFS 网络文件系统。我们使用的软硬件环境是:一台 PC,上面运行虚拟机 Ubuntu,iTOP-4412 开发... 查看详情

嵌入式开发-迅为4412开发板qt鼠标和触摸的问题解决方案

迅为4412开发板-QT鼠标和触摸的问题解决方案:一. 背景在使用迅为提供的QT4.7的时候,鼠标可以正常使用,有触摸但是触摸会出现问题。尤其是在左右滑动qt界面的时候,总是会出现往左滑动,画面急速往右走,然而往右滑动... 查看详情

嵌入式开发板迅为4412开发板搭建qt应用程序开发环境

集成开发软件qtcreator-3.2.2下载官网下载选择GPL/LGPL协议选择离线下载选择LinuxHost这里需要注意的是,如果只下载“QtCreator”,是不带运行环境的。迅为电子网盘下载“iTOP-4412开发板搭建编译环境所需要的工具包以及补丁包”“07-Q... 查看详情

迅为的4412开发板怎么样?请实际使用过的同学给个建议吧

...然友善之臂、友坚的也不错,但是它们并不适合初学者来学习,因为资料很少,买回来只能当个平板电脑使。所以要是想学习的话就选讯为的吧。参考技术A很棒的,技术有优势,资料很全,售后也给力 参考技术B讯为友善的都用... 查看详情

嵌入式开发首选迅为i.mx6开发板高稳定工业级设计

北京迅为电子有限公司专业提供ARM开发板,嵌入式开发板,三星4412开发板,三星4418开发板,八核6818开发板,飞思卡尔I.MX6开发板,三星4412核心板,exynos4412开发板及面向客户指定完整的解决方案服务迅为-i.MX6开发板是采用FreescaleCortex-A9四... 查看详情

迅为4412开发板学习之win8下基础软件的安装和学习

 平台:迅为4412开发板详情了解:http://topeetboard.com 更多了解:https://arm-board.taobao.com  一、超级终端的安装和使用1 关闭 win8 的自动更新如果用户使用的 PC 机没有串口,就需要用到 USB转串口... 查看详情

迅为-arm嵌入式开发一体化工业9.7寸屏幕平板式智能触控屏

...p;FPC(也可以通过类似HDMI线方式连接)   用于嵌入式开发平台4412开发板:    查看详情

itop-4412开发板-串口转接小板的使用文档

本文档介绍如何使用迅为iTOP-4412精英版如何使用串口转接板,串口小板如下所示。和串口转接板模块相关的资料如下:“iTOP-4412-Android-串口测试文档(升级版)_V2.X.zip”“iTOP-4412-QtE-串口uart测试程序_v1.X.rar”“iTOP-4412-驱动-关闭... 查看详情

qt210开发板怎么样?

...;并不适合个人特别是初学者学习使用。 参考技术C博航嵌入式有卖友善的tiny210mini210s用的人多 参考技术D看个人所用吧,我个人认为友善的TINY210也不错价格也便宜 查看详情

itop-4412开发板-嵌入式平台开机测试

iTOP-4412平台硬件的连接1.核心板和底板的连接迅为iTOP-4412开发板采用工业级进口板对板连接器,拔插方便稳定可靠,如下图所示。650)this.width=650;"id="aimg_Z9bwE"class="zoom"width="600"src="http://www.eeboard.com/bbs/data/attachment/forum/201606/28/151457eq 查看详情

学习嵌入式stm32有必要吗,直接用arm开发板怎么样?

...设计有10多年的经验了,我来告诉你的困惑,你如果喜欢嵌入式设计的话你就学习STM32你如果喜欢处理器运算方面的话你就学习ARM11类的,其实你是想问,你应该学习微控制器还是微处理器。stm32是微控制器ARM11还有那些所谓的可... 查看详情

迅为itop-开发板-驱动-can和rfid配置

在迅为开发板中,在4412,4418以及6818中,有的开发板默认配置RFID,有的默认配置CAN驱动(IMX6默认都配置)。本文档介绍如何配置CAN和RFID的驱动。截图界面使用的是4418开发板的menuconfig界面,4412和6818的配置方法和路径也是一模一... 查看详情