基于PM8916 MPP创建一个Linux led子系统
基于PM8916 MPP创建一个Linuxled子系统
首先,从kernel文件系统层面上创建sys文件系统节点/sys/class/leds/button-backlight/brightness的方法,是基于kernel部分驱动kernel/drivers/leds/leds-gpio.c创建的,其中dts中每一个子节点都对应一个Gpio的led,都会生成一个以label名称为目录的led类。
Dts配置如下:
&soc {gpio-leds {compatible = "gpio-leds";status = "okay";pinctrl-names = "default";pinctrl-0 = <&button_backlight_off>;
/*add by eliot shao add adevice led-breath at /sys/class/leds/led-breath- 2016/8/18*/led-breath {gpios =<&msm_gpio 8 0>; label = "led-breath-";linux,default-trigger = "none";default-state = "keep"; /*gpio value will keep prrvious value*/};keypad-backlight {gpios =<&msm_gpio 119 0>;label = "button-backlight";linux,default-trigger = "none";};};
};
但是如果控制引脚不是AP的gpio,而是PMIC上的MPP引脚,过程就不是这样的了。
PMIC上的MPP是多功能引脚的意思,可以做电源、gpio、ADC、PWM、SINK等功能。
2、 驱动程序
kernel/drivers/leds/leds-qpnp.c
这里说一下第一次遇到这种问题解决思路:
Mpp2脚控制LED,如果自己写驱动的话关键点是如何配置PM8916上和MPP上相关的寄存器,将MPP2配置成为GPIO或者pwm模式。写一个设置mpp2输出高低或者pwm频率的函数,包装成led的class注册到sys文件系统中。
找到PM 8916相关的dts文件,查看其支持的设备有哪些,查找和led相关的设备。
打开Y:\LA.BR.1.2.4-05310-8x16.0\kernel\arch\arm\boot\dts\qcom\msm-pm8916.dtsi
在&spmi_bus {};设备节点下定义了
qcom,pm8916@0 {……
pm8916_leds: qcom,leds@a100 {compatible= "qcom,leds-qpnp";reg= <0xa100 0x100>;label= "mpp";};};
继续跟踪compatible = “qcom,leds-qpnp”;检索qcom,leds-qpnp。
找到驱动文件:
kernel/drivers/leds/leds-qpnp.c
分析驱动:
#ifdefCONFIG_OF
staticstruct of_device_id spmi_match_table[] = {{ .compatible = "qcom,leds-qpnp",},{ },
};
#else
#definespmi_match_table NULL
#endifstaticstruct spmi_driver qpnp_leds_driver = {.driver ={.name ="qcom,leds-qpnp",.of_match_table = spmi_match_table,},.probe =qpnp_leds_probe,.remove =qpnp_leds_remove,};
在probe函数主要做一下事情:
1、解析dts各项,分配到structled_classdev cdev;
2、
led->cdev.brightness_set = qpnp_led_set;
led->cdev.brightness_get = qpnp_led_get;
qpnp_led_set函数调用__qpnp_led_work
–>
caseQPNP_ID_LED_MPP:
rc = qpnp_mpp_set(led);
–>
qpnp_led_masked_write(structqpnp_led_data *led, u16 addr, u8 mask, u8 val)
–>
spmi_ext_register_readl; spmi_ext_register_writel;读写PMICmpp相关寄存器。
–>
spmi_read_cmd(ctrl,SPMI_CMD_EXT_READL, sid, addr, len - 1, buf);
spmi_write_cmd(ctrl,op, sid, addr, len - 1, buf);
–>
pa_read_data; pmic_arb_write
–>
writel_relaxed(val,dev->wrbase + offset);
u32val = readl_relaxed(dev->rdbase + offset);
3、注册led_classdev_register(&spmi->dev,&led->cdev);
整个过程就是MPP+led子系统的架构,和GPIO+led子系统的架构类似,区别就是硬件控制方式。
3、 dts配置
&spmi_bus{qcom,pm8916@0 {qcom,leds@a100 {status = "okay";qcom,led_mpp_2 {label = "mpp";linux,name = "button-backlight";linux,default-trigger ="none";qcom,default-state ="off";qcom,max-current = <40>;qcom,current-setting =<5>;qcom,id = <6>;qcom,mode = "manual";qcom,source-sel = <1>;qcom,mode-ctrl =<0x10>; /*change mode to digitaloutput*/};};};};
创建/sys/class/leds/button-backlight/brightness
基于PM8916 MPP创建一个Linux led子系统相关推荐
- 手动添加linux用户,Linux入门教程:如何手动创建一个Linux用户
想到要创建一个用户的时候,我们马上想到了useradd命令或者在图像下进行建立,但是这样并没有真正的了解linux用户的生成步骤,我们知道在linux下"一切皆文件",那么对于一个 ...
- (4opencv)如何基于GOCW,创建一个实时视频程序
直接使用提供的代码框架进行修改,是最快得到效果的方法:但是这样的灵活性较差,而且真正的程序员从来都不会停滞在这一步:我们需要的是"将框架解析到最小化.理清楚每个构建之间的关系",只 ...
- 如何创建一个linux用户名和密码,Linux下如何创建用户 | Soo Smart!
Linux下如何创建用户? 初步接触linux时要学会用户账号的添加.删除与修改.用户口令的管理.用户组的管理方法,这里列出来供大家参考使用吧. user的create, delete, modify ...
- 关于“让我们基于Node.js创建一个Web应用:记事本(三)”
在我当初学习这个系列的教程的时候,这一部分让我驻足了很久.其他内容都很顺利,能够自己编写出代码并在Node.js中跑出结果,或者在浏览器中得到想要的内容,唯有最后那一部分测试,要使用Exporesso ...
- GCE 创建一个Linux VM
sudo yum install wget 安装Java sudo wget --no-check-certificate --no-cookies --header "Cookie: or ...
- ssas如何创建分区_如何基于SSAS信息创建Excel报告
ssas如何创建分区 介绍 (Introduction) In SSAS, when I offer Power BI, Reporting Services, PowerPivot or Share ...
- 【PTC Thingworx(二)】创建一个物联网应用程序
这个项目将通过创建一个工作的web应用程序向你介绍ThingWorx Foundation的原理. 按照本指南中的步骤,您将创建您的第一个物联网应用程序的构建块.您将使用ThingWorx Compo ...
- 初探linux子系统集之led子系统(一)【转】
本文转载自:http://blog.csdn.net/eastmoon502136/article/details/37569789 就像学编程第一个范例helloworld一样,学嵌入式,单片机.f ...
- Linux下的LED子系统
最简单的led驱动就是从端口输出0或1来关闭或点亮灯.而我们这里讲的led子系统,主要是对led事件进行了分装和优化,这里我们主要讲的是可以实现跨平台的led驱动.不管你是使用三星的平台,还是Atme ...
最新文章
- CC2540获取本机MAC地址
- 计算机病毒攻防技术研究,计算机网络病毒辐射攻防技术研究.pdf
- [转[c++]从int转换成string
- python和linux哪个难学-“慢”下来的 Python 要怎么竞争?
- formal method lecture 13
- vue 实现数据滚动显示_vue 滚动加载数据
- 炒菜机器人放食材的顺序_2年要开1000家 碧桂园旗下千玺机器人餐厅开业
- php是啥_php是什么
- python改文件名_python 怎么改文件名
- vue 连接地址下载 PDF
- 5个强盗分100颗宝石 你该怎么分?
- DOSBOX 0.74模拟器安装Windows 95
- 移动终端开发详解总结(一)(kotlin版)| CSDN创作打卡
- hdu 5956 The Elder
- K近邻(k-Nearest Neighbor,KNN)算法,一种基于实例的学习方法
- P2P之UDP穿透NAT的原理与实现(附源代码)
- serverless入门介绍
- Rosetta安装过程报错集锦
- Unity 打包安卓APK到上架各大应用商店(超详细)
- 青岛大学微型计算机控制技术期末,青大教师于金鹏 | 根植青大 言传身教 砺行致远...