文档章节

RK3288开发板PopMetal上的GPIO驱动实例

穿
 穿prada的008
发布于 2015/08/03 18:07
字数 1117
阅读 1861
收藏 0

楼主在这边给大家介绍下如何使用PopMetal的GPIO。先讲过程,再讲原理吧,

该驱动需要涉及到的知识点:1,DTS设备树的作用,2,platform虚拟总线驱动的编写。

第一步,添加DTS节点

在/kernel/arch/arm/boot/dts/rockchip.dts下添加如下内容。

下图rockchip-leds-gpio这部分的内容,修改保存,

  

第二步,在kernel/drivers下创建个LED文件夹,然后加入如下几个文件驱动文件leds.c,Makefile和Kconfig.如下图

源码:

/***********************************************************************************

* driver for led0

**********************************************************************************/

#include <linux/miscdevice.h>

#include <linux/input.h>

#include <linux/clk.h>

#include <linux/delay.h>

#include <asm/io.h>

#include <asm/uaccess.h>

#include <linux/module.h>

#include <linux/init.h>

#include <linux/of_gpio.h>

#include <linux/gpio.h>

#include <linux/of_platform.h>

static int leds_probe(struct platform_device *pdev)

{  int ret =-1

int i 

int led

enum of_gpio_flags flag

struct device_node *led_node = pdev->dev.of_node

led = of_get_named_gpio_flags(led_node,"led-gpios",0,&flag)

printk("get gpio id successful\n")

if(!gpio_is_valid(led)){ 

  printk("invalid led-gpios: %d\n",led) 

  return -1 

}

if(gpio_request(led,"led_gpio")){

printk("led gpio request failed!\n")

return ret 

  gpio_direction_output(led,1)

for(i=0 i < 10 i++)

{

  gpio_set_value(led,1)

  mdelay(500)

  gpio_set_value(led,0)

  mdelay(500)

  printk("it's %d\n",i)

}

return 0


}

static int leds_remove(struct platform_device *pdev)

{

        return 0

}


static struct of_device_id leds_of_match[] = {

        { .compatible = "rockchip-leds-gpio" },

        { }

}

MODULE_DEVICE_TABLE(of, leds_of_match)

static struct platform_driver leds_driver = {

        .driver         = {

                .name           = "leds-drivers",

                .owner          = THIS_MODULE,

                .of_match_table = of_match_ptr(leds_of_match),

        },

        .probe          = leds_probe,

        .remove         = leds_remove,

};


/*static int __init leds_init(void)

{

    printk(KERN_INFO "Enter %s\n", __FUNCTION__)

    return platform_driver_register(&leds_driver)

    return 0

}


static void __exit leds_exit(void)

{

platform_driver_unregister(&leds_driver)

    printk("close leds\n")

}*/module_platform_driver(leds_driver)

module_platform_driver(leds_driver)


MODULE_DESCRIPTION("leds Driver")

MODULE_LICENSE("GPL")

MODULE_ALIAS("platform:leds-drivers")

/***********************************************************************************

* driver for led0

**********************************************************************************/

Kconfig:

  

Makefile:

  

第三步,修改drivers下的Kconfig和Makefile,修改内容如下

在Kconfig末尾添加:source “drivers/led/Kconfig”

在Makefile末尾添加: obj-$(CONFIG_LED0_TEST)  +=led/

第四步,编译新的kernel与resource并烧写进板子里,

然后DTS中定义的引脚就会按照驱动的内容,进行高低电平的变化。

需要源码可下载:  led.zip

好了,现在我们来介绍下原理,首先是DTS,和另一块开发板PX2不一样,PopMetal并没有写相应的mach-*****文件,而是通过设备树的方式获取引脚的编号,设备树的引入可减少了内核为支持新硬件而需要的改变,提高代码重用,加速了Linux支持包的开发,使得单个内核镜像能支持多个系统。简单来说,它就是给内核的一个参数,这些参数会启动相应的驱动,这样参数不一样,内核源码支持的系统就不一样。

而在这里我们要清楚的是我们要用相应的引脚就必须创建相应的节点,并且赋上一些参数。

而驱动又是怎么识别到这些参数的呢?这里我们先讲讲platform虚拟总线驱动,这个总线跟IIC,SPI等总线不一样,是由内核虚拟出来的,我们就以上面的代码为例,给大家讲讲他是怎么工作的,

首先这个驱动的核心是:

static struct platform_driver leds_driver = {

        .driver         = {

                .name           = "leds-drivers",//驱动名

                .owner          = THIS_MODULE,

                .of_match_table = of_match_ptr(leds_of_match),//匹配设备树

        },

        .probe          = leds_probe,//探测函数,检测硬件上是否存在设备,检测到便执行

        .remove         = leds_remove,//移除函数,硬件移除时,执行

};

在这里我们只给部分内容赋予了值,本身这个结构体还有别的子项,需要了解的同学可以在这编博客看看:http://blog.sina.com.cn/s/blog_53c733350100zdav.html

在这个结构体中,我们就是通过.of_match_table = of_match_ptr(leds_of_match),来匹配设备树上的参数,而即系统会根据设备树种定义的compatible参数比较驱动中的leds_of_match中定义的 .compatible 参数,

来为参数找到相应的驱动,而定义的probe和remove函数则是对探测到设备做出反应,及移除设备时做出反应,而module_platform_driver(leds_driver)是将驱动挂到总线上去,

现在我们看看probe是怎么获取到GPIO的值的,其中它的主要函数如下:

struct device_node *led_node = pdev->dev.of_node

led = of_get_named_gpio_flags(led_node,"led-gpios",0,&flag)

功能就是将led_node节点上的led-gpios的值取下,而我们之前在rockchip.dts中队led-gpios的定义如下:

led-gpios=&GPIO6 GPIO_A6 GPIO_ACTIVE_LOW,意思就是选择引脚gpio6_a6,且该引脚低电平有效。

上面这句赋值便已经将引脚的编号赋给了led-gpios,故接下来我们就可以用GPIO_requset_one GPIO_set_value,等函数去操作这个GPIO了,像gpio_set_value(led-gpios,1)将该引脚设置为高电平。

当然这些操作只是相对于引脚没复用的GPIO口,引脚如果有复用功能,我们还得进行一些别的操作把引脚的功能选好。


© 著作权归作者所有

穿
粉丝 0
博文 51
码字总数 24172
作品 0
福州
私信 提问
Popmetal ubuntu系统实现jpeg硬解例子

一、下载、烧写ubuntu固件 固件地址: http://chipspark.com/download/fi ... opMetal20150706.7z 烧写工具: http://chipspark.com/download/fi ... oolReleasev2.3.7z 系统登入密码 ubuntu......

穿prada的008
2015/09/17
195
0
芯客网基于 RK3288 开源开发板 PopMetal 即将上线

PopMetal基于RK32系列开源开发板即将登陆“芯客网”,RK3288采用28纳米HKMG工艺打造,四核Cortex-A17,主频高达1.8H,GPU采用ARM Mali-T764,支持4K H.264 和 10bits H.265视频解码,1080P 多...

超级丹
2014/11/18
4.4K
2
RK3288 GPIO 驱动

简介 GPIO, 全称 General-Purpose Input/Output(通用输入输出),是一种软件运行期间能够动态配置和控制的通用引脚。 RK3288 有 9 组 GPIO bank: GPIO0,GPIO1, ..., GPIO8。每组又以 A0~A...

倔强的小蚂蚁
2016/12/14
193
0
PopMetal和PX2上运行upstream linux kernel代码

Rockchip的平台,以其强大的性能和丰富的功能,在开源社区大受欢迎,Linux内核对其提供越来越丰富的支持。 Linux内核目前发布的最新稳定版本是Linux 4.2,Linux 4.3的合并窗口已经打开,大概...

穿prada的008
2015/09/15
733
0
Firefly RK3288开源硬件项目启动

Firefly RK3288是一个高性能的开源硬件平台,使用瑞芯微最新的RK3288处理器,支持Android4.4和Ubuntu系统,并支持HDMI 4K超高清输出,扩展还预留了MIPI、LVDS等LCD显示接口以及GPIO、SPI、I...

藤木z
2014/06/19
10.9K
14

没有更多内容

加载失败,请刷新页面

加载更多

面试官,Java8 JVM内存结构变了,永久代到元空间

在文章《JVM之内存结构详解》中我们描述了Java7以前的JVM内存结构,但在Java8和以后版本中JVM的内存结构慢慢发生了变化。作为面试官如果你还不知道,那么面试过程中是不是有些露怯?作为面试...

程序新视界
12分钟前
8
0
读书笔记:深入理解ES6 (八)

第八章 迭代器(Iterator)与生成器(Generator) 第1节 循环语句的问题   在循环、多重循环中,通过变量来跟踪数组索引的行为容易导致程序出错。迭代器的出现旨在消除这种复杂性,并减少循...

张森ZS
13分钟前
8
0
Elasticsearch 实战(一) - 简介

官腔 Elasticsearch,分布式,高性能,高可用,可伸缩的搜索和分析系统 基本等于没说,咱们慢慢看 1 概述 百度:我们比如说想找寻任何的信息的时候,就会上百度去搜索一下,比如说找一部自己喜...

JavaEdge
17分钟前
8
0
【jQuery基础学习】11 jQuery性能简单优化

本文转载于:专业的前端网站➦【jQuery基础学习】11 jQuery性能简单优化 关于性能优化 合适的选择器 $("#id")会直接调用底层方法,所以这是最快的。如果这样不能直接找到,也可以用find方法继...

前端老手
26分钟前
7
0
重磅发布 | 全球首个云原生应用标准定义与架构模型 OAM 正式开源

导读:2019 年 10 月 17 日,阿里巴巴合伙人、阿里云智能基础产品事业部总经理蒋江伟(花名:小邪)在 Qcon 上海重磅宣布,阿里云与微软联合推出开放应用模型 Open Application Model (OAM...

阿里云官方博客
28分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部