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

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

时间: 2024-12-12 06:26:24

RK3288开发板PopMetal上的GPIO驱动实例的相关文章

芯客网推出基于RK3288最强性能开源开发板PopMetal

瑞芯微网络战略合作伙伴"芯客网"推出基于RK3288开源开发板PopMetal.PopMetal是一个高性能的开源硬件平台,使用瑞芯微最新的RK3288处理器,支持Android5.0和Ubuntu系统,并支持HDMI 4K超高清输出,扩展还预留了MIPI.LVDS等LCD显示接口以及I2C.GPIO等一列的常规接口,板子自带8GB存储,支持TF卡扩展.板载支持蓝牙.红外.WIFI.NFC,自带千兆网卡.适合用作文件服务器.微型电脑主机.网络播放器.机顶盒.广告播放机.开发板.软件编程

在开发板Linux上挂载"驱动"挂载不成功,出现提示server 172.27.52.100 not responding, still trying

1.在开发板具体操作步骤如下: 1.1 :设置IP ifconfig eth0 172.27.52.200 1.2 :ping通 虚拟机Linux 主机Linux ping XXX.XXX.XXX.XXX 1.3.挂接 mount -t nfs -o nolock  XXX.XXX.XXX.XXX:/work/nfs_root/first_fs  /mnt // 例如:mount -t nfs -o nolock  172.27.52.100:/work/nfs_root/first_fs  /

第8章 让开发板发出声音,蜂鸣器驱动 心得体会

第8章让开发板发出声音,蜂鸣器驱动 心得体会 通过学习Android深度探索(卷1)HAL与驱动开发的第8章 让开发板发出声音,蜂鸣器驱动,我加深对驱动的认识.以下主要是我对本节实验和参考在Linux驱动开发中使用PWM控制蜂鸣器中的一些见解. 先编写一个简单的蜂鸣器驱动程序,根据开发板上的硬件IO接口和Android驱动规范,在kernel中的driver目录中新建一个Buzzer文件,新建一个buzzer.c的源文 在目录下创建一个Makefile文件 先运行make clean命令清楚到编

第8章 让开发板发出声音,蜂鸣器驱动

第8章让开发板发出声音,蜂鸣器驱动 心得体会 在目录下创建一个Makefile文件 先运行make clean命令清楚到编译生成的一些工程文件,执行make命令,重新编译驱动程序.将编译生成的buzzer.ko内核镜像文件拷贝出来,adb push buzzer.ko /fpga/moudles 然后插入内核镜像文件到系统中,insmod buzzer.ko,并且装载设备驱动程序,mknod  /dev/buzzer c 248 0 现在就可以在库层直接编写C/C++文件来调用这个驱动程序,这个

织女星开发板使用RISC-V RI5CY核驱动GPIO

前言 织女星开发板是OPEN-ISA社区为中国大陆地区定制的一款体积小.功耗超低和功能丰富的 RISC-V评估开发板,基于NXP半导体四核异构RV32M1主控芯片. 两个RISC-V核:RI5CY + ZERO_RISCY. 两个ARM核: Cortex-M4F + Cortex-M0+ . 4个核被分为两个子系统,大核CM4F/RI5CY和小核CM0+/ZERO-RISCY,片上集成1.25 MB Flash .384 KB SRAM,其中1 MB的Flash被大核所使用,起始地址0x0000

第八章 让开发板发出声音:蜂鸣器驱动

这一章的主要内容是让开发板发出声音——蜂鸣器驱动,在Linux驱动开发中重点也学习了这一部分内容,同时最后我们小组的考核内容是通过中断控制蜂鸣器发七个音符的音. 这一部分中,要中断控制蜂鸣器,在中断和蜂鸣器代码的基础上进行增加.中断与蜂鸣器的代码不变,在中断的测试代码中,首先要定义七个音符,之后将开发板上的七个键与七个音符相连接,再将七个音符的转换与蜂鸣器相连接,来达到所需的效果. 核心代码: int main() { int fd,fd1; int div; int keyval; fd1 =

让开发板发出声音:蜂鸣器驱动

第八章介绍了一个个实验:蜂鸣器驱动,让开发板发出声音. 将介绍蜂鸣器的实现原理,并实现一个完整的蜂鸣器驱动,通过该驱动可以控制蜂鸣器的打开与关闭. 蜂鸣器也称为PWM脉冲宽度调制,基本原理就是通过脉冲来控制蜂鸣器的打开和停止.蜂鸣器是开发板上带的一个硬件设备,可以通过向寄存器写入特定的值来控制蜂鸣器发出的声音.本节介绍了蜂鸣器的实现原理,并实现一个完整的蜂鸣器驱动,可以打开和关闭.PWM驱动的实现方式不同于LED驱动,PWM驱动由多个文件组成,这也是大多数Linux驱动的标准实现方式. Linu

第八章 让开发板发出声音:蜂鸣器驱动 心得笔记

蜂鸣器也称为PWM脉冲宽度调制,基本原理就是通过脉冲来控制蜂鸣器的打开和停止.蜂鸣器是开发板上带的一个硬件设备,可以通过向寄存器写入特定的值来控制蜂鸣器发出的声音.本节介绍了蜂鸣器的实现原理,并实现一个完整的蜂鸣器驱动,可以打 开和关闭.PWM驱动的实现方式不同于LED驱动,PWM驱动由多个文件组成,这也是大多数Linux驱动的标准实现方式. Linux驱动的代码重用有很多种方法.分为静态重用和动态重用,静态重用是代码级的重用,就是将需要重用的代码和使用这些代码的文档放在一起编 译,最终生成一个

第8 意让开发板发出声音:蜂鸣器驱动

通过有I/O命令可以打开和停止PWM,PWM 驱动由3 个文件组成: pwm.c, pwm_fun.h .pwm_fun.c.其中pwm.c 是驱动主程序.pwm_fun.h 引用了相应的头文件,以及定义了一些宏.pwm_fun.c 文件则包含了打开和停止PWM的两个函数( pwm_start 和pwm_stop ).运行之后从Makefile 文件的内容可以看出,编译器首先将pwm.c 和pwm_fun.c 文件编译成pwm.o和pwm_fun.o,然后再将这两个*.o文件链接成pwm_dri