视壮BBS

   登录   |   注册   |

RK的gpio使用说明

2

主题

3

帖子

28

积分

新手上路

Rank: 1

积分
28
发表于 2017-12-19 10:58:15     
本帖最后由 kfb03 于 2017-12-19 11:02 编辑

GPIO, 全称 General-Purpose Input/Output(通用输入输出),是一种软件运行期间能够动态配置和控制的通用引脚。

RK3288 有 9 组 GPIO bank: GPIO0,GPIO1, ..., GPIO8。每组又以 A0~A7, B0~B7, C0~C7, D0~D7 作为编号区分


每个 GPIO 口除了通用输入输出功能外,还可能有其它复用功能,例如 GPIO5_B4,可以复用成以下功能之一:

  • spi0_clk
  • ts0_data4
  • uart4exp_ctsn
输入输出

下面以电源 LED 灯的驱动为例,讲述如何在内核编写代码控制 GPIO 口的输出,写法如下。

首先需要在 dts (Device Tree) 文件 rk3288-evb-android-rk808-mipi.dts中增加驱动的资源描述:

    1. led{
    2.     compatible = "vs,led";               
    3.     gpio = <&gpio7 2 GPIO_ACTIVE_HIGH>;       //GPIO7_A2,
    4.     //gpio = <&gpio7 10 GPIO_ACTIVE_HIGH>;  //如GPIO7_B2,
    5.     //gpio = <&gpio7 18 GPIO_ACTIVE_HIGH>;  //如GPIO7_C2,
    6.    //gpio = <&gpio7 19 GPIO_ACTIVE_HIGH>;   //如GPIO7_C3,
    7. };
    复制代码



GPIO_ACTIVE_HIGH 表示高电平有效(灯亮),如果是低电平有效,需要替换为 GPIO_ACTIVE_LOW 。


回复

使用道具 举报

2

主题

3

帖子

28

积分

新手上路

Rank: 1

积分
28
发表于 2017-12-19 10:59:08     
程序如下
  1. #include <linux/module.h>
  2. #include <linux/init.h>
  3. #include <linux/platform_device.h>
  4. #include <linux/kernel.h>
  5. #include <linux/clk.h>
  6. #include <linux/io.h>
  7. #include <linux/of.h>
  8. #include <linux/of_device.h>
  9. #include <linux/of_gpio.h>
  10. #include <linux/gpio.h>
  11. #include <linux/proc_fs.h>   

  12. static int led_gpio;

  13. static ssize_t led_read_proc(struct file *file,char __user *buffer,size_t count, loff_t *data)
  14. {
  15. }
  16. static ssize_t led_write_proc(struct file *file, const char *buffer,unsigned long count, void *data)
  17. {

  18.         char c;
  19.         int rc;
  20.         int num = 0;

  21.         rc = get_user(c, buffer);
  22.         num = c - '0';
  23.         if(num==0)
  24.         {
  25.                 gpio_direction_output(led_gpio, 0);                            //设置led_gpio为低电平
  26.         }else
  27.         {
  28.                 gpio_direction_output(led_gpio, 1);                            //设置led_gpio为高电平
  29.         }
  30.         return count;
  31. }
  32. static const struct file_operations led_wr = {
  33.             .owner = THIS_MODULE,
  34.             .read =  led_read_proc,
  35.             .write = led_write_proc,
  36. };
  37. static int led_gpio_probe(struct platform_device *pdev)             //驱动加载
  38. {
  39.         enum of_gpio_flags flag;
  40.         struct device_node *led_node = pdev->dev.of_node;
  41.         static struct proc_dir_entry *entry_ledctr;

  42.          led_gpio = of_get_named_gpio_flags(led_node,"gpio", 0, &flag);//从dts中获取gpio
  43.         gpio_request(led_gpio, "led_gpio");                                           //注册led_gpio这个gpio
  44.         gpio_direction_output(led_gpio, 1);                                           //设置gpio的方向为输出
  45.        
  46.         entry_ledctr=proc_mkdir("led", NULL);                                      //在proc目录下创立led目录
  47.         proc_create("IO", 0, entry_ledctr, &led_wr);                              //在led目录下创立一个IO名称的文件节点

  48.         return 0;
  49. }
  50. static int led_gpio_remove(struct platform_device *pdev) //驱动移除
  51. {
  52.         return 0;
  53. }

  54. #ifdef CONFIG_OF
  55. static const struct of_device_id of_rk_led_gpio_match[] = {
  56.         { .compatible = "vs,led" },                                                     //名称要与dts文件中的compatible对应
  57.         { /* Sentinel */ }
  58. };
  59. #endif

  60. static struct platform_driver led_gpio_driver = {
  61.         .probe                = led_gpio_probe,
  62.         .remove                = led_gpio_remove,
  63.         .driver                = {
  64.                 .name        = "vs-led",
  65.                 .owner        = THIS_MODULE,
  66. #ifdef CONFIG_OF
  67.                 .of_match_table        = of_rk_led_gpio_match,
  68. #endif
  69.         },
  70. };
  71. static int __init led_gpio_init(void)                                                  
  72. {
  73.             return platform_driver_register(&led_gpio_driver);        //注册平台驱动
  74. }
  75. static void __exit led_gpio_exit(void)
  76. {
  77.           platform_driver_unregister(&led_gpio_driver);             //注销平台驱动
  78. }

  79. module_init(led_gpio_init);                                                      //驱动模块加载
  80. module_exit(led_gpio_exit);

  81. MODULE_AUTHOR("liaomx <66434992@qq.com>");           //视壮科技
  82. MODULE_DESCRIPTION("led Gpio driver");
  83. MODULE_LICENSE("GPL");
复制代码
回复

使用道具 举报

11

主题

14

帖子

83

积分

注册会员

Rank: 2

积分
83
发表于 2017-12-21 14:25:22     
好资料,不错
回复

使用道具 举报

0

主题

8

帖子

32

积分

新手上路

Rank: 1

积分
32
发表于 2018-6-22 23:47:29     
不错!!!
回复

使用道具 举报

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

本版积分规则

友情链接 : 易百讯      粤ICP备14022046号-2
快速回复 返回顶部 返回列表