最近在研究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. 非即插即用型设备驱动的加载过程

    非即插即用型设备驱动的加载过程 1. 非PnP总线驱动在系统启动时通过扫描注册表发现非PnP设备的存在,并向OS报告ID信息.(例如根总线驱动通过扫描 HKLM\ SYSTEM\ CurrentCon ...

  2. linux centos fedora audio root 普通用户声卡驱动安装 加载 声音

    linux  centos fedora Audio root 及普通用户声卡及声音的问题 大家用linux大部分当作服务器用的,谁用这玩意听歌,看电影啊,毕竟是玩吗,玩来玩去,声音给浪丢了,那也不能 ...

  3. 设备树语法,加载过程和与驱动的关系

    文章目录 一.设备树语法 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 编 ...

  4. linux内核启动以及文件系统的加载过程

    Linux 内核启动及文件系统加载过程 当u-boot 开始执行 bootcmd 命令,就进入 Linux 内核启动阶段.普通 Linux 内核的启动过程也可以分为两个阶段.本文以项目中使用的 lin ...

  5. linux Pci字符驱动基本加载流程

    今天有朋友问我linux系统Pci字符驱动加载流程,简单整理了一下,顺便做个记录. 首先说下需要包含的头文件: 一个完整的字符驱动一般包含下面这些头文件: #include <linux/typ ...

  6. java 手动加载数据库驱动_JAVA加载数据库驱动(JDBC)

    JAVA加载数据库驱动(JDBC) 前言 之前,对Class.forName("com.mysql.jdbc.Driver");这条动态加载JDBC驱动感觉很疑惑,故有了这篇短文. ...

  7. html动态资源加载进度,JavaScript_快速解决js动态改变dom元素属性后页面及时渲染的问题,今天实现一个进度条加载过程 - phpStudy...

    快速解决js动态改变dom元素属性后页面及时渲染的问题 今天实现一个进度条加载过程,dom结构其实就是两个div 控制里层div的宽width属性,就能实现进度条往前走的效果. 我的进度条是显示下载文 ...

  8. 一个驱动无法加载的分析

    一个驱动无法加载的分析 客户反馈一个问题,原工作很好的usb key设备,安装 NCT_2000_XP 后,运行测试程序找硬件,提示没找到.检查系统 %systemroot%/system32/dir ...

  9. 1wifi 简介(框架)2系统启动后的 wifi加载 过程-图解 3系统启动后的 wifi 加载过程

    http://blog.csdn.net/wh_19910525/article/details/7384480 一.wifi 组建原理: WIFI就是一种无线联网的技术,以前通过网线连接电脑,而现在 ...

  10. Java虚拟机中 类的加载过程

    Java中 类的加载过程 例如下面的一段简单的代码 public class HelloWorld {public static void main(String[] args) {System.ou ...

最新文章

  1. c语言大顶堆数组维护,图解大顶堆的构建、排序过程
  2. 19.VS属性管理器窗口不见了怎么办?
  3. 委托、Lambda表达式和事件
  4. Container ViewController自定义转场控制器。
  5. 红魔3电竞手机配置进一步曝光 电池容量不低于5000mAh
  6. the dhc driver package_DHC智商低?不,它用1k阅读,444个好看证明了自己
  7. 文本以大写字母html,如何强制EditText以大写字母开始文本?
  8. Troubleshoot: R.Layout.Main cannot be resolved
  9. ngRoute+ngAnimate与JQM中的页面跳转的区别
  10. LoadRunner字符串编码转换函数:lr_convert_string_encoding
  11. C#下对象与JSON串互相转换
  12. ACM算法分类及完成情况
  13. installshield使用教程
  14. 计算机考研 专业课 数据结构
  15. OpenCV:图像平移
  16. 卡西欧计算机蓝屏的处理方法,电脑出现蓝屏怎么办 电脑出现蓝屏解决方法【图文详解】...
  17. Live Archive 6657
  18. 天池比赛-02-用Apriori算法进行商品关联分析
  19. Java学习之路——接口
  20. android上传sd卡文件格式,Android开发学习:向模拟器的sdcard中添加文件

热门文章

  1. InnoDB一棵B+树能存多少行数据?为什么要用B+树?而不是其他树?
  2. android 自定义字体 ttf,Android利用TTF文件设置字体
  3. Easy Connect 当前IE代理启用了自动配置脚本,不允许使用CS客户端登录
  4. 网站被攻击如何修复网站漏洞
  5. 网站漏洞修复公司 对网站上传文件漏洞的修复与安全加固
  6. 天天淘宝,你却不知道个性化推荐技术...
  7. 软考之网络工程师准备
  8. Winxp不幸中毒以及手杀过程
  9. 【前端】微信小程序 内容安全图片校验API imgSecCheck 代码示例 图片违规校验
  10. AI算法可帮助因气候变化而流离失所的数百万难民找到新家了!