Mtk ALPS Led驱动的加载过程
最近在研究led驱动,顺便记录一下,下面将从两个方面来介绍Led的驱动。
一、Led驱动加载过程
mediatek/kernel/drivers/leds/leds_drv.c
module_init(mt65xx_leds_init);
mt65xx_leds_init()函数的具体实现:
static int __init mt65xx_leds_init(void)
{int ret;LEDS_DRV_DEBUG("[LED]%s\n", __func__);#if 0ret = platform_device_register(&mt65xx_leds_device);if (ret)printk("[LED]mt65xx_leds_init:dev:E%d\n", ret);
#endifret = platform_driver_register(&mt65xx_leds_driver);if (ret){LEDS_DRV_DEBUG("[LED]mt65xx_leds_init:drv:E%d\n", ret);return ret;}mt_leds_wake_lock_init();return ret;
}
上述函数实现调用了platform_driver_register(&mt65xx_leds_driver),对mtk的led平台设备驱动进行注册,平台设备驱动的定义如下所示:
static struct platform_driver mt65xx_leds_driver = {.driver = {.name = "leds-mt65xx",.owner = THIS_MODULE,},.probe = mt65xx_leds_probe,.remove = mt65xx_leds_remove,//.suspend = mt65xx_leds_suspend,.shutdown = mt65xx_leds_shutdown,
};
其中,probe被赋值mt65xx_leds_probe,并在发现设备的时候启动,具体看一下其实现:
static int __init mt65xx_leds_probe(struct platform_device *pdev)
{int i;int ret, rc;struct cust_mt65xx_led *cust_led_list = mt_get_cust_led_list();//获取led设备列表LEDS_DRV_DEBUG("[LED]%s\n", __func__);get_div_array();//获取led分频数据for (i = 0; i < MT65XX_LED_TYPE_TOTAL; i++) {if (cust_led_list[i].mode == MT65XX_LED_MODE_NONE) {g_leds_data[i] = NULL;//遍历led设备列表,如果某一led设备的模式配置为none,就不注册该设备continue;}g_leds_data[i] = kzalloc(sizeof(struct mt65xx_led_data), GFP_KERNEL);//为该设备分配设备结构体if (!g_leds_data[i]) {ret = -ENOMEM;goto err;}//初始化相关域g_leds_data[i]->cust.mode = cust_led_list[i].mode;g_leds_data[i]->cust.data = cust_led_list[i].data;g_leds_data[i]->cust.name = cust_led_list[i].name;g_leds_data[i]->cdev.name = cust_led_list[i].name;g_leds_data[i]->cust.config_data = cust_led_list[i].config_data;//bei addg_leds_data[i]->cdev.brightness_set = mt65xx_led_set;//亮灭控制g_leds_data[i]->cdev.blink_set = mt65xx_blink_set;//闪烁控制INIT_WORK(&g_leds_data[i]->work, mt_mt65xx_led_work);//入队ret = led_classdev_register(&pdev->dev, &g_leds_data[i]->cdev);//注册找到的led平台设备//register every found led deviceif(strcmp(g_leds_data[i]->cdev.name,"lcd-backlight") == 0)//如果该led设备是backlight,就走以下流程,主要是创建几个属性文件,包括duty、div、freq及pwm。{rc = device_create_file(g_leds_data[i]->cdev.dev, &dev_attr_duty);if(rc){LEDS_DRV_DEBUG("[LED]device_create_file duty fail!\n");}rc = device_create_file(g_leds_data[i]->cdev.dev, &dev_attr_div);if(rc){LEDS_DRV_DEBUG("[LED]device_create_file duty fail!\n");}rc = device_create_file(g_leds_data[i]->cdev.dev, &dev_attr_frequency);if(rc){LEDS_DRV_DEBUG("[LED]device_create_file duty fail!\n");}rc = device_create_file(g_leds_data[i]->cdev.dev, &dev_attr_pwm_register);if(rc){LEDS_DRV_DEBUG("[LED]device_create_file duty fail!\n");}bl_setting = &g_leds_data[i]->cust;}if (ret)goto err;}
#ifdef CONTROL_BL_TEMPERATURElast_level = 0; limit = 255;limit_flag = 0; current_level = 0;LEDS_DRV_DEBUG("[LED]led probe last_level = %d, limit = %d, limit_flag = %d, current_level = %d\n",last_level,limit,limit_flag,current_level);
#endifreturn 0;err:if (i) {for (i = i-1; i >=0; i--) {if (!g_leds_data[i])continue;led_classdev_unregister(&g_leds_data[i]->cdev);cancel_work_sync(&g_leds_data[i]->work);kfree(g_leds_data[i]);g_leds_data[i] = NULL;}}return ret;
}
代码有点长,但是主要关注几个函数就行了,主要是mt_get_cust_led_list()与led_classdev_register(&pdev->dev, &g_leds_data[i]->cdev);
其中的pdev->dev是led平台设备指针,g_leds_data[i]->cdev是led设备指针,这个问题后面再来详细说。
先来看mt_get_cust_led_list()这个函数。
struct cust_mt65xx_led * mt_get_cust_led_list(void)
{return get_cust_led_list();
}
可以看到这个函数只是一个简单的封装,接着往下看。
struct cust_mt65xx_led *get_cust_led_list(void)
{return cust_led_list;
}
static struct cust_mt65xx_led cust_led_list[MT65XX_LED_TYPE_TOTAL] = {{"red", MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK0, {0,0,0,0,0}},{"green", MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK1, {0,0,0,0,0}},{"blue", MT65XX_LED_MODE_PMIC, MT65XX_LED_PMIC_NLED_ISINK2, {0,0,0,0,0}},{"jogball-backlight", MT65XX_LED_MODE_NONE, -1,{0,0,0,0,0}},{"keyboard-backlight",MT65XX_LED_MODE_NONE, -1,{0,0,0,0,0}},{"button-backlight", MT65XX_LED_MODE_NONE, -1,{0,0,0,0,0}},{"lcd-backlight", MT65XX_LED_MODE_CUST_LCM, (int)Cust_lk_SetBacklight, {0,0,0,0,0}},
};
这部分代码在mediatek/custom/hexing71_cwet_kk/lk/cust_leds.c定义,可以看出其实就是一个客制化的代码,用户可以在这个位置自己实现一个设备列表,并且设置好相应的参数,当加载模块的时候,会逐一加载列表当中的设备。
二、Led驱动调用流程
//待写
Mtk ALPS Led驱动的加载过程相关推荐
- 非即插即用型设备驱动的加载过程
非即插即用型设备驱动的加载过程 1. 非PnP总线驱动在系统启动时通过扫描注册表发现非PnP设备的存在,并向OS报告ID信息.(例如根总线驱动通过扫描 HKLM\ SYSTEM\ CurrentCon ...
- linux centos fedora audio root 普通用户声卡驱动安装 加载 声音
linux centos fedora Audio root 及普通用户声卡及声音的问题 大家用linux大部分当作服务器用的,谁用这玩意听歌,看电影啊,毕竟是玩吗,玩来玩去,声音给浪丢了,那也不能 ...
- 设备树语法,加载过程和与驱动的关系
文章目录 一.设备树语法 1.1 简介 1.2 基本数据格式 1.3 一个例子 1.3.1 根节点 2.3.2 CPU 1.3.3 节点名称 1.3.4 设备 1.3.5 status 1.3.6 编 ...
- linux内核启动以及文件系统的加载过程
Linux 内核启动及文件系统加载过程 当u-boot 开始执行 bootcmd 命令,就进入 Linux 内核启动阶段.普通 Linux 内核的启动过程也可以分为两个阶段.本文以项目中使用的 lin ...
- linux Pci字符驱动基本加载流程
今天有朋友问我linux系统Pci字符驱动加载流程,简单整理了一下,顺便做个记录. 首先说下需要包含的头文件: 一个完整的字符驱动一般包含下面这些头文件: #include <linux/typ ...
- java 手动加载数据库驱动_JAVA加载数据库驱动(JDBC)
JAVA加载数据库驱动(JDBC) 前言 之前,对Class.forName("com.mysql.jdbc.Driver");这条动态加载JDBC驱动感觉很疑惑,故有了这篇短文. ...
- html动态资源加载进度,JavaScript_快速解决js动态改变dom元素属性后页面及时渲染的问题,今天实现一个进度条加载过程 - phpStudy...
快速解决js动态改变dom元素属性后页面及时渲染的问题 今天实现一个进度条加载过程,dom结构其实就是两个div 控制里层div的宽width属性,就能实现进度条往前走的效果. 我的进度条是显示下载文 ...
- 一个驱动无法加载的分析
一个驱动无法加载的分析 客户反馈一个问题,原工作很好的usb key设备,安装 NCT_2000_XP 后,运行测试程序找硬件,提示没找到.检查系统 %systemroot%/system32/dir ...
- 1wifi 简介(框架)2系统启动后的 wifi加载 过程-图解 3系统启动后的 wifi 加载过程
http://blog.csdn.net/wh_19910525/article/details/7384480 一.wifi 组建原理: WIFI就是一种无线联网的技术,以前通过网线连接电脑,而现在 ...
- Java虚拟机中 类的加载过程
Java中 类的加载过程 例如下面的一段简单的代码 public class HelloWorld {public static void main(String[] args) {System.ou ...
最新文章
- c语言大顶堆数组维护,图解大顶堆的构建、排序过程
- 19.VS属性管理器窗口不见了怎么办?
- 委托、Lambda表达式和事件
- Container ViewController自定义转场控制器。
- 红魔3电竞手机配置进一步曝光 电池容量不低于5000mAh
- the dhc driver package_DHC智商低?不,它用1k阅读,444个好看证明了自己
- 文本以大写字母html,如何强制EditText以大写字母开始文本?
- Troubleshoot: R.Layout.Main cannot be resolved
- ngRoute+ngAnimate与JQM中的页面跳转的区别
- LoadRunner字符串编码转换函数:lr_convert_string_encoding
- C#下对象与JSON串互相转换
- ACM算法分类及完成情况
- installshield使用教程
- 计算机考研 专业课 数据结构
- OpenCV:图像平移
- 卡西欧计算机蓝屏的处理方法,电脑出现蓝屏怎么办 电脑出现蓝屏解决方法【图文详解】...
- Live Archive 6657
- 天池比赛-02-用Apriori算法进行商品关联分析
- Java学习之路——接口
- android上传sd卡文件格式,Android开发学习:向模拟器的sdcard中添加文件
热门文章
- InnoDB一棵B+树能存多少行数据?为什么要用B+树?而不是其他树?
- android 自定义字体 ttf,Android利用TTF文件设置字体
- Easy Connect 当前IE代理启用了自动配置脚本,不允许使用CS客户端登录
- 网站被攻击如何修复网站漏洞
- 网站漏洞修复公司 对网站上传文件漏洞的修复与安全加固
- 天天淘宝,你却不知道个性化推荐技术...
- 软考之网络工程师准备
- Winxp不幸中毒以及手杀过程
- 【前端】微信小程序 内容安全图片校验API imgSecCheck 代码示例 图片违规校验
- AI算法可帮助因气候变化而流离失所的数百万难民找到新家了!