说明:这里主要是基于Amlogic_S905X平台上实现的,其实gpio的控制都是通用的,使用的都是标准的gpio操作函数,跟平台无关。通过往节点写入1或者0来拉高拉低gpio来控制led灯的亮灭。

 stvs9:/ $ cd sys/devices/led_ctrl.15/                                          stvs9:/sys/devices/led_ctrl.15 $ ls -ltotal 0lrwxrwxrwx 1 root root    0 2018-09-11 00:00 driver -> ../../bus/platform/drivers/led_ctrl-rw-rw-rw- 1 root root 4096 2018-09-11 00:01 gpio_wps-rw-rw-rw- 1 root root 4096 2018-09-11 00:01 gpio_zigbee-rw-rw-rw- 1 root root 4096 2018-09-11 00:00 gpio_zwave-r--r--r-- 1 root root 4096 2018-09-11 00:00 modaliasdrwxr-xr-x 2 root root    0 1970-01-13 09:47 powerlrwxrwxrwx 1 root root    0 2018-09-11 00:00 subsystem -> ../../bus/platform-rw-r--r-- 1 root root 4096 1970-01-13 09:47 ueventstvs9:/sys/devices/led_ctrl.15 $ echo 1 > gpio_zigbee //打开ledstvs9:/sys/devices/led_ctrl.15 $ echo 0 > gpio_zigbee //关闭led                        stvs9:/sys/devices/led_ctrl.15 $ echo 1 > gpio_zwave                           stvs9:/sys/devices/led_ctrl.15 $ echo 0 > gpio_zwave                           stvs9:/sys/devices/led_ctrl.15 $ echo 1 > gpio_wps                             stvs9:/sys/devices/led_ctrl.15 $ echo 0 > gpio_wpsstvs9:/sys/devices/led_ctrl.15 $ cat gpio_zigbee  //查看led电平

主要代码如下:
1、dts的配置:

       led_ctrl {compatible = "amlogic, led_ctrl";dev_name = "led_ctrl";status = "okay";gpio_zigbee = <&gpio GPIOH_8 GPIO_ACTIVE_HIGH>;gpio_zwave = <&gpio GPIOH_7 GPIO_ACTIVE_HIGH>;gpio_wps = <&gpio GPIOH_6 GPIO_ACTIVE_HIGH>;};

2、 具体驱动代码如下:

 #include <linux/init.h>#include <linux/slab.h>#include <linux/module.h>#include <linux/kernel.h>#include <linux/fs.h>#include <linux/cdev.h>#include <linux/device.h>#include <linux/ioctl.h>#include <linux/uaccess.h>#include <linux/string.h>#include <linux/wait.h>#include <linux/types.h>#include <linux/proc_fs.h>#include <linux/of.h>#include <linux/of_gpio.h>#include <linux/gpio.h>#include <linux/delay.h>#include <linux/platform_device.h>#include <linux/err.h>static int gpio_zigbee;static int gpio_zwave;static int gpio_wps;static ssize_t led_ctrl_gpio_zigbee_show(struct device *dev,struct device_attribute *attr, char *buf){return sprintf(buf, "%d\n", gpio_get_value(gpio_zigbee));}static ssize_t led_ctrl_gpio_zwave_show(struct device *dev,struct device_attribute *attr, char *buf){return sprintf(buf, "%d\n", gpio_get_value(gpio_zwave));}static ssize_t led_ctrl_gpio_wps_show(struct device *dev,struct device_attribute *attr, char *buf){return sprintf(buf, "%d\n", gpio_get_value(gpio_wps));}static ssize_t led_ctrl_gpio_zigbee_store(struct device *dev,struct device_attribute *attr,const char *buf, size_t size){u8 wp;u8 ret;ret = sscanf(buf, "%x", (int *)&wp);if (wp == 0) {gpio_set_value(gpio_zigbee, 0);pr_err("-czd-: _%s_ :gpio_zigbee off\n", __func__);} else if (wp == 1) {gpio_set_value(gpio_zigbee, 1);pr_err("-czd-: _%s_ :gpio_zigbee on\n", __func__);} elsepr_err("I only support 0 or 1 to ctrl led on or off\n");return size;}static ssize_t led_ctrl_gpio_zwave_store(struct device *dev,struct device_attribute *attr,const char *buf, size_t size){u8 wp;u8 ret;ret = sscanf(buf, "%x", (int *)&wp);if (wp == 0) {gpio_set_value(gpio_zwave, 0);pr_err("-czd-: _%s_ :gpio_zwave off\n", __func__);} else if (wp == 1) {gpio_set_value(gpio_zwave, 1);pr_err("-czd-: _%s_ :gpio_zwave on\n", __func__);} elsepr_err("I only support 0 or 1 to ctrl led on or off\n");return size;}static ssize_t led_ctrl_gpio_wps_store(struct device *dev,struct device_attribute *attr,const char *buf, size_t size){u8 wp;u8 ret;ret = sscanf(buf, "%x", (int *)&wp);if (wp == 0) {gpio_set_value(gpio_wps, 0);pr_err("-czd-: _%s_ :gpio_wps off\n", __func__);} else if (wp == 1) {gpio_set_value(gpio_wps, 1);pr_err("-czd-: _%s_ :gpio_wps on\n", __func__);} elsepr_err("I only support 0 or 1 to ctrl led on or off\n");return size;}static DEVICE_ATTR(gpio_zigbee, 0664, led_ctrl_gpio_zigbee_show, led_ctrl_gpio_zigbee_store);static DEVICE_ATTR(gpio_zwave, 0664, led_ctrl_gpio_zwave_show, led_ctrl_gpio_zwave_store);static DEVICE_ATTR(gpio_wps, 0664, led_ctrl_gpio_wps_show, led_ctrl_gpio_wps_store);static int led_ctrl_probe(struct platform_device *pdev){struct device_node *led_ctrl_node = pdev->dev.of_node;enum of_gpio_flags flags;pr_err("---[czd]--- Enter %s\n", __func__);gpio_zigbee = of_get_named_gpio_flags(led_ctrl_node,"gpio_zigbee", 0, &flags);pr_err("---[czd]--- gpio_zigbee is %d --\n", gpio_zigbee);if (!gpio_is_valid(gpio_zigbee)) {pr_err("gpio_zigbee: %d is invalid\n", gpio_zigbee);return -ENODEV;}if (gpio_request(gpio_zigbee, "gpio_zigbee")) {pr_err("gpio_zigbee: %d request failed!\n", gpio_zigbee);gpio_free(gpio_zigbee);return -ENODEV;}gpio_zwave = of_get_named_gpio_flags(led_ctrl_node,"gpio_zwave", 0, &flags);pr_err("---[czd]--- gpio_zwave is %d --\n", gpio_zwave);if (!gpio_is_valid(gpio_zwave)) {pr_err("gpio_zwave: %d is invalid\n", gpio_zwave);return -ENODEV;}if (gpio_request(gpio_zwave, "gpio_zwave")) {pr_err("gpio_zwave: %d request failed!\n", gpio_zwave);gpio_free(gpio_zwave);return -ENODEV;}gpio_wps = of_get_named_gpio_flags(led_ctrl_node,"gpio_wps", 0, &flags);pr_err("---[czd]--- gpio_wps is %d --\n", gpio_wps);if (!gpio_is_valid(gpio_wps)) {pr_err("gpio_wps: %d is invalid\n", gpio_wps);return -ENODEV;}if (gpio_request(gpio_wps, "gpio_wps")) {pr_err("gpio_wps: %d request failed!\n", gpio_wps);gpio_free(gpio_wps);return -ENODEV;}gpio_direction_output(gpio_zigbee, 0);gpio_direction_output(gpio_zwave, 0);gpio_direction_output(gpio_wps, 0);device_create_file(&pdev->dev, &dev_attr_gpio_zigbee);device_create_file(&pdev->dev, &dev_attr_gpio_zwave);device_create_file(&pdev->dev, &dev_attr_gpio_wps);pr_err("-czd- led_ctrl_probe sucess..\n");return 0;}static struct of_device_id led_ctrl_match_table[] = {{ .compatible = "amlogic, led_ctrl",},{},};static int led_ctrl_remove(struct platform_device *pdv){pr_err("led_ctrl_remove...\n");return 0;}static struct platform_driver led_ctrl_driver = {.driver = {.name = "led_ctrl",.owner = THIS_MODULE,.of_match_table = led_ctrl_match_table,},.probe = led_ctrl_probe,.remove = led_ctrl_remove,};static int led_ctrl_init(void){pr_err("-czd-: led_ctrl_init start...\n");platform_driver_register(&led_ctrl_driver);return 0;}static void led_ctrl_exit(void){pr_err("led_ctrl_exit ...\n");platform_driver_unregister(&led_ctrl_driver);}module_init(led_ctrl_init);module_exit(led_ctrl_exit);MODULE_AUTHOR("caizd");MODULE_DESCRIPTION("Device_create Driver");MODULE_LICENSE("GPL");

写一个控制gpio的驱动相关推荐

  1. 写一个块linux设备驱动

    ----------------------- Page 1----------------------- 第 1章 +---------------------------------------- ...

  2. 从零开始学习linux的I2C设备驱动框架——写一个简单的SHT20驱动

    目录 0.测试环境说明 1.设备树的修改 2.设备驱动框架 3.I2C数据传输过程 3.1 struct i2c_msg 3.2 SHT20的数据收发 4.I2C适配器超时等待时间的修改 本文资源 参 ...

  3. 如何写一个树莓派的驱动来控制GPIO LED

    一直以来,物联网开发者面对新的硬件都是一件头痛的事情.有些时候明明有现成的驱动,我们却没法直接利用.公司的PM/领导一句话下来,整套系统就要从新来,说明书一看就是一天,重复的软硬联调,日复一日的造轮子 ...

  4. rk3568 | 瑞芯微平台GPIO引脚驱动编写

    最近在玩瑞芯微平台的产品,移植了几个设备的驱动,遇到了一些问题,总结后发现大部分问题都出在了GPIO配置的问题上,写下本篇文章,用来分享一下调试的心得. 有喜欢瑞芯微的朋友,可以加我好友,拉你进群,一 ...

  5. 驱动开发之六 --- 一个简单的显示驱动之一 [译文]

    这个系列的文章在网上到处都是 这里也不清楚谁才是原文作者 我这里做个整理,标注一下希望大家能看的更加舒服一点 目录 (一)驱动开发一个简单的显示驱动 (二)驱动开发一个简单的显示驱动 (三)驱动开发一 ...

  6. 写一个公用的gpio口驱动

    因为项目需要控制的GPIO口比较多,如果每个GPIO口都写一个驱动就显得比骄麻烦,所以就写了一个通用的GPIO口驱动.只要dts里面配置好设备GPIO相关信息就可以自动加载了.可以很充分的体现多个设备 ...

  7. 实战!手把手教你如何编写一个Linux驱动并写一个支持物联网的LED演示demo

    目录 一.开发环境 二. 准备工作: 1. 创建一个项目工程目录 2. 创建输出与目标目录 3.头文件目录 4. 建立源代码src目录 5. 使用git管理你的项目 三.编写LED驱动 三.一 准备工 ...

  8. 自己动手写TCC7901的GPIO驱动

    //===================================================================== //TITLE: //    自己动手写TCC7901的 ...

  9. 手把手带你写一个中断输入设备驱动

    今天群里有人问,要开始驱动开发的话从什么开始比较好. 我说,应该开始去摸索触摸屏驱动,现在我想了下,触摸屏驱动可能会难了些,但是从一个GPIO开始,我觉得一定是一件很容易的事情. 所以这篇文章就来了. ...

  10. linux鼠标驱动程序,Linux usb子系统(一) _写一个usb鼠标驱动

    USB总线是一种典型的热插拔的总线标准,由于其优异的性能几乎成为了当下大小设备中的标配. USB的驱动可以分为3类:SoC的USB控制器的驱动,主机端USB设备的驱动,设备上的USB Gadget驱动 ...

最新文章

  1. 新的一年,,,新的生活
  2. 基于JSP实现的项目管理平台系统
  3. Windows下载Android源代码
  4. php 回调通知 连连支付_php怎么写连连支付退款
  5. 成功解决AttributeError: module ‘tornado.web‘ has no attribute ‘asynchronous‘
  6. 使用Java 8 Lambda表达式将实体映射到DTO
  7. ERROR in ./src/css/1.scss 1:2
  8. java web w3c_1.3 搭建Java Web开发环境
  9. Linux学习之CentOS6下Mysql数据库的安装与配置
  10. 尝试Adam代替梯度下降
  11. GitHub上常用命令(工作中几乎每天用到的命令)
  12. 修改Maven本地仓库路径,IDEA修改maven位置
  13. 极简「Oauth2.0」微信网页授权教程
  14. WebRTC-NACK、Pacer和拥塞控制和FEC
  15. android10.0连接wifi后提示“已连接,但无法访问互联网”
  16. 关于mysql的题目_关于MySQL的经典例题50道 答案参考
  17. 介绍一些免费好用的静态网站托管服务
  18. 有向图 G=(V, E) 的拓扑排序
  19. 新建银行账户类,实现基本的属性和方法。
  20. 高效率的免费发布信息平台,助力企业高质量采购

热门文章

  1. mysql优化--explain分析sql语句执行效率
  2. 缓冲文件系统和非缓冲文件系统
  3. Merge k Sorted Lists
  4. 颜色直方图的计算、显示、处理、对比及反向投影(How to Use Histogram? Calculate, Show, Process, Compare and BackProject)...
  5. Google将推游戏内广告技术 游戏中插入视频广告
  6. 「翻版王攀」?深大研究生控诉导师不让毕业:读研三年,猪狗不如
  7. 放弃幻想,全面拥抱Transformer:自然语言处理三大特征抽取器(CNN/RNN/TF)比较...
  8. 对自己深度学习方向的论文有idea,可是工程实践能力跟不上,实验搞不定怎么办?...
  9. 【CV学习笔记】色彩空间
  10. 【福利】PyTorch中文版官方教程来啦(附下载)