CPU:RK3288

系统:Android 5.1

功能:上层 app 控制 led 亮灭

开发板:Firefly RK3288

1、在dts文件中增加 led 设备

path:kernel/arch/arm/boot/dts/firefly-rk3288.dts

  1. firefly-led{
  2. //匹配内容
  3. compatible = "firefly,led";
  4. //led引脚及有效电平
  5. led-work = <&gpio8 GPIO_A2 GPIO_ACTIVE_LOW>;
  6. status = "okay";
  7. };

2、led 驱动

path:kernel/drivers/firefly/leds.c

  1. #include <linux/init.h>
  2. #include <linux/kernel.h>
  3. #include <linux/uaccess.h>
  4. #include <linux/proc_fs.h>
  5. #include <linux/module.h>
  6. #include <linux/slab.h>
  7. #include <linux/gpio.h>
  8. #include <linux/miscdevice.h>
  9. #include <linux/of_gpio.h>
  10. #include <linux/of_platform.h>
  11. #include <linux/platform_device.h>
  12. #include <linux/of.h>
  13. #include <linux/of_gpio.h>
  14.  
  15. #define DEBUG
  16.  
  17. #ifdef DEBUG
  18. #define LED_DBG(fmt,arg...) do{\
  19. printk("<LED-DEBUG> [%d]"fmt"\n", __LINE__, ##arg);\
  20. }while()
  21. #else
  22. #define LED_DBG(fmt,arg...)
  23. #endif
  24.  
  25. struct led_data {
  26. int work_pin; //led引脚
  27. int work_status; //led状态
  28. int work_enable; //led使能电平
  29. };
  30.  
  31. struct led_data *led_info;
  32.  
  33. static int led_drv_open(struct inode *inode, struct file *filp)
  34. {
  35. LED_DBG("--%s()--", __func__);
  36. return ;
  37. }
  38.  
  39. static int led_drv_release(struct inode *inode, struct file *filp)
  40. {
  41. LED_DBG("--%s()--", __func__);
  42. return ;
  43. }
  44.  
  45. static ssize_t led_drv_read(struct file *filp, char __user *buf, size_t len, loff_t *pos)
  46. {
  47. int ret;
  48.  
  49. LED_DBG("--%s()--", __func__);
  50. ret = copy_to_user(buf, &(led_info->work_status), len);
  51. if(ret > )
  52. {
  53. LED_DBG("copy to user failed.");
  54. return ret;
  55. }
  56.  
  57. return len;
  58. }
  59.  
  60. static ssize_t led_drv_write(struct file *filp, const char __user *buf, size_t len, loff_t *pos)
  61. {
  62. int on;
  63. int ret;
  64.  
  65. LED_DBG("--%s()--", __func__);
  66. ret = copy_from_user(&on, buf, len);
  67. if(ret > )
  68. {
  69. LED_DBG("copy from user failed.");
  70. return ret;
  71. }
  72.  
  73. gpio_direction_output(led_info->work_pin, !on);
  74. led_info->work_status = on;
  75.  
  76. return ret;
  77. }
  78.  
  79. //上层没添加此函数api
  80. static long led_drv_ioctl(struct file *filp, unsigned int cmd, unsigned long arg)
  81. {
  82. LED_DBG("--%s()--", __func__);
  83. return ;
  84. }
  85.  
  86. struct file_operations led_fops = {
  87. .owner = THIS_MODULE,
  88. .open = led_drv_open,
  89. .release = led_drv_release,
  90. .write = led_drv_write,
  91. .read = led_drv_read,
  92. .unlocked_ioctl = led_drv_ioctl,
  93. };
  94.  
  95. //注册为杂项设备
  96. struct miscdevice led_dev =
  97. {
  98. .minor = MISC_DYNAMIC_MINOR,
  99. .fops = &led_fops,
  100. .name = "firefly_leds",
  101. };
  102.  
  103. static int led_drv_probe(struct platform_device *pdev)
  104. {
  105. int ret = -;
  106. enum of_gpio_flags work_flags;
  107. struct device_node *led_node = pdev->dev.of_node;
  108.  
  109. LED_DBG("--%s()--", __func__);
  110.  
  111. led_info = kzalloc(sizeof(struct led_data), GFP_KERNEL);
  112. if(led_info == NULL)
  113. {
  114. LED_DBG("Alloc GFP_KERNEL memory failed.");
  115. return -ENOMEM;
  116. }
  117.  
  118. //从dts中获取led的引脚,和有效电平
  119. led_info->work_pin = of_get_named_gpio_flags(led_node, "led-work", , &work_flags);
  120. if(!gpio_is_valid(led_info->work_pin))
  121. {
  122. LED_DBG("Work pin is invaild.");
  123. ret = -ENODEV;
  124. goto dev_fail;
  125. }
  126.  
  127. led_info->work_enable = (work_flags == OF_GPIO_ACTIVE_LOW) ? : ;
  128.  
  129. ret = gpio_request(led_info->work_pin, "work_led");
  130. if(ret < )
  131. {
  132. LED_DBG("Work led request failed.");
  133. goto dev_fail;
  134. }
  135.  
  136. gpio_direction_output(led_info->work_pin, !(led_info->work_enable));
  137. led_info->work_status = ;
  138.  
  139. misc_register(&led_dev);
  140.  
  141. return ;
  142.  
  143. request_fail:
  144. gpio_free(led_info->work_pin);
  145. dev_fail:
  146. kfree(led_info);
  147.  
  148. return ret;
  149. }
  150.  
  151. static int led_drv_remove(struct platform_device *pdev)
  152. {
  153. misc_deregister(&led_dev);
  154. LED_DBG("--%s()--", __func__);
  155. gpio_free(led_info->work_pin);
  156. kfree(led_info);
  157. }
  158.  
  159. int led_drv_suspend(struct device *dev)
  160. {
  161. LED_DBG("--%s()--", __func__);
  162. return ;
  163. }
  164.  
  165. int led_drv_resume(struct device *dev)
  166. {
  167. LED_DBG("--%s()--", __func__);
  168. return ;
  169. }
  170.  
  171. //suspend和resume暂时没调试成功
  172. const struct dev_pm_ops led_pm_ops = {
  173. .suspend = led_drv_suspend,
  174. .resume = led_drv_resume,
  175. };
  176.  
  177. static const struct of_device_id of_gpio_leds_match[] = {
  178. {.compatible = "firefly,led", },
  179. {},
  180. };
  181.  
  182. static struct platform_driver led_drv = {
  183. .probe = led_drv_probe,
  184. .remove = led_drv_remove,
  185. .driver = {
  186. .name = "leds",
  187. .owner = THIS_MODULE,
  188. .pm = &led_pm_ops,
  189. .of_match_table = of_match_ptr(of_gpio_leds_match),
  190. },
  191. };
  192.  
  193. module_platform_driver(led_drv);
  194.  
  195. MODULE_LICENSE("GPL");
  196. MODULE_AUTHOR("AaronLee");

3、Makefile

path:kernel/drivers/firefly/Makefile

  1. obj-$(CONFIG_FIREFLY_RK3288_LEDS) += leds.o

4.Kconfig

path:kernel/drivers/firefly/Kconfig

  1. menu "Firefly Device Options"
  2.  
  3. config FIREFLY_RK3288_LEDS
  4. bool "select firefly rk3288 leds"
  5. default y
  6.  
  7. endmenu

5、defconfig文件中增加led

path:kernel/arch/arm/configs/firefly-rk3288_defconfig

  1. CONFIG_FIREFLY_RK3288_LEDS=y

6、修改led节点的权限

path:device/rockchip/common/ueventd.rockchip.rc

  1. /dev/firefly_leds system system

Android 从上层到底层-----hal层

Android 从上层到底层-----jni层

Android 从上层到底层-----app层

Android 从上层到底层-----kernel层的更多相关文章

  1. Android 从上层到底层-----app层

    CPU:RK3288 系统:Android 5.1 功能:上层 app 控制 led 亮灭 开发板:Firefly RK3288 MainActivity.java package com.aaron ...

  2. Android 从上层到底层-----jni层

    CPU:RK3288 系统:Android 5.1 功能:上层 app 控制 led 亮灭 开发板:Firefly RK3288 led_jni.h path:hardware/rockchip/fi ...

  3. Android 从上层到底层-----hal层

    CPU:RK3288 系统:Android 5.1 功能:上层 app 控制 led 亮灭 开发板:Firefly RK3288 led_hal.c path:hardware/rockchip/fi ...

  4. Linux、Android系统调用从上层到底层的调用路径浅析

    参考: https://blog.csdn.net/liuhangtiant/article/details/85149369 http://blog.sina.com.cn/s/blog_79433 ...

  5. Android HAL层与Linux Kernel层驱动开发简介

    近日稍微对Android中的驱动开发做了一些简要的了解. HAL:Hardware Abstract Layer 硬件抽象层,由于Linux Kernel需要遵循GPL开源协议,硬件厂商为了保护自己硬 ...

  6. Linux/Android——input系统之 kernel层 与 frameworks层交互 (五)【转】

    本文转载自:http://blog.csdn.net/jscese/article/details/42291149 之前的四篇博文记录的都是linux中的input体系相关的东西,最底层以我调试的u ...

  7. Android Camera 通过V4L2与kernel driver的完整交互过程

    http://blog.chinaunix.net/uid-26215986-id-3552456.html 原文地址:Android Camera 通过V4L2与kernel driver的完整交互 ...

  8. Android源码剖析之Framework层升级版(窗口、系统启动)

    本文来自http://blog.csdn.net/liuxian13183/ ,引用必须注明出处! 看本篇文章之前,建议先查看: Android源码剖析之Framework层基础版 前面讲了frame ...

  9. 创建Android守护进程(底层服务)【转】

    本文转载自:https://blog.csdn.net/myfriend0/article/details/80016739 创建Android守护进程(底层服务) 前言 Android底层服务,即运 ...

随机推荐

  1. IOS-第三方开源库

    我找的琐碎框架 1.HZExtend:应用快速开发架构集合了MVC和MVVM的特点https://github.com/GeniusBrother/HZExtend : 1.减少控制器压力以及耦合 2 ...

  2. day27 CRM delete& action& 嵌入CRM

    课程目录:deleteactionpop up window嵌入crm项目 权限(未讲)学员交作业发邮件 代码路径:https://github.com/liyongsan/git_class/tre ...

  3. scale的空白问题

    使用scale对表格进行缩放 出现大片空白问题 一直没有很好地重视这个问题,导致这次不得不面对,经过各种搜索,各种尝试,终于解决了这个留白问题 思路 大小盒子,小盒子进行缩放,大盒子依据缩放来进行动态 ...

  4. 008-对象—— 对象$this self parent 内存方式及使用方法讲解

    <?php /** * */ /*class Web{ private $webname; private $weburl; function __construct($webname,$web ...

  5. 【sql】使用触发器

    今天在写sql触发器时遇到这样一个问题: 利用完整性规则创建教师表,包括(教师工号,姓名,性别,职称,工资),在此基础上定义触发器,为教师表Teacher定义完整性规则“教授的工资不能低于4000元, ...

  6. SQLServer中通过脚本内容查找存储过程

    select o.name,m.definition from sys.objects o left outer join sys.sql_modules m on o.object_id = m.o ...

  7. web运行异常解决

    端口占用: 在dos下,输入  netstat   -ano|findstr  8080 //说明:查看占用8080端口的进程 显示占用端口的进程 taskkill  /pid  6856  /f   ...

  8. tooltip提示框组件

    Tooltip 提示框组件 可独立于其他组件通过$.fn.tooltip.defaults重写默认的defaults.当用户移动鼠标指针在某个元素上时,出现提示信息窗口来显示额外信息.提示内容可以包含 ...

  9. ExpandoObject使用

    //public class Users { // public int Id { set; get; } // public string UName { set; get; } // public ...

  10. [转载]Spring源码下载地址

    转载自:http://blog.csdn.net/liuzheng2684/article/details/6534722,谢谢! 今天想下载一下spring的源代码,登录到Spring官网,傻眼了, ...