基于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子系统相关推荐

  1. 手动添加linux用户,Linux入门教程:如何手动创建一个Linux用户

    想到要创建一个用户的时候,我们马上想到了useradd命令或者在图像下进行建立,但是这样并没有真正的了解linux用户的生成步骤,我们知道在linux下"一切皆文件",那么对于一个 ...

  2. (4opencv)如何基于GOCW,创建一个实时视频程序

    直接使用提供的代码框架进行修改,是最快得到效果的方法:但是这样的灵活性较差,而且真正的程序员从来都不会停滞在这一步:我们需要的是"将框架解析到最小化.理清楚每个构建之间的关系",只 ...

  3. 如何创建一个linux用户名和密码,Linux下如何创建用户 | Soo Smart!

    Linux下如何创建用户? 初步接触linux时要学会用户账号的添加.删除与修改.用户口令的管理.用户组的管理方法,这里列出来供大家参考使用吧. user的create, delete, modify ...

  4. 关于“让我们基于Node.js创建一个Web应用:记事本(三)”

    在我当初学习这个系列的教程的时候,这一部分让我驻足了很久.其他内容都很顺利,能够自己编写出代码并在Node.js中跑出结果,或者在浏览器中得到想要的内容,唯有最后那一部分测试,要使用Exporesso ...

  5. GCE 创建一个Linux VM

    sudo yum install wget 安装Java sudo wget --no-check-certificate --no-cookies --header "Cookie: or ...

  6. ssas如何创建分区_如何基于SSAS信息创建Excel报告

    ssas如何创建分区 介绍 (Introduction) In SSAS, when I offer Power BI, Reporting Services, PowerPivot or Share ...

  7. 【PTC Thingworx(二)】创建一个物联网应用程序

    这个项目将通过创建一个工作的web应用程序向你介绍ThingWorx Foundation的原理. 按照本指南中的步骤,您将创建您的第一个物联网应用程序的构建块.您将使用ThingWorx Compo ...

  8. 初探linux子系统集之led子系统(一)【转】

    本文转载自:http://blog.csdn.net/eastmoon502136/article/details/37569789 就像学编程第一个范例helloworld一样,学嵌入式,单片机.f ...

  9. Linux下的LED子系统

    最简单的led驱动就是从端口输出0或1来关闭或点亮灯.而我们这里讲的led子系统,主要是对led事件进行了分装和优化,这里我们主要讲的是可以实现跨平台的led驱动.不管你是使用三星的平台,还是Atme ...

最新文章

  1. CC2540获取本机MAC地址
  2. 计算机病毒攻防技术研究,计算机网络病毒辐射攻防技术研究.pdf
  3. [转[c++]从int转换成string
  4. python和linux哪个难学-“慢”下来的 Python 要怎么竞争?
  5. formal method lecture 13
  6. vue 实现数据滚动显示_vue 滚动加载数据
  7. 炒菜机器人放食材的顺序_2年要开1000家 碧桂园旗下千玺机器人餐厅开业
  8. php是啥_php是什么
  9. python改文件名_python 怎么改文件名
  10. vue 连接地址下载 PDF
  11. 5个强盗分100颗宝石 你该怎么分?
  12. DOSBOX 0.74模拟器安装Windows 95
  13. 移动终端开发详解总结(一)(kotlin版)| CSDN创作打卡
  14. hdu 5956 The Elder
  15. K近邻(k-Nearest Neighbor,KNN)算法,一种基于实例的学习方法
  16. P2P之UDP穿透NAT的原理与实现(附源代码)
  17. serverless入门介绍
  18. Rosetta安装过程报错集锦
  19. Unity 打包安卓APK到上架各大应用商店(超详细)
  20. 青岛大学微型计算机控制技术期末,青大教师于金鹏 | 根植青大 言传身教 砺行致远...

热门文章

  1. jQuery基础入门篇
  2. swift 与 oc 有哪些区别
  3. 产业区块链迎来新纪元,基础设施建设成核心命题
  4. HTTP之CROS、预检
  5. oracle和arc,Oracle跟ArcSDE 分开部署方法(转)
  6. python 实现正弦波、三角波、方波、锯齿波
  7. vc2005(visual studio)使用习惯记录
  8. 最新消息!Win 10 界面将大更新,新UI曝光!这次真的美了??
  9. c盘html文件能删除吗,appdata是什么文件夹 C盘Appdata文件能不能删除?
  10. 前端 HTMLCSS视频教程学习记录