查看: 2967|回复: 4

[原创] 【FirePrime】编程控制GPIO输出

[复制链接]
  • TA的每日心情
    奋斗
    2018-11-15 08:49
  • 签到天数: 1031 天

    连续签到: 2 天

    [LV.10]以坛为家III

    发表于 2015-10-10 18:01:55 | 显示全部楼层 |阅读模式
    分享到:
    本帖最后由 liuyu-419812 于 2015-10-10 18:01 编辑

          内容和代码参考:http://blog.csdn.net/junllee/article/details/8900372

          Linux驱动编写对于我这种小白来说,还是有难度的,还是先从应用出发学习Linux,把FirePrime给玩起来。
          FirePrime开发板上预留了很多的接口,如果不用岂不可惜了,先从简单的GPIO开始。Linux内核中GPIO是最简单,最常用的资源驱动程序,应用程序都能够通过相应的接口使用GPIOGPIO使用0MAX_INT之间的整数标识,不能使用负数。用户空间访问GPIO,即通过sysfs接口访问GPIO,下面是/sys/class/gpio目录下的三种文件:
          export/unexport文件
          gpioN文件:指代具体的gpio引脚
          gpio_chipN文件:指代gpio控制器
       必须知道以上接口没有标准device文件和它们的链接。
          1.export/unexport文件接口:
          /sys/class/gpio/export,该接口只能写不能读
          用户程序通过写入GPIO的编号来向内核申请将某个GPIO的控制权导出到用户空间,当然前提是没有内核代码申请这个GPIO端口。如果想申请开发板上的GPIO1_B4这个端口,它的GPIO号为32+8+4=44,例如:
    1. echo 44 > export
    复制代码
          上述操作会为44GPIO创建一个节点gpio44,此时/sys/class/gpio目录下边生成一个gpio44的目录。
          /sys/class/gpio/unexport和导出的效果相反。例如
    1. echo 44 > unexport
    复制代码
          上述操作将会移除gpio44这个节点。
          2./sys/class/gpio/gpioN
          指代某个具体的GPIO端口,主要用到如下属性文件:
          (1)direction:表示GPIO端口的方向,读取结果是inout。该文件也可以写,写入out 时该GPIO设为输出同时电平默认为低。
          (2)value :表示GPIO引脚的电平,如果GPIO被配置为输出,这个值是可写的,记住任何非零的值都将输出高电平。              
          (3)edge:表示中断的触发方式,edge文件有如下四个值:"none", "rising", "falling""both"
                 none表示引脚为输入,不是中断引脚
                 rising表示引脚为中断输入,上升沿触发
                 falling表示引脚为中断输入,下降沿触发
                 both表示引脚为中断输入,边沿触发
             这个文件节点只有在引脚被配置为输入引脚的时候才存在。当值是none时可以通过如下方法将变为中断引脚。
    1. echo "both" > edge
    复制代码
           对于是bothfalling还是rising依赖具体硬件的中断的触发方式。此方法即用户态GPIO转换为中断引脚的方式。                               3./sys/class/gpio/gpiochipN
          gpiochipN表示的就是一个gpio_chip,用来管理和控制一组GPIO端口的控制器。
          在程序里,主要通过open()函数和write()函数来实现GPIO控制。为了使用这两个函数你需要包含以下头文件:
           #include<fcntl.h>
           #include <unistd.h>
        在程序里会控制GPIO_B4这个端口输出高低电平。我们在程序里先打开export文件,然后向export文件写入相应控制的GPIO号,使得该GPIO的操作接口从内核空间暴露到用户空间。然后向该GPIO下的direction文件写入out,变为输出接口。最后向该gpio下的value文件写入数值,控制输出的电平。 程序代码如下:
    1. #include<stdio.h>
    2. #include<unistd.h>
    3. #include<fcntl.h>
    4. #include<string.h>

    5. void tdelay(int d)
    6. {
    7.         volatile int j;
    8.         for(j = 0; j<d*1000000;j++);
    9. }

    10. int main(int argc,char **argv)
    11. {
    12.         int gpio_fd =  -1;
    13.         int ret;
    14.         char gpio[] = "44";
    15.         char dir[] = "out";
    16.         gpio_fd = open("/sys/class/gpio/export",O_WRONLY);
    17.         if(gpio_fd<0)
    18.         {
    19.                 printf("open gpio/export1 failed\n");
    20.                 return -1;
    21.         }
    22.         ret = write(gpio_fd,gpio,strlen(gpio));
    23.         if(ret < 0)
    24.         {
    25.                 printf("Write to gpio/failed\n");
    26.                 return  -1;
    27.         }
    28.         close(gpio_fd);

    29.         gpio_fd = open("/sys/class/gpio/gpio44/direction",O_RDWR);
    30.         if(gpio_fd < 0)
    31.         {
    32.                 printf("open gpio44/direction failed\n");
    33.                 return -1;
    34.         }
    35.         ret = write(gpio_fd,dir,strlen(dir));
    36.         if(ret < 0)
    37.         {
    38.                 printf("write to gpio44/direction failed\n");
    39.                 return -1;
    40.         }
    41.         close(gpio_fd);
    42.         gpio_fd = open("/sys/class/gpio/gpio44/value",O_RDWR);
    43.         if(gpio_fd < 0)
    44.         {
    45.                 printf("open gpio44/value failed\n");
    46.                 return -1;
    47.         }
    48.         int i;
    49.         char off[] = "1";
    50.         char on[] = "0";
    51.         for(i = 0; i<10;i++)
    52.         {
    53.                 printf("led off\n");
    54.                 ret = write(gpio_fd,off,strlen(off));
    55.                 if(ret < 0 )
    56.                 {
    57.                         printf("write to gpio44/value failed\n");
    58.                         return -1;
    59.                 }
    60.                 tdelay(30);

    61.                 printf("led on\n");
    62.                 ret = write(gpio_fd,on,strlen(on));
    63.                 if(ret < 0 )
    64.                 {
    65.                         printf("write to gpio44/value failed\n");
    66.                         return -1;
    67.                 }
    68.                 tdelay(10);
    69.         }
    70.         close(gpio_fd);

    71.         gpio_fd = open("/sys/class/gpio/unexport",O_WRONLY);
    72.         if(gpio_fd<0)
    73.         {
    74.                 printf("open gpio/unexport1 failed\n");
    75.                 return -1;
    76.         }
    77.         ret = write(gpio_fd,gpio,strlen(gpio));
    78.         if(ret < 0)
    79.         {
    80.                 printf("Write to gpio/unexport failed\n");
    81.                 return  -1;
    82.         }
    83.         close(gpio_fd);
    84.         printf("Hello World");
    85.         return 0;
    86. }
    复制代码
          打开一个终端,定位到程序所在的文件夹,编译,执行。gpio_out.c为我的源文件。
    1. gcc gpio_out.c -o gpio
    2. sudo ./gpio
    复制代码
    P51010-121801.jpg

    P51010-121735.jpg

    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2016-10-17 12:07
  • 签到天数: 306 天

    连续签到: 1 天

    [LV.8]以坛为家I

    发表于 2015-10-11 07:33:19 | 显示全部楼层
    学习一下。。。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    2023-7-25 22:49
  • 签到天数: 385 天

    连续签到: 1 天

    [LV.9]以坛为家II

    发表于 2015-10-11 15:49:35 | 显示全部楼层
    学习一下。。。。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2016-4-14 10:16
  • 签到天数: 9 天

    连续签到: 1 天

    [LV.3]偶尔看看II

    发表于 2015-10-13 12:00:08 | 显示全部楼层
    学习学习,赞一个
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-11-23 14:54
  • 签到天数: 19 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    发表于 2015-10-14 09:38:18 | 显示全部楼层
    学习学习,赞一个
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2025-1-12 06:08 , Processed in 0.147472 second(s), 24 queries , MemCache On.

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

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.