查看: 2384|回复: 0

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

[复制链接]

该用户从未签到

发表于 2015-8-3 17:07:18 | 显示全部楼层 |阅读模式
分享到:
本帖最后由 穿prada的008 于 2015-8-3 18:01 编辑

楼主在这边给大家介绍下如何使用PopMetal的GPIO。先讲过程,再讲原理吧,
该驱动需要涉及到的知识点:1,DTS设备树的作用,2,platform虚拟总线驱动的编写。
第一步,添加DTS节点
在/kernel/arch/arm/boot/dts/rockchip.dts下添加如下内容。
下图rockchip-leds-gpio这部分的内容,修改保存,
090150tii1bi8wbgk8gb9a.png   
第二步,在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:
092524zvvt1kl0jew8q1tw.png   
Makefile:
093005ypil1zdbj0sppipk.png   
第三步,修改drivers下的Kconfig和Makefile,修改内容如下
在Kconfig末尾添加:source “drivers/led/Kconfig”
在Makefile末尾添加: obj-$(CONFIG_LED0_TEST)  +=led/
第四步,编译新的kernel与resource并烧写进板子里,
然后DTS中定义的引脚就会按照驱动的内容,进行高低电平的变化。

需要源码可下载: led.zip (1.52 KB, 下载次数: 2)

评分

参与人数 1与非币 +5 收起 理由
loveeeboard + 5 三周年铜板双倍!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /1 下一条

手机版|小黑屋|与非网

GMT+8, 2024-4-24 12:51 , Processed in 0.134021 second(s), 20 queries , MemCache On.

ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

苏公网安备 32059002001037号

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.