MTK6762 的LED驱动

MTK的驱动不是使用一些初级教程的找到对应IO去配置寄存器,需要用到的知识有平台总线、pinctrl子系统以及设备树等等,在这里我就具体去讲解这些知识了,在论坛里已经有了很多大佬讲的很好。

需要修改设备树和增加自己的驱动文件以及添加makefile文件

一、修改设备树
路径:mt6762_Q\kernel-4.9\arch\arm64\boot\dts\mediatek
文件: MT6762.dts

二、 增加自己的驱动文件
路径:mt6762_Q\kernel-4.9\drivers\misc\mediatek
在此路径添加自己的驱动文件夹 如:green_led
在此路径的Makefile添加自己的文件夹信息 如:obj-y += green_led /

路径:mt6762_Q\kernel-4.9\drivers\misc\mediatek\ green_led
在此路径添加自己写的驱动.c文件和编译Makefile文件
如在此文件夹添加green_led.c 和Makefile
此路径的Makefile 添加驱动编译信息如:obj-y += green_led.o
到此文件添加结束

green_led.c

#include <linux/types.h>
#include <linux/delay.h>
#include <linux/gpio.h>
#include <linux/module.h>
#include <linux/slab.h>
#include <linux/init.h>
#include <linux/platform_device.h>
#include <linux/miscdevice.h>
#include <linux/input.h>
#include <linux/input/mt.h>
#include <linux/interrupt.h>
#include <linux/kernel.h>
#include <linux/gpio.h>
#include <linux/regulator/consumer.h>
#include <linux/firmware.h>
#include <linux/debugfs.h>
#include <linux/errno.h>
#include <linux/io.h>
#include <linux/fs.h>
#include <linux/string.h>
static struct pinctrl *greenctrl = NULL;//句柄
static struct pinctrl_state *green_led_Hight = NULL;//句柄
static struct pinctrl_state *green_led_Low = NULL;//句柄char *Led_State=0;
/************************************驱动的调用区********************************************/static ssize_t HouhxGreenLed_show(struct device *dev,struct device_attribute *attr, char *buf)
{return sprintf(buf, "%s\n", Led_State);
}static ssize_t HouhxGreenLed_store(struct device *dev, struct device_attribute *attr,const char *buf, size_t size)
{printk("the buf is [%s]",buf);//方便调试查看写入的实际内容   调试结果为echo输入的字符串最后会默认加上换行符'\n'if(strcmp(buf,"on\n") == 0){pinctrl_select_state(greenctrl,green_led_Hight);Led_State = "GreenLed is On. ";}if(strcmp(buf,"off\n") == 0){pinctrl_select_state(greenctrl,green_led_Low);
//      sprintf(Led_State,"GreenLed is Off.");   //这个会导致系统直接崩毁Led_State = "GreenLed is Off.";}return size;
}static DEVICE_ATTR(HhxGreenLed, 0664, HouhxGreenLed_show, HouhxGreenLed_store); //属性宏定义赋值/*****************************************************************************************************/static int GreenLed_probe(struct platform_device *pdev)
{int err=-1;greenctrl = devm_pinctrl_get(&pdev->dev);green_led_Hight = pinctrl_lookup_state(greenctrl,"Green_on");green_led_Low   = pinctrl_lookup_state(greenctrl,"Green_off");err = device_create_file(&pdev->dev,&dev_attr_HhxGreenLed);//创建节点if(err){dev_err(&pdev->dev,"sys GreenLed file creation failed\n");return -ENODEV;}printk("%s %d", __FUNCTION__, __LINE__);printk("GreenLed_probe success\n");return 0;
}static int GreenLed_remove(struct platform_device *pdev)
{return 0;
}static const struct of_device_id GreenLed_of_match[]={{ .compatible = "mediatek,GreenLed"},{},
};static struct platform_driver GreenLed_driver = {.driver = {.name = "GreenLed",.owner = THIS_MODULE,.of_match_table = GreenLed_of_match,},.probe = GreenLed_probe,.remove = GreenLed_remove,
};static __init int Led_init(void)
{int err=-1;printk("green_driver init\n");err=platform_driver_register(&GreenLed_driver);printk("platform_driver_register GreenLed_driver=%d\n",err);return 0;
}static void __exit Led_exit(void)
{platform_driver_unregister(&GreenLed_driver);
}module_init(Led_init);
module_exit(Led_exit);
MODULE_DESCRIPTION("green led contrl");
MODULE_LICENSE("GPL");

MT6762.dts里面添加设备树

GreenLed:GreenLed{compatible = "mediatek,GreenLed";
};
&GreenLed {pinctrl-names = "Green_default","Green_on","Green_off";pinctrl-0 = <&MyGreen_default>;pinctrl-1 = <&Green_h>;pinctrl-2 = <&Green_l>;status = "okay";
};&pio {MyGreen_default:Green_default{  };Green_h:Green_on{pins_cmd_dat {pinmux = <PINMUX_GPIO177__FUNC_GPIO177>;slew-rate = <1>;output-high;};};Green_l:Green_off{pins_cmd_dat {pinmux = <PINMUX_GPIO177__FUNC_GPIO177>;slew-rate = <1>;output-low;};};
};

我是在安卓系统调试的,但我们不用写安卓app软件,直接在adb shell中找到我们的节点然后echo对应命令即可。

MTK6762的LED驱动相关推荐

  1. 驱动学习之LED驱动框架

    一:什么是驱动框架   (1)内核中驱动部分维护者针对每个种类的驱动设计一套成熟的.标准的.典型的驱动实现,然后把不同厂家的同类硬件驱动中相同的部分抽出来自己实现好,再把不同部分留出接口给具体的驱动开 ...

  2. linux修改led中颜色,Linux学习三之LED驱动(修改内核)

    昨天到今天折腾了两天才把LED的驱动实现了,当终于成功的时候还是很开心的.在此把错误的原因总结了一下, 也供正在学习的童鞋们参考一下,因为有些原因是手册误导的. 第一,在编译镜像前首先要把天嵌配置好的 ...

  3. NanoPi NEO Air使用九:使用Linux内核自带的LED驱动

    NanoPi NEO Air使用一:介绍 NanoPi NEO Air使用二:固件烧录 NanoPi NEO Air使用三:OverlayFS.CPU温度和频率.wifi.蓝牙.npi-config ...

  4. LED驱动设计及实现

    文章目录 1 LED驱动流程图分析 1.1 led_on流程图分析 1.2 led_blink流程图分析 2 代码实现 1 LED驱动流程图分析 这里主要分析led_on和led_blink流程. 1 ...

  5. 友善之臂 mini2440 linux led 驱动代码,mini2440 led驱动程序

    这个led驱动程序只在linux-2.6.32.2内核中测试通过,至于其他的内核可能头文件有一些改动就不能 编译成功了.下面给出源程序: 这是友善之臂提供的源码: #include #include ...

  6. Linux LED驱动开发实验(直接操作寄存器 -- 实际开发很少这样做)

    目录 Linux 下LED 灯驱动原理 地址映射(ioremap映射.iounmap释放) I/O 内存访问函数 硬件原理图分析 实验程序编写 LED 灯驱动程序编写 APP测试程序编写 运行测试 编 ...

  7. ARM(IMX6U)裸机C语言版本LED驱动实验(汇编进入处理器SVC模式、SP堆内存、跳转main函数、链接起始地址)

    参考:Linux之ARM(IMX6U)裸机C语言LED驱动实验–驱动编写,编译 作者:一只青木呀 发布时间: 2020-08-11 11:20:17 网址:https://blog.csdn.net/ ...

  8. linux3.0-内核自带led驱动移植

    **************************************************************************************************** ...

  9. 多通道_人机交互界面的多通道RGB LED驱动设计

    现在的产品变得非常智能且彼此相互连接.扬声器.电视.冰箱.机顶盒和烟雾探测器等器件不再只是处在某一位置的工具 - 用户可远程或通过语音唤醒控制它们.这些器件比以前更加智能,这意味着它们还需要更加智慧的 ...

最新文章

  1. Maven 手动添加 JAR 包到本地仓库
  2. 生命真的源于宇宙吗?多名宇航员身体,都曾发生“不可逆”的变化
  3. SQL优化:使用explain
  4. Python调用PyAutoGUI模块
  5. 如何评价软件写的好还是坏?
  6. SSH服务的渗透测试
  7. tomcat源码运行
  8. 【CF1204D】Kirk and a Binary String【结论题】【LIS】
  9. 边框border(HTML、CSS)
  10. C编程语言中整型变量在内存中的存储形式介绍
  11. Docker-mysql 安装
  12. macOs 10.12.2总于修复鼠标驱动了
  13. Windows 如何完整备份驱动
  14. 基站机房防雷接地解决方案
  15. Origin画法——简单的分布图画法
  16. mysql定义过程_mysql定义和调用存储过程
  17. 《OC基础教程》读书笔记3-继承
  18. 旁轴相机,单反相机之间的区别(转)
  19. VB写的软件加壳都没用,超强反调试反破解分析,检测OD调试器
  20. 项目经理的岗位职责和要求

热门文章

  1. Android StudioTV开发教程(十八)建立电视频道,开发电视输入服务
  2. html怎么发送表情,前端怎么解决emoji表情无法发送的BUG
  3. codeforces723d
  4. 基于Matlab的Vander Lugt相关算法车牌汉字识别系统
  5. O_DIRECT使用
  6. 计算机专业211大学排名,在国内,这2所双非大学,计算机学科专业实力可比211...
  7. Unity ML-Agent 训练工业机械臂到达目标点 数字孪生
  8. 监控技术:smart265和H.265的主要区别 动态码率和变码率的主要区别
  9. 虎年大吉,虎虎生威!
  10. Bentley 软件公司将基础设施数字孪生引入 NVIDIA Omniverse