2019独角兽企业重金招聘Python工程师标准>>>

楼主在这边给大家介绍下如何使用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口,引脚如果有复用功能,我们还得进行一些别的操作把引脚的功能选好。

转载于:https://my.oschina.net/u/2007588/blog/487211

RK3288开发板PopMetal上的GPIO驱动实例相关推荐

  1. 导出RK3288开发板上的根文件系统,并打包img

    整体操作一共三步: 一.将Rk3288的整个根文件系统的文件,通过ssh拷贝到PC系统(Ubuntu): 二.将此拷贝的全部文件,加载到虚拟光盘中,制作成img文件: 三.将img文件,再烧回RK32 ...

  2. RK3288 开发板 排插物理引脚对应图以及如何进入android6.0.1内核终端、uboot终端

    主要讲述三个问题: (1)RK3288 排查的物理引脚对应图 (2)如何通过打印窗口进入内核终端 (3)如何进入u-boot 终端 1.下面是RK3288 开发板排插物理引脚对应图 2.将物理引脚37 ...

  3. Auvidea J120 TX2开发板 Jetpack刷机与驱动安装

    Auvidea J120 TX2开发板 Jetpack刷机与驱动安装 一.刷机准备 下载Nvidia SDK Manager 网址:https://developer.nvidia.com/nvidi ...

  4. 【Renesas RA6M4开发板之两路PWM驱动】

    [Renesas RA6M4开发板之两路PWM驱动] 1.0 PWM 简介 1.1 原理 1.2 访问 PWM 设备 2. RT-theard配置 2.1 硬件需求 2.2 软件配置 3. 代码分析 ...

  5. 【STC8A8K64S4A12开发板】—小白做GPIO按键实验

    版权声明:本文为博主原创文章,转载请附上原文出处链接. 文章目录 前言 一.硬件电路设计 1.开发板用户按键硬件电路 2.按键检测接法 3.按键检测电路考虑因素 二.软件设计 1.寄存器解析 1.1. ...

  6. 逆变器方案(高频 工频)正弦波逆变驱动开发板,完全兼容EG8010驱动板

    逆变器方案(高频 工频)正弦波逆变驱动开发板,完全兼容EG8010驱动板,高频机工频机通用,资料包含源代码,带中文注释,原理图,PCB图,高质量开发板代码,可以直接上机运行 ID:4215006632 ...

  7. 关于arduino开发板链接usb时,驱动安装不成功的解决办法

    关于arduino开发板链接usb时,驱动安装不成功的解决办法 环境 当前的环境是Windows 64位 x86平台 系统镜像创建方法是gosht还原 当前问题 arduino开发板使用原装数据线链接 ...

  8. 【基于NSR3588开发板Android12三屏拼接显示实例】

    基于NSR3588开发板Android12三屏拼接显示实例 1.硬件接口 2路HDMI接口 1路Type-c DP转HDMI 如下图: 2.多屏显示拼接简介 RK3588可以支持如下多种拼接模式: 我 ...

  9. RK3288开发板GPIO介绍

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

最新文章

  1. 创建一个显示所有预定义WPF颜色的ListBox
  2. ML之XGBoost:XGBoost案例应用实战(原生接口实现+Scikit-learn接口实现)
  3. 【ElasticSearch】ElasticSearch-SQL插件
  4. mysql简单外连接查询
  5. 怎么把php的时区配置为本地,PHP本地时区设置
  6. opencv waitKey() 函数理解及应用
  7. github ssl验证跳过
  8. 给 22 岁的自己六点建议
  9. Kaggle入门 - TMDB 5000 电影推荐数据分析
  10. Excel 2010 VBA 入门 049 根据身份证号码判断性别(left,right,mid,len)
  11. ASP.NET+Sql Server 2008 +highchart控件从数据库中获取数据生成饼状图柱状图
  12. 人生苦短_人生苦短,懂事太晚!
  13. Unity面试经验(两天面六家,四个offer,济南)
  14. OFD文件怎么转换成图片?这两种方法能够快速转换
  15. 中国柔性电子行业应用需求及发展前景展望报告(2022-2027年)
  16. 【MATLAB】matlab中clc,close,close all,clear,clear all作用区别
  17. 上下边距html样式表,css上下间距怎么调?
  18. 雅虎开始关闭韩国业务并裁员 200 人
  19. 数据库中的变量和if语句的相关语法与案例
  20. Web登录使用RSA对密码进行加密解密过程

热门文章

  1. 你的微信版本过低,无法正常使用此小程序,请更新微信到最新版本。
  2. 人民币换算美元java计算_美元和人民币换算(人民币转换美元计算)
  3. Linux截图和屏幕视频录制软工具Kazam使用攻略
  4. 企业管理员必看:企业邮箱如何注册?企业邮箱账号怎么管理?
  5. word文档生成系列:doc和docx插入多图
  6. 企业招聘面试的经典6类问题
  7. python的环境问题相关
  8. 《红警2》防空步兵都说了些什么?
  9. 循序渐进学SAP系列(一):--SAP该如何入门
  10. 分布式监控工具zabbix 配置安装