社区导航

 

搜索
查看: 2597|回复: 0

[经验] RK3288开发板PopMetal上的GPIO驱动实例

[复制链接]

67

TA的帖子

0

TA的资源

一粒金砂(初级)

Rank: 1

发表于 2015-8-3 17:58 | 显示全部楼层 |阅读模式
楼主在这边给大家介绍下如何使用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
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
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, 下载次数: 17)

回复

使用道具 举报

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

关闭

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

  • 论坛活动 E手掌握

    扫码关注
    EEWORLD 官方微信

  • EE福利  唾手可得

    扫码关注
    EE福利 唾手可得

Archiver|手机版|小黑屋|电子工程世界 ( 京ICP证 060456 )

GMT+8, 2020-6-2 22:54 , Processed in 0.094505 second(s), 23 queries , Gzip On, MemCache On.

快速回复 返回顶部 返回列表